diff --git a/Freeswitch.2015.sln b/Freeswitch.2015.sln index 955be84cc8..f0529beaca 100644 --- a/Freeswitch.2015.sln +++ b/Freeswitch.2015.sln @@ -232,8 +232,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libaprutil", "libs\win32\ap EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iksemel", "libs\win32\iksemel\iksemel.2015.vcxproj", "{E727E8F6-935D-46FE-8B0E-37834748A0E3}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsndfile", "libs\win32\libsndfile\libsndfile.2015.vcxproj", "{3D0370CA-BED2-4657-A475-32375CBCB6E4}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xml", "libs\win32\apr-util\xml.2015.vcxproj", "{155844C3-EC5F-407F-97A4-A2DDADED9B2F}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sofia", "src\mod\endpoints\mod_sofia\mod_sofia.2015.vcxproj", "{0DF3ABD0-DDC0-4265-B778-07C66780979B}" @@ -956,17 +954,6 @@ Global {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Win32.Build.0 = Release|Win32 {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64.ActiveCfg = Release|x64 {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64.Build.0 = Release|x64 - {3D0370CA-BED2-4657-A475-32375CBCB6E4}.All|Win32.ActiveCfg = Release|x64 - {3D0370CA-BED2-4657-A475-32375CBCB6E4}.All|x64.ActiveCfg = Release|x64 - {3D0370CA-BED2-4657-A475-32375CBCB6E4}.All|x64.Build.0 = Release|x64 - {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Debug|Win32.ActiveCfg = Debug|Win32 - {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Debug|Win32.Build.0 = Debug|Win32 - {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Debug|x64.ActiveCfg = Debug|x64 - {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Debug|x64.Build.0 = Debug|x64 - {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Release|Win32.ActiveCfg = Release|Win32 - {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Release|Win32.Build.0 = Release|Win32 - {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Release|x64.ActiveCfg = Release|x64 - {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Release|x64.Build.0 = Release|x64 {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|Win32.ActiveCfg = Debug|x64 {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64.ActiveCfg = Debug|x64 {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64.Build.0 = Debug|x64 @@ -3005,7 +2992,6 @@ Global {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} {F057DA7F-79E5-4B00-845C-EF446EF055E3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} {E727E8F6-935D-46FE-8B0E-37834748A0E3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {3D0370CA-BED2-4657-A475-32375CBCB6E4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} {155844C3-EC5F-407F-97A4-A2DDADED9B2F} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} {0DF3ABD0-DDC0-4265-B778-07C66780979B} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A} = {C120A020-773F-4EA3-923F-B67AF28B750D} diff --git a/libs/.gitignore b/libs/.gitignore index 49d7177e88..f66304d9f7 100644 --- a/libs/.gitignore +++ b/libs/.gitignore @@ -854,3 +854,5 @@ flite-*/ flite-* pcre-*/ pcre-* +libsndfile-*/ +libsndfile-* diff --git a/libs/libsndfile/.update b/libs/libsndfile/.update deleted file mode 100644 index cbf0edf709..0000000000 --- a/libs/libsndfile/.update +++ /dev/null @@ -1 +0,0 @@ -Fri Feb 28 03:45:32 CDT 2014 diff --git a/libs/libsndfile/AUTHORS b/libs/libsndfile/AUTHORS deleted file mode 100644 index b7e2232b95..0000000000 --- a/libs/libsndfile/AUTHORS +++ /dev/null @@ -1,14 +0,0 @@ -The main author of libsndfile is Erik de Castro Lopo -apart from code in the following directories: - - - src/GSM610 : Written by Jutta Degener and Carsten - Bormann . They should not be contacted in relation to - libsndfile or the GSM 6.10 code that is part of libsndfile. Their original - code can be found at: - - http://kbs.cs.tu-berlin.de/~jutta/toast.html - - - src/G72x : Released by Sun Microsystems, Inc. to the public domain. Minor - modifications were required to integrate these files into libsndfile. The - changes are listed in src/G72x/ChangeLog. - diff --git a/libs/libsndfile/COPYING b/libs/libsndfile/COPYING deleted file mode 100644 index c396169eea..0000000000 --- a/libs/libsndfile/COPYING +++ /dev/null @@ -1,503 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - diff --git a/libs/libsndfile/Cfg/.empty b/libs/libsndfile/Cfg/.empty deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libs/libsndfile/ChangeLog b/libs/libsndfile/ChangeLog deleted file mode 100644 index d22be00cd7..0000000000 --- a/libs/libsndfile/ChangeLog +++ /dev/null @@ -1,9764 +0,0 @@ -2013-04-05 Erik de Castro Lopo - - * Makefile.am - Make sure checkprograms are built as part of 'make test-tarball'. - Closes: https://github.com/erikd/libsndfile/issues/37 - -2013-03-29 Erik de Castro Lopo - - * tests/dft_cmp.c - Fix a buffer overflow detected using GCC 4.8's -fsantiize=address runtime - error checking functionality. This was a buffer overflow in libsndfile's - test suite, not in the actual library code. - -2013-03-09 Erik de Castro Lopo - - * M4/gcc_version.m4 - Fix to work with OpenBSD's sed. - -2013-03-07 Erik de Castro Lopo - - * src/ALAC/alac_encoder.c - Patch from Michael Pruett (author of libaudiofile) to add correct byte - swapping for the mChannelLayoutTag field. - -2013-03-02 Erik de Castro Lopo - - * doc/bugs.html - Bugs should bt reported on the github issue tracker. - -2013-02-22 Erik de Castro Lopo - - * configure.ac - Improve sanitization of FLAC_CFLAGS value. - -2013-02-21 Erik de Castro Lopo - - * src/Makefile.am - Call python interpreter instead of using '#!' in script. Thanks to Jan - Stary for reporting this. - - * doc/index.html doc/FAQ.html - Make internal links relative. Patch from Jan Stary. - -2013-02-13 Erik de Castro Lopo - - * src/test_endswap.def src/test_endswap.tpl - Add tests for psf_put_be32() and psf_put_be64(). - - * src/sfendian.h src/test_endswap.(def|tpl) - Add functions psf_get_be(16|32|64) with tests. - These are needed for platforms where un-aligned accesses cause bus faults. - - * src/ALAC/ag_enc.c src/ALAC/alac_decoder.c - Replace all un-aligned accesses with safe alternatives. - Closes: https://github.com/erikd/libsndfile/issues/19 - -2013-02-12 Erik de Castro Lopo - - * src/sfendian.h - Add big endian versions of H2BE_16 and H2BE_32. - -2013-02-11 Erik de Castro Lopo - - * src/ALAC/ - Replace Apple endswap routines with ones from libsndfile. - - * merge from libsndfile-cart repo - Add ability to set and get a cart chunk with WAV and RF64. - Orignal patch by Chris Roberts required a number of - tweaks. - -2013-02-10 Erik de Castro Lopo - - * src/common.h - Bump SF_HEADER_LEN from 8192 to 12292, the value it was in the 1.0.25 - release. - -2013-02-09 Erik de Castro Lopo - - * src/alac.c - Fix segfault when encoding 8 channel files. - Closes: https://github.com/erikd/libsndfile/issues/30 - -2013-02-07 Erik de Castro Lopo - - * src/ALAC/EndianPortable.c - Fall back to compiler's __BYTE_ORDER__ for endian-ness detection. - -2013-02-06 Erik de Castro Lopo - - * configure.ac src/common.h src/ima_adpcm.c src/ms_adpcm.c src/paf.c - Drop tests for and #ifdef hackery for C99 struct flexible array feature. - libsndfile assumes the compiler supports most of the ISO C99 standard. - - * src/alac.c - Fix valgrind invalid realloc. Reported by nu774. - Closes: https://github.com/erikd/libsndfile/issues/31 - -2013-02-05 Erik de Castro Lopo - - * src/alac.c - The 'pakt' chunk header should now be written correctly. - Closes: https://github.com/erikd/libsndfile/issues/24 - - * configure.ac Makefile.am - Use PKG_INSTALLDIR when it exists. Suggestion from Christoph Thompson. - Closes: https://github.com/erikd/libsndfile/pull/28 - -2013-02-03 Erik de Castro Lopo - - * src/common.h src/caf.c - Read the ALAC 'pakt' header and stash the values. - - * src/sfendian.h - Add functions psf_put_be64() and psf_put_be32(). - - * src/alac.c - Start work on filling on the 'pakt' chunk header. - -2013-02-02 Erik de Castro Lopo - - * doc/FAQ.html - Add missing opening

tag. - - * src/alac.c - Increase ALAC_BYTE_BUFFER_SIZE to 82000. - -2013-01-27 Erik de Castro Lopo - - * doc/FAQ.html - Improve question #8. - -2013-01-02 Erik de Castro Lopo - - * src/ogg_opus.c - Add skeleton implementation so someone else can run with it. - -2012-12-12 Erik de Castro Lopo - - * src/common.h src/dwd.c src/rx2.c src/txw.c - Fix for compiling when configured with --enable-experimental. Thanks to - Eric Wong for reporting this. - -2012-12-01 Erik de Castro Lopo - - * configure.ac programs/sndfile-play.c - OS X 10.8 uses a different audio API to previous versions. - Fix compile failure on by disabling sndfile-play on this version. - Someone needs to supply code for the new API. - -2012-11-30 Erik de Castro Lopo - - * Octave/Makefile.am Octave/octave_test.sh - Fix 'make distcheck'. - -2012-10-13 Erik de Castro Lopo - - * M4/octave.m4 - Relax constraints on Octave version. - -2012-10-11 Erik de Castro Lopo - - * tests/utils.tpl - Improve compare_*_or_die() functions. - - * src/command.c - Fix bug reported by Keiler Florian. When reading short or int data from a - file containing float data, and setting SFC_SET_SCALE_FLOAT_INT_READ to - SF_TRUE would fail 3, 5, 7 and other channels counts. Problem was that - psf_calc_signal_max() was not calculating the signal max correctly. - Calculation of the signal max was failing because it was trying to read - a sample count that was not an integer multiple of the channel count. - - * tests/channel_test.c tests/Makefile.am tests/test_wrapper.sh.in - Add test for the above. - -2012-09-25 Erik de Castro Lopo - - * src/sndfile.hh - Added a constructor to allow the use of SF_VIRTUAL_IO. Patch from - DannyDaemonic : https://github.com/erikd/libsndfile/pull/20 - -2012-08-23 Erik de Castro Lopo - - * doc/octave.html - Fix link to octave.sourceforge.net. Thanks to IOhannes m zmoelnig. - - * src/mat5.c - Allow reading of mat5 files without a specified sample rate (default to - 44.1kHz). Thanks to IOhannes m zmoelnig. - -2012-08-19 Erik de Castro Lopo - - * src/paf.c - Error out if channel count is zero. Bug report from William ELla via - launchpad: - https://bugs.launchpad.net/ubuntu/+source/libsndfile/+bug/1036831 - -2012-08-04 Erik de Castro Lopo - - * configure.ac programs/sndfile-play.c - Patch from Ricci Adams to use OSX's AudioQueues on OSX 10.7 and greater. - -2012-07-09 Erik de Castro Lopo - - * programs/common.c - Accept "ogg" as a file extention for Ogg/Vorbis files. - -2012-06-22 Erik de Castro Lopo - - * src/flac.c - Make sure any previously allocated FLAC stream encoder and stream decoder - objects are deleted before a new one is allocated. - -2012-06-20 Erik de Castro Lopo - - * tests/utils.tpl - Rename gen_lowpass_noise_float() to gen_lowpass_signal_float() and add a - sine wave component so that different FLAC compression levels can be - tested. - - * src/sndfile.h.in doc/command.html - Add SFC_SET_COMPRESSION_LEVEL and document it. - - * src/sndfile.c - Catch SFC_SET_VBR_ENCODING_QUALITY command and implement it as the inverse - of SFC_SET_COMPRESSION_LEVEL. - - * src/ogg_vorbis.c src/flac.c - Implement SFC_SET_COMPRESSION_LEVEL command. - - * tests/test_wrapper.sh.in tests/compression_size_test.c - Use the compression_size_test on FLAC as well. - -2012-06-19 Erik de Castro Lopo - - * tests/ - Rename vorbis_test.c -> compression_size_test.c so it can be extended to - test FLAC as well. - -2012-06-18 Erik de Castro Lopo - - * src/broadcast.c - Fix a bug where a file with a 'bext' chunk with a zero length coding - history field would get corrupted when the file was closed. - Reported by Paul Davis of the Ardour project. - - * src/test_broadcast_var.c - Add a test for the above. - -2012-05-19 Erik de Castro Lopo - - * src/sndfile.c - sf_format_check: For SF_FORMAT_AIFF, reject endian-ness setttings for - non-PCM formats. - -2012-04-12 Erik de Castro Lopo - - * src/aiff.c - Fix regression in handling of odd length SSND chunks. - Thanks Olivier Tristan for the example file. - - * src/aiff.c src/wav.c - Exit parser loop when marker == 0. - -2012-04-04 Erik de Castro Lopo - - * doc/FAQ.html - Fix text. Thanks to Richard Collins. - -2012-03-24 Erik de Castro Lopo - - * src/caf.c - Exit parse loop if the marker is zero. Pass jump offsets as size_t instead - of int. - -2012-03-20 Erik de Castro Lopo - - * src/alac.c - Fix segfault when decoding CAF/ALAC file with more than 4 channels. - Fixes github issue #8 reported by Charles Van Winkle. - -2012-03-20 Erik de Castro Lopo - - * src/common.h - Change 'typedef SF_CHUNK_ITERATOR { ... } SF_CHUNK_ITERATOR' into 'struct - SF_CHUNK_ITERATOR { ... }' to prevent older compilers from complaining of - re-typedef-ing of SF_CHUNK_ITERATOR. - - * configure.ac - Fix if test for empty $prefix. - -2012-03-18 Erik de Castro Lopo - - * src/*.c tests/chunk_test.c - Reworking of custom chunk handling code. - - Memory for the iterator is now attached to the SF_PRIVATE struct and - freed one sf_close(). - - Rename sf_create_chunk_iterator() -> sf_get_chunk_iterator(). - - Each SNDFILE handle never has more than one SF_CHUNK_ITERATOR handle. - - * tests/string_test.c - Fix un-initialised char buffer. - -2012-03-17 Erik de Castro Lopo - - * src/*.c tests/chunk_test.c - Add improved handling of custom chunk getting and settings. Set of patches - from IOhannes m zmoelnig submitted via github pull request #6. - - * src/alac.c - Fix calculated frame count for files with zero block length. - -2012-03-13 Erik de Castro Lopo - - * src/avr.c - Remove double assignment to psf->endian. Thanks Kao Dome. - - * src/gsm610.c - Fix clearing of buffers. Thanks Kao Dome. - - * src/paf.c - Remove duplicate code. Thanks Kao Dome. - - * src/test_strncpy_crlf.c - Fix minor error in test. Thanks Kao Dome. - - * src/common.h src/*.c - Fix a bunch of valgrind errors. - -2012-03-13 Erik de Castro Lopo - - * src/sndfile.c - Fix typo in error string 'Uknown' -> 'Unknown'. - - * tests/fix_this.c - Fix potential int overflow. - -2012-03-10 Erik de Castro Lopo - - * src/alac.c - Fix decoding of last block so that the decode length is not a multiple of - the block length. Fixes github issue #4 reported by Charles Van Winkle. - - * src/sfconfig.h src/sfendian.h - Fix for MinGW cross compiling. Use '#if (defined __*66__)' instead of - '#if __*86__' because the MinGW header use '#ifdef __x86_64__'. - -2012-03-10 Erik de Castro Lopo - - * src/ALAC/ src/alac.c - Unify the interface between libsndfile and Apple ALAC codec. Regardless of - file bit width samples are now passed between the two as int32_t that are - justified towards the most significant bit. Without this modification, 16 - conversion functions would have been needed between the libsndfile (short, - int, float, double) types and the ALAC types (16, 20, 24 and 32 bit). With - this mod, only 4 are needed. - - * tests/floating_point_test.tpl tests/write_read_test.(def|tpl) - Add tests for 20 and 24 bit ALAC/CAF files. - - * src/command.c - Add ALAC/CAF to the SFC_GET_FORMAT_* commands. Fixes github issue #5. - - * configure.ac - Only use automake AM_SLIENT_RULES where supported. Thanks Dave Yeo. - - * tests/pipe_test.tpl - Disable tests on OS/2. Thanks Dave Yeo. - -2012-03-09 Erik de Castro Lopo - - * configure.ac src/sfconfig.h src/sfendian.h - For GCC, use inline assembler for endian swapping. This should work with - older versions of GCC like the one currently used in OS/2. - -2012-03-06 Erik de Castro Lopo - - * src/alac.c - Make sure temp file gets opened in binary mode. - - * src/alac.c src/common.c src/common.h - Fix function alac_write16_d(). - - * tests/floating_point_test.tpl - Add tests for 16 bit ALAC/CAF. - - * src/alac.c src/common.c src/common.h - Add support for 32 bit ALAC/CAF files. - - * tests/floating_point_test.tpl tests/write_read_test.tpl - Add tests for 32 bit ALAC/CAF files. - -2012-03-05 Erik de Castro Lopo - - * src/ - Refactor chunk storage so it work on big as well as little endian CPUs. - - * tests/chunk_test.c - Clean up error messages. - - * src/sfendian.h src/*.c - Rename endian swapping macros and add ENDSWAP_64 and BE2H_64. - - * configure.ac - Detect presence of header file. - - * src/sfendian.h - Use intrinsics (ie for MinGW) when is not - present. - Make ENDSWAP_64() work with i686-w64-mingw32 compiler. - - * src/ALAC/EndianPortable.c - Add support for __powerpc__. - - * src/sfconfig.h - Make sure HAVE_X86INTRIN_H is either 1 or 0. - -2012-03-03 Erik de Castro Lopo - - * src/ALAC/* - Big dump of code for Apple's ALAC file format. The copyyright to this code - is owned by Apple who have released it under an Apache style license. A few - small modifications were made to allow this to be integrated into libsndfile - but unfortunately the history of those changes were lost because they were - developed in a Bzr tree and during that time libsndfile moved to Git. - - * src/alac.c src/caf.c src/common.[ch] src/Makefile.am src/sndfile.h.in - src/sndfile.c - Hook new ALAC codec in. - - * programs/sndfile-convert.c - Add support for alac codec. - - * tests/write_read_test.tpl - Expand tests to cover ALAC. - -2012-03-02 Erik de Castro Lopo - - * src/aiff.c src/wav.c - Fix a couple of regressions from version 1.0.25. - -2012-03-01 Erik de Castro Lopo - - * src/strings.c - Minor refactoring. Make sure that the memory allocation size if always > 0 - to avoid undefined behaviour. - -2012-02-29 Erik de Castro Lopo - - * src/chunk.c - Fix buffer overrun introduced in recently added chunk logging. This chunk - logging has not yet made it to a libsndfile release version. Thanks to - Olivier Tristan for providing an example file. - - * src/wav.c - Fix handling of odd sized chunks which was causing the parser to lose some - chunks. Thanks to Olivier Tristan for providing an example file. - -2012-02-26 Erik de Castro Lopo - - * tests/util.tpl - Used gnu_printf format checking with mingw-w64 compiler. - - * tests/header_test.tpl - Printf format fixes. - -2012-02-25 Erik de Castro Lopo - - * M4/extra_pkg.m4 - Update PKG_CHECK_MOD_VERSION macro to add an AC_TRY_LINK step. This fix - allows the configure process to catch attempts to link incompatible - libraries. For example, linking 32 bit version of eg libFLAC to a 64 bit - version of libsndfile will now fail. Similarly, when cross compiling - libsndfile from Linux to Windows linking the Linux versions of a library - to the Windows version of libsndfile will now also fail. - - * src/sndfile.h.in src/sndfile.c src/common.h src/create_symbols_file.py - Add API function sf_current_byterate(). - - * src/dwvw.c src/flac.c src/ogg_vorbis.c src/sds.c - Add codec specific handlers for current byterate. - - * tests/floating_point_test.tpl - Add initial test for sf_current_byterate(). - -2012-02-24 Erik de Castro Lopo - - * src/common.[ch] - Add function psf_decode_frame_count(). - - * src/dwvw.c - Fix a termnation bug that caused the decoder to go into an infinite loop. - -2012-02-24 Erik de Castro Lopo - - * src/wav.c - Fix a regression in the WAV header parser. Thanks to Olivier Tristan for - bug report and the example file. - -2012-02-21 Erik de Castro Lopo - - * src/sndfile.c - Return error when SF_BROADCAST_INFO struct has bad coding_history_size. - Thanks to Alex Weiss for the report. - -2012-02-20 Erik de Castro Lopo - - * src/au.c src/flac.c src/g72x.c src/ogg_vorbis.c src/wav_w64.c - Don't fake psf->bytewidth values. - -2012-02-19 Erik de Castro Lopo - - * tests/string_test.c - Fix valgrind warnings. - - * src/common.h src/sndfile.c src/strings.c - Make string storage dynamically allocated. - - * src/sndfile.c - Add extra validation for custom chunk handling. - -2012-02-18 Erik de Castro Lopo - - * src/wav.c - Improve handlling unknown chunk types. Thanks to Olivier Tristan for sending - example files. - - * src/utils.tpl - Add GCC specific testing for format string parameters for exit_if_true(). - - * tests/*.c tests/*.tpl - Fix all printf format warnings. - - * programs/sndfile-play.c - Remove un-needed OSX include . Thanks jamesfmilne for github - issue #3. - - * tests/chunk_test.c - Extend custom chunk test. - -2012-02-12 Erik de Castro Lopo - - * src/wav.c - Jump over some more chunk types while parsing. - -2012-02-04 Erik de Castro Lopo - - * src/common.h src/strings.c - Change way strings are stored in SF_PRIVATE in preparation for dynamically - allocating the storage. - -2012-02-02 Erik de Castro Lopo - - * src/common.h src*.c - Improve encapsulation of string data in SF_PRIVATE. - -2012-02-01 Erik de Castro Lopo - - * src/common.h src*.c - Remove the buffer union from SF_PRIVATE. Most uses of this have been - replaced with a BUF_UNION that is allocated on the stack. - -2012-01-31 Erik de Castro Lopo - - * src/common.h src*.c - Rename logbuffer field of SF_PRIVATE to parselog and reduce its size. - Put the parselog buffer and the index inside a struct within SF_PRIVATE. - -2012-01-26 Erik de Castro Lopo - - * configure.ac - Fix typo, FLAC_CLFAGS -> FLAC_CFLAGS. Thanks to Jeremy Friesner. - -2012-01-21 Erik de Castro Lopo - - * src/sndfile.c src/ogg.c - Fix misleading error message when trying to create an SF_FORMAT_OGG file - with anything other than SF_FORMAT_FILE. Thanks to Charles Van Winkle for - the bug report. Github issue #1. - -2012-01-20 Erik de Castro Lopo - - * src/sndfile.c src/wav.c - Allow files opened in RDWR mode with string data in the tailer to be - extended. Thanks to Bodo for the patch. - - * tests/string_test.c - Add tests for the above changes (patch from Bodo). - -2012-01-09 Erik de Castro Lopo - - * src/aiff.c - Refactor reading of chunk size and use of psf_store_read_chunk(). - - * src/(caf|wav).c - Correct storing of chunk offset. - -2012-01-05 Erik de Castro Lopo - - * src/aiff.c src/wav.c src/common.h - Refactor common code into src/common.h. - - * src/caf.c - Make custom chunks work for CAF files. - - * tests/chunk_test.c tests/test_wrapper.sh.in - Test CAF files with custom chunks. - - * src/sndfile.c - Prevent psf->codec_close() being called more than once. - -2012-01-04 Erik de Castro Lopo - - * programs/sndfile-cmp.c - Catch the case where the second file has more frames than the first. - -2012-01-02 Erik de Castro Lopo - - * src/create_symbols_file.py - Add sf_set_chunk/sf_get_chunk_size/sf_get_chunk_data. - -2011-12-31 Erik de Castro Lopo - - * tests/chunk_test.c tests/Makefile.am - New test for custom chunks. - - * src/aiff.c src/chunk.c src/common.h src/sndfile.c - Make custom chunks work on AIFF files. - - * src/wav.c - Make custom chunks work on WAV files (includes refactoring). - -2011-11-12 Erik de Castro Lopo - - * src/sndfile.h.in src/common.h src/sndfile.c - Start working on setting/getting chunks. - -2011-11-24 Erik de Castro Lopo - - * src/binheader_writef_check.py src/create_symbols_file.py - Make it work for Python 2 and 3. Thanks Michael. - -2011-11-19 Erik de Castro Lopo - - * libsndfile.spec.in - Change field name 'URL' to 'Url'. - - * src/sndfile.h.in - Add SF_SEEK_SET/CUR/END. - -2011-11-05 Erik de Castro Lopo - - * src/id3.c - Fix a stack overflow that can occur when parsing a file with multiple - ID3 headers which would cause libsndfile to go into an infinite recursion - until it blew the stack. Thanks to Anders Svensson for supplying an example - file. - -2011-10-30 Erik de Castro Lopo - - * src/double64.c src/float32.c src/common.h - Make (float32|double_64)_(be|le)_read() functions const correct. - -2011-10-28 Erik de Castro Lopo - - * src/sfendian.h - Minor tweaking of types. Cast to ptr to correct final type rather void*. - - * programs/sndfile-play.c tests/utils.tpl - Fix compiler warnings with latest MinGW cross compiler. - -2011-10-13 Erik de Castro Lopo - - * src/file_io.c - Use the non-deprecated resource fork name on OSX. Thanks to Olivier Tristan. - -2011-10-12 Erik de Castro Lopo - - * src/wav.c - Jump over the 'olym' chunks when parsing. - -2011-10-06 Erik de Castro Lopo - - * tests/write_read_test.tpl - Remove windows only truncate() implementation. - -2011-09-04 Erik de Castro Lopo - - * src/sd2.c src/sndfile.c - Make sure 23 bit PCM SD2 files are readable/writeable. - - * tests/write_read_test.tpl - Add tests for 32 bit PCM SD2 files. - -2011-08-23 Erik de Castro Lopo - - * configure.ac - Use AC_SYS_LARGEFILE instead of AC_SYS_EXTRA_LARGEFILE as suggested by - Jan Willies. - -2011-08-07 Erik de Castro Lopo - - * configure.ac Makefile.am - Move ACLOCAL_AMFLAGS setup to Makefile.am. - -2011-07-15 Erik de Castro Lopo - - * doc/command.html - Merge two separate blocks of SFC_SET_VBR_ENCODING_QUALITY documentation. - - * src/paf.c - Replace ppaf24->samplesperblock with a compile time constant. - -2011-07-13 Erik de Castro Lopo - - * src/ogg_vorbis.c - Fix return value of SFC_SET_VBR_ENCODING_QUALITY command. - - * doc/command.html - Document SFC_SET_VBR_ENCODING_QUALITY, SFC_GET/SET_LOOP_INFO and - SFC_GET_INSTRUMENT. - - * NEWS README configure.ac doc/*.html - Updates for 1.0.25. - -2011-07-07 Erik de Castro Lopo - - * src/sfconfig.h - Add handling for HAVE_SYS_WAIT_H. - - * Makefile.am src/Makefile.am tests/Makefile.am - Add 'checkprograms' target. - -2011-07-05 Erik de Castro Lopo - - * src/common.h src/sndfile.c - Purge SF_ASSERT macro. Use standard C assert instead. - - * src/paf.c src/common.h src/sndfile.c - Fix for Secunia Advisory SA45125, heap overflow (heap gets overwritten with - byte value of 0) due to integer overflow if PAF file handler. - - * src/ima_adpcm.c src/ms_adpcm.c src/paf.c - Use calloc instead of malloc followed by memset. - - * tests/utils.tpl - Clean up use of memset. - -2011-07-05 Erik de Castro Lopo - - * src/ogg.c - Fix log message. - - * tests/format_check_test.c - Fix compiler warnings. - -2011-07-04 Erik de Castro Lopo - - * src/sndfile.c - Fix error message for erro code SFE_ZERO_MINOR_FORMAT. - - * tests/format_check_test.c - Add a test to for SF_FINFO format field validation. - - * src/ogg.c src/ogg_vorbis.c src/ogg.h src/ogg_pcm.c src/ogg_speex.c - src/common.h src/Makefile.am - Move vorbis specific code to ogg_vorbis.c, add new files for handling PCM - and Speex codecs in an Ogg container. The later two are only enabled with - ENABLE_EXPERIMENTAL_CODE config variable. - -2011-06-28 Erik de Castro Lopo - - * src/strings.c - Clean up and refactor storage of SF_STR_SOFTWARE. - -2011-06-23 Erik de Castro Lopo - - * src/sndfile.h.in doc/api.html - Fix definition of SF_STR_LAST and update SF_STR_* related docs. Thanks to - Tim van der Molen for the patch. - -2011-06-21 Erik de Castro Lopo - - * programs/sndfile-interleave.c - Fix handling of argc. Thanks to Marius Hennecke. - - * src/wav_w64.c - Accept broken WAV files with blockalign == 0. Thanks to Olivier Tristan for - providing example files. - - * src/wav.c - Jump over 'FLLR' chunks. - -2011-06-14 Erik de Castro Lopo - - * src/sndfile.h.in - Fix -Wundef warning due to ENABLE_SNDFILE_WINDOWS_PROTOTYPES. - - * configure.ac - Add -Wundef to CFLAGS. - - * src/ogg.c - Fix -Wunder warning. - -2011-05-18 Erik de Castro Lopo - - * configure.ac - Use int64_t instead of off_t when they are the same size. - - * src/Makefile.am tests/Makefile.am - Use check_PROGRAMS instead of noinst_PROGRAMS where appropriate. - -2011-05-08 Erik de Castro Lopo - - * src/wav.c - Don't allow unknown and/or un-editable chunks to prevent the file from being - opened in SFM_RDWR mode. - -2011-04-25 Erik de Castro Lopo - - * tests/format_check_test.c - Fix segfault in test program. - -2011-04-25 Erik de Castro Lopo - - * tests/format_check_test.c - New test program to check to make sure that sf_open() and sf_check_format() - agree as to what is a valid program. - - * tests/Makefile.am tests/test_wrapper.sh.in - Hook into build and test runner. - - * src/sndfile.c - Fix some sf_format_check() problems. Thanks to Charles Van Winkle for the - notification. - -2011-04-06 Erik de Castro Lopo - - * src/caf.c - Add validation to size of 'data' chunk and fix size of written 'data' - chunk. Thanks to Michael Pruett for reporting this. - -2011-03-28 Erik de Castro Lopo - - * src/* tests/* programs/* - Fix a bunch of compiler warnings with gcc-4.6. - -2011-03-25 Erik de Castro Lopo - - * tests/util.tpl - Add NOT macro to util.h. - - * src/strings.c - Fix handling of SF_STR_SOFTWARE that resulted in a segfault due to calling - strlen() on an unterminated string. Thanks to Francois Thibaud for reporting - this problem. - - * tests/string_test.c - Add test for SF_STR_SOFTWARE segfault bug. - - * configure.ac - Sanitize FLAC_CFLAGS value supplied by pkg-config which returns a value of - '-I${includedir}/FLAC'. However FLAC also provides an include file - which clashes with the Standard C header of the same name. The - solution is strip the 'FLAC' part off the end and include all FLAC headers - as . - - * configure.ac src/Makefile.am - Use non-recursive make in src/ directory. - -2011-03-23 Erik de Castro Lopo - - * NEWS README docs/*.html - Updates for 1.0.24 release. - -2011-03-22 Erik de Castro Lopo - - * configure.ac - Fix up usage of sed (should not assume GNU sed). - - * M4/add_(c|cxx)flags.m4 - Test flags in isolation. - - * tests/cpp_test.cc - Fix a broken test (test segfaults). Report by Dave Flogeras. - -2011-03-21 Erik de Castro Lopo - - * programs/common.[ch] - Add function program_name() which returns the program name minus the path - from argv [0]. - - * programs/*.c programs/Makefile.am - Use program_name() where appropriate. Fix build. - -2011-03-20 Erik de Castro Lopo - - * src/wav.c - For u-law and A-law files, write an 18 byte 'fmt ' chunk instead of a 16 - byte one. Win98 accepts files with a 16 but not 18 byte 'fmt' chunk. Later - version accept 18 byte but not 16 byte. - -2011-03-15 Erik de Castro Lopo - - * doc/FAQ.html - Add examples for question 12. - - * doc/libsndfile.css.in - Add tweaks for h4 element. - - * doc/api.html - Add documentation for virtual I/O functionality. Thanks to Uli Franke. - - * tests/util.tpl - Add static inline functions sf_info_clear() and sf_info_setup(). - - * tests/(alaw|dwvw|ulaw)_test.c - Use functions sf_info_clear() and sf_info_setup(). - -2011-03-08 Erik de Castro Lopo - - * configure.ac - Fail more gracefully if pkg-config is missing. Suggestion from Brian - Willoughby. - -2011-02-27 Erik de Castro Lopo - - * src/common.c - Use size_t instead of int for size params with varargs. - -2011-02-09 Erik de Castro Lopo - - * doc/index.html - Update supported platforms with more Debian platforms and Android. - -2011-01-27 Erik de Castro Lopo - - * src/sndfile.hh - Add an LPCWSTR version of the SndfileHandle constructor to the SndfileHandle - class definition. Thanks to Eric Eizenman for pointing out this was missing. - - * tests/cpp_test.cc - Add test for LPCWSTR version of the SndfileHandle constructor. - -2011-01-19 Erik de Castro Lopo - - * programs/sndfile-play.c - Remove cruft. - -2010-12-01 Erik de Castro Lopo - - * src/sndfile.hh - Add methods rawHandle() and takeOwnership(). Thanks to Tim Blechmann for - the patch. - - * tests/cpp_test.cc - Add tests for above two methods. Also supplied by Tim Blechmann. - -2010-11-11 Erik de Castro Lopo - - * doc/api.html - Add mention of use of sf_strerror() when sf_open() fails. - -2010-11-01 Erik de Castro Lopo - - * configure.ac - Make TYPEOF_SF_COUNT_T int64_t where possible. This may fix problems where - people are compiling on a 64 bit system with the GCC -m32 flag. - - * src/sndfile.h.in - Fix comments on sf_count_t. - -2010-10-26 Erik de Castro Lopo - - * src/aiff.c - Handle non-zero offset field in SSND chunk. Thanks to Michael Chinen. - -2010-10-20 Erik de Castro Lopo - - * configure.ac - Sed fix for FreeBSD. Thanks Tony Theodore. - -2010-10-14 Erik de Castro Lopo - - * shave.in M4/shave.m4 - Fix shave invocation of windres compiler. Thanks Damien Lespiau (upstream - shave author). - - * configure.ac M4/shave.m4 shave-libtool.in shave.in - Switch from shave to automake-1.11's AM_SILENT_RULES. - -2010-10-13 Erik de Castro Lopo - - * shave-libtool.in shave.in - Sync to upstream version. - - * src/rf64.c - More work to make the parser more robust and accepting of mal-formed files. - -2010-10-12 Erik de Castro Lopo - - * src/common.h - Add functions psf_strlcpy() and psf_strlcat(). - - * src/broadcast.c src/sndfile.c src/strings.c src/test_main.c - src/test_main.h src/test_strncpy_crlf.c - Use functions psf_strlcpy() and psf_strlcat() as appropriate. - - * tests/string_test.c - Add tests for SF_STR_GENRE and SF_STR_TRACKNUMBER. - - * src/rf64.c - Fix size of 'ds64' chunk when writing RF64. - -2010-10-10 Erik de Castro Lopo - - * programs/*.c - Add the libsndfile version to the usage message of all programs. - -2010-10-10 Erik de Castro Lopo - - * configure.ac src/version-metadata.rc.in src/Makefile.am - Add version string resources to the windows DLL. - - * doc/api.html - Update to add missing SF_FORMAT_* values. Closed Debian bug #545257. - - * NEWS README configure.ac doc/*.html - Updates for 1.0.23 release. - -2010-10-09 Erik de Castro Lopo - - * tests/pedantic-header-test.sh.in - Handle unusual values of CC environment variable. - - * src/rf64.c - Minor tweaks and additional sanity checking. - - * src/Makefile.am src/binheader_writef_check.py - Use python 2.6. - -2010-10-08 Erik de Castro Lopo - - * src/sndfile.hh - Add a missing 'inline' before a constructor defintion. - -2010-10-06 Erik de Castro Lopo - - * src/common.h - Add macro NOT. - - * src/rf64.c - Minor tweaks. - - * Makefile.am */Makefile.am - Add *~ to CLEANFILES. - -2010-10-05 Erik de Castro Lopo - - * src/sndfile.c - Fix a typo in the error string for SFE_OPEN_PIPE_RDWR. Thanks to Charles - Van Winkle for the report. - -2010-10-04 Erik de Castro Lopo - - * src/flac.c src/ogg.c src/sndfile.h.in src/strings.c src/wav.c - Add ability to read/write tracknumber and genre to flac/ogg/wav files. - Thanks to Matti Nykyri for the patch. - - * src/common.h src/broadcast.c src/strings.c - Add function psf_safe_strncpy() and use where appropriate. - -2010-10-04 Erik de Castro Lopo - - * NEWS README configure.ac doc/*.html - Updates for 1.0.22 release. - -2010-10-03 Erik de Castro Lopo - - * src/common.h src/broadcast.c src/rf64.c src/sndfile.c src/wav.c - Rewrite of SF_BROADCAST_INFO handling. - - * src/test_broadcast_var.c tests/command_test.c - Tweak SF_BROADCAST_INFO tests. - - * src/test_broadcast_var.c - Fix OSX stack check error. - -2010-09-30 Erik de Castro Lopo - - * src/sds.c - Set sustain_loop_end to 0 as suggested by Brian Lewis. - -2010-09-29 Erik de Castro Lopo - - * src/sds.c - Make sure the correct frame count gets written into the header. - - * tests/write_read_test.tpl - Don't allow SDS files to have a long frame count. - -2010-09-17 Erik de Castro Lopo - - * src/sds.c - Apply a pair of patches from Brian Lewis to fix the packet number location - and the checksum. - -2010-09-10 Erik de Castro Lopo - - * src/aiff.c src/file_io.c src/ogg.c src/rf64.c src/sndfile.c - src/strings.c src/test_audio_detect.c src/test_strncpy_crlf.c - src/wav.c tests/pcm_test.tpl - Fix a bunch of minor issues found using static analysis. - -2010-08-23 Erik de Castro Lopo - - * src/test_broadcast_var.c - New file containing tests for broadcast_set_var(). - - * src/Makefile.am src/test_main.[ch] - Hook test_broadcast_var.c into tests. - -2010-08-22 Erik de Castro Lopo - - * src/broadcast.c src/common.(c|h) - Move function strncpy_crlf() to src/common.c so the function can be tested - in isolation. - - * src/test_strncpy_crlf.c - New file. - - * src/Makefile.am src/test_main.[ch] - Hook test_strncpy_crlf.c into tests. - -2010-08-18 Erik de Castro Lopo - - * src/common.h - Move code around to make comments make sense. - - * src/broadcast.c - Add debugging code that is disabled by default. - -2010-08-02 Erik de Castro Lopo - - * src/flac.c - When the file meta data says the file has zero frames set psf->sf.frames - to SF_COUNT_MAX. Fixes Debian bug #590752. - - * programs/sndfile-info.c - Print 'unknown' if frame count == SF_COUNT_MAX. - -2010-06-27 Erik de Castro Lopo - - * src/sndfile.c - Only support writing mono SVX files. Multichannel SVX files are not - interleaved and there is no support infrastructure to cache and write - multiple channels to create a non-interleaved file. - - * src/file_io.c - Don't call close() on a file descriptor of -1. Thanks to Jeremy Friesner - for the bug report. - -2010-06-09 Erik de Castro Lopo - - * src/common.h - Add macro SF_ASSERT. - - * src/sndfile.c - Use SF_ASSERT to ensure sizeof (sf_count_t) == 8. - - * src/svx.c - Add support for reading and writing stereo SVX files. - -2010-05-07 Erik de Castro Lopo - - * configure.ac - When compiling with x86_64-w64-mingw32-gcc link with -static-libgcc flags. - - * programs/common.c programs/sndfile-metadata-set.c - Update metadata after the audio data is copied. Other minor fixes. Patch - from Marius Hennecke. - -2010-05-04 Erik de Castro Lopo - - * src/nist.c - Fix a regression reported by Hugh Secker-Walker. - - * src/api.html - Add comment about sf_open_fd() not working on Windows if the application - and the libsndfile DLL are linked to different versions of the Microsoft - C runtime DLL. - -2010-04-23 Erik de Castro Lopo - - * tests/pedantic-header-test.sh.in - Fix 'make distcheck'. - -2010-04-21 Erik de Castro Lopo - - * tests/pedantic-header-test.sh.in - New file to test whether sndfile.h can be compiled with gcc's -pedantic - flag. - - * configure.ac tests/test_wrapper.sh.in - Hook pedantic-header-test into test suite. - - * src/sndfile.h.in - Fix -pedantic warning. - -2010-04-19 Erik de Castro Lopo - - * programs/sndfile-salvage.c programs/Makefile.am - New program to salvage the audio data from WAV/WAVEX/AIFF files which are - greater than 4Gig in size. - -2010-04-09 Erik de Castro Lopo - - * programs/sndfile-convert.c - Fix valgrind warning. - -2010-04-06 Erik de Castro Lopo - - * programs/sndfile-cmp.c - When files differ in the PCM data, also print the difference offset. - Minor cleanup. - -2010-03-19 Erik de Castro Lopo - - * src/aiff.c - Don't use the 'twos' marker for 24 and 32 bit PCM, use 'in24' and 'in32' - instead. Thanks to Paul Davis (Ardour) for this suggestion. - -2010-02-28 Erik de Castro Lopo - - * configure.ac - Clean up configure report. - - * tests/utils.tpl - Add functions test_read_raw_or_die and test_write_raw_or_die. - - * tests/rdwr_test.(def|tpl) tests/Makefile.am - Add new test program and hook into build. - - * src/sndfile.c - Fix minor issues with sf_read/write_raw(). Bug reported by Milan Křápek. - - * tests/test_wrapper.sh.in - Add rdwr_test to the test wrapper script. - -2010-02-22 Erik de Castro Lopo - - * configure.ac - Remove -fpascal-strings from OSX's OS_SPECIFIC_CFLAGS. - - * programs/common.[ch] programs/sndfile-metadata-set.c - Apply a patch from Robin Gareus allowing the setting of the time reference - field of the BEXT chunk. - -2010-02-06 Erik de Castro Lopo - - * src/ima_adpcm.c - Add a fix from Jonatan Liljedahl to handle predictor overflow when decoding - IMA4. - -2010-01-26 Erik de Castro Lopo - - * src/sndfile.hh - Add a constructor which takes an existing file descriptor and then calls - sf_open_fd(). Patch from Sakari Bergen. - -2010-01-10 Erik de Castro Lopo - - * programs/sndfile-deinterleave.c programs/sndfile-interleave.c - Improve usage messages. - -2010-01-09 Erik de Castro Lopo - - * src/id3.c src/Makefile.am - Add new file src/id3.c and hook into build. - - * src/sndfile.c src/common.h - Detect and skip and ID3 header at the start of the file. - -2010-01-07 Erik de Castro Lopo - - * programs/common.c - Fix update_strings() copyright, comment, album and license are correctly - written. Thanks to Todd Allen for reporting this. - - * man/Makefile.am - Change GNU makeism to something more widely supported. Thanks to Christian - Weisgerber for reporting this. - - * configure.ac programs/Makefile.am programs/sndfile-play.c - Apply patch from Christian Weisgerber and Jacob Meuserto add support for - OpenBSD's sndio. - -2010-01-05 Erik de Castro Lopo - - * doc/api.html - Discourage the use of sf_read/write_raw(). - -2009-12-28 Erik de Castro Lopo - - * configure.ac - Test for Unix pipe() and waitpid() functions. - - * src/sfconfig.h tests/pipe_test.tpl - Disable pipe_test if pipe() and waitpid() aren't available. - -2009-12-16 Erik de Castro Lopo - - * configure.ac src/Makefile.am src/create_symbols_file.py - src/make-static-lib-hidden-privates.sh - Change name of generated file src/Symbols.linux to Symbols.gnu-binutils and - and use the same symbols file for other systems which use GNU binutils like - Debian's kfreebsd. - - * M4/shave.m4 shave.in - Update shave files from upstream. - -2009-12-15 Erik de Castro Lopo - - * man/sndfile-metadata-get.1 - Fix typo. - - * man/sndfile-interleave.1 man/Makefile.am - New man page. - -2009-12-13 Erik de Castro Lopo - - * src/ogg.c - When decoding to short or int, clip the decoded signal to [-1.0, 1.0] if - its too hot. Thanks to Dmitry Baikov for suggesting this. - - * NEWS README doc/*.html - Updates for 1.0.21. - -2009-12-09 Erik de Castro Lopo - - * programs/sndfile-jackplay.c man/sndfile-jackplay.1 - Remove these which will now be in found in the sndfile-tools package. - - * programs/Makefile.am man/Makefile.am - Remove build rules for sndfile-jackplay. - - * configure.ac - Remove detection of JACK Audio Connect Kit. - - * programs/sndfile-concat.c man/sndfile-concat.1 - Add new program with man page. - - * man/Makefile.am programs/Makefile.am - Hook sndfile-concat into build system. - -2009-12-08 Erik de Castro Lopo - - * tests/error_test.c - Don't terminate when sf_close() returns zero in error_close_test(). - It seems that Windows 7 behaves differently from earlier versions of - Windows. - -2009-12-03 Erik de Castro Lopo - - * configure.ac M4/*.m4 - Rename all custom macros from AC_* to MN_*. - - * programs/sndfile-interleave.c - Make it actually work. - -2009-12-02 Erik de Castro Lopo - - * doc/*.html configure.ac - Corrections and clarifications courtesy of Robin Forder. - - * programs/sndfile-convert.c programs/common.[ch] - Move some code from convert to common for reuse. - - * programs/sndfile-interleave.c programs/sndfile-interleave.c - Add new programs sndfile-interleave and sndfile-deinterleave. - - * programs/Makefile.am - Hook new programs into build. - -2009-12-01 Erik de Castro Lopo - - * src/create_symbols_file.py tests/stdio_test.c tests/win32_test.c - Minor OS/2 tweaks as suggested by David Yeo. - - * tests/multi_file_test.c - Fix file creation flags on windows. Thanks to Bruce Sharpe. - - * src/sf_unistd.h - Set all group and other file create permssions to zero. - - * tests/win32_test.c - Add a new test. - -2009-11-30 Erik de Castro Lopo - - * doc/print.css doc/*.html - Add a print stylesheet and update all HTML documents to reference it. - Thanks to Aditya Bhargava for suggesting this. - - * doc/index.html - Minor corrections. - -2009-11-29 Erik de Castro Lopo - - * sndfile.pc.in - Add a Libs.private entry to assist with static linking. - -2009-11-28 Erik de Castro Lopo - - * src/make-static-lib-hidden-privates.sh src/Makefile.am - Add a script to hide all non-public symbols in the libsndfile.a static - library. - -2009-11-22 Erik de Castro Lopo - - * tests/locale_test.c - Correct usage of ENABLE_SNDFILE_WINDOWS_PROTOTYPES. - -2009-11-20 Erik de Castro Lopo - - * src/windows.c - Correct usage of ENABLE_SNDFILE_WINDOWS_PROTOTYPES. - -2009-11-16 Erik de Castro Lopo - - * programs/sndfile-convert.c - Allow the program to read from stdin by specifying '-' on the command line - as the input file. - - * src/sndfile.h.in - Hash define ENABLE_SNDFILE_WINDOWS_PROTOTYPES to 1 for greater safety. - - * tests/virtual_io_test.c - Add a PAF/PCM_24 test and verify the file length is not negative - immediately after openning the file for write. - -2009-10-18 Erik de Castro Lopo - - * src/wav.c - When writing loop lengths, adjust the end position by one to make up for - Microsoft's screwed up spec. Thanks to Olivier Tristan for the patch. - -2009-10-14 Erik de Castro Lopo - - * src/flac.c - Apply patch from Uli Franke allowing FLAC files to be encoded at any sample - rate. - -2009-10-09 Erik de Castro Lopo - - * src/nist.c - Fix parsing of odd ulaw encoded file provided by Jan Silovsky. - - * configure.ac - Insist on libvorbis >= 1.2.3. Earlier verions have bugs that cause the - libsndfile test suite to fail on MIPS, PowerPC and others. - See: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=549899 - -2009-10-06 Erik de Castro Lopo - - * man/sndfile-convert.1 - Fix warning from Debian's lintian checks. - - * man/sndfile-cmp.1 man/sndfile-jackplay.1 man/sndfile-metadata-get.1 - man/Makefile.am - Add three new minimal manpages and hook into build. - -2009-10-05 Erik de Castro Lopo - - * tests/test_wrapper.sh.in - Don't run cpp_test on x86_64-w64-mingw32. - -2009-09-28 Erik de Castro Lopo - - * tests/utils.tpl - On windows, make sure the open() function doesn't get called with a third - parameter of 0 which fails for no good reason. Also make sure this third - parameter doesn't get called with S_IRGRP when compiling for windows because - Wine complains. - - * src/sndfile.hh - Add a SndfileHandle constructor for windows that takes a 'const wchar_t *' - string. - - * doc/FAQ.html - Add Q/A : I'm cross compiling libsndfile for another platform. How can I - run the test suite? - - * src/create_symbols_file.py src/Makefile.am - Add Symbols.static target, a list of symbols, one per line. - -2009-09-27 Erik de Castro Lopo - - * tests/test_wrapper.sh.in - Update to allow all tests to be gathered up into a testsuite tarball and - then be run using this script. - - * build-test-tarball.mk.in - Add a Make script to build a tarball of all the test binaries and the test - wrapper script. This is useful for cross compiling; you can build the - binaries, build test test tarball and transfer the test tarball to the - target machine for testing. - -2009-09-26 Erik de Castro Lopo - - * src/common.h src/*.c - Modify SF_FILE struct to allow it to carry either 8-bit or 16-bit strings - for the file path, directory and name. Fixes for this change throughout. - - * src/windows.c src/Makefile.am - New file defining new windows only public function sf_wchar_open() which - takes a 'const wchar_t *' string (LPCWSTR) for the file name parameter. - - * src/sndfile.h.in - Add SF_CHANNEL_MAP_ABISONIC_* entries. - Add windows only defintion for sf_wchar_open(). - - * src/create_symbols_file.py - Add sf_wchar_open() to the list of public symbols (windows only). - - * tests/locale_test.c - Add a wchar_test() to test sf_wchar_open(). - -2009-09-25 Erik de Castro Lopo - - * src/common.h src/*.c - Split file stuff into PSF_FILE struct within the SF_PRIVATE struct. - -2009-09-23 Erik de Castro Lopo - - * src/aiff.c src/voc.c - When a byte is needed, use unsigned char. - - * src/ima_oki_adpcm.c src/broadcast.c src/test_ima_oki_adpcm.c - Include sfconfig.h to prevent compile errors with MinGW compilers. - - * configure.ac - Remove AM_CONFIG_HEADER due to warnings from autoconf 2.64. - - * tests/locale_test.c - Update to work with xx_XX.UTF-8 style locales. Refactoring. - -2009-09-22 Erik de Castro Lopo - - * configure.ac - Set __USE_MINGW_ANSI_STDIO to 1 when compiling using MinGW compilers. - Remove unneeded AC_SUBST. - Report Host CPU/OS/vendor. - -2009-09-19 Erik de Castro Lopo - - * src/sndfile.c - Fix error message string. - - * src/flac.c - Add 88200 to the list of supported sample rates. - - * src/ogg.c - Fix compiler warning when using gcc-4.5.0. - - * programs/sndfile-info.c tests/utils.tpl - Remove WIN32 snprintf #define. - - * src/ima_adpcm.c - Fix minor bug in aiff_ima_encode_block. Thanks to Denis Fileev for finding - this. - -2009-09-16 Erik de Castro Lopo - - * src/caf.c - Use the correct C99 format specifier for int64_t. - - * M4/endian.m4 - Fix detection of CPU endian-ness when cross compiling. Thanks to Pierre - Ossman for the bug report. - - * src/caf.c src/sndfile.c - Fix reading and writing of PEAK chunks in CAF files. - - * tests/peak_chunk_test.c tests/test_wrapper.sh.in - Run peak_chunk_test on CAF files. - -2009-09-15 Erik de Castro Lopo - - * src/aiff.c src/wav.c - Use the correct C99 format specifier for int64_t. - -2009-08-30 Erik de Castro Lopo - - * src/rf64.c src/sndfile.c src/wav.c src/wav_w64.h - Apply a patch (massaged slightly) from Uli Franke adding handling of the - BEXT chunk in RF64 files. - - * tests/command_test.c - Update channel_map_test() function so WAV test passes. - - * src/rf64.c - Add channel mapping and ambisonic support. - - * src/sndfile.h - Add comments showing correspondance between libsndfile channel map - defintiions and those used by Apple and MS. - - Add handling of reading/writing channel map info. - - * tests/command_test.c tests/test_wrapper.sh.in - Update channel map tests. - -2009-07-29 Erik de Castro Lopo - - * src/common.h - Add function psf_isprint() a replacement for the standard C isprint() - function which ignores any locale settings and treats all input as ASCII. - - * src/(aiff|common|rf64|sd2|strings|svx|wav).c - Use psf_isprint() instead of isprint(). - -2009-07-13 Erik de Castro Lopo - - * src/command.c - Add string descriptions for SF_FORMAT_RF64 and SF_FORMAT_MPC2K. - -2009-06-30 Erik de Castro Lopo - - * programs/sndfile-play.c - Allow use of Open Sound System audio output under FreeBSD. - -2009-06-24 Erik de Castro Lopo - - * configure.ac - Add patch from Conrad Parker to add --disable-jack. - -2009-05-28 Erik de Castro Lopo - - * src/alaw.c src/float32.c src/htk.c src/pcm.c src/sds.c src/ulaw.c - Fix bugs where invalid files can cause a divide by zero error (SIGFPE). - Thanks to Sami Liedes for reporting this a Debian bug #530831. - -2009-05-26 Erik de Castro Lopo - - * src/chanmap.[ch] - New files for channel map decoding/encoding. - -2009-05-25 Erik de Castro Lopo - - * configure.ac src/sndfile.h.in - Fix MSVC definition of sf_count_t. - -2009-05-24 Erik de Castro Lopo - - * src/wav_w64.[ch] - Add wavex_channelmask to WAV_PRIVATE struct and add a function to convert - an array of SF_CHANNEL_MASK_* values into a bit mask for use in WAV files. - - * src/wav.c - Add ability to write the channel mask. - -2009-05-23 Erik de Castro Lopo - - * programs/sndfile-info.c - Add -c command line option to dump the channel map information. - - * src/wav_w64.c - Don't bail from parser if channel map bitmask is faulty. - - * src/common.h src/sndfile.c - Remove error code SFE_W64_BAD_CHANNEL_MAP which is not needed any more. - - * src/sndfile.c - On SFC_SET_CHANNEL_MAP_INFO pass the channel map command down to container's - command handler. - -2009-05-22 Erik de Castro Lopo - - * src/sndfile.h.in src/common.h src/sndfile.c src/wav_w64.c - Apply a patch from Lennart Poettering (PulseAudio) to allow reading of - channel data in WAV and W64 files. - Add a test for the above. - -2009-05-20 Erik de Castro Lopo - - * src/FAQ.html - Update the section about pre-compiled binaries for Win64. - -2009-05-14 Erik de Castro Lopo - - * src/common.h src/test_conversions.c - Be more careful when including so compiling on pre-C99 platforms - (hello Slowlaris) might actually work. - - * NEWS README doc/*.html - Updates for 1.0.20. - -2009-04-21 Erik de Castro Lopo - - * src/voc.c - Fix a bug whereby opening a specially crafted VOC file could result in a - heap overflow. Thanks to Tobias Klein (http://www.trapkit.de) for reporting - this issue. - - * src/aiff.c - Fix potential (heap) buffer overflow when parsing 'MARK' chunk. - -2009-04-12 Erik de Castro Lopo - - * tests/stdin_test.c - Check psf->error after opening file. - - * src/file_io.c - Fix obscure seeking bug reported by Hugh Secker-Walker. - - * tests/utils.tpl - Add check of sf_error to test_open_file_or_die(). - - * src/sndfile.c - Clear error if opening resource fork fails. - -2009-04-11 Erik de Castro Lopo - - * tests/alaw_test.c tests/locale_test.c tests/ulaw_test.c - Cleanup output. - -2009-03-25 Erik de Castro Lopo - - * src/float32.c - Fix f2s_clip_array. - -2009-03-24 Erik de Castro Lopo - - * src/float32.c - In host_read_f2s call convert instead of f2s_array. - - * src/ima_adpcm.c - Remove dead code. - - * src/test_ima_oki_adpcm.c examples/generate.c tests/dither_test.c - tests/dwvw_test.c tests/fix_this.c tests/generate.c - tests/multi_file_test.c - Minor fixes. - -2009-03-23 Erik de Castro Lopo - - * M4/shave.m4 shave.in - Pulled update from upstream. - -2009-03-19 Erik de Castro Lopo - - * doc/api.html - Add pointers to example programs in source code tarball. - -2009-03-17 Erik de Castro Lopo - - * src/common.h - Define SF_PLATFORM_S64 for non-gcc compilers with 'long long' type. - - * configure.ac - Add documentation for --disable-external-libs and improve error handling - for that option. - - * src/sndfile.c src/sndfile.h.in src/create_symbols_file.py - Add public function sf_version_string. - - * tests/sfversion.c - Test function sf_version_string. - - * M4/shave.m4 shave-libtool.in shave.in - Add new files from 'git clone git://git.lespiau.name/shave'. - - * configure.ac - Enable shave. - - * src/Makefile.am src/binheader_writef_check.py Octave/* - Shave related tweaks. - -2009-03-15 Erik de Castro Lopo - - * src/common.h src/caf.c src/sndfile.c - Add SF_MAX_CHANNELS (set to 256) and use it. - - * src/sndfile.h.in - Check for either _MSCVER or _MSC_VER being defined. - -2009-03-04 Erik de Castro Lopo - - * tests/vorbis_test.c - Relax test slighly to allow test to pass on more CPUs etc. - -2009-03-03 Erik de Castro Lopo - - * configure.ac - Detect vorbis_version_string() correctly. - -2009-03-02 Erik de Castro Lopo - - * doc/index.html - Add a 'See Also' section with a link to sndfile-tools. - - * NEWS README doc/*.html - Updates for 1.0.19 release. - - * configure.ac - Fix --enable-external-libs logic. - -2009-03-01 Erik de Castro Lopo - - * src/aiff.c - Fix resource leak and potential read beyond end of buffer. - - * src/nist.c - Fix reading of header value sample_n_bytes. - - * src/sd2.c src/wav.c - Fix potential read beyond end of buffer. - - * src/sndfile.c src/svx.c - Check return values of file_io functions. - - * tests/win32_test.c - Fix resource leak. - - * configure.ac - Detect the presence/absence of vorbis_version_string() in libvorbis. - - * src/ogg.c - Only call vorbis_version_string() from libvorbis if present. - -2009-02-24 Erik de Castro Lopo - - * tests/win32_test.c - Don't use sprintf, even on windows. - - * src/aiff.c src/rf64.c src/wav.c - Eliminate dead code, more validation of data read from file. - -2009-02-22 Erik de Castro Lopo - - * src/ima_adpcm.c - Clamp values to a valid range before indexing ima_step_size array. - - * src/GSM610/*.c tests/*c programs/*.c src/audio_detect.c - Don't include un-needed headers. - - * programs/sndfile-info.c - Remove dead code. - - * tests/test_wrapper.sh.in - Add 'set -e' so the script exits on error. - - * src/test_ima_oki_adpcm.c - Fix read beyond end of array. - - * tests/win32_test.c - Add missing close on file descriptor. - - * src/nist.c programs/sndfile-metadata-set.c - Fix 'unused variable' warnings. - - * src/aiff.c - Fix potential memory leak in handling of 'MARK' chunk. - Remove un-needed test (unsigned > 0). - - * src/sd2.c - Improve handling of heap allocated buffer. - - * src/sndfile.c - Remove un-needed test (always true). - - * src/wav.c src/rf64.c - Ifdef out dead code that will be resurected some time in the future. - - * src/wav.c src/w64.c src/xi.c - Handle error return values from psf_ftell. - - * src/wav_w64.c - Fix handling and error checking of MSADPCM coefficient arrays. - - * regtest/*.c - Bunch of fixes. - - * src/test_file_io.c - Use snprintf instead of strncpy in test program. - -2009-02-21 Erik de Castro Lopo - - * src/sd2.c - Validate data before using. - - * src/caf.c - Validate channels per frame value before using, fixing a possible integer - overflow bug, leading to a possible heap overflow. Found by Alin Rad Pop of - Secunia Research (CVE-2009-0186). - -2009-02-20 Erik de Castro Lopo - - * Octave/octave_test.sh - Unset TERM environment variable and export LD_LIBRARY_PATH. - -2009-02-16 Erik de Castro Lopo - - * src/file_io.c - In windows code, cast LPVOID to 'char*' in printf. - -2009-02-15 Erik de Castro Lopo - - * M4/octave.m4 - Clear the TERM environment before evaluating anything in Octave. This works - around problems that might occur if a users TERM settings are incorrect. - Thanks to Rob Til Freedmen for helping to debug this. - - * src/wav.c - Handle four zero bytes as a marker within a LIST or INFO chunk. - Thanks to Rogério Brito for supplying an example file. - -2009-02-14 Erik de Castro Lopo - - * src/common.h src/*.c - Use C99 snprintf everywhere. - -2009-02-11 Erik de Castro Lopo - - * tests/test_wrapper.sh.in - New file to act as the template for the test wrapper script. - - * configure.ac - Generate tests/test_wrapper.sh from the template. - - * tests/Makefile.am - Replace all tests with a single invocation of the test wrapper script. - -2009-02-09 Erik de Castro Lopo - - * src/ogg.c - Record vorbis library version string. - - * configure.ac - Require libvorbis >= 1.2.2. - - * M4/endian.m4 - Fix bracketing of function for autoconf 2.63. Thanks to Richard Ash. - - * M4/octave.m4 M4/mkoctfile_version.m4 - Clean up AC_WITH_ARG usage using AC_HELP_STRING. - -2009-02-08 Erik de Castro Lopo - - * Octave/Makefile.am - Use $(top_buildir) instead of $(builddir) which may not be defined. - - * M4/octave.m4 - Improve logic and status reporting. - -2009-02-07 Erik de Castro Lopo - - * configure.ac AUTHORS NEWS README doc/*.html - Final tweaks for 1.0.18 release. - -2009-02-03 Erik de Castro Lopo - - * programs/sndfile-convert.c - Add 'htk' to the list of convert formats. - - * programs/sndfile-info.c - Simplify get_signal_max using SFC_CALC_SIGNAL_MAX command. - Increase size of files for which signal max will be calculated. - -2009-01-14 Erik de Castro Lopo - - * doc/index.html - Fix links for SoX and WavPlay. Thanks to Daniel Griscom. - -2009-01-11 Erik de Castro Lopo - - * programs/sndfile-metadata-get.c - Make valgrind clean. - Clean up temp string array usage. - Error out if trying to update coding history in RDWR mode. - -2009-01-10 Erik de Castro Lopo - - * doc/index.html - Fix links to versions of the LGPL. - -2008-12-14 Erik de Castro Lopo - - * tests/string_test.c - Add test for RDWR mode where the file ends up shorter than when it was - opened. - - * src/wav.c - Truncate the file on close for RDWR mode where the file ends up shorter - than when it was opened. - -2008-11-30 Erik de Castro Lopo - - * M4/add_cflags.m4 - Fix problem with quoting of '#include'. - - * M4/add_cxxflags.m4 configure.ac - Add new file M4/add_cxxflags.m4 and use it in configure.ac. - -2008-11-19 Erik de Castro Lopo - - * programs/sndfile-info.c - Apply patch from Conrad Parker to calculate and display total duration when - more than one file is dumped. - -2008-11-10 Erik de Castro Lopo - - * configure.ac src/Makefile.am - Tweaks to generation of Symbols files. - - * tests/win32_ordinal_test.c - Update tests for above changes. - -2008-11-06 Erik de Castro Lopo - - * programs/common.c - When merging broadcast info, make sure to clear the destination field - before copying in the new data. - - * programs/test-sndfile-metadata-set.py - Add test for the above. - - * src/broadcast.c - Fix checking of required coding_history_size. - -2008-10-28 Erik de Castro Lopo - - * tests/command_test.c - Add test to detect if coding history is truncated. - - * src/broadcast.c - Fix truncation of coding history. - -2008-10-27 Erik de Castro Lopo - - * tests/command_test.c - Add broadcast_coding_history_size test. - - * programs/*.[ch] - Use SF_BROADCAST_INFO_VAR to manipulate larger 'bext' chunks. - - * src/rf64.c - Add code to prevent infinite loop on malformed file. - - * src/common.h src/sndfile.c src/w64.c src/wav_w64.c - Rationalize and improve error handling when parsing 'fmt ' chunk. - - * M4/octave.m4 - Simplify and remove cruft. - Check for correct Octave version. - - * Octave/* - Reduce 3 C++ files to one, fix build for octave 3.0, fix build. - - * Octave/sndfile.cc Octave/PKG_ADD - Add Octave function sfversion which returns the libsndfile version that the - module is linked against. - - * Octave/Makefile.am - Bunch of build and 'make distcheck' fixes. - -2008-10-26 Erik de Castro Lopo - - * programs/common.c - Return 1 if SFC_SET_BROADCAST_INFO fails. - - * programs/test-sndfile-metadata-set.py - Update for new programs directory, exit on any error. - - * tests/error_test.c - Fix failure behaviour in error_number_test. - - * src/common.h src/sndfile.c - Add error number SFE_BAD_BROADCAST_INFO_SIZE. - - * src/* - Reimplement handling of broadcast extentioon chunk in WAV/WAVEX files. - - * src/broadcast.c - Fix generation of added coding history. - -2008-10-25 Erik de Castro Lopo - - * programs/sndfile-metadata-get.c programs/sndfile-info.c - Exit with non-zero on errors. - -2008-10-21 Erik de Castro Lopo - - * examples/sndfile-to-text.c examples/Makefile.am - Add a new example program and hook it into the build. - - * examples/ programs/ - Add a new directory programs and move sndfile-info, sndfile-play and other - real programs to the new directory, leaving example programs where they - were. - -2008-10-20 Erik de Castro Lopo - - * tests/Makefile.am - Automake 1.10 MinGW cross compiling fixes. - -2008-10-19 Erik de Castro Lopo - - * examples/sndfile-play.c - Remove call to deprecated function snd_pcm_sw_params_get_xfer_align. - Fix gcc-4.3 compiler warnings. - - * tests/command_test.c - Fix a valgrind warning. - - * tests/error_test.c tests/multi_file_test.c tests/peak_chunk_test.c - tests/pipe_test.tpl tests/stdio_test.c tests/win32_test.c - Fix gcc-4.3 compiler warnings. - -2008-10-17 Erik de Castro Lopo - - * src/broadcast.c - Fix termination of desitination string in strncpy_crlf. - When copying BROADCAST_INFO chunk, make sure destination gets correct line - endings. - - * examples/common.c - Fix copying of BROADCAST_INFO coding_history field. - -2008-10-13 Erik de Castro Lopo - - * tests/command_test.c - Add test function instrument_rw_test, but don't hook it into the testing - yet. - - * src/common.h src/command.c src/sndfile.c src/flac.c - Error code rationalization. - - * src/common.h src/sndfile.c - Set psf->error to SFE_CMD_HAS_DATA when adding metadata via sf_command() - fails due to psf->have_written being true. - - * doc/command.html - Document the SFC_GET/SET_BROADCAST_INFO comamnds. - -2008-10-10 Erik de Castro Lopo - - * tests/command_test.c - Improve error reporting when '\0' is found in coding history. - Fix false failure. - -2008-10-09 Erik de Castro Lopo - - * src/broadcast.c - Convert all coding history line endings to \r\n. - - * tests/command_test.c - Add test to make sure all line endings are converted to \r\n. - -2008-10-08 Erik de Castro Lopo - - * src/broadcast.c - Changed the order of coding history fields. - - * tests/command_test.c - Update bextch test to cope with previous change. - - * examples/common.c - Add extra length check when copying broadcast info data. - -2008-10-05 Erik de Castro Lopo - - * tests/utils.tpl tests/pcm_test.tpl - Update check_file_hash_or_die to use 64 bit hash. - - * tests/checksum_test.c tests/Makefile.am - Add new checksum_test specifically for lossy compression of headerless - files. - -2008-10-04 Erik de Castro Lopo - - * src/gsm610.c - Seek to psf->dataoffset before decoding first block. - - * src/sndfile.c - Fix detection of mpc2k files on big endian systems. - -2008-10-03 Erik de Castro Lopo - - * src/broadcast.c - Use '\r\n' newlines in Coding History as required by spec. - -2008-10-02 Erik de Castro Lopo - - * src/test_conversions.c - Use int64_t instead of 'long long'. - -2008-10-01 Erik de Castro Lopo - - * examples/sndfile-metadata-set.c - Remove --bext-coding-history-append command line option because it didn't - really make sense. - - * examples/sndfile-metadata-(get|set).c - Add usage messages. - - * examples/test-sndfile-metadata-set.py - Start work on test coding history. - -2008-09-30 Erik de Castro Lopo - - * README doc/win32.html - Bring these up to date. - - * src/aiff.c - Fix parsing of REX files. - -2008-09-29 Erik de Castro Lopo - - * src/file_io.c - Use intptr_t instead of long for return value of _get_osfhandle. - - * src/test_conversions.c src/test_endswap.tpl - Fix printing of int64_t values. - - * examples/sndfile-play.c - Fix win64 issues. - - * tests/win32_ordinal_test.c - Fix calling of GetProcAddress with ordinal under win64. - - * tests/utils.tpl - Fix win64 issues. - -2008-09-25 Erik de Castro Lopo - - * examples/* - Rename copy_data.[ch] to common.[ch]. Fix build. - Move code from sndfile-metadata-set.c to common.c. - - * examples/Makefile.am tests/Makefile.am regtest/Makefile.am - Clean paths. - -2008-09-19 Erik de Castro Lopo - - * doc/tutorial.html doc/Makefile.am - Add file doc/tutorial.html and hook into build/dist system. - -2008-09-14 Erik de Castro Lopo - - * examples/sndfile-metadata-set.c - Clean up handling of bext command line params. - -2008-09-13 Erik de Castro Lopo - - * src/w64.c - Add handling/skipping of a couple of new chunk types. - -2008-09-09 Erik de Castro Lopo - - * configure.ac - Add -funsigned-char to CFLAGS if the compiler supports it. - - * examples/sndfile-metadata-(get|set).c - Add handling for more metadata types. - -2008-09-04 Erik de Castro Lopo - - * src/common.h - Add macros SF_CONTAINER, SF_CODEC and SF_ENDIAN useful for splitting format - field of SF_INFO into component parts. - - * src/*.c - Use new macros everywhere it is appropriate. - -2008-09-02 Erik de Castro Lopo - - * examples/sndfile-bwf-set.c - Massive reworking. - -2008-08-24 Erik de Castro Lopo - - * examples/sndfile-bwf-set.c - Add --info-auto-create-date command line option. - - * examples/sndfile-metadata-set.c examples/sndfile-metadata-get.c - examples/Makefile.am examples/test-sndfile-bwf-set.py - Rename sndfile-bwf-(set|get).c to sndfile-metadata-(set|get).c. - Change command line args. - -2008-08-23 Erik de Castro Lopo - - * src/wav.c - Allow 'PAD ' chunk to be modified in RDWR mode. - - * src/sndfile.h.in src/sndfile.c - Add handling (incomplete) for SFC_SET_ADD_HEADER_PAD_CHUNK. - - * tests/Makefile.am tests/write_read_test.tpl tests/header_test.tpl - tests/misc_test.c - Add tests for RF64. - - * src/rf64.c - Fixes to make sure all tests pass. - - * tests/Makefile.am tests/string_test.c - Add string tests (not yet passing). - -2008-08-22 Erik de Castro Lopo - - * src/rf64.c - First pass at writing RF64 now working. - -2008-08-21 Erik de Castro Lopo - - * examples/sndfile-convert.c - Add SF_FORMAT_RF64 to format_map. - - * src/common.h src/sndfile.c - More RF64 support code. - - * examples/sndfile-bwf-set.c - Fix the month number in autogenerated date string and use hypen in date - instead of slash. - - * examples/test-sndfile-bwf-set.py - Update tests. - - * examples/sndfile-info.c - When called with -i or -b option, operate on all files on command line, not - just the first. - -2008-08-19 Erik de Castro Lopo - - * src/rf64.c - New file to handle RF64 (WAV like format supportting > 4Gig files). - - * src/sndfile.h.in src/common.h src/sndfile.c src/Makefile.am - Hook the above into build so hacking can begin. - - * src/pcm.c - Improve log message when pcm_init fails. - - * src/sndfile-info.c - Only calculate and print 'Signal Max' if file is less than 10 megabytes in - length. - -2008-08-18 Erik de Castro Lopo - - * tests/string_test.c - Polish string_multi_set_test. - - * src/wav.c - In RDWR mode, pad the header if necessary (ie LIST chunk has moved or - length has changed). - Minor fixes in wav_write_strings. - Write PAD chunk with default endian-ness, not a specific endian-ness. - - * examples/test-sndfile-bwf-set.py - Add Python script to test sndfile-bwf-set/get. - - * examples/sndfile-bwf-set.c - Clean up and fixes. - - * src/wav.c - Merge function wavex_write_header into wav_write_header, deleting about 70 - lines of code. - - * src/common.h - Double value of SF_MAX_STRINGS. - - * tests/string_test.c - Add string tests for WAVEX and RIFX files. - - * tests/command_test.c - Add broadcast test for WAVEX files. - -2008-08-17 Erik de Castro Lopo - - * tests/string_test.c - Add a new string_rdwr_test (currently failing for WAV). - Add a new string_multi_set_test (currently failing). - - * tests/command_test.c - Add new broadcast_rdwr_test (currently failing). - - * src/wav.c - Fix to WAV parser to allow 'bext' chunk to be updated in place. - In wav_write_tailer, seek to psf->dataend if its greater than zero. - - * src/sndfile.c - Make sure psf->have_written gets set correctly in mode SFM_RDWR. - - * configure.ac - Test for and gettimeofday. - - * src/common.c - Use gettimeofday() to initialize psf_rand_int32. - - * src/common.h src/sndfile.c - Add unique_id field to SF_PRIVATE struct. - - * src/common.h src/sndfile.c src/wav.c src/wav_w64.[ch] - Move wavex_ambisonic field from SF_PRIVATE struct to WAV_PRIVATE struct. - - * src/common.h src/strings.c - Add function psf_location_string_count. - -2008-08-16 Erik de Castro Lopo - - * configure.ac - Test for localtime and localtime_r. - - * examples/sndfile-convert.c - In function copy_metadata(), copy broadcast info if present. - - * examples/copy_data.[ch] examples/Makefile.am - Break some functionality out of sndfile-convert.c so it can be used in - examples/sndfile-bwf-set.c. - - * tests/utils.tpl - Add new function create_short_sndfile(). - - * examples/sndfile-bwf-set.c examples/sndfile-bwf-get.c - examples/Makefile.am - Add new files and hook into build. - -2008-08-11 Erik de Castro Lopo - - * src/sndfile.h.in - Fix comments. Patch from Mark Glines. - -2008-07-30 Erik de Castro Lopo - - * tests/misc_test.c - Use zero_data_test on Ogg/Vorbis files. - - * src/ogg.c - Fix segfault when closing an Ogg/Vorbis file that has been opened for write - but had no actual data written to it. Bug reported by Chinoy Gupta. - - * tests/Makefile.am - Make sure to run mist_test on Ogg/Vorbis files. - -2008-07-19 Erik de Castro Lopo - - * regtest/Makefile.am - Use SQLITE3_CFLAGS to locate sqlite headers. - -2008-07-10 Erik de Castro Lopo - - * doc/index.html doc/FAQ.html - Add notes about which versions of windows libsndfile works on. - -2008-07-03 Erik de Castro Lopo - - * tests/misc_test.c - Add a test for correct handling of Ambisonic files. Thanks to Fons - Adriaensen for the test. - - * src/wav.c src/wav_w64.c - Fix handling of Ambisonic files. Thanks to Fons Adriaensen for the patch. - -2008-06-29 Erik de Castro Lopo - - * configure.ac - Fix detection/enabling of external libs. - - * M4/extra_pkg.m4 M4/Makefile.am - Add m4 macro PKG_CHECK_MOD_VERSION which is a hacked version - PKG_CHECK_MODULES. The new macro prints the version number of the package - it is searching for. - -2008-06-14 Erik de Castro Lopo - - * src/aiff.c - Apply a fix from Axel Röbel where if the second loop in the instrument - chunk is none, the loop mode is written into the first loop. - -2008-05-31 Erik de Castro Lopo - - * src/test_float.c src/test_main.(c|h) src/Makefile.am - Add new file to test functions float32_(le|be)_(read|write) and - double64_(le|be)_(read|write). Hook into build and testsuite. - - * src/double64.c src/float32.c - Fix bugs in functions found by test added above. Thanks to Nicolas Castagne - for reporting this bug. - - * src/sndfile.h.in - Change time_reference_(low|high) entries of SF_BROADCAST_INFO struct to - unsigned. - - * examples/sndfile-info.c - Print out the BEXT time reference in a sensible format. - -2008-05-21 Erik de Castro Lopo - - * src/*.c - Fuzz fixes. - - * src/ogg.c - Add call to ogg_stream_clear to fix valgrind warning. - - * src/aiff.c - Fix x86_64 compile issue. - - * configure.ac src/Makefile.am src/flac.c src/ogg.c - Link to external versions of FLAC, Ogg and Vorbis. - - * tests/lossy_comp_test.c tests/ogg_test.c tests/string_test.c - tests/vorbis_test.c tests/write_read_test.tpl - Fix tests when configured with --disable-external-libs. - - * tests/external_libs_test.c tests/Makefile.am - Add new test and hook into build and test suite. - - * src/command.c - Use HAVE_EXTERNAL_LIBS to ensure that the SFC_GET_FORMAT_* commands return - the right data when external libs are disabled. - -2008-05-11 Erik de Castro Lopo - - * tests/write_read_test.tpl - Add a test for extending a file during write by seeking past the current - end of file. - - * src/sndfile.c - Allow seeking past end of file during write. - -2008-05-10 Erik de Castro Lopo - - * doc/api.html doc/command.html - Move all information about the sf_command function to command.html and add - a link from documentation of the sf_read/write_raw function to the - SFC_RAW_NEEDS_ENDSWAP command. - - * doc/index.html doc/FAQ.html doc/libsndfile.css - Minor documentation tweaks. - -2008-05-09 Erik de Castro Lopo - - * configure.ac - Add AM_PROG_CC_C_O. - -2008-04-27 Erik de Castro Lopo - - * tests/error_test.c - Add a test to make sure if file opened with sf_open_fd, and then the file - descriptor is closed, then sf_close will return an error code. Thanks to - Dave Flogeras for the bug report. - - * src/sndfile.c - Make sf_close return an error is the file descriptor is already closed. - -2008-04-19 Erik de Castro Lopo - - * configure.ac - Set object format to aout for OS/2. Thanks to David Yeo. - - * src/mpc2k.c src/sndfile.c src/sndfile.h.in src/common.h src/Makefile.am - Add ability to read MPC 2000 file. - - * tests/write_read_test.tpl tests/misc_test.c tests/header_test.tpl - tests/Makefile.am - Add tests for MPC 2000 file format. - - * examples/sndfile-convert.c - Allow conversion to MPC 2000 file format. - -2008-04-17 Erik de Castro Lopo - - * src/VORBIS/lib/codebook.c - Sync from upstream SVN. - - * autogen.sh configure.ac - Minor tweaks. - -2008-04-13 Erik de Castro Lopo - - * src/ogg.c - Add a patch that fixes finding the length in samples of an Ogg/Vorbis file. - The patch as supplied segfaulted and required many hours of debugging. - - * src/OGG/bitwise.c - Sync from upstream SVN. - -2008-04-09 Erik de Castro Lopo - - * src/aiff.c - Fix up handling of 'APPL' chunk. Thanks to Axel Röbel for bringing up - this issue. - -2008-04-06 Erik de Castro Lopo - - * tests/*.c - Add calls to sf_close() where needed. - - * tests/utils.tpl tests/multi_file_test.c - Always pass 0 as the third argument to open when OS_IS_WIN32. - -2008-04-03 Erik de Castro Lopo - - * src/test_* - Add files test_main.[ch]. - Collapse all tests into a single executable. - -2008-03-30 Erik de Castro Lopo - - * src/FLAC - Sync to upstream CVS. - -2008-03-25 Erik de Castro Lopo - - * src/common.h - Make SF_MIN and SF_MAX macros MinGW friendly. - - * examples/sndfile-(info|play).c - Use Sleep function from instead of _sleep. - - * tests/locale_test.c - Disable some tests when OS_IS_WIN32. - - * src/FLAC/src/share/replaygain_anal/replaygain_analysis.c - src/FLAC/src/share/utf8/utf8.c - MinGW fixes. - -2008-03-11 Erik de Castro Lopo - - * doc/FAQ.html - Tweaks to pcm16 <-> float conversion answer. - -2008-02-10 Erik de Castro Lopo - - * src/OGG - Sync to SVN upstream. - - * Makefile.am - Add 'DISTCHECK_CONFIGURE_FLAGS = --enable-gcc-werror'. - -2008-02-05 Erik de Castro Lopo - - * examples/sndfile-jackplay.c - Minor tweaks to warning message printed when compiled without libjack. - -2008-01-27 Erik de Castro Lopo - - * tests/peak_chunk_test.c - Improve read_write_peak_test to find more errors. Inspired by example - provided by Nicolas Castagne. - - * src/aiff.c - Another SFM_RDWR fix shown up by above test. - -2008-01-24 Erik de Castro Lopo - - * src/aiff.c - Fix reading of COMM encoding string. - - * src/chunk.c src/common.h src/Makefile.am - New file for storing and retrieving info about header chunks. Hook into - build. - - * src/aiff.c - Use new chunk logging to fix problem with AIFF in RDWR mode. - -2008-01-22 Erik de Castro Lopo - - * src/command.c - Add WVE to the list of major formats. - - * tests/aiff_rw_test.c - Fix error reporting. - -2008-01-21 Erik de Castro Lopo - - * src/common.[ch] - Add internal functions str_of_major_format, str_of_minor_format, - str_of_open_mode and str_of_endianness. - - * tests/write_read_test.tpl - Fix reporting of errors in new_rdwr_XXXX_test. - -2008-01-20 Erik de Castro Lopo - - * examples/sndfile-play.c - Apply patch from Yair K. to fix compiles with OSS v4. - - * src/common.h src/float32.c src/double64.c - Rename psf->float_enswap to psf->data_endswap. - - * src/sndfile.h.in src/sndfile.c src/pcm.c - Add command SFC_RAW_NEEDS_ENDSWAP. - - * tests/command.c - Add test for SFC_RAW_NEEDS_ENDSWAP. - - * doc/command.html - Document SFC_RAW_NEEDS_ENDSWAP. - - * tests/peak_chunk_test.c - Add test function read_write_peak_test. Thanks to Nicolas Castagne for the - bug report. - -2008-01-09 Erik de Castro Lopo - - * examples/sndfile-cmp.c - Add new example program contributed by Conrad Parker. - - * examples/Makefile.am - Hook into build. - - * doc/development.html - Change use or reconfigure.mk to autogen.sh. - -2008-01-08 Erik de Castro Lopo - - * tests/win32_test.c - Add another win32 test. - - * tests/util.tpl - Add function file_length_fd which wraps fstat. - - * tests/Makefile.am - Run the multi_file_test on AU files. - - * tests/multi_file_test.c - Use function file_length_fd() instead of file_length() to overcome stupid - win32 bug. Fscking hell Microsoft sucks so much. - -2008-01-05 Erik de Castro Lopo - - * src/sd2.c - Fix a rsrc parsing bug. Example file supplied by Uli Franke. - -2007-12-28 Erik de Castro Lopo - - * doc/index.html - Allow use of either LGPL v2.1 or LGPL v3. - - * tests/header_test.tpl - Add header_shrink_test from Axel Röbel. - - * src/wav.c - Add fix from Axel Röbel for writing files with float data but no peak - chunk (ie peak chunk gets removed after the file is opened). - - * src/aiff.c tests/header_test.tpl - Apply similar fix to above for AIFF files. - - * src/wav.c tests/header_test.tpl - Apply similar fix to above for WAVEX files. - - * src/command.c - Add Ogg/Vorbis to 'get format' commands. - -2007-12-16 Erik de Castro Lopo - - * src/ogg.c - Fix seeking on multichannel Ogg Vorbis files. Reported by Bodo. - Set the default encoding quality to 0.4 instead of 4.0 (Bodo again). - - * tests/ogg_test.c - Add stereo seek tests. - -2007-12-14 Erik de Castro Lopo - - * tests/ogg_test.c - Add a test (currently failing) for stereo seeking on Ogg Vorbis files. Test - case supplied by Bodo. - - * tests/utils.(def|tpl) - Add compare_XXX_or_die functions. - -2007-12-05 Erik de Castro Lopo - - * src/aiff.c - Fix a bug where ignoring ssnd_fmt.offset and ssnd_fmt.blocksize caused - misaligned reading of 24 bit data. Thanks to Uli Franke for reporting this. - -2007-12-03 Erik de Castro Lopo - - * src/vox_adpcm.c src/ima_oki_adpcm.[ch] src/Makefile.am - Merge in code from the vox-patch branch. Thanks to Robs for the patch - which fixes a long standing bug in the VOX codec. - -2007-12-01 Erik de Castro Lopo - - * examples/sndfile-convert.c - Fix handling of -override-sample-rate=X option. - -2007-11-25 Erik de Castro Lopo - - * src/ogg.c src/VORBIS - Merge in Ogg Vorbis support from John ffitch of the Csound project. - -2007-11-24 Erik de Castro Lopo - - * src/sndfile.c - Recognise files with 'vox6' extension as 6kHz OKI VOX ADPCM files. Also - recognise 'vox8' as and 'vox' as 8kHz files. - - * configure.ac - Detect libjack (JACK Audio Connect Kit). - - * examples/sndfile-jackplay.c examples/Makefile.am - Add new example program to play sound files using the JACK audio server. - Thanks to Jonatan Liljedahl for allowing this to be included. - -2007-11-21 Erik de Castro Lopo - - * doc/index.html - Update support table with SD2 and FLAC. - -2007-11-17 Erik de Castro Lopo - - * src/sndfile.c - Fix calculation of internal value psf->read_current when attempting to read - past end of audio data. - Remove redundant code. - - * tests/lossy_comp_test.c - Add read_raw_test to check that raw reads do not go past the end of the - audio data section. - Clean up error output messages. - - * src/sndfile.c - Add code to prevent sf_read_raw from reading past the end of the audio data. - - * tests/Makefile.am - Add the wav_pcm lossy_comp_test. - -2007-11-16 Erik de Castro Lopo - - * configure.ac src/Makefile.am src/create_symbols_file.py - More OS/2 fixes from David Yeo. - -2007-11-12 Erik de Castro Lopo - - * src/file_io.c tests/utils.tpl tests/benchmark.tpl - Improve handling of requirements for O_BINARY as suggested by Ed Schouten. - -2007-11-11 Erik de Castro Lopo - - * src/common.h - Fix symbol class when SF_MIN is nested inside SF_MAX or vice versa. - - * src/create_symbols_file.py - Add support for OS/2 contributed by David Yeo. - -2007-11-05 Erik de Castro Lopo - - * M4/gcc_version.m4 - Add macro AC_GCC_VERSION to detect GCC_MAJOR_VERSION and GCC_MINOR_VERSION. - - * configure.ac - Use AC_GCC_VERSION to work around gcc-4.2 inline warning stupidity. - See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33995 - Use -fgnu-inline to prevent stupid warnings. - -2007-11-03 Erik de Castro Lopo - - * tests/util.tpl - Increase the printing width for print_test_name(). - - * tests/command_test.c tests/Makefile.am - Add tests for correct updating of broadcast WAV coding history. - - * examples/sndfilehandle.cc examples/Makefile.am - Add example program using the C++ SndfileHandle class. - -2007-10-29 Erik de Castro Lopo - - * src/common.h src/sndfile.c - Add error codes SFE_ZERO_MAJOR_FORMAT and SFE_ZERO_MINOR_FORMAT. - -2007-10-26 Erik de Castro Lopo - - * src/sd2.c - Identify sample-rate/sample-size/channels by resource id. - -2007-10-25 Erik de Castro Lopo - - * src/broadcast.c src/common.h src/sndfile.c - Improvements to handling of broadcast info in WAV files. Thanks to Frederic - Cornu and other for their input. - -2007-10-24 Erik de Castro Lopo - - * src/FLAC/include/share/alloc.h - Mingw fix for SIZE_T_MAX from Uli Franke. - -2007-10-23 Erik de Castro Lopo - - * tests/open_fail_test.c tests/error_test.c tests/Makefile.am - Move tests from open_fail_test.c to error_test.c and remove the former. - -2007-10-22 Erik de Castro Lopo - - * tests/scale_clip_test.(def|tpl) - Add tests for SFC_SET_INT_FLOAT_WRITE command. - - * doc/command.html - Add docs for SFC_SET_INT_FLOAT_WRITE command. - - * examples/sndfile-play.c tests/dft_cmp.c - Fix gcc-4.2 warning messages. - -2007-10-21 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c - Add command SFC_GET_CURRENT_SF_INFO. - - * src/sndfile.h.in src/sndfile.c src/create_symbols_file.py - Remove function sf_get_info (only ever in pre-release code). - - * tests/command_test.c - Add test for SFC_GET_CURRENT_SF_INFO. - -2007-10-15 Erik de Castro Lopo - - * src/wav.c - Add parsing of 'exif' chunks. Originally coded by Trent Apted. - - * configure.ac - Put config stuff in Cfg directory. - Remove check for inttypes.h. - -2007-10-10 Erik de Castro Lopo - - * src/w64.c - Fix writing of 'riff' chunk length and check for correct value in parser. - -2007-09-20 Erik de Castro Lopo - - * doc/index.html - Link to MP3 FAQ entry. - -2007-09-18 Erik de Castro Lopo - - * src/flac.c - Move the blocksize check to an earlier stage of flac_buffer_copy. - -2007-09-12 Erik de Castro Lopo - - * src/FLAC - Huge merge from FLAC upstream. - -2007-09-10 Erik de Castro Lopo - - * examples/*.c - Change license to all example programs to BSD. - -2007-09-08 Erik de Castro Lopo - - * src/FLAC/include/FLAC/metadata.h - Include to prevent compile error on OSX. - - * Octave/octave_test.sh - Disable test on OSX. Can't get it to work. - - * src/flac.c - Check the blocksize returned from the FLAC decoder to prevent buffer - overruns. Reported by Jeremy Friesner. Thanks. - -2007-09-07 Erik de Castro Lopo - - * Makefile.am M4/octave.m4 - Fix build when Octave headers are not present. - -2007-08-27 Erik de Castro Lopo - - * doc/development.html - Add note about bzr repository directory looking empty. - -2007-08-26 Erik de Castro Lopo - - * configure.ac Octave/* M4/octave_* - Bunch of changes to add ability to build GNU Octave modules to read/write - sound files using libsndfile from Octave. - -2007-08-23 Erik de Castro Lopo - - * acinclude.m4 configure.ac ... - Get rid of acinclude.m4 and replace it with an M4 directory. - -2007-08-21 Erik de Castro Lopo - - * src/sndfile.h.in - Remove crufty Metrowerks compiler support. Allow header file to be compiled - on windows with both GCC and microsoft compiler. - -2007-08-19 Erik de Castro Lopo - - * tests/dft_cmp.[ch] tests/floating_point_test.tpl - Clean up floating point tests. - -2007-08-14 Erik de Castro Lopo - - * src/aiff.c - Fix segfault when COMM chunk length is byte swapped. - -2007-08-09 Erik de Castro Lopo - - * src/common.h src/mat4.c src/mat5.c src/sndfile.c - Add a generic SFE_CHANNEL_COUNT_ZERO error, remove format specific errors. - - * src/au.c - Fix crash on AU files with zero channel count. Reported by Ben Alison. - -2007-08-08 Erik de Castro Lopo - - * src/voc.c - Fix bug in handling file supplied by Matt Olenik. - -2007-07-31 Erik de Castro Lopo - - * src/OGG - Merge from OGG upstream sources. - -2007-07-25 Erik de Castro Lopo - - * src/FLAC - Merge from FLAC upstream sources. - -2007-07-15 Erik de Castro Lopo - - * src/flac.c - Fix memory leak; set copy parameter to FALSE in call to - FLAC__metadata_object_vorbiscomment_append_comment. - - * src/common.[ch] - Add function psf_rand_int32(). - -2007-07-14 Erik de Castro Lopo - - * src/FLAC - Merge from FLAC upstream sources. - - * src/strings.c tests/string_test.c tests/Makefile.am - Make sure string tests for SF_STR_LICENSE actually works. - -2007-07-13 Erik de Castro Lopo - - * tests/string_test.c - Add ability to test strings stored in metadata secion of FLAC files. - - * src/string.c - Fix logic for testing if audio data has been written and string is added. - Make sure SF_STR_ALBUM actually works. - - * src/flac.c - Finalize reading/writing string metadata. Tests pass. - - * src/sndfile.h.in tests/string_test.c src/flac.c - Add string type SF_STR_LICENSE, update test and use for FLAC files. - - * src/sndfile.h.in - Add definition for SFC_SET_SCALE_FLOAT_INT_WRITE command. - - * src/common.h src/double64.c src/float32.c src/sndfile.c - Add support for SFC_SET_SCALE_FLOAT_INT_WRITE (still needs testing). - -2007-07-12 Erik de Castro Lopo - - * src/flac.c - Apply patch from Ed Schouten to read artist and title metadata from FLAC - files. - Improve reporting of FLAC metadata. - - * src/sndfile.h.in tests/string_test.c src/flac.c - Add string type SF_STR_ALBUM, update test and use for FLAC files. - -2007-06-28 Erik de Castro Lopo - - * src/FLAC/* - Merge from upstream CVS. - -2007-06-16 Erik de Castro Lopo - - * src/FLAC/* - Update from upstream CVS. - -2007-06-14 Erik de Castro Lopo - - * tests/cpp_test.cc - Add extra tests for when the SndfileHandle constructor fails. - - * src/sndfile.hh - Make sure failure to open the file in the constructor does not allow later - calls to other methods to fail. - -2007-06-10 Erik de Castro Lopo - - * tests/util.tpl - Add function write_mono_file. - - * tests/generate.[ch] tests/Makefile.am - Add files generate.[ch] and hook into build. - - * tests/write_read_test.tpl - Add multi_seek_test. - - * src/flac.c - Fix buffer overflow bug. Test provided by Jeremy Friesner and fix provided - by David Viens. - -2007-06-07 Erik de Castro Lopo - - * doc/FAQ.html - Minor update. - - * configure.ac src/FLAC/src/libFLAC/ia32/Makefile.am src/Makefile.am - Apply patch from Trent Apted make it compile on Intel MacOSX. Thanks Trent. - -2007-05-28 Erik de Castro Lopo - - * src/wav.c - Fix writing of MSGUID subtypes. Thanks to Bruce Sharpe. - -2007-05-22 Erik de Castro Lopo - - * src/wav.c - Fix array indexing bug raised by Bruce Sharpe. - -2007-05-12 Erik de Castro Lopo - - * src/FLAC/src/share/getopt/getopt.c - Fix Mac OSX / PowerPC compile warnings. - - * configure.ac - Make sure WORDS_BIGENDIAN gets correctly defined for FLAC code. - -2007-05-04 Erik de Castro Lopo - - * doc/FAQ.html - Add Q/A about MP3 support. - -2007-05-03 Erik de Castro Lopo - - * doc/new_file_type.HOWTO - Minor updates. - -2007-05-02 Erik de Castro Lopo - - * src/wve.c - Fix a couple bad parameters with psf_log_printf. - - * src/pcm.c - Improve error reporting. - - * src/common.h src/common.c - Constify psf_hexdump. - -2007-04-30 Erik de Castro Lopo - - * src/FLAC - Ditch and re-import required FLAC code. - - * configure.ac - Force FLAC__HAS_OGG variable to 1. - - * src/FLAC/src/libFLAC/stream_encoder.c - Fix compiler warnings. - -2007-04-23 Erik de Castro Lopo - - * configure.ac tests/win32_ordinal_test.c - Detect if win32 DLL is beging generated and only run win32_ordinal_test if - true. - - * src/G72x/Makefile.am src/Makefile.am - Use $(EXEEXT) where possible. - -2007-04-18 Erik de Castro Lopo - - * src/wve.c src/common.h src/sndfile.c - Complete definition of SfE_WVE_NO_WVE error message. - - * src/wve.c - Fix error in files generated on big endian systems. Robustify parsing. - -2007-04-16 Erik de Castro Lopo - - * src/double64.c - Fix clipping of double to short conversions on 64 bit systems. - - * src/flac.c regtest/database.c tests/cpp_test.cc - Fix compile warnings for 64 bit systems. - -2007-04-15 Erik de Castro Lopo - - * src/wav.c src/wav_w64.c - Use audio detect function when 'fmt ' chunk data is suspicious. - - * configure.ac - Add ugly hack to remove -Werror from some Makefiles. - -2007-04-14 Erik de Castro Lopo - - * src/GSM610/long_term.c src/macbinary3.c tests/cpp_test.cc - Add patch from André Pang to clean up compiles on OSX. - - * src/wve.c src/common.h src/sndfile.c src/sndfile.h.in - examples/sndfile-convert.c - Merge changes from Reuben Thomas to improve WVE support. - - * tests/lossy_comp_test.c tests/Makefile.am - Add tests for WVE files. - -2007-04-11 Erik de Castro Lopo - - * src/sndfile.hh - Add a static SndfileHandle::formatCheck method as suggested by Jorge - Jiménez. - -2007-04-09 Erik de Castro Lopo - - * src/sndfile.c - Fixed a bug in sf_error() where the function itself was being compared - against zero. Add a check for a NULL return from peak_info_calloc. Fix a - possible NULL dereference. - -2007-04-07 Erik de Castro Lopo - - * src/flac.c - Turn off seekable flag when writing, return SFE_BAD_RDWR_FORMAT when - opening file for RDWR. - - * src/sndfile.c - Improve error message for SFE_BAD_RDWR_FORMAT. - - * src/mat4.c - Fix array indexing issue. Thanks to Ben Allison (Nullsoft) for alerting me. - -2007-03-05 Erik de Castro Lopo - - * doc/FAQ.html - Add Q/A 19 on project files. - -2007-03-01 Erik de Castro Lopo - - * src/sndfile.c - Guard agains MacOSX universal binary compiles. - - * doc/FAQ.html - Add Q/A 18 and clean up Q3. - -2007-02-22 Erik de Castro Lopo - - * src/aiff.c - Add support for 'in24' files. - -2007-02-13 Erik de Castro Lopo - - * src/wav.c src/wav_w64.c src/wav_w64.h - Start work towards detecting ausio codec type from the actual audio data. - - * src/audio_detect.c src/test_audio_detect.c - Add new file and its unit test. - -2007-02-07 Erik de Castro Lopo - - * examples/cooledit-fixer.c examples/Makefile.am - Remove old broken example program. - -2007-02-06 Erik de Castro Lopo - - * src/sndfile.c src/sndfile.h.in src/create_symbols_file.py - Add function sf_get_info. - -2007-01-25 Erik de Castro Lopo - - * examples/sndfile-play.c - For ALSA, use the 'default' device instead of 'plughw:0'. - -2007-01-22 Erik de Castro Lopo - - * src/sndfile.c - Allow writing of WAV/WAVEX 'BEXT' chunks in SFM_RDWR mode. - -2007-01-21 Erik de Castro Lopo - - * doc/development.html doc/embedded_files.html man/sndfile-play.1 - Minor documentation fixes. Thanks Reuben Thomas. - -2006-12-16 Erik de Castro Lopo - - * examples/sndfile-convert.c - Add -override-sample-rate command line option. - -2006-11-19 Erik de Castro Lopo - - * tests/misc_test.c - Force errno to zero at start of some tests. - - * src/sndfile.c - Minor clean up of error handling. - - * configure.ac - Remove an assembler test which was failing on OSX. - -2006-11-15 Erik de Castro Lopo - - * src/common.h - Fix the definition of SF_PLATFORM_S64 for MinGW. - - * src/FLAC/Makefile.am src/FLAC/share/grabbag/Makefile.am - Fix path problems for MinGW. - -2006-11-13 Erik de Castro Lopo - - * src/sfendian.h - Add include guard. - - * src/Makefile.am src/flac.c - Clean up include paths. - - * src/test_conversions.c - New file to test psf_binheader_readf/writef functions. - - * src/Makefile.am src/test_file_io.c src/test_log_printf.c src/common.c - Clean up unit testing. - - * src/common.c - Fix a bug reading/writing 64 bit header fields. Thanks to Jonathan Woithe - for reporting this. - - * src/test_conversions.c - Complete unit test for above fix. - -2006-11-11 Erik de Castro Lopo - - * src/sndfile.c - More refactoring to clean up psf_open_file() and vairous sf_open() - functions. - -2006-11-09 Erik de Castro Lopo - - * src/wav.c - Apply a patch from Jonathan Woithe to allow opening of (malformed) WAV - files of over 4 gigabytes. - -2006-11-05 Erik de Castro Lopo - - * src/sndfile.c - Refactor function psf_open_file() to provide a single return point. - - * tests/misc_test.c - Fix permission_test to ensure that read only file can be created. - -2006-11-03 Erik de Castro Lopo - - * src/common.h - Add SF_PLATFORM_S64 macro as a platform independant way of doing signed 64 - bit integers. - - * src/aiff.c src/svx.c src/wav.c - Add warning in log if files are larger than 4 gigabytes in size. - -2006-11-01 Erik de Castro Lopo - - * src/FLAC src/OGG confgure.ac src/Makefile.am - Pull in all required FLAC and OGG code so external libraries are not - needed. This makes compiling on stupid fscking Windoze easier. - -2006-10-27 Erik de Castro Lopo - - * src/sd2.c - Add workaround for switched sample rate and sample size. - - * src/wav.c - Add workaround for excessively long coding history in the 'bext' chunk. - -2006-10-23 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c src/wav.c doc/command.html - Use SF_AMBISONIC_* instead of SF_TRUE/SF_FALSE. - -2006-10-22 Erik de Castro Lopo - - * src/sndfile.h.in src/wav.c src/wav_w64.c src/common.h doc/command.html - Apply a patch from Fons Adriaensen to allow writing on WAVEX Ambisonic - files. Still needs a little tweaking before its ready for release. - - * src/*.c - Use the UNUSED macro to prevent compiler warnings. - -2006-10-19 Erik de Castro Lopo - - * src/aiff.c - Fix a bug in parsing AIFF files with a slightly unusual 'basc' chunk. Thanks - to David Viens for providing two example files. - - * src/common.(c|h) src/aiff.c - Add a function psf_sanitize_string and use it in aiff.c. - -2006-10-18 Erik de Castro Lopo - - * src/wav_w64.c - Apply a patch from Fons Adriaensen which fixes a minor WAVEX GUID issue. - -2006-10-17 Erik de Castro Lopo - - * src/Makefile.am - Fix problem related to recent test coverage changes. - -2006-10-15 Erik de Castro Lopo - - * configure.ac tests/Makefile.am - Add --enable-test-coverage configure option. - -2006-10-05 Erik de Castro Lopo - - * src/sndfile.hh - Add an std::string SndfileHandle constructor. - - * tests/scale_clip_test.tpl - Fix the 'make distcheck' target. - -2006-10-03 Erik de Castro Lopo - - * src/double64.c src/float32.c - Add optional clipping on float file data to int read data conversions. - - * tests/tests/scale_clip_test.(def|tpl) - Add test for above new code. - -2006-09-06 Erik de Castro Lopo - - * tests/aiff_rw_test.c - Add 'MARK' chunks to make sure they are parsed correctly. - -2006-09-05 Erik de Castro Lopo - - * src/aiff.c - Fix parsing of MARK chunks. Many thanks to Sciss for generating files to - help debug the problem. - -2006-09-02 Erik de Castro Lopo - - * src/common.h - Make the SF_MIN and SF_MAX macros at least partially type safe. - - * tests/lossy_comp_test.c - Fix overflow problems when ensuring that signalis not zero. - -2006-08-31 Erik de Castro Lopo - - * configure.ac docs/*.html - Changes for release 1.0.17. - -2006-08-08 Erik de Castro Lopo - - * src/flac.c - Remove inline from functions called by pointer. Thanks to Sampo Savolainen - for notifying me of this. - -2006-07-31 Erik de Castro Lopo - - * src/sndfile.hh - Add writeSync method. - Add copy constructor and assignment operator (thanks Daniel Schmitt). - Add methods readRaw and writeRaw. - Make read/write/readf/writef simple overlaods instead of templates (thanks - to Trent Apted for suggesting this). - - * tests/cpp_test.cc - Cleanup. Add tests. - -2006-07-30 Erik de Castro Lopo - - * src/sndfile.hh - Templatize the read/write/readf/writef methods as suggested by Lars Luthman. - Prevent the potential leak of SNDFILE* pointers in the openRead/openWrite/ - openReadWrite methods. - Add const to SF_INFO pointer in Sndfile constructor. - Make the destrictor call the close() method. - - * tests/cpp_test.cc - Add more tests. - -2006-07-29 Erik de Castro Lopo - - * tests/cpp_test.cc - Remove the generated file so "make distcheck" passes. - - * src/Makefile.am - Add sndfile.hh to distributed header files. - - * src/sndfile.hh - Change the license for the C++ wrapper to modified BSD. - -2006-07-28 Erik de Castro Lopo - - * src/sndfile.hh - Complete it. - - * tests/cpp_test.cc - Add more tests. - -2006-07-27 Erik de Castro Lopo - - * tests/utils.tpl - Add extern C to generated header file. - - * src/sndfile.hh - Work towards completing this. - - * tests/cpp_test.cc tests/Makefile.am - Add a C++ test and hook into build. - - * configure.ac - Add appropriate CXXFLAGS. - -2006-07-26 Erik de Castro Lopo - - * configure.ac - Test if compiler supports -Wpointer-arith. - - * src/common.c - Fix a warning resulting from -Wpointer-arith. - -2006-07-15 Erik de Castro Lopo - - * examples/sndfile-play.c - Explicitly set endian-ness as well as setting 16 bit output. - - * examples/sndfile-info.c - Make sure to parse info if file fails to open. - - * src/sndfile.c - Handle parse error a little better. - - * src/wav_w64.[ch] - Minor clean up, add detection of IPP ITU G723.1. - -2006-06-23 Erik de Castro Lopo - - * src/sndfile.c - Make sure psf->dataoffset gets reset to zero when openning headersless - files based on the file name extension. - -2006-06-21 Erik de Castro Lopo - - * tests/(command|lossy_comp|pcm|scale_clip)_test.c tests/fix_this.c - tests/write_read_test.(tpl|def) - Fix gcc-4.1 compiler warnings about "dereferencing type-punned pointer will - break strict-aliasing rules". - - * examples/cooledit-fixer.c - More fixes like above. - -2006-06-20 Erik de Castro Lopo - - * src/file_io.c - Fix a windows bug where the syserr string of SF_PRIVATE was not being set - correctly. - - * src/sndfile.c - Fixed a logic bug in sf_seek(). Thanks to Paul Davis for finding this. - -2006-06-04 Erik de Castro Lopo - - * configure.ac - Fixed detection of S_IRGRP. - -2006-05-30 Erik de Castro Lopo - - * sndfile-convert.c - Add conversion SF_INSTRUMENT data when present. - -2006-05-22 Erik de Castro Lopo - - * doc/development.html - Removed references to tla on windows. - - * src/common.h src/sndfile.c - Add separate void pointers for file containter and file codec data to - SF_PRIVATE struct. Still need to move all existing fdata pointers. - - * tests/write_read_test.tpl - Change the order of some tests. - - * src/aiff.c - When writing 'AIFC' files, make sure get an 'FVER' gets added. - - * src/common.h src/(dwvw|flac|g72x|gsm610|ima_adpcm|ms_adpcm|paf|sds).c - src/(sndfile|voc|vox_adpcm|xi).c - Remove fdata field from SF_PRIVATE struct and replace it with codec_data. - -2006-05-10 Erik de Castro Lopo - - * Win32/testprog.c Win32/Makefile.am - Add a minimal win32 test program. - - * Win32/README-precompiled-dll.txt Mingw-make-dist.sh - Update readme and Mingw build script. - -2006-05-09 Erik de Castro Lopo - - * configure.ac acinclude.m4 - Minor fixes for Solaris. - -2006-05-05 Erik de Castro Lopo - - * src/test_endswap.(def|tpl) - Fix printf formatting for int64_t on 64 bit machines. - -2006-05-04 Erik de Castro Lopo - - * src/binhead_check.py - New file to check for bad parameters passed to psf_binheader_writef(). - - * src/Makefile.am - Hook into test suite. - - * src/voc.c src/caf.c src/wav.c src/mat5.c src/mat4.c - Fix bugs found by new test program. - - * src/double64.c - Clean up double64_get_capability(). - -2006-05-03 Erik de Castro Lopo - - * src/wav_w64.c - Fix a bug on x86_64 where an int was being passed via stdargs and being - read using size_t which is 64 bits. Thenks to John ffitch for giving me a - login on his box. - -2006-05-02 Erik de Castro Lopo - - * src/caf.c src/double64.c examples/sndfile-info.c tests/virtual_io_test.c - tests/utils.tpl - Fix a couple of signed/unsigned problems. - -2006-05-01 Erik de Castro Lopo - - * tests/command_test.c - Add channel map tests. - - * src/common.h src/sndfile.c - Add a pointer the the SF_PRIVATE struct and make sure it gets freed in - sf_close(). - -2006-04-30 Erik de Castro Lopo - - * configure.ac doc/(command|index|api).html NEWS README - Updates for 1.0.16 release. - - * src/sndfile.h.in - Define enums for channel mapping. - - * examples/sndfile-info.c - Clean up usage of SF_INFO struct. - -2006-04-29 Erik de Castro Lopo - - * tests/util.tpl - Add function testing function exit_if_true(). - - * tests/floating_point_test.tpl - Fix a problem where the test program was not exiting when the test failed. - -2006-04-15 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c src/common.h src/command.c - Implement new commands SFC_GET_SIGNAL_MAX and SFC_GET_MAX_ALL_CHANNELS. - - * doc/commands.html - Document new commands. Other minor updates. - - * tests/peak_chunk_test.c - Update tests for new commands. - -2006-04-02 Erik de Castro Lopo - - * tests/peak_chunk_test.c - Add test for RIFX and WAVEX files. - Try and confuse the PEAK chunk writing by enabling and disabling it. - - * src/sndfile.c - Fix a bug where enabling and disabling PEAK chunk was screwing up. - -2006-03-31 Erik de Castro Lopo - - * src/sndfile.h.in - Add the block of 190 reserved bytes into this struct to allow for - future expansion. - - * src/wav.c src/sndfile.c src/broadcast.c - Significant cleanup of broadcast wave stuff. - - * examples/sndfile-info.c - Fix print message. - - * tests/command_test.c tests/Makefile.am - Complete bext tests, hook test in test suite. - -2006-03-30 Erik de Castro Lopo - - * src/sndfile.h.in - Make coding_history field of SF_BROADCAST_INFO struct a char array instead - of a char pointer. - - * src/sndfile.c src/common.h src/wav.c - Clean up knock on effects of above chnage. - - * examples/sndfile-info.c - Add -b command line option to usage message. - Clean up output of broadcast wave info. - - * src/wav.c - Ignore and skip the 'levl' chunk. - -2006-03-26 Erik de Castro Lopo - - * configure.ac - Fix handling of --enable and --disable configure args. Thanks to Diego - 'Flameeyes' Pettenò who sent the patch. - -2006-03-22 Erik de Castro Lopo - - * doc/win32.html - Make it really clear that although the MSVC++ cannot compile libsndfile, - the precompiled DLL can be used in C++ programs compiled with MSVC++. - -2006-03-18 Erik de Castro Lopo - - * src/aiff.c - Fix bug in writing of INST chunk in AIFF files. - Fix potential bug in writing MARK chunks. - - * src/sndfile.c - Make sure the instrument chunk can only be written at the start of the file. - - * tests/command_test.c - Add check of log buffer. - - * tests/utils.tpl - Add usage of space character to psf_binheader_writef. - -2006-03-17 Erik de Castro Lopo - - * src/Makefile.am tests/Makefile.am - Remove --source-time argument from autogen command lines. - - * src/broadcast.c - New file for EBU Broadcast chunk in WAV files. - - * src/sndfile.c src/sndfile.h.in src/wav.c src/common.h - Add patch from Paul Davis implementing read/write of the BEXT chunk. - -2006-03-16 Erik de Castro Lopo - - * Win32/README-precompiled-dll.txt - New file descibing how to use the precompiled DLL. - - * Win32/Makefile.am - Add Win32/README-precompiled-dll.txt to EXTRA_DIST files. - - * configure.ac - Bump version to 1.0.15. - -2006-03-11 Erik de Castro Lopo - - * src/wav.c - On read, only add the endian flag if the file is big endian. - - * src/ms_adpcm.c - Fixed writing of APDCM coeffs in RIFX files. - - * tests/write_read_test.tpl tests/lossy_comp_test.c - Add tests for RIFX files. - -2006-03-10 Erik de Castro Lopo - - * Mingw-make-dist.sh - Bunch of improvements. - - * doc/win32.html - Update MinGW program versions. - -2006-03-09 Erik de Castro Lopo - - * src/create_symbols_file.py - Fix the library name in created win32 DEF file. Add correct DLL name for - Cygwin DLL. - - * Win32/Makefile.am tests/Makefile.am - Remove redundant files, add win32_ordinal_test to test suite. - - * tests/win32_ordinal_test.c - Update to do test in cygsndfile-1.dll as well. - - * doc/win32.html - Fix typo, mention that -mno-cygwin with the Cygwin compiler does not work. - - * src/wav.c src/wav_w64.c src/sndfile.c src/sndfile.h.in - Apply large patch from Jesse Chappell which adds support for RIFX files. - -2006-03-08 Erik de Castro Lopo - - * Makefile.am - Add Mingw-make-dist.sh to the extra dist files. - - * configure.ac - Fix setting SHLIB_VERSION_ARG for MinGW. - - * tests/win32_ordinal_test.c - New test program to test that the win32 DLL ordinals agree with the DEF - file. - -2006-03-04 Erik de Castro Lopo - - * src/common.h - Add a static inline function to convert an int to a size_t. This will be - a compile to nothing on 32 bit CPUs and a sign extension on 64 bit CPUs. - - * src/aiff.c src/avr.c src/common.c src/xi.c src/gsm610.c - Fix an ia64 problem where a varargs function was being passed an int in - some places and a size_t in other places. - - * src/sd2.c - Add a workaround for situations where OSX seems to add an extra 0x52 bytes - to the start of the resource fork. - -2006-02-19 Erik de Castro Lopo - - * Mingw-make-dist.sh - Add a shell script to build the windows binary/source ZIP file. - - * doc/index.html - Add download link for windows binary/source ZIP file. Add links for GPG - signatures. - - * doc/win32.html - Remove info about building using microsoft compiler. - - * configure.ac - Bump version to 1.0.14. - -2006-02-11 Erik de Castro Lopo - - * src/sd2.c - Improve logging of errors in resource fork parser. - -2006-01-31 Erik de Castro Lopo - - * Win32/Makefile.msvc - Replace au_g72x.* with g72x.*. Thanks to ussell Borogove. - -2006-01-29 Erik de Castro Lopo - - * src/common.c - Make sure return values are initialised header buffer is full. - - * src/wav.c - Add workarounds for messed up WAV files. - -2006-01-21 Erik de Castro Lopo - - * Win32/config.h - Undef HAVE_INTTYPES_H for win32. - - * tests/command_test.c - Don't exit on error in instrument test for XI files. - - * configure.ac - Bump version to 1.0.13. - - * doc/*.html NEWS README - Update version numbers. - -2006-01-19 Erik de Castro Lopo - - * src/xi.c - Start work on add read/write of instrument chunks. - - * src/command_test.c - Add tests for XI instrument chunk. - - * tests/largefile_test.c tests/Makefile.am - Add new test and hook it into the build system. This test will not be run - automatically because it requires 3 Gig of disk space and takes 3 minutes - to run. - -2006-01-10 Erik de Castro Lopo - - * examples/sndfile-play.c - Fix calculation of samples remaining in win32 code. Thanks Axel Röbel. - - * src/common.h - Make sure length of header buffer can hold header plus strings. Thanks Axel - Röbel. - -2006-01-09 Erik de Castro Lopo - - * src/sndfile.h.in src/aiff.c src/wav.c - Apply a patch from John ffitch (Csound project). - Add detune field to SF_INSTRUMENT struct. - Add reading/writing instrument chunks to WAV files. - - * tests/command_test.c - Update SF_INSTRUMENT tests. - - * tests/Makefile.am - Hook instrument tests into test suite. - -2006-01-05 Erik de Castro Lopo - - * configure.ac - Check for because some broken systems (like Solaris) don't have - which is the 1999 ISO C standard file containing int64_t. - - * src/sfendian.h src/common.h - Use if is not available. - -2005-12-30 Erik de Castro Lopo - - * tests/peak_chunk_test.c - Extend and clean up tests. - - * src/sndfile.c - Fix a bug that prevented the turning off of PEAK chunks. - -2005-12-29 Erik de Castro Lopo - - * tests/error_test.c - Make the test distclean correct. - - * src/file_io.c - Fix an SD2 MacOSX bug (reported by vince schwarzinger). - -2005-12-28 Erik de Castro Lopo - - * src/aiff.c tests/command_test.c - Apply a big patch from John ffitch (Csound project) to add reading and - writing of instrument chunks to AIFF files. Also update the test. - -2005-12-10 Erik de Castro Lopo - - * tests/aiff_rw_test.c tests/virtual_io_test.c tests/utils.tpl - Move test function dump_data_to_file() to utils.tpl. - - * tests/error_test.c tests/Makefile.am - Updates, including a new test to test that sf_error() returns a valid error - number. - -2005-12-07 Erik de Castro Lopo - - * examples/list_formats.c - Make sure the SF_INFO struct is memset to all zero before being used. - Thanks to Stephen F. Booth. - - * src/sndfile.c - Make the return value of sf_error() match the API documentation. - -2005-11-19 Erik de Castro Lopo - - * examples/sndfile-convert.c - Allow conversion to raw gsm610. - - * src/common.h src/sndfile.c src/au.c - Remove au_nh_open() and all references to it (wasn't working anyway). - - * tests/headerless_test.c - Add new test for file extension based detection. - - * src/sndfile.c - Rejig file extension based file type detection. - -2005-11-16 Erik de Castro Lopo - - * src/sndfile.c - Add "gsm" as a recognised file extension when no magic number can be found. - - * tests/lossy_comp_test.c tests/Makefile.am - Test headerless GSM610. - -2005-11-13 Erik de Castro Lopo - - * doc/api.html - Fix a minor typo and a minor error. Thanks Christoph Kobe and John Pavel. - -2005-10-30 Erik de Castro Lopo - - * src/wav_w64.c - Add more reporting of 'fmt ' chunk for G721 encoded files. - - * src/wav.c - Gernerate a more correct 20 byte 'fmt ' chunk rather than a 16 byte one. - -2005-10-29 Erik de Castro Lopo - - * src/G72x/g72x.[ch] - Minor cleanup of interface. - -2005-10-28 Erik de Castro Lopo - - * src/ogg.c - Removed the horribly broken and non-functional OGG implementation when - --enable-experimental was enabled. When OGG does finally work it will be - merged. - - * src/caf.c - Fix a memory leak. - -2005-10-27 Erik de Castro Lopo - - * src/g72x.c src/G72x/*.(c|h) src/common.h src/sndfile.c src/wav.c src/au.c - Add support for G721 encoded WAV files. - - * doc/index.html - Update support matrix. - - * tests/lossy_comp_test.c - For file formats that support it, add string data after the audio data and - make sure it isn't treated as audio data on read. - - * src/gsm610.c - Add code to ensure that the container close function (ie for WAV files) gets - called after the codec's close function. This allows GSM610 encoded WAV files - to have string data following the audio data. - Add an AIFF specific check on psf->datalength. - - * src/wav.c - Simplify wav_close function. - - * src/aiff.c - Make sure the tailer data gets written at an even file offset. Pad if - necessary. - - * src/common.h - Replace the close function pointer in SF_PRIVATE with separate functions - codec_close and container_close. The former is always called first. - - * src/*.c - Fix knock on effects of above. - -2005-10-26 Erik de Castro Lopo - - * examples/sndfile-info.c - Complete dumping SF_INSTRUMENT data. - - * src/dwvw.c src/ima_adpcm.c src/gsm610.c src/ms_adpcm.c - Add extra checks in *_init function. - - * tests/lossy_comp_test.c - Add a string comment to the end of the files to make sure that the decoder - doesn't decode beyond the end of the audio data section. - -2005-10-25 Erik de Castro Lopo - - * examples/sndfile-info.c - Minor code cleanup. - Start work on dumping SF_INSTRUMENT data. - -2005-10-23 Erik de Castro Lopo - - * src/sndfile.h.in src/common.h src/common.c - Update definition of SF_INSTRUMENT struct and create a function to allocate - and initialize the struct (input from David Viens). - Clean up definition of SF_INSTRUMENT struct. - - * src/wav.c src/wav_w64.c - Add support for Ambisoncs B WAVEX files (David Viens). - - * src/aiff.c src/wav.c src/wav_w64.c - Start work on reading/writing the SF_INSTRUMENT data. - - * src/sndfile.c - Add code to get and set SF_INSTRUMENT data. - - * tests/command_test.* tests/Makefile.am - Add test for set and getof SF_INSTRUMENT data. - The file command_test.c is no longer autogen generated. - -2005-10-15 Erik de Castro Lopo - - * src/gsm610.c - Minor cleanup. - -2005-10-14 Erik de Castro Lopo - - * tests/lossy_comp_test.c - Minor cleanup. - -2005-10-13 Erik de Castro Lopo - - * src/*.c - Ensure sfconfig.h is included before any other header file. - - * src/file_io.c - Add comments documenting the three sections of the file. - - * src/gsm610.c - Make sure SF_FORMAT_WAVEX are handled correctly. - -2005-10-07 Erik de Castro Lopo - - * configure.ac - Add options to allow disabling of FLAC and ALSA. Suggested by Ben Greear. - -2005-09-30 Erik de Castro Lopo - - * tests/locale_test.c - Modify the way the unicode strings were encoded so that older compilers - do not complain. Thanks Axel Röbel. - - * configure.ac - Bump the version to 1.0.12 for release. - - * NEWS README Win32/config.h doc/(FAQ|index.html|command|api).html - Update version numbers. - -2005-09-26 Erik de Castro Lopo - - * src/flac.c - Fix valgrind error and minor cleanup. - -2005-09-25 Erik de Castro Lopo - - * src/(au|paf|aiff|w64|wav|svx).c - Make sure structs are initialised. - -2005-09-24 Erik de Castro Lopo - - * configure.ac - Make -Wdeclaration-after-statement work with --enable-gcc-werror configure - option. - Add -std=gnu99 (C99 plus posix style stuff like gmtime_r) to CFLAGS if the - compiler supports it. - -2005-09-23 Erik de Castro Lopo - - * configure.ac acinclude.m4 - Add -Wdeclaration-after-statement to CFLAGS if the compilers supports it. - -2005-09-22 Erik de Castro Lopo - - * tests/util.(tpl|def) - Make the test_write_*_or_die() functions const safe. - -2005-09-21 Erik de Castro Lopo - - * src/nist.c - Make sure the data offset is read from the file header. Thanks to - David A. van Leeuwen for a patch. - -2005-09-20 Erik de Castro Lopo - - * configure.ac src/sfconfig.h - Check for and the function setlocale(). - Set config variables to zero if not found. - - * tests/locale_test.c tests/Makefile.am - Add new test program and hook into build/test system. - -2005-09-18 Erik de Castro Lopo - - * src/common.h src/file_io.c - On windows, use windows specific types for file handles. - Add functions psf_init_files() and psf_use_rsrc(). - - * src/sd2.c - Make resource fork handling independant of file desciptor/handles. - - * src/sndfile.c src/test_file_io.c - Fix knock on effects. - -2005-09-06 Erik de Castro Lopo - - * src/float_cast.h - The lrint and lrintf implementations in Cygwin are both buggy and slow. - Add replacements which were pulled from the Public Domain MinGW math.h - header file. - -2005-09-05 Erik de Castro Lopo - - * tests/(lossy_comp_test|virtual_io_test).c - More Valgrind fixups. - - * configure.ac - Simplify and correct configuring for Cygwin. - - * Win32/config.h Win32/sndfile.h Win32/Makefile.msvc - Update build for MSVC. - -2005-09-04 Erik de Castro Lopo - - * tests/lossy_comp_test.c - Make sure to close SNDFILE when exiting test when file format is not seekable. - - * tests/(aiff_rw_test|virtual_io_test).c - Do a few valgrind fix ups. - -2005-09-03 Erik de Castro Lopo - - * src/float32.c src/double64.c - Replace floating point equality comparisons with greater/less comparisons. - Found by John Pavel using the Intel compiler. - - * src/sfconfig.h - New file to clean up issues surrounding autoconf generated preprocessor - symbols. - - * src/*.(c|h) tests/*.(c|tpl) examples/*.c - Fixed a bunch of other stuff found by John Pavel using the Intel compiler. - - * src/file_io.c - Remove Mac OS9 Metrowerks compiler specific hacks. - -2005-08-31 Erik de Castro Lopo - - * src/w64.c - Cast integer literal to sf_count_t in call to psf_binheader_writef() to - prevent Valgrind error. - -2005-08-30 Erik de Castro Lopo - - * doc/command.html - Improve documentation of SF_GET_FORMAT_SUBTYPE. - -2005-08-26 Erik de Castro Lopo - - * examples/sndfile-convert.c - Allow files to be converted to SD2 format. - - * src/sd2.c - Fix a bug in reading and writing of SD2 files on little endian CPUs. - Thanks to Matthew Willis for finding this. - -2005-08-25 Erik de Castro Lopo - - * doc/api.html - Update Note2 to point to SFC_SET_SCALE_FLOAT_INT_READ. - -2005-08-16 Erik de Castro Lopo - - * configure.ac - Use $host_os instead of $target_os (thanks to Mo De Jong). - -2005-08-15 Erik de Castro Lopo - - * src/Makefile.am - Apply a patch from Mo DeJong to allow building outside of the source dir. - - * src/file_io.c - Fix psf_fsync() for win32. - - * src/wav.c src/wav_w64.(c|h) - Move some code from wav.c to wav_w64.c to improve the log output of files of - type WAVE_FORMAT_EXTENSIBLE. - -2005-08-10 Erik de Castro Lopo - - * src/create_symbols_file.py - Make sure sf_write_fsync is an exported symbol. - - * examples/sndfile-convert.c - Add support for writing VOX adpcm files. - -2005-07-31 Erik de Castro Lopo - - * doc/api.html - Document the new function sf_write_sync(). - - * doc/FAQ.html - Do you plan to support XYZ codec. - -2005-07-28 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c - Add function sf_write_sync() to the API. - - * src/common.h src/file_io.c - Low level implementation (win32 not done yet). - - * tests/write_read_test.tpl - Use the new function in the tests. - -2005-07-24 Erik de Castro Lopo - - * src/common.h src/double64.c src/float32.c src/sndfile.c - Change the way PEAK chunk info is stored. Peaks now stored as an sf_count_t - for position and a double as the value. - - * src/aiff.c src/caf.c src/wav.c - Fix knock on effects of above changes. - - * src/caf.c - Implement 'peak' chunk for file wuth data in SF_FORMAT_FLOAT or - SF_FORMAT_DOUBLE format. - -2005-07-23 Erik de Castro Lopo - - * src/nist.c - Fix a bug where a variable was being used without being initialized. - - * src/flac.c - Add extra debug in sf_flac_meta_callback. - Make a bunch of private functions static. - - * src/aiff.c src/wav.c - Fix allocation for PEAK_CHUNK (bug found using valgrind). - -2005-07-21 Erik de Castro Lopo - - * src/common.h - Move the peak_loc field of SF_PRIVATE to the PEAK_CHUNK struct. - Remove had_peak field of SF_PRIVATE, use pchunk != NULL instead. - Rename PEAK_CHUNK and PEAK_POS to PEAK_CHUNK_32 and PEAK_POS_32. - - * src/aiff.c src/caf.c src/wav.c src/float32.c src/double64.c - Fix knock on effects from above. - -2005-07-19 Erik de Castro Lopo - - * src/wav.c - Prevent files with unknown chunks from being opened read/write. - -2005-07-14 Erik de Castro Lopo - - * src/flac.c - Do not use psf->end_of_file because it never gets set to anything. - - * src/common.h - Remove unused SF_PRIVATE field end_of_file. - -2005-07-12 Erik de Castro Lopo - - * src/common.c - Change the 'S' format specifier of psf_binheader_writef() to write AIFF - style strings (no terminating character). - - * src/aiff.c - Move to new (correct) AIFF string style. Thanks to Axel Röbel for being - so persistent on this issue. - -2005-07-11 Erik de Castro Lopo - - * src/sndfile.c - Allow SFE_UNSUPPORTED_FORMAT as an error from sf_open(). - - * doc/api.html doc/command.html - Documentation updates (thanks to Kyroz for promoting these updates). - - * src/mat5.c - Modify the way the header is written. - -2005-07-10 Erik de Castro Lopo - - * src/caf.c - Add a 'free' chunk to the written file so that the audio data starts at - an offset of 0x1000. - - * src/sndfile.c - Allow SFE_UNSUPPORTED_FORMAT as an error from sf_open(). - -2005-07-09 Erik de Castro Lopo - - * src/caf.c src/sndfile.c - Add support for signed 8 bit integers. - - * tests/write_read_test.tpl - Add test for signed 8 bit integers in CAF files. - - * doc/index.html - Update matrix for signed 8 bit integers in CAF files. - -2005-07-08 Erik de Castro Lopo - - * src/sndfile.c - Update sf_check_format() to support CAF. - - * examples/sndfile-convert.c - Add support for ".caf" file extension. - - * doc/index.html - Add Apple CAF to the support matrix. - - * src/caf.c - Add file write support. - - * src/common.c - Fix printing of Frames. - - * tests/Makefile.am tests/write_read_test.tpl tests/lossy_comp_test.c - tests/header_test.tpl misc_test.c - Add tests for CAF files. - -2005-07-07 Erik de Castro Lopo - - * doc/FAQ.html - Fix Q/A about reading/writing memory buffers. - - * src/caf.c - Bunch of work to support reading of CAF files. - -2005-07-04 Erik de Castro Lopo - - * src/(aiff|ima_adpcm|mat4|mat5|ms_adpcm).c examples/sndfile-play.c - Fix sign conversion errors reported by gcc-4.0. - - * src/caf.c - New file for Apple's Core Audio File format. - - * src/sndfile.c src/common.h src/sndfile.h.in src/Makefile.am - Hook new file into build system. - -2005-06-21 Erik de Castro Lopo - - * src_wav_w64.c - Fix handling of stupidly large 'fmt ' chunks. Thanks to Vadim Berezniker - for supplying an example file. - - * src/common.h src/sndfile.c - Remove redundant error code SFE_WAV_FMT_TOO_BIG. - -2005-06-20 Erik de Castro Lopo - - * src/sndfile.h.in src/common.h src/sndfile.c - Add public error value SF_ERR_MALFORMED_FILE. - - * src/sndfile.c - When parsing a file header fails and we don't have a system error, then set - the error number to SF_ERR_MALFORMED_FILE (suggested by Kyroz). - - * configure.ac - Allow sqlite support to be disabled in configure script. - - * regtest/database.c regtest/sndfile-regtest.c - Fix compiling when sqlite is missing. - -2005-06-11 Erik de Castro Lopo - - * src/file_io.c - Fix psf_is_pipe() and return value of psf_fread() when using virtual i/o. - - * src/sndfile.c - Fix VALIDATE_AND_ASSIGN_PSF macro for virtual i/o. - - * tests/virtual_io_test.c - Fill in skeleton test program. - - * tests/Makefile.am - Move virtual i/o tests to end of tests with stdio/pipe tests. - - * src/(sndfile.h.in|file_io.c|common.h|sndfile.c) tests/virtual_io_test.c - Rename some of the virtual i/o functions and data types. - -2005-06-10 Erik de Castro Lopo - - * src/sndfile.c - Fix the return values of sf_commands : SFC_SET_NORM_DOUBLE, - SFC_SET_NORM_FLOAT, SFC_GET_LIB_VERSION and SFC_GET_LOG_INFO. Thanks to - Kyroz for pointing out these errors. - - * doc/command.html - Correct documented return values for SFC_SET_NORM_DOUBLE and - SFC_SET_NORM_FLOAT. Thanks to Kyroz again. - -2005-05-17 Erik de Castro Lopo - - * regtest/* - Add new files for sndfile-regtest program. - - * configure.ac Makefile.am - Hook regetest into build. - - * src/wav.c src/common.c - Fix a regression where long ICMT chunks were causing the WAV parser - to exit. - -2005-05-15 Erik de Castro Lopo - - * libsndfile.spec.in - Add html docs to the files section as suggested by Karsten Jeppesen. - - * src/aiff.c - Fix parsing of odd length ANNO chunks. - -2005-05-13 Erik de Castro Lopo - - * src/common.h - Change the include guard to prevent clashes with other code. - -2005-05-12 Erik de Castro Lopo - - * examples/sndfile-play.c - Improve error handling in code for playback under Linux/ALSA. - -2005-05-10 Erik de Castro Lopo - - * src/ircam.c - Fix writing of IRCAM files on big endian systems (thanks to Axel Röbel). - - * src/wav.c - Add workaround for files created by the Peak audio editor on Mac which can - produce files with very short LIST chunks (thanks to Jonathan Segel who - supplied the file). - -2005-04-30 Erik de Castro Lopo - - * src/aiff.c - Apply a patch From David Viens to make the parsing of basc chunks more - robust. - - * src/wav.c - Another patch from David Viens to write correct wavex channel masks for - the most common channel configurations. - -2005-04-08 Erik de Castro Lopo - - * src/command.c - Only allow FLAC in the format arrays if FLAC is enabled. Thanks to - Leigh Smith. - -2005-03-09 Erik de Castro Lopo - - * src/common.h - Add a directory field for storing the file directory to the SF_PRIVATE - struct. - - * src/sndfile.c - Grab the directory name when copying the file path. - - * src/file_io.c - Cleanup psf_open_rsrc() and also check for resource fork in - .AppleDouble/filename. - -2005-03-01 Erik de Castro Lopo - - * src/svx.c - Fix a bug in the printing of the channel count. Bug reported by Michael - Schwendt. Thanks. - -2005-01-26 Erik de Castro Lopo - - * src/paf.c - Fix a seek bug for 24 bit PAF files. - - * tests/write_read_test.tpl - Update write_read_test to trigger the previously hidden PAF seek bug. - -2005-01-25 Erik de Castro Lopo - - * src/aiff.c src/w64.c src/wav.c - Do not return a header parse error when the log buffer overflows. - Continuing parsing works even on files where the log buffer does overflow. - This avoids a bug on some weirdo WAV (and other) files. - - * src/common.h src/sndfile.c - Remove SFE_LOG_OVERRIN error and its associated error message. - - * src/file_io.c - Fix a rsrc fork problem on MacOSX. - -2004-12-31 Erik de Castro Lopo - - * src/sndfile-play.c - In the ALSA output code, added call to snd_pcm_drain() just before - snd_pcm_close() as suggested by Thomas Kaeding. - In the OSS output code, added two ioctls (SNDCTL_DSP_POST and - SNDCTL_DSP_SYNC) just before the close of the audio device. - - * tests/virtual_io_test.c tests/Makefile.am - Add a new test program (currently empty) and add it to the build. - -2004-12-29 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.h src/common.h src/file_io.c - src/create_symbols_file.py - Apply patch from Steve Baker which is the beginnings of a virtual - I/O interface. - -2004-12-23 Erik de Castro Lopo - - * src/*.c src/sndfile.h.in - Const-ify the write path throughout the library. - -2004-12-14 Erik de Castro Lopo - - * doc/development.html - Minor improvements. - -2004-11-29 Erik de Castro Lopo - - * doc/bugs.html - Minor improvements. - -2004-11-18 Erik de Castro Lopo - - * src/aiff.c - Add workaround for Logic Platinum AIFF files with broken COMT chunks. - -2004-11-16 Erik de Castro Lopo - - * doc/FAQ.html - Remove some ambiguities in the SD2 FAQ answer. - -2004-11-15 Erik de Castro Lopo - - * Win32/sndfile.h Win32/config.h MacOS9/sndfile.h MacOS9/config.h - Updates from autoconfig versions. - -2004-11-13 Erik de Castro Lopo - - * src/aiff.c - Fix parsing of COMT chunks. Store SF_STR_COMMENT data in ANNO chunks - instead of COMT chunk. - -2004-11-07 Erik de Castro Lopo - - * src/file_io.c src/common.h - Change the ptr argument to psf_write() from "void*" to a "const void*". - Thanks to Tobias Gehrig for suggesting this. - -2004-10-31 Erik de Castro Lopo - - * src/file_io.c src/common.h - Add functions psf_close_rsrc() and read length of resourse fork into - rsrclength field of SF_PRIVATE. - - * src/sd2.c - Make sure resource fork gets closed. - - * tests/util.tpl - Add functions to check for file descriptor leakage. - - * src/write_read_test.tpl - Use the file descriptor leak checks. - - * src/sndfile.h.in - Add SFC_GET_LOOP_INFO and SF_LOOP_INFO struct. - - * src/common.h - Add SF_LOOP_INFO pointer to SF_PRIVATE. - - * src/wav.c src/aiff.c - Improve and add parsing of 'ACID' and 'basc' chunks, filling in - SF_LOOP_INFO data in SF_PRIVATE. - -2004-10-30 Erik de Castro Lopo - - * src/sd2.c - Further cleanup: remove printfs, change snprintf to LSF_SNPRINTF. - - * Win32/config.h Win32/sndfile.h - Updates. - - * tests/util.tpl - Add win32 macro for snprintf. - -2004-10-29 Erik de Castro Lopo - - * src/sfendian.h - Add macros : H2BE_SHORT, H2BE_INT, H2LE_SHORT and H2LE_INT. - - * src/sd2.c - Use macros to make sure writing SD2 files on little endian machines works - correctly. - - * tests/util.tpl - Add a delete_file() function which also deletes the resource fork of SD2 - files. - - * tests/write_read_test.tpl - Use delete_file() so that "make distcheck" works. - -2004-10-28 Erik de Castro Lopo - - * src/sndfile.c src/file_io.c - Move resource filename construction and testing to psf_open_rsrc(). - - * src/common.h src/sndfile.c - Add error SFE_SD2_FD_DISALLOWED. - - * tests/util.tpl tests/*.(c|tpl) - Add and allow_fd parameter to test_open_file_or_die() so that use of - sf_open_fd() can be avoided when opening SD2 files. - -2004-10-27 Erik de Castro Lopo - - * src/wav.c - Update ACID chunk parsing. - - * src/sd2.c - More fixes for files with large resource forks. - -2004-10-23 Erik de Castro Lopo - - * src/common.h src/sndfile.c - Add error numbers and messages for sd2 files. - - * src/sd2.c - Reading of sd2 (resource fork version) now seems to be working. - -2004-10-17 Erik de Castro Lopo - - * src/file_io.h - Update file_io.c to include win32 psf_rsrc_open(). - - * tests/floating_point_test.tpl - Remove use of __func__ in test programs (MSVC++ doesn't grok this). - - * Win32/(config|sndfile).h MacOS9/(config|sndfile).h - Updates. - -2004-10-13 Erik de Castro Lopo - - * src/sfendian.h - Fix endswap_int64_t_(array|copy). - - * src/test_endswap.(tpl|def) - Add tests for above and inprove all tests. - -2004-10-12 Erik de Castro Lopo - - * src/sfendian.h - Improve type safety, add endswap_double_array(). - - * src/double64.c - Use endswap_double_array() instead of endswap_long_array(). - - * src/test_endswap.(tpl|def) src/Makefile.am - Add preliminary endswap tests and hook into build system. - -2004-10-06 Erik de Castro Lopo - - * src/configure.ac src/makefile.am - Finally fix the bulding of DLLs on Win32/MinGW. - - * tests/makefile.am - Fix running of tests on Win32/MinGW. - -2004-10-01 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c tests/floating_point_test.tpl - Rename SFC_SET_FLOAT_INT_MULTIPLIER to SFC_SET_SCALE_FLOAT_INT_READ. - - * doc/command.html - Document SFC_SET_SCALE_FLOAT_INT_READ. - -2004-09-30 Erik de Castro Lopo - - * tests/floating_point_test.(tpl|def) - Derived from floating_point_test.c. - Add (float|double)_(short|int)_test functions. - - * tests/util.(tpl|def) - Make separate float and double versions of gen_windowed_sine(). - - * tests/write_read_test.tpl - Fix after changes to gen_windowed_sine(). - - * src/(float32|double64).c - Implement SFC_SET_FLOAT_INT_MULTIPPLIER. - -2004-09-29 Erik de Castro Lopo - - * acinclude.m4 - Fix warnings from automake 1.8 and later. - - * examples/sndfile-info.c - Add a "fflush (stdout)" after printing Win32 message. - -2004-09-28 Erik de Castro Lopo - - * Win32/Makefile.mingw.in - Add a "make install" target. - -2004-09-24 Erik de Castro Lopo - - * src/sndfile.h.in src/common.h src/sndfile.c src/command.c - Start work on adding command SFC_SET_FLOAT_INT_MULTIPLIER. - -2004-09-22 Erik de Castro Lopo - - * examples/sndfile-convert.c - Fix a bug converting stereo integer PCM files to float. - -2004-09-22 Erik de Castro Lopo - - * examples/sndfile-play.c - Appy patch from Conrad Parker to make Mac OSX error messages more - consistent and informative. - - * doc/api.html - Fix a HTML HREF which was wrong. - - * doc/win32.html - Add information about when nmake fails. - -2004-09-05 Erik de Castro Lopo - - * examples/sndfile-play.c - Another patch from Denis Cote to prevent race conditions. - -2004-09-02 Erik de Castro Lopo - - * src/common.h src/ms_adpcm.c src/ima_adpcm.c - Fix alternative to ISO standard flexible struct array feature for broken - compilers. - -2004-08-31 Erik de Castro Lopo - - * src/common.h src/string.c src/sndfile.c - Make sf_set_string() return an error if trying to set a string when in - read mode. - -2004-08-29 Erik de Castro Lopo - - * src/common.h - Change the unnamed union into a named union so gcc-2.95 will compile it. - - * src/*.c - Fixes to allow for the above change. - -2004-08-20 Erik de Castro Lopo - - * examples/sndfile-play.c - Fixes for Win32. Thanks to Denis Cote. - - * Win32/Win32/Makefile.(msvc|mingw.in) - Fix build system after removal of sfendian.h. - Build sndfile-convert. - - * src/Makefile.am - Remove sfendian.c from dependancies. - -2004-08-10 Erik de Castro Lopo - - * src/sndfile.h.in - Fix typo in comments (thanks Tommi Sakari Uimonen). - -2004-07-31 Erik de Castro Lopo - - * tests/(a|u)law_test.c - Minor cleanup. - -2004-07-29 Erik de Castro Lopo - - * src/(pcm|float|double64|ulaw|alaw|xi).c - Optimise read/write loops by removing a redundant variable. - -2004-07-24 Erik de Castro Lopo - - * src/file_io.c - Remove call to fsync() in psf_close(). - -2004-07-19 Erik de Castro Lopo - - * src/pcm.c - Inline x2y_array() functions where possible. - - * configure.ac - Detect presence of type int64_t. - - * src/sfendian.c src/sfendian.h - Move functions in the first file to the sfendian.h as static inline - functions. - Improve endswap_long_*() where possible. - -2004-07-17 Erik de Castro Lopo - - * src/pcm.c - When converting from unsigned char to float or double, subtract 128 before - converting to float/double rather than after to save a floating point - operation as suggested by Stefan Briesenick. - - * src/(pcm|sfendian|alaw|ulaw|double64|float32).c - Optimize inner loops by changing the loop counting slightly as suggested - by Stefan Briesenick. - - * configure.ac - Detect presence of . - - * src/sfendian.h - Use if present as suggested by Stefan Briesenick. - - * src/pcm.c - Update bytewapping. - -2004-07-02 Erik de Castro Lopo - - * src/common.h src/*.c - Change the psf->buffer field of SF_PRIVATE into a more type safe union with - double, float, int etc elements. - -2004-06-28 Erik de Castro Lopo - - * examples/sndfile-play.c - Merge slightly modifed patch from Stanko Juzbasic which allows playback of - mono files on MacOSX. - -2004-06-25 Erik de Castro Lopo - - * examples/sndfile-convert.c - Move copy_metadata() after the second sf_open(). - -2004-06-21 Erik de Castro Lopo - - * examples/sndfile-convert.c - Fix a bug which caused the program to go into an infinite loop if the source - file has no meta-data. Thanks to Ron Parker for reporting this. - - * src/sndfile.h.in - Add SF_STR_FIRST and SF_STR_LAST to allow enumeration of string types. - - * Win32/sndfile.h MacOS9/sndfile.h - Update these as per the above file. - -2004-06-17 Erik de Castro Lopo - - * configure.ac src/common.h src/ogg.c src/sndfile.c src/sndfile.h.in - src/Makefile.am - Apply large patch from Conrad Parker implementing Ogg Vorbis, Ogg Speex and - Annodex support via liboggz and libfishsound. Thanks Conrad. - -2004-06-15 Erik de Castro Lopo - - * src/avr.c src/ircam.c src/nist.c src/paf.c src/xi.c - Add cast to size_t for some parameters passed to psf_binheader_writef. This - is Debian bug number 253490. Thanks to Anand Kumria and Andreas Jochens. - - * src/w64.c - Found and fixed a bug resulting from use of size_t when writing W64 'fmt ' - chunk. - -2004-06-14 Erik de Castro Lopo - - * configure.ac - Bump version to 1.0.10 ready for release. - - * Makefile.am - Remove redundant files (check_libsndfile.py libsndfile_version_convert.py) - from distribution tarball. - - * tests/header_test.tpl - Fix uninitialised variable. - - * src/GSM610/short_term.c - Fix compiler warning on MSVC++. - -2004-05-23 Erik de Castro Lopo - - * src/wav.c - Improve record keeping of chunks seen and return an error if a file with - unusual chunks is opened in mode SFM_RDWR. - - * src/mmreg.h - This file not needed so remove it. - -2004-05-22 Erik de Castro Lopo - - * tests/header_test.tpl - Add extra_header_test(). - - * src/common.h src/sndfile.c - Add SFE_RDWR_BAD_HEADER error number and string. - -2004-05-21 Erik de Castro Lopo - - * tests/utils.tpl tests/*.c tests/*.tpl - Add a line number argument to check_log_buffer_or_die() and update all - files that use that function. - - * tests/header_test.tpl - Modify/update tests for files opened SFM_RDWR and SFC_UPDATE_HEADER_AUTO. - - * src/aiff.c src/wav.c - Fix another bug in AIFF and WAV files opened in SFM_RDWR and using - SFC_UPDATE_HEADER_AUTO. - - * src/test_file_io.c - Add a test for psf_ftruncate() function. - -2004-05-19 Erik de Castro Lopo - - * src/sndfile.c - Fix another weird corner case bug found by Martin Rumori. Thanks. - - * tests/header_test.(tpl|def) - Two new files to test for the absence of the above bug and include tests - moved from tests/misc_test.c. - - * tests/Makefile.am - Hook new tests into build/test system. - - * tests/misc_test.c - Remove update_header_test() which has been moved to the new files above. - -2004-05-16 Erik de Castro Lopo - - * src/aiff.c - Fixed a bug reported by Martin Rumori on the LAD list. If a file created - with a format of SF_FORMAT_FLOAT and then closed before any data is written - to it, the header can get screwed up (PEAK chunk gets overwritten). - - * tests/write_read_test.tpl - Add a test (empty_file_test) for the above bug. - -2004-05-13 Erik de Castro Lopo - - * Win32/Makefile.mingw.in - Added a Makefile for MinGW (needs to be processed by configure). - - * src/mmsystem.h src/mmreg.h - Add files from the Wine project (under the LGPL) to allow build of - sndfile-play.exe under MinGW. - -2004-05-12 Erik de Castro Lopo - - * src/GSM610/gsm610_priv.h - Replace ugly macros with inline functions. - - * src/GSM610/*.c - Remove temporary variables used by macros and other minor fixes required by - above change. - -2004-05-10 Erik de Castro Lopo - - * tests/pipe_test.tpl tests/stdio_test.c Win32/Makefile.msvc - Make sure these programs compile (even though they do nothing) on Win32 - and add them to the "make check" target. - - * src/sfendian.h - Fix warning on Sparc CPU and code cleanup. - -2004-05-09 Erik de Castro Lopo - - * src/file_io.c - Fix warning messages when compiling under MinGW. - -2004-05-01 Erik de Castro Lopo - - * configure.ac - Set HAVE_FLEXIBLE_ARRAY in src/config.h depending on whether the compiler - accepts the flexible array struct member as per 1999 ISO C standard. - - * src/common.h src/ima_adpcm.c src/paf.c src/ms_adpcm.c - Added ugly #if HAVE_FLEXIBLE_ARRAY and provided a non-standards compliant - hack for non 1999 ISO C compliant compilers. - -2004-04-26 Erik de Castro Lopo - - * src/strings.c - If adding an SF_STR_SOFTWARE string, only append libsndfile-X.Y.Z if the - string does not already have libsndfile in the string. Thanks to Conrad - Parker. - - * tests/string_test.c - Add test to verify the above. - - * examples/sndfile-convert.c - Add ability to transcode meta data as well (Conrad Parker). - -2004-04-25 Erik de Castro Lopo - - * doc/command.html - Fix minor error. Thanks to Simon Burton. - - * doc/win32.html - Started adding instructions for compiling libsndfile under MinGW. - - * configure.ac - Add --enable-bow-docs to enable black text on a white background HTML docs. - - * doc/libsndfile.css.in - This is now a template file for configure which sets the foreground and - background colours. - -2004-04-20 Erik de Castro Lopo - - * configure.ac - Do some MinGW fixes. - - * configure.ac doc/Makefile.am - Install HTML docs when doing make install. - -2004-04-19 Erik de Castro Lopo - - * examples/sndfile-info.c - Print out the dB level with the signal max. - -2004-04-15 Erik de Castro Lopo - - * src/file_io.c - Define S_ISSOCK in src/file_io.c if required. - -2004-04-03 Erik de Castro Lopo - - * configure.ac - Improve printout configuration summary (as suggested by Axel Röbel). - - * doc/index.html - Add link to pre-release location. - - * src/sndfile.h.in - Remove comma after last element of enum. - - * src/float32.c src/double64.c - Fix read/write of float/double encoded raw files to/from pipes. - - * tests/pipe_test.c tests/pipe_test.tpl tests/pipe_test.def - Turn pipe_test.c into an autogenerated file and add tests for reading/ - writing floats and doubles. - - * tests/Makefile.am - Hook tests/pipe_test.* into build system. - -2004-04-02 Erik de Castro Lopo - - * configure.ac acinclude.m4 - Rename AC_C_STRUCT_HACK macro to AC_C99_FLEXIBLE_ARRAY. - -2004-03-31 Erik de Castro Lopo - - * tests/misc_test.c - Perform update_header_test in RDWR mode as well. - - * src/aiff.c - Fix problems when updating header in RDWR mode. - -2004-03-30 Erik de Castro Lopo - - * src/wav.c src/w64.c src/wav_w64.c - Integrate code supplied by David Viens for supporting microsoft's - WAVEFORMATEXTENSIBLE stuff. Thanks David for supplying this. - - * configure.ac doc/*.html - Bump version to 1.0.9. - -2004-03-28 Erik de Castro Lopo - - * src/command.c src/sndfile.c src/sndfile.h.in src/wav.c - Started work on supporting microsoft's WAVEFORMATEXTENSIBLE gunk. - -2004-03-26 Erik de Castro Lopo - - * src/avr.c - New file to handle Audio Visual Resaerch files. - - * src/sndfile.h.in src/common.h src/sndfile.c src/command.c - Hook AVR into everything else. - - * tests/Makefile.am tests/write_read_test.tpl tests/misc_test.c - Add testing for AVR files. - -2004-03-22 Erik de Castro Lopo - - * src/file_io.c - Fix psf_set_file() for win32. Thanks to Vincent Trussart (Plogue Art et - Technologie) for coming up with the solution. - -2004-03-21 Erik de Castro Lopo - - * tests/write_read_test.tpl - Fixed a bug that was causing valgrind to report a memory leak. The bug was - in the test code itself, not the library. - -2004-03-20 Erik de Castro Lopo - - * examples/generate.cs - An example showing how to use libsndfile from C#. Thanks to James Robson - for providing this. - -2004-03-19 Erik de Castro Lopo - - * src/common.c - Fix problems with WAV files containing large chunks after the 'data' - chunk. Thanks to Koen Tanghe for providing a sample file. - -2004-03-17 Erik de Castro Lopo - - * configure.ac - Detect presense of ALSA (Advanced Linux Sound Architecture). - - * examples/sndfile-play.c - Add ALSA output support. - - * examples/Makefile.am - Add ALSA_LIBS to link line of sndfile-play.c. - -2004-03-15 Erik de Castro Lopo - - * acinclude.m4 - Add new macro (AC_C_STRUCT_HACK) to detect whether the C compiler allows - the use of the what is known as the struct hack introduced by the 1999 ISO - C Standard. - - * configure.ac - The last release would not compile with gcc-2.95 due to the use of features - (ie struct hack) introduced by the 1999 ISO C Standard. - Add check to make sure compiler handles this and bomb out if it doesn't. - -2004-03-14 Erik de Castro Lopo - - * tests/write_read_test.tpl - Fix compiler warning on Win32. - - * src/file_io.c - Fix use of an un-initialised variable in Win32 stuff. - - * Win32/config.h examples/sndfile-play.c - Win32 fixes. - -2004-03-10 Erik de Castro Lopo - - * configure.ac - Fix bug which occurres when configuring for MinGW. - If compiler is gcc and cross compiling use -nostdinc. - -2004-03-09 Erik de Castro Lopo - - * src/common.h src/aiff.c src/wav.c src/float32.c src/double64.c - src/sndfile.c - Fix a bug with PEAK chunk handling for files with more than 16 channels. - Thanks to Remy Bruno for finding this. - -2004-03-08 Erik de Castro Lopo - - * src/common.c - Fix a bug which was preventing WAV files being openned correctly if the - file had a very large header. Thanks to Eldad Zack for finding this. - -2004-03-04 Erik de Castro Lopo - - * configure.ac src/file_io.c - Fix cross-compiling from Linux to Win32 using the MinGW tools. - -2004-03-01 Erik de Castro Lopo - - * src/create_symbols_file.sh - Christian Weisgerber pointed out that the shell script did not run on a - real Bourne shell although it did run under Bash in Bourne shell mode. - - * src/create_symbols_file.py - Rewrite of above in Python. Also add support for writing Win32 .def files. - The Python script generates Symbols.linux, Symbols.darwin and - libsndfile.def (Win32 version). These files get shipped with the tarball - so there should not be necessary to run the Python script when building - the code from the tarball. - - * configure.ac src/Makefile.am Win32/Makefile.am - Hook new Python script into the build system. - -2004-02-25 Erik de Castro Lopo - - * src/configure.ac - Add --enable-gcc-werror option and move GCC specific stuff down. - -2004-02-24 Erik de Castro Lopo - - * acinclude.m4 configure.ac - Fix clip mode detection (tested in one of HP's testdrive Itanium II boxes). - - * src/file_io.c - Added check for sizeof (off_t) != sizeof (sf_count_t) to prevent recurrence - of missing large file support on Linux and Solaris. - -2004-02-19 Erik de Castro Lopo - - * examples/sndfile-play.c - Fix a MacOSX specific bug which was caused by a space being inserted in - the middle of a file name. - - * configure.ac src/Makefile.am examples/Makefile.am - Fix a couple of MacOSX build issues. - -2004-02-17 Erik de Castro Lopo - - * doc/command.html - Document SFC_SET_CLIPPING and SFC_GET_CLIPPING. - -2004-02-14 Erik de Castro Lopo - - * doc/*.html - Applied patch from Frank Neumann (author of lakai) which fixes many minor - typos in documentation. Thanks Frank. - -2004-02-13 Erik de Castro Lopo - - * ChangeLog - Changed my email address throughout source and docs. - -2004-02-08 Erik de Castro Lopo - - * src/file_io.c - Make sure config.h is included before stdio.h to make sure large file - support is enabled on Linux (and Solaris). - - * tests/misc_test.c - Disable update_header test on Win32. This should work but doesn't and - I'm not sure why. - - * Make.bat Win32/Makefile.msvc - Updates. - -2004-01-07 Erik de Castro Lopo - - * src/common.h - Changed logindex, headindex and headend files of SF_PRIVATE from unsigned - int to int to prevent weird arithmetic bugs. - - * src/common.c src/aiff.c src/wav.c src/w64.c - Fixed compiler warnings resulting from above change. - -2004-01-06 Erik de Castro Lopo - - * src/common.c - Fixed a bug in header reader for some files with data after the sample data. - -2003-12-29 Erik de Castro Lopo - - * tests/lossy_comp_test.c tests/Makefile.am - Add tests for AIFF/IMA files. - -2003-12-26 Erik de Castro Lopo - - * src/macbinary3.c src/macos.c - Two new files required for handling SD2 files. - - * src/common.h - Add prototypes for functions in above two files. - - * src/Makefile.am - Hook new files into build system. - -2003-12-21 Erik de Castro Lopo - - * configure.ac - Add checks for mmap() and getpagesize() which might be used at some time - for faster file reads. - Add detection of MacOSX. - -2003-12-13 Erik de Castro Lopo - - * doc/FAQ.html - Minor mods to pkg-config section. - -2003-12-12 Erik de Castro Lopo - - * src/create_symbols_file.sh - Andre Pang (also known as Ozone) pointed out that on MacOSX, all non - static symbols are exported causing troubles when trying to link - libsndfile with another library which has any of the same symbols. - He fixed this by supplying the MacOSX linker with a file containing - all the public symbols so that only they would be exported and then - supplied a patch for libsndfile. - This wasn't quite ideal, because I would have to maintain two (3 if - you include Win32) separate files containing the exported symbols. - A better solution was to create this script which can generate a - Symbols file for Linux, MacoSX and any other OS that supports - minimising the number of exported symbols. - - * configure.ac src/Makefile.am - Hook the new script into the build process. - -2003-12-10 Erik de Castro Lopo - - * doc/index.html - Added comments about Steve Dekorte's SoundConverter scam. - -2003-12-07 Erik de Castro Lopo - - * src/file_io.c - Axel Röbel pointed out that on Mac OSX a pipe is not considered a fifo - (S_ISFIFO (st.st_mode) is false) but a socket (S_ISSOCK (st.st_mode) is - true). The test has therefore been changed to is S_ISREG and anything - which which does not return true for S_ISREG is considered a pipe. - -2003-11-25 Erik de Castro Lopo - - * tests/misc_test.c - Fix update_header_test to pass SDS. - - * src/sds.c - More minor fixes. - - * tests/floating_point_test.c - Add test for SDS files. - - * src/command.c - Add SDS to major_formats array. - -2003-11-24 Erik de Castro Lopo - - * tests/write_read_test.tpl tests/misc_test.c - Add tests for SDS files. - - * src/sds.c - Fix a bug in header update code. - -2003-11-23 Erik de Castro Lopo - - * src/sds.c - Get file write working. - - * src/paf.c - Fix a potential bug in paf24_seek(). - -2003-11-04 Erik de Castro Lopo - - * doc/FAQ.html - Add Q/A about u-law encoded WAV files. - - * Win32/*.h - Updated so it compiles on Win32. - -2003-11-03 Erik de Castro Lopo - - * examples/sndfile-convert.c - Add -alaw and -ulaw command line arguments. - - * configure.ac - Add library versioning comments. - Add arguments to AC_INIT. - -2003-10-28 Erik de Castro Lopo - - * src/file_io.c - Ross Bencina has contributed code to replace all of the (mostly broken) - Win32 POSIX emulation calls with calls the native Win32 file I/O API. - This code still needs testing but is likely to be a huge improvemnt - of support for Win32. Thanks Ross. - -2003-10-27 Erik de Castro Lopo - - * src/dwvw.c - Removed filedes field from the DWVW_PRIVATE struct. - - * src/file_io.c - Change psf_fopen() so it returns psf->error instead of the file descriptor. - Add new functions psf_set_stdio() and psf_set_file(). - - * src/sndfile.c - Change these to work with changed psf_fopen() return value. - Remove all uses of psf->filedes from sndfile, making it easier to slot native - Win32 API file handling functions. - - * src/test_file_io.c - Minor changes to make it compile with new file_io.c stuff. - -2003-10-26 Erik de Castro Lopo - - * src/gsm610.h - Rename a variable from true to true_flag. As Ross Bencina points out, - true is defined in the C99 header . - - * src/file_io.c - If fstat() fails, return SF_TRUE instead of -1 (Ross Bencina). - -2003-10-09 Erik de Castro Lopo - - * src/common.h - Increase the size of SF_BUFFER_LEN and SF_HEADER_LEN. - - * src/sndfile.c - Fix sf_read/write_raw which were dividing by psf->bytwidth and - psf->blockwidth which can both be zero. - - * examples/sndfile-info.c - Increase size of BUFFER_LEN. - -2003-09-21 Erik de Castro Lopo - - * configure.ac - Add checks for and ssize_t. - Other Win32/MinGW checks. - - * src/aiff.c src/au_g72x.c src/file_io.c src/gsm610.c src/interleave.c - src/paf.c src/sds.c src/svx.c src/voc.c src/w64.c src/wav.c src/xi.c - Fix compiler warnings. - -2003-09-20 Erik de Castro Lopo - - * tests/scale_clip_test.tpl - Add definition of M_PI if needed. - -2003-09-19 Erik de Castro Lopo - - * configure.ac - Detect if S_IRGRP is declared in . - - * src/file_io.c tests/*.tpl tests/*.c - More fixes for Win32/MSVC++ and MinGW. MinGW does have but that - file doesn't declare S_IRGRP. - -2003-10-18 Erik de Castro Lopo - - * src/config.h.in - Add comment stating that the sf_count_t typedef is determined when - libsndfile is being compiled. - - * tests/utils.tpl - Modified so that utils.c gets one copy of the GPL and not two. - - -2003-09-17 Erik de Castro Lopo - - * Win32/unistd.h src/sf_unistd.h - Move first file to the second. This will help for Win32/MSVC++ and MinGW. - - * Win32/Makefile.am src/Makefile.am - Changed in line with above. - - * Win32/Makefile.msvc - Removed "/I Win32" which is no longer required. - - * src/file_io.c src/test_file_io.c tests/*.tpl tests/*.c - If HAVE_UNISTD_H include else include . This should - work for Win32, MinGW and other fakes Unix-like OSes. - - * src/*.c - Removed #include from files which didn't need it. - -2003-09-16 Erik de Castro Lopo - - * libsndfile.spec.in - Apply fix from Andrew Schultz. - -2003-09-07 Erik de Castro Lopo - - * src/vox_adpcm.c - Only set psf->sf.samplerate if the existing value is invalid. - -2003-09-06 Erik de Castro Lopo - - * examples/sndfile-play.c - Started adding support for ALSA output. - -2003-09-04 Erik de Castro Lopo - - * src/sndfile.h.in - Removed from sndfile.h. - - * src/*.c examples/*.c tests/*.c tests/*.tpl - Added where needed. - -2003-09-02 Erik de Castro Lopo - - * src/common.h - Added ARRAY_LEN, SF_MAX and SF_MIN macros. - -2003-08-19 Erik de Castro Lopo - - * doc/index.html - Remove statements about alternative licensing arrangements. - -2003-08-17 Erik de Castro Lopo - - * MacOS MacOS9 Makefile.am configure.ac - Change directory name from MacOS to MacOS9 - - * MacOS9/MacOS9-readme.txt - Change name to make it really obvious, add text to top of file to make it - still more obvious again. - -2003-08-16 Erik de Castro Lopo - - * src/test_log_printf.c - Add tests for %u conversions. - - * src/common.c - Fix psf_log_printf() %u conversions. - -2003-08-15 Erik de Castro Lopo - - * src/aiff.c - Fixed a bug where opening a file with a non-trival header in SFM_RDWR mode - would over-write part of the header. Thanks to Axel Röbel for pointing - this out. Axel also provided a patch to fix this but I came up with a - neater and more general solution. - Return error when openning an AIFF file with data after the SSND chunk - (Thanks Axel Röbel). - - * tests/aiff_rw_test.c - Improvements to test program which will later allow it to be generalised to - test WAV, SVX and others as required. - -2003-08-14 Erik de Castro Lopo - - * tests/pipe_test.c - Add useek_pipe_rw_test() submitted by Russell Francis. - - * src/sndfile.c - In sf_open_fd(), check if input file descriptor is a pipe. - - * src/sndfile.[ch] - Fix typo in variable name do_not_close_descriptor. - -2003-08-13 Erik de Castro Lopo - - * src/test_log_printf.c - Improve the tests for %d and %s conversions. - - * src/common.c - Fixed a few problems in psf_log_printf() found using new tests. - -2003-08-06 Erik de Castro Lopo - - * configure.ac - Add -Wwrite-strings warning to CFLAGS if the compiler is GCC. Thanks to - Peter Miller (Aegis author) for suggesting this and supplying a patch. - - * src/*.c examples/*.c tests/*.c - Fix all compiler warnings arising from the above. - -2003-08-02 Erik de Castro Lopo - - * tests/aiff_rw_test.c tests/Makefile.am - New test program to check for errors re-writing the headers of AIFC files - opened in mode SFM_RDWR. - -2003-07-21 Erik de Castro Lopo - - * examples/sndfile-play.c - Applied a patch from Tero Pelander to allow this program to run on systems - using devfs which used /dev/sound/dsp instead of /dev/dsp. - -2003-07-11 Erik de Castro Lopo - - * doc/new_file_type.HOWTO - Updated document. Still incomplete. - -2003-06-29 Erik de Castro Lopo - - * src/sndfile.c - Fix VALIDATE_SNDFILE_AND_ASSIGN_PSF which was returning an error rather - than saving it and returning zero. - -2003-06-25 Erik de Castro Lopo - - * src/file_io.c - Two fixes for Mac OS9. - Fix all casts from sf_count_t to ssize_t (not size_t). - -2003-06-22 Erik de Castro Lopo - - * src/wav.c - Fix for reading files with RIFF length of 8 and data length of 0. - -2003-06-14 Erik de Castro Lopo - - * src/*.c tests/*.c tests/*.tpl - Added comments to mark code for removal when make Lite version of - libsndfile. - -2003-06-09 Erik de Castro Lopo - - * examples/sndfile-convert.c - Add extra error checking for unrecognised arguments. - -2003-06-08 Erik de Castro Lopo - - * src/ima_adpcm.c - Started adding code to write IMA ADPCM encoded AIFF files. - - * src/test_log_printf.c src/Makefile.am - New file to test psf_log_printf() function and add hooks into build system. - - * src/common.c - Move psf_log_printf() function to top of the file and only compile the rest - of the file if if PSF_LOG_PRINTF_ONLY is not defined. - -2003-06-03 Erik de Castro Lopo - - * Win32/config.h Win32/sndfile.h - Updated with new config variables. - - * Win32/unistd.h src/file_io.c - Added implementation of S_ISFIFO macro which Win32 seems to lack and is - used in src/file_io.c. - - * tests/utils.tpl - Added #include to pull in Win32/unistd.h so it compiles for - Win32. - - * src/Makefile.msvc - Added src\test_file_io.exe build target and run this as the very first - test. - - * tests/win32_test.c - Add support for testing Cygwin32. - - * configure.ac - Detect POSIX fsync() and fdatasync() functions. - - * src/file_io.c - If compiling for Cygwin, call fsync() before calling fstat() to retrieve - file length. - - * tests/pcm_test.tpl - Add a test for lrintf() function. This was required to detect a really - broken lrint() and lrintf() on Cygwin. - - * tests/misc_test.c - Don't run permission test when compiling under Cygwin. - - * src/float_cast.h - Fix fallback macro for lrint() and lrintf() to cast to long instead of int - to match official function prototypes. - -2003-06-02 Erik de Castro Lopo - - * examples/sndfile-convert.c - Modifications to improve accuracy of conversions; use double data for - floating point and int for everything else. - - * src/ima_apdcm.c - Completed work on decoding IMA ADPCM encoded AIFF files. Still need to - get encoding working. - -2003-05-28 Erik de Castro Lopo - - * src/aiff.c src/ima_adpcm.c - Start working on getting IMA ADPCM encoded AIFF files working. - -2003-05-27 Erik de Castro Lopo - - * configure.ac - Fixed the touch command for when the autogen program is not found (Matt - Flax). - - * src/ulaw.c src/alaw.c - Made these pipe-able. - -2003-05-24 Erik de Castro Lopo - - * src/paf.c src/ircam.c - Fixed writing to pipe. - - * src/wav.c src/aiff.c src/nist.c src/mat*.c src/svx.c src/w64.c - Return SFE_NO_PIPE_WRITE if an attempt is made to write to a pipe. - -2003-05-23 Erik de Castro Lopo - - * examples/sndfile-info.c - Modified to detect unknown file lengths. - - * src/mat4.c - Fix reading from a pipe. - -2003-05-22 Erik de Castro Lopo - - * tests/pipe_test.c - Add more file types to tests. - - * src/mat4.c - Removed explicit setting of psf->sf.seekable to SF_TRUE. - - * tests/utils.tpl - Add macro for generating and check data in the stdio and pipe tests. - - * tests/stdout_test.c tests/stdin_test.c - Use the above macro to generate known data on output and check data on - input. - - * src/voc.c src/htk.c common.h sndfile.c - Disallow reading/writing VOC and HTK files from/to pipes be returning new - error values. - - * src/w64.c - Fixes to allow reading from a pipe. - -2003-05-21 Erik de Castro Lopo - - * configure.ac src/sndfile.h.in - When the configure script determines the sizeof (sf_count_t), also set the - value of SF_COUNT_MAX in sndfile.h. - - * configure.ac - Remove -pedantic flag from default GCC compiler flags. - - * tests/pipe_test.c - Add a pipe_read_test() before doing pipe_write_test(). - - * tests/scale_clip_test.c - Add test to make sure non-normalized values also clip in the right way. - -2003-05-18 Erik de Castro Lopo - - * configure.ac - Add test to detect processor clipping capabilities. - - * tests/stdin_test.c tests/stdout_test.c - Fix a pair of compiler warnings. - - * src/common.h - Add new pipeoffset field to SF_PRIVATE. This will contain the current file - offset when operating on a pipe. - - * src/common.c - Removed direct calls to psf_fread()/psf_fseek()/psf_fgets() etc from - psf_binheader_readf and redirect them to new buffered versions - header_read(), header_seek() and header_gets(). - Add "G" format specifier to emulate fgets() functionality with buffering. - This will allow reading some file types from pipes. - - * src/file_io.c - When the file descriptor is a pipe, manintain psf->pipeoffset. - - * src/pvf.c - Change use of psf_fgets() to psf_binheader_readf() as required but changes to header re - - * src/au.c - Fix reading from a pipe. - -2003-05-17 Erik de Castro Lopo - - * src/pcm.c - Add clipping versions of the f2XXX_array() functions to allow option of - clipping data that would otherwise overflow. - - * tests/scale_clip_test.tpl tests/scale_clip_test.def - New files test that clipping option does actually work. - -2003-05-14 Erik de Castro Lopo - - * doc/index.html - Fixed a typo ("OS(" instead of "OS9"). - -2003-05-13 Erik de Castro Lopo - - * tests/open_fail_test.c - Include to prevent warning message of missing declaration of - memset(). - -2003-05-12 Erik de Castro Lopo - - * src/common.h - Add new "add_clipping" field to SF_PRIVATE. - - * src/sndfile.h.in src/sndfile.c - Add command SFC_SET_CLIPPING which sets/resets add_clipping field. - -2003-05-11 Erik de Castro Lopo - - * doc/api.html - Add docs for sf_set_string() and sf_get_string(). - - * src/common.h src/sndfile.c - Add new SFE_STR_BAD_STRING error. - - * tests/stdin_test.c tests/stdout_test.c - Removed all non-error print statements. - - * tests/stdio_test.c tests/pipe_test.c tests/Makefile.am - Add print statements removed from two files above. - -2003-05-10 Erik de Castro Lopo - - * libsndfile.spec.in - Fixed a coulpe of minor errors discovered by someone calling themselves - Agent Smith. - - * src/common.c src/common.h src/file_io.h - Added is_pipe field to SF_PRIVATE and declaration of psf_is_pipe() - function. (Axel Röbel) - - * src/sndfile.c - Fixed determination of whether the file is a pipe. (Axel Röbel) - - * src/paf.c - Force paf24 to start with undefined mode. (Axel Röbel) - - * tests/pipe_test.c - Mods to make this test work and actually do the test on RAW files. (Axel - Röbel). - -2003-05-05 Erik de Castro Lopo - - * src/sndfile.c - Fixed a potential bug where psf->sf.seekable was being set to FALSE when - operating on stdin or stdout but then the default initialiser was reseting - it to TRUE. Thanks to Axel Röbel. - - * src/aiff.c - Fixed a bug in the header parser where it was not handling an odd length - COMM chunk correctly. Thanks to Axel Röbel. - - * src/test_file_io.c - Add more tests. - - * tests/win32_test.c - New file for showing the bugs in the Win32 implementation of the POSIX API. - It also runs on Linux for sanity checking. - - * tests/Makefile.am Win32/Makefile.msvc - Hook the new test program into the build system. - -2003-05-04 Erik de Castro Lopo - - * src/test_file_io.c - New test program to test operation of functions defined in file_io.c. This - should make supporting win32 significantly easier. - - * src/Makefile.am - Hook new test program into the build system. - - * src/file_io.c - Add compile/run time check that sizeof statbuf.st_size and sf_count_t are - the same. - - * src/common.h src/sndfile.c - Added new error code and error message for new check. - - * tests/benchmark.tpl - Fix to use frames instead of samples in SF_INFO. - -2003-05-03 Erik de Castro Lopo - - * src/file_io.c - More stuffing about working around PLAIN OLD-FASHIONED **BUGS** in Win32. - - * examples/sndfile-info.c - Applied patch from Conrad Parker to add "--help" and "-h" options as - well as an improved usage message. - -2003-05-02 Erik de Castro Lopo - - * src/au.c - Added embedded file support. - - * tests/multi_file_test.c - Added tests for embedded AU files. - Added verbose testing mode. - - * src/common.h src/sndfile.c - Added an embedded AU specific error code and message. - - * src/wav.c - Added patch from Conrad Parker which filled in a little more information - about ACIDized WAV files. - -2003-04-30 Erik de Castro Lopo - - * src/file_io.c - Fixed Win32 version of psf_fseek() which was calling psf_get_filelen() - which was in turn calling psf_fseek() which in the end blew the stack. - Now of course this would have been easy to find on Linux, but this blow - up was happening in kernel32.dll and the fscking MSVC++ debugger couldn't - figure out what call caused this (it couldn't even tell me the stack had - overflowed) and was absolutley useless for this debugging exercise. - On top of that, the reason I got into this mess was that windoze doesn't - have a working fstat() function which can return file lengths > 2 Gig. It - HAS a fscking _fstati64() but the file length value is only updated AFTER - the bloody file is closed. That makes it completely useless. - How the hell do people stand working on this crap excuse of an OS? - -2003-04-29 Erik de Castro Lopo - - * Win32/unistd.h src/file_io.c - Moved definitions of S_IGRP etc from file_io.c to unistd.h so that these - can be used in the test programs. - - * Win32/libsndfile.def - Added sf_open_fd. - - * Win32/sndfile.h - Updated to match src/sndfile.h.in. - - * Win32/Makefile.msvc - Added dither.c and htk.c to libsndfile.dll target. - -2003-04-28 Erik de Castro Lopo - - * src/file_io.c - First attempt at getting the Win32 versions of the these functions working. - They still need to be tested. - -2003-04-27 Erik de Castro Lopo - - * src/strings.c - Found and fixed a bug which was causing psf_store_string() to fail on - Motorola 68k processors. Many thanks fo Joshua Haberman (Debian maintainer - of libsndfile) for compiling and running debug code to help me debug the - problem. - -2003-04-26 Erik de Castro Lopo - - * src/sndfile.c src/file_io.c src/wav.c src/aiff.c - Much hacking to get reading and writing of embedded files working (ie sound - files at a non-zero files offset). - - * doc/embedded_files.html - First pass atempt at documenting reading/writing embedded files. - -2003-04-21 Erik de Castro Lopo - - * doc/FAQ.html - Updated answer to "Why doesn't libsndfile do interleaving/de-interleaving?" - -2003-04-19 Erik de Castro Lopo - - * src/wav.c src/aiff.c - Fix retrieving and storing of string data from files. Need to be careful - about using psf->buffer for strings. - -2003-04-18 Erik de Castro Lopo - - * src/file_io.c - Fix psf_fseek() for seeks withing embedded files. - -2003-04-15 Erik de Castro Lopo - - * src/sndfile.h.in - Changed the definition of SNDFILE slightly to produce warnings when it isn't - used correctly. This should have zero affect in code which uses the SNDFILE - type correctly. - - * src/sndfile.c - Fixed a few compiler warnings cause by the changes to the SNDFILE type. - -2003-04-12 Erik de Castro Lopo - - * doc/FAQ.html - Added question and answer to the question "How about adding the ability - to write/read sound files to/from memory buffers?". - -2003-04-08 Erik de Castro Lopo - - * tests/write_read_test.tpl - Removed un-needed enums declaring TRUE and FALSE and replaced usage of - these with SF_TRUE and SF_FALSE. - - * tests/multi_file_test.c - New test program to test sf_open_fd() on files containing data other than - a single sound file. - -2003-04-06 Erik de Castro Lopo - - * src/file_io.c - When creating files, set the readable by others flag. This still allows - further restrictions to be enforced by use of the user's umask. Fix - suggested by Eric Lyon. - -2003-04-05 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c - Changed sf_open_fd(). Dropped offset parameter and added a close_desc - parameter. If close desc is TRUE, the file descritpor passed into the - library will be closed when sf_close() is called. - - * tests/utils.tpl - Modified call to sf_open_fd() to set close_desc parameter to SF_TRUE. - -2003-04-04 Erik de Castro Lopo - - * tests/write_read_test.tpl - Add a string (using sf_set_string() function) before and after data section - of all files. This will make sure that if string data can be added, it - doesn't overwrite real audio data. - -2003-04-02 Erik de Castro Lopo - - * src/sndfile.c - Started work on supporting a non-zero offset parameter for sf_open_fd (). - - * src/.c - Removed many uses of psf_fseek (SEEK_END) which to allow for future use of - sf_open_fd() with non-zero offset. - Associated refactoring. - - * src/aiff.c - Implemented functionality required to get sf_get_string() and - sf_set_string() working for AIFF files. - -2003-04-01 Erik de Castro Lopo - - * tests/utils.tpl - Modified test_open_file_or_die() to alternately use sf_open() and - sf_open_fd(). - - * src/svx.c - Fixed a bug which occurred when openning an existing file for read/write - using sf_open_fd(). In this case, the existing NAME chunk needs to be - read into psf->filename. - Fixed printing of sf_count_t types to logbuffer. - -2003-03-31 Erik de Castro Lopo - - * src/sndfile.h.in - Added prototype for new function sf_open_fd(). - - * src/sndfile.c - Moved most of the code in sf_open() to a new function psf_open_file(). - Created new function sf_open_fd() which also uses psf_open_file() but - does not currently support the offset parameter. - - * doc/api.html - Document sf_open_fd(). - -2003-03-09 Erik de Castro Lopo - - * src/sndfile.c - Fixed a memory leak reported by Evgeny Karpov. Memory leak only occurred - when an attempt was made to read and the open() call fails. - -2003-03-08 Erik de Castro Lopo - - * tests/open_fail_test.c - New test program to check for memory leaks when sf_open fails on a valid - file. Currently this must be run manually under valgrid. - - * tests/Makefile.am - Hook new test program into build. - -2003-03-03 Erik de Castro Lopo - - * Octave/sndfile_save.m Octave/sndfile_play.m - Added a -mat-binary option to the octave save command to force the output - to binary mode even if the user has set ascii data as the default. Found - by Christopher Moore. - -2003-02-27 Erik de Castro Lopo - - * doc/dither.html - New file which will document the interface which allows the addition of - audio dither when sample word sizes are being reduced. - - * src/dither.c - More work. - -2003-02-26 Erik de Castro Lopo - - * tests/misc_test.c - In update_header_test(), make HTK files a special case. - - * doc/index.html - Added HTK to the feature matrix. - -2003-02-25 Erik de Castro Lopo - - * src/htk.c - New file for reading/writing HMM Tool Kit files. - - * src/sndfile.h.in src/sndfile.c src/command.c src/Makefile.am - Hook in htk.c - - * tests/write_read_test.tpl tests/misc_test.c tests/Makefile.am - Add tests for HTK files. - -2003-02-22 Erik de Castro Lopo - - * src/wav.c - Fixed a bug where the LIST chunk length was being written incorrectly. - - * tests/string_test.c - Added call to check_log_buffer(). - Minor cleanups. - -2003-02-10 Erik de Castro Lopo - - * src/wav_w64.h - Applied patch from Antoine Mathys to add extra WAV format definitions and - a G72x_ADPCM_WAV_FMT struct definition. - - * src/wav_w64.c - Applied patch from Antoine Mathys which converts wav_w64_format_str() from - one huge inefficient switch statement to a binary search. - - * tests/string_test.c - Dump log buffer if tests fail. - -2003-02-07 Erik de Castro Lopo - - * tests/string_test.c - David Viens supplied some modifications to this file which showed up a bug - when using sf_set_string() and the sf_writef_float() functions. - - * src/sndfile.c - Fixed the above bug. - -2003-02-06 Erik de Castro Lopo - - * doc/FAQ.html - Added Q and A on how to detect libsndfile in configure.in (at the suggestion - of Davy Durham). - -2003-02-05 Erik de Castro Lopo - - * src/sndfile.h.in - Add enums and typedefs for dither. - Deprecate SFC_SET_ADD_DITHER_ON_WRITE and SFC_SET_ADD_DITHER_ON_READ, to be - replaced with SFC_SET_DITHER_ON_WRITE and SFC_SET_DITHER_ON_READ which will - allow different dither algorithms to be enabled. - Added SFC_GET_DITHER_INFO_COUNT and SFC_GET_DITHER_INFO. - - * src/sndfile.h.in src/Version_script.in Win32/libsndfile.def. - Added public sf_dither_*() functions. - - * src/sndfile.c - Implement commands above. - - * src/dither.c - More work. Framework and external hooks into dither algorithms complete. - -2003-02-03 Erik de Castro Lopo - - * doc/version-1.html libsndfile_version_convert.py - Remove redundant files. - - * doc/index.html doc/api.html - Remove links to version-1.html. - - * src/dither.c - New file to allow the addition of audio dither on input and output. - - * src/common.h - Add prototype for dither_init() function. - - * Makefile.am doc/Makefile.am - Changes for added and removed files. - -2003-02-02 Erik de Castro Lopo - - * Win32/Makefile.msvc - Changes to force example binaries to be placed in the top level directory - instead of the examples/ directory. - Add src/strings.c and src/xi.c to the build. - Add string_test to build and to tests on WAV files. - - * doc/index.html - Added XI to support matrix. - -2003-01-27 Erik de Castro Lopo - - * src/sndfile.h.in - Added prototypes for sf_get_string() and sf_set_string() and SF_STR_* - enum values. - - * src/sndfile.c - Added public interface to sf_get_string() and sf_set_string(). - - * src/wav.c - Added code for setting and getting strings in WAV files. - - * tests/string_test.c - New test program for sf_get_string() and sf_set_string() functionality. - - * tests/Makefile.am - Hook new test program into build and test framework. - -2003-01-26 Erik de Castro Lopo - - * src/common.h - Added fields to SF_PRIVATE for string data needed to implement - sf_get_string() and sf_set_string(). - - * src/strings.c - New file for storing and retrieving strings to/from files. - - * src/Makefile.am - Added strings.c to build. - -2003-01-25 Erik de Castro Lopo - - * src/xi.c - Read seems to be working so looking at write. - - * src/sndfile.h.in - Added SF_FORMAT_XI, SF_FORMAT_DPCM_8 and SF_FORMAT_DPCM_16 enum values. - - * tests/floating_point_test.c tests/lossy_comp_test.c tests/Makefile.am - Added test for 8 and 16 bit XI format files. - -2003-01-24 Erik de Castro Lopo - - * doc/index.html - Added a non-lawyer readable summary of the licensing provisions as - suggested by Steve Dekorte. - -2003-01-23 Erik de Castro Lopo - - * src/wav.c - Fixed a compiler warning found by Alexander Lerch. - -2003-01-18 Erik de Castro Lopo - - * configure.ac - Fixed the multiple linking of libm. - -2003-01-17 Erik de Castro Lopo - - * Win32/Makefile.mcvs - Added comments on the correct way to set up the MSVCDir environment - variable. - - * doc/win32.html - Add on how to set up the MSVCDir environment variable. - -2003-01-15 Erik de Castro Lopo - - * examples/sndfile-play.c examples/sndfile-info.c - When run on Win32 without any command line parameters print a message and - then sleep for 5 seconds. This means the when somebody double clicks on - these programs in explorer the user will actually see the message. - -2003-01-14 Erik de Castro Lopo - - * tests/misc_test.c - Bypass permission test if running as root because root is allowed to open - a readonly file for write. - -2003-01-08 Erik de Castro Lopo - - * Win32/Makefile.msvc - Added pvf.c and xi.c source files to project. - - * src/sndfile.h - Updated for PVF files. - -2003-01-07 Erik de Castro Lopo - - * src/sndfile.c - Modified validate_sfinfo() to force samplerate, channels and sections - to be >= 1. - In format_from_extension() replaced calls to does_extension_match() - with strcmp(). - - * src/xi.c - More work. - -2003-01-06 Erik de Castro Lopo - - * doc/Makefile.am - Added octave.html which had been left out. Found by Jan Weil. - -2003-01-05 Erik de Castro Lopo - - * src/pvf.c src/common.h src/sndfile.c - Fixed error handling for PVF files. - - * src/xi.c - New file for handling Fasttracker 2 Extended Instrument files. Not working - yet and included when configured with --enable-experimental. - - * src/sndfile.c src/common.h - Hooked in new file xi.c. - -2002-12-30 Erik de Castro Lopo - - * src/rx2.c - Added a patch from Marek Peteraj which sheds a little more light on the - slices within an RX2 file. Still need to find out data encoding. - -2002-12-20 Erik de Castro Lopo - - * src/wav.c - Started work on decoding 'acid' and 'strc' chunks. - -2002-12-14 Erik de Castro Lopo - - * tests/peak_check_test.c - Minor cleanup. - -2002-12-12 Erik de Castro Lopo - - * tests/write_read_test.tpl - Added check to make sure no error was generated when an attempt was made to - read past the end of the file. - -2002-12-11 Erik de Castro Lopo - - * doc/lists.html - Added "mailto" links for all three lists. - - * src/pvf.c - New file for Portable Voice Format files. - - * src/sndfile.h.in src/sndfile.c src/common.h src/command.c src/Makefile.am - Added hooks for SF_FORMAT_PVF format files. - - * tests/write_read_test.tpl tests/std*.c - Add tests for SF_FORMAT_PVF. - - * doc/index.html - Add PVF to the compatibility matrix. - - * src/pcm.c src/alaw.c src/ulaw.c src/float32.c src/double64.c - Previously, attempts to read beyond the end of a file would set psf->error - to SFE_SHORT_ERROR. This behaviour diverged from the behaviour of the POSIX - read() call but has now been fixed. - Attempts to read beyond the end of the file will return a short read count - but will not longer set any error. - -2002-12-09 Erik de Castro Lopo - - * src/sndfile.c - Add more sanity checking when opening a RAW file for read. When format is - not RAW, zero out all members of the SF_INFO struct. - - * tests/raw_test.c - Add bad_raw_test() to check for above problem. - - * tests/stdin_test.c examples/sndfile-info.c - Set the format field of the SF_INFO struct to zero before calling - sf_open(). - - * doc/api.html - Add information about the need to set the format field of the SF_INFO struct - to zero when opening non-RAW files for read. - - * configure.ac - Removed use of conversion script on Solaris. Not all Solaris versions - support it. - - * doc/lists.html - New file containg details of the mailing lists. - - * doc/index.html - Add a link to the above new file. - -2002-12-04 Erik de Castro Lopo - - * tests/dft_cmp.c - Fixed a SIGFPE on Alpha caused by a log10 (0.0). Thanks to Joshua Haberman - for providing the gdb traceback. - -2002-11-28 Erik de Castro Lopo - - * src/wav.c - Added more capabilities to 'smpl' chunk parser. - - * src/sndfile.c - Fixed some (not all) possible problems found with Flawfinder. - -2002-11-24 Erik de Castro Lopo - - * src/sndfile.c - Fixed a bug in sf_seek(). This bug could only occur when an attempt was - made to read beyond the end and then sf_seek() was called with a whence - parameter of SEEK_CUR. - - * src/file_io.c - Win32's _fstati64() does not work, it returns BS. Re-implemented - psf_get_filelen() in terms of psf_fseek(). - - * tests/write_read_test.tpl - Add a test to detect above bug. - - * src/float_cast.h - Modification to prevent compiler warnings on Mac OS X. - - * src/file_io.c - Fixes for windows (what a f**ked OS). - -2002-11-08 Erik de Castro Lopo - - * configure.ac - Disable use of native lrint()/lrintf() on Mac OSX. These functions exist on - Mac OSX 10.2 but not on 10.1. Forcing the use of the versions in - src/float_cast.h means that a library compiled on 10.2 will still work on - 10.1. - -2002-11-06 Erik de Castro Lopo - - * configure.in configure.ac - Renamed configure.in to configure.ac as expected by later versions of - autoconf. - Slight hacking of configure.ac to work with version 2.54 of autoconf. - Changed to using -dumpversion instead of --version for determining GCC - version numer as suggested by Anand Kumria. - - * src/G72x/Makefile.am - Slight hacking required for operation with automake 1.6.3. - -2002-11-05 Erik de Castro Lopo - - * src/common.c - In psf_binheader_readf() changed type parameter type "b" type from size_t - to int to prevent errors on IA64 CPU where sizeof (size_t) != sizeof (int). - Thanks to Enrique Robledo Arnuncio for debugging this. - -2002-11-04 Erik de Castro Lopo - - * test/command_test.tpl - Changed test value so test would pass on Solaris. - - * src/Version_script.in - Modified version numbering so that later versions of 1.0.X can replace - earlier versions without recompilation. - - * src/vox_adpcm.c - Fixed bug causing short reads. - -2002-11-03 Erik de Castro Lopo - - * test/floating_point_test.c - Code cleanup using functions from util.c. - Add test for IEEE replacement floats and doubles. - -2002-11-01 Erik de Castro Lopo - - * src/wav.c - Fixed a possible divide by zero error when read the 'smpl' chunk. Thanks to - Serg Repalov for the example file. - - * tests/pcm_test.tpl - Used sf_command (SFC_TEST_IEEE_FLOAT_REPLACE) to test IEEE replacement code. - Clean up pcm_double_test(). - - * src/float32.c src/double64.c - Force use of IEEE replacement code using psf->ieee_replace is TRUE, - Print message to log_buffer as well. - Rename all broken_read_* and broken_write* functions to replace_read_* and - replace_write_*. - - * tests/util.tpl - Added string_in_log_buffer(). - - * tests/pcm_test.tpl - Use string_in_log_buffer() to ensure that IEEE replacement code has been - used. - - * configure.in - Removed --enable-force-broken-float option. IEEE replacement code is now - always tested. - -2002-10-31 Erik de Castro Lopo - - * src/double64.c - Implement code for read/writing IEEE doubles on platforms where the native - double format is not IEEE. - - * src/float32.c src/common.h - Remove float32_read() and float32_write(). Replace with float32_le_read(), - float32_be_read(), float32_le_write() and float32_be_write() to match stuff - in src/double64.c. - - * src/common.c - Fix all usage of float32_write(). - - * src/sndfile.h.in - Added SFC_TEST_IEEE_FLOAT_REPLACE command (testing only). - - * src/common.h - Added SF_PRIVATE field ieee_replace. - - * src/sndfile.c - In sf_command() set/reset psf->ieee_replace. - -2002-10-26 Erik de Castro Lopo - - * tests/pcm_test.tpl - Fixed a problem when testing with --enable-force-broken-float. The test was - generating a value of negative zero and the broken float code is not able - to write negative zero. Removing the negative zero fixed the test. - -2002-10-25 Erik de Castro Lopo - - * src/file_io.c - Added fix for Cygwin (suggested by Maros Michalik). - -2002-10-23 Erik de Castro Lopo - - * src/file_io.c - Improved error detection and handling. - - * src/file_io.c src/common.h - Removed functions psf_ferror() and psf_clearerr() which were redundant - after above improvements. - - * src/aiff.c src/svx.c src/w64.c src/wav.c - Removed all use of psf_ferror() and psf_clearerr(). - - * src/sndfile.c - Removed #include of , , and which - are no longer needed. - - * tests/misc_test.c - Added test to make sure the correct error message is returned with an - existing read-only file is openned for write. - -2002-10-21 Erik de Castro Lopo - - * doc/index.html doc/api.html - Updated for OKI Dialogic ADPCM files. - - * src/command.c - Added VOX ADPCM to sub_fomats. - -2002-10-20 Erik de Castro Lopo - - * src/vox_adpcm.c src/Makefile.am - New file for handling OKI Dialogic ADPCM files. - - * src/sndfile.h - Add new subtype SF_FORMAT_VOX_ADPCM. - - * src/sndfile.c - Renamed function is_au_snd_file () to format_from_extenstion () and expanded - its functionality to detect headerless VOX files. - - * src/raw.c - Added hooks for SF_FORMAT_VOX_ADPCM. - - * examples/sndfile-info.c - Print out file duration (suggested by Conrad Parker). - - * libsndfile.spec.in - Force installation of sndfile.pc file (found by John Thompson). - - * tests/Makefile.am tests/lossy_comp_test.c tests/floating_point_test.c - Add tests for SF_FORMAT_VOX_ADPCM. - -2002-10-18 Erik de Castro Lopo - - * tests/misc_test.c - Add test which attempts to write to /dev/full (on Linux anyway) to check - for correct handling of writing to a full filesystem. - - * src/sndfile.c - Return correct error message if the header cannot be written because the - filesystem is full. - - * tests/util.tpl - Corrected printing of file mode in error reporting. - - * src/mat5.c - Fixed a bug where a MAT5 file written by libsndfile could not be opened by - Octave 2.1.36. - -2002-10-13 Erik de Castro Lopo - - * src/common.h src/file_io.c - All low level file I/O have been modified to be better able to report - system errors resulting from calling system level open/read/write etc. - - * src/*.c - Updated for compatibility with above changes. - - * examples/cooledit-fixer.c - New example program which fixes badly broken file created by Syntrillium's - Cooledit which are marked as containing PCM samples but actually contain - floating point data. - - * examples/Makefile.am - Hooked cooledit-fixer into the build system. - -2002-10-10 Erik de Castro Lopo - - * doc/command.html - Document SFC_GET_FORMAT_INFO. - -2002-10-09 Erik de Castro Lopo - - * examples/wav32_aiff24.c examples/sndfile2oct.c examples/sfhexdump.c - examples/sfdump.c - Removed these files because they weren't interesting. - - * examples/sfconvert.c examples/sndfile-convert.c - Renamed the first to the latter. - - * examples/Makefile.am - Added sndfile-convert to the bin_PROGRAMS, so it is installed when the lib - is installed. - Removed old programs wav32_aiff24 and sndfile2oct. - - * man/sndfile-convert.1 - New man page. - - * examples/sndfile-convert.c - Added some gloss now that sndfile-convert.c is an installed program. - - * src/sndfile.h.in src/sndfile.c src/common.h src/command.h - Added command SFC_GET_FORMAT_INFO. - - * tests/command_test.c - Added tests form SFC_GET_FORMAT_INFO. - -2002-10-08 Erik de Castro Lopo - - * src/sndfile.c - In sf_format_check() return error if samplerate < 0. - -2002-10-07 Erik de Castro Lopo - - * src/aiff.c - Fixed bug in handling of COMM chunks with a 4 byte encoding byte but no - encoding string. - -2002-10-06 Erik de Castro Lopo - - * src/sndfile.c - Fixed repeated word in an error message. - -2002-10-05 Erik de Castro Lopo - - * doc/index.html - Improved advertising in Features section. - -2002-10-04 Erik de Castro Lopo - - * src/wav.c - Added decoding of 'labl' chunks within 'LIST' chunks. - - * src/common.h - Added (experimental only) SF_FORMAT_OGG and SF_FORMAT_VORBIS and definition - of ogg_open(). This is nowhere near working yet. - - * src/sndfile.c - Added detection of 'OggS' file marker and added call to ogg_open() to - switch statement. - - * src/ogg.c - New file. Very early start of Ogg Vorbis support. - - * src/wav.c - Added handling of brain-damaged and broken Cooledit "32 bit 24.0 float - type 1" files. These files are marked as being 24 bit WAVE_FORMAT_PCM with - a block alignment of 4 times the numbers of channels but are in fact 32 bit - floating point. - -2002-10-02 Erik de Castro Lopo - - * configure.in - Modified option --enable-experimental to set ENABLE_EXPERIMENTAL_CODE in - config.h to either 0 or 1. - - * src/sndfile.c - Modify sf_command (SFC_GET_LIB_VERSION) to append "-exp" to the version - string if experimental code has been enabled. - -2002-10-01 Erik de Castro Lopo - - * src/Makefile.am - Added -lm to libsndfile_la_LIBADD. This means that -lm is not longer needed - in the link line when linking something to libsndfile. - - * tests/Makefile.am examples/Makefile.am - Removed -lm from all link lines. - - * sndfile.pc.in - Removed -lm from Libs line. - -2002-09-24 Erik de Castro Lopo - - * src/file_io.c - Removed all perror() calls. - - * src/nist.c - Removed calls to exit() function. - Added check to detect NIST files dammaged from Unix CR -> Win32 CRLF - conversion process. - -2002-09-24 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c - New function sf_strerror() which will eventually replace functions - sf_perror() and sf_error_str(). - Function sf_error_number() has also been changed, but this was documented - as being for testing only. - - * doc/api.html - Documented above changes. - - * tests/*.c examples/*.c - Changed to new error functions. - -2002-09-22 Erik de Castro Lopo - - * configure.in - Detect GCC version, and print a warning message about writeable strings - it GCC major version number is less than 3. - -2002-09-21 Erik de Castro Lopo - - * src/sndfile.h.in doc/api.html - Documentation fixes. - -2002-09-19 Erik de Castro Lopo - - * src/Version_script.in src/Makefile.am configure.in - Use the version script to prevent the exporting of all non public symbols. - This currently only works with Linux. Will test on Solaris as well. - - * src/float_cast.h - Added #ifndef to prevent the #warning directives killing the SGI MIPSpro - compiler. - - * src/au_g72x.c src/double64.c src/float32.c src/gsm610.c src/ima_adpcm.c - src/ms_adpcm.c - Fix benign compiler warnings arising from previously added compiler - flags. - -2002-09-18 Erik de Castro Lopo - - * src/sndfile.c - Fixed a bug in sf_error_str() where errnum was used as the index instead - of k. Found by Tim Hockin. - - * examples/sndfile-play.c - Fixed a compiler warning resulting from a variable shadowing a previously - defined local. - -2002-09-17 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c - Added command SFC_SET_RAW_START_OFFSET. - - * doc/command.html - Document SFC_SET_RAW_START_OFFSET. - - * tests/raw_test.c tests/Makefile.am - Add new file for for testing SF_FORMAT_RAW specific functionality. - - * tests/dwvw_test.c - Updates. - -2002-09-16 Erik de Castro Lopo - - * src/wav.c - Modified reading of 'smpl' chunk to take account of the sampler data field. - - * tests/utils.tpl tests/utils.h - Added function print_test_name(). - - * tests/misc_test.c tests/write_read_test.tpl tests/lossy_comp_test.c - tests/pcm_test.tpl tests/command_test.tpl tests/floating_point_test.c - Convert to use function print_test_name(). - -2002-09-15 Erik de Castro Lopo - - * doc/octave.html - Added a link to some other Octave scripts for reading and writing sound - files. - - * src/paf.c - Change type of dummy data field to int. This should fix a benign compiler - warning on some CPUs. - Removed superfluous casts resulting from the above change. - - * src/rx2.c - More hacking. - -2002-09-14 Erik de Castro Lopo - - * src/mat5.c src/common.c - Changed usage of snprintf() to LSF_SNPRINTF(). - - * Win32/Makefile.msvc - Updated to include new files and add new tests. - - * Win32/config.h Win32/sndfile.h - Updated. - - * doc/api.html - Added note about the possibility of "missing" features actually being - implemented as an sf_command(). - -2002-09-13 Erik de Castro Lopo - - * tests/misc_test.c - Added previously missing update_header_test and zero_data_tests for PAF, - MAT4 and MAT5 formats. - - * src/paf.c src/mat4.c src/mat5.c - Fixed bugs uncovered by new tests above. - - * src/mat5.c - Generalised parsing of name fields of MAT5 files. - - * src/mat5.c src/sndfile.c - Added support for unsigned 8 bit PCM MAT5 files. - - * tests/write_read_test.tpl - Added test for unsigned 8 bit PCM MAT5 files. - - * doc/index.html - Added unsigned 8 bit PCM MAT5 to capabilities matrix. - -2002-09-12 Erik de Castro Lopo - - * test/update_header_test.c tests/misc_test.c - Renamed update_header_test.c to misc_test.c. - Added zero_data_test() to check for case where file is opened for write and - closed immediately. The resulting file can be left in a state where - libsndfile cannot open it. Problem reported by Werner Schweer, the author - of Muse. - - * src/aiff.c - Removed superfluous cast. - - * src/wav.c src/svx.c - Fixed case of file generated with no data. - Removed superfluous cast. - - * src/sndfile.c - Fixed error on IA64 platform caused by incorrect termination of - SndfileErrors struct array. This problem was found in the Debian buildd - logs (http://buildd.debian.org/). - - * configure.in - Added Octave directory. - - * Octave/Makefile.ma - New Makfile.am for Octave directory. - - * Octave/sndfile_load.m Octave/sndfile_save.m Octave/sndfile_play.m - New files for working with Octave. - - * doc/octave.html - Document explaining the use of the above three Octave scripts. - -2002-09-10 Erik de Castro Lopo - - * src/sndfile.c - Fixed bug in RDWR mode. - -2002-09-09 Erik de Castro Lopo - - * src/common.c - Fixed psf_get_date_str() for systems which don't have gmtime_r() or - gmtime(). - - * src/file_io.c - Added #include for Win32. Reported by Koen Tanghe. - -2002-09-08 Erik de Castro Lopo - - * src/common.c - Added 'S' format specifier for psf_binheader_writef() which writes a C - string, including single null terminator to the header. - Added 'j' format specifier to allow jumping forwards or backwards in the - header. - Added function psf_get_date_str(). - - * src/mat5.c - Complete read and write support. - - * doc/index.html - Added entries for MAT4 and MAT5 in capabilities matrix. - -2002-09-06 Erik de Castro Lopo - - * src/mat4.c - Completed read and write support. - - * src/common.h src/sndfile.c - Added MAT4 and MAT5 specific error messages. - - * tests/write_read_test.tpl tests/Makefile.am - Added tests for MAT4 and MAT5 files. - - * tests/stdio_test.c tests/stdout_test.c tests/stdin_test.c - Added tests for MAT4 and MAT5 files. - -2002-09-05 Erik de Castro Lopo - - * src/command.c - Added elements for SF_FORMAT_MAT4 and SF_FORMAT_MAT5 to major_formats - array. - - * examples/sfconvert.c - Added mat4 and mat5 output targets. - -2002-09-04 Erik de Castro Lopo - - * src/sndfile.c - Added check to prevent errors openning read only formats for read/write. - - * src/interleave.c - New file for interleaving non-interleaved data. Non-interleaved data is - only supported on read. - - * src/Makefile.am - Added src/interleave.c to build. - -2002-09-03 Erik de Castro Lopo - - * src/double64.c src/common.h - Added double64_be_read(), double64_le_read(), double64_be_write() and - double64_le_write() which replace double64_read() and double64_write(). - - * src/common.c - Cleanup of psf_binheader_readf() and add ability to read big and little - endian doubles (required by mat4.c and mat5.c). - Add ability for psf_binheader_writef() to write doubles to sound file - headers. - -2002-09-01 Erik de Castro Lopo - - * src/mat5.c - New file for reading Matlab (tm) version 5 data files. This is also the - native binary file format for version 2.1.X of GNU Octave which will be - used for testing. - Not complete yet. - - * src/mat4.c - New file for reading Matlab (tm) version 4.2 data files. This is also the - native binary file format for version 2.0.X of GNU Octave which will be - used for testing. - Not complete yet. - - * src/sndfile.h.in src/sndfile.c src/common.h src/command.c src/Makefile.am - Mods to add Matlab files. - - * src/common.[ch] - Added readf_endian field to SF_PRIVATE struct allowing endianness to - remembered across calls to sf_binheader_readf(). - Fixed bug in width_specifier behaviour for printing hex values. - -2002-08-31 Erik de Castro Lopo - - * src/file_io.c - Check return value of close() call in psf_fclose(). - -2002-08-24 Erik de Castro Lopo - - * src/ms_adpcm.c - Commented out some code where 0x10000 was being subtracted from a short - and the result assigned to a short again. Andrew Zaja found this. - -2002-08-23 Erik de Castro Lopo - - * doc/command.html - Fixed typo found by Tommi Ilmonen. - - * src/ima_adpcm.c - Changed type of diff from short to int to prevent errors which can occur - during very rare circumstances. Thanks to FUWAFUWA. - -2002-08-16 Erik de Castro Lopo - - * tests/floating_point_test.c - Disable testing on machines without lrintf(). - - * Win32/Makefile.msvc - Added dwd.c and wve.c to build. - - * configure.in - Bumped version to 1.0.0. - -2002-08-15 Erik de Castro Lopo - - * src/file_io.c - Add a #include for Mac OS 9. Thanks to Stephane Letz. - - * src/wav.c - Changed an snprintf to LSF_SNPRINTF. - - * doc/Makefile.am - Added version-1.html. - -2002-08-14 Erik de Castro Lopo - - * configure.in - Bumped version to 1.0.rc6. - - * src/*.c - Modified scaling of normalised floats and doubles to integers. Until now - this has been done by multiplying by 0x8000 for short output, 0x80000000 - for 32 bit ints and so on. Unfortunately this can cause an overflow and - wrap around in the target value. All thes values have therefore been - reduced to 0x7FFF, 0x7FFFFFFF and so on. The conversion from ints to - normalised floats and doubles remains unchanged. This does mean that for - repeated conversions normalised float -> pcm16 -> normalised float would - result in a decrease in amplitude of 0x7FFF/0x8000 on every round trip. - This is undesirable but less undesireable than the wrap around I am trying - to avoid. - - * tests/floating_point_test.c - Removed file hash checking because new float scaling procedure introduced - above prevented the ability to crate a has on both x86 and PowerPC systems. - -2002-08-13 Erik de Castro Lopo - - * src/txw.c - Completed reading of TXW files. Seek doesn't work yet. - - * src/file_io.c - Added a MacOS 9 replacement for ftruncate(). - - * MacOS/sndfile.h - Added MacOS 9 header file. This should be copied into src/ to compile - libsndfile for MacOS9. - -2002-08-12 Erik de Castro Lopo - - * src/sndfile.c - Fixed commands SF_SET_NORM_DOUBLE and SFC_SET_NORM_FLOAT to return their - values after being set. Reported by Jussi Laako. - - * configure.in - If autogen is not found, touch all .c and .h files in tests/. - - * src/common.c - Added format width specifier to psf_log_printf() for %u, %d, %D and %X. - - * src/dwd.c - Completed implementation of read only access to these files. - - * src/common.h src/*.c src/pcm.c - Removed redundant field chars from SF_PRIVATE struct and modified - pcm_init() to do without it. - -2002-08-11 Erik de Castro Lopo - - * src/wve.c - New file implementing read of Psion Alaw files. This will be a read only - format. Implementation complete. - - * src/dwd/c - Started implementation of DiamondWare Digitized files. Also read only, not - complete. - - * src/wav.c - Add parsing of 'smpl' chunk. - - * src/paf.c - Fixed reading on un-normalized doubles and floats from 24 bit PAF files. - This brings it into line with the reading of 8 bit files into - un-normalized doubles which returns values in the range [-128, 127]. - - * src/common.c - Modified psf_log_printf() to accept the %% conversion specifier to allow - printing of a single '%'. - - * src/sds.c - Read only of 16 bit samples is working. Need to build a test harness for - this and other read only formats. - -2002-08-10 Erik de Castro Lopo - - * configure.in - Added --enable-experimental configure option. - Removed pkg-config message at the end of the configure process. - - * src/sds.c src/txw.c src/rx2.c src/sd2.c - Moved all the code in these files inside #if ENABLE_EXPERIMENTAL_CODE - blocks and added new *_open() function for the case where experimental is - not enabled. These new functions just return SFE_UNIMPLMENTED. - - * Win32/sndfile.h src/sndfile.h.in src/common.h - Removed un-necessary #pragma pack commands. - - * src/file_io.c - Implemented psf_ftruncate() and much other hacking for Win32. - - * Win32/Makefile.msvc - Updated. - - * doc/win32.html - Updated to include the copying of the sndfile.h file from the Win32/ - directory to the src/ directory. - - * Make.bat - Batch file to make compiling on Wi32 a little easier. Implements "make" and - "make check". - -2002-08-09 Erik de Castro Lopo - - * src/file_io.c - Add place holder for ftruncate() on Win32 which doesn't have ftruncate(). - This will need to be fixed later. - - * src/sndfile.h.in - New file (copy of sndfile.h) with sets up @TYPEOF_SF_COUNT_T@ which will be - replaced by the correct type during configure. - - * configure.in - Modified to find a good type for TYPEOF_SF_COUNT_T. - - * src/aiff.c - Fixed a bug when reading malformed headers. - - * src/common.c - Set read values to zero before performing read. - -2002-08-08 Erik de Castro Lopo - - * doc/command.html - Fixed some HTML tags which were not allowing jumps to links within the - page. - - * src/sds.c - Massive hacking on this. - - * src/wav.c - Added recognition of 'clm ' tag. - -2002-08-07 Erik de Castro Lopo - - * doc/index.html - Added beginning of a capabilities list beyond simple file formats which - can be read/written. - - * src/aiff.c - Added parsing of INST and MARK chunks of AIFF files. At the moment this - data is simply recorded in the log buffer. Later it will be possible to - read this data from an application using sf_command(). - - * src/wav.c - Added parsing of 'cue ' chunk which contains loop information in WAV files. - - * exampes/sndfile-info.c - Changed reporting of Samples to Frames. - - * src/wav.c src/w64.c src/aiff.c src/wav_w64.h - Moved from a samples to a frames nomenclature to avoid confusion. - - * doc/FAQ.html - What's the best format for storing temporary files? - - * src/sds.c - New file for reading/writing Midi Sample Dump Standard files. - - * src/Makefile.am src/sndfile.c src/common.[ch] - Added hooks for sds.c. - - * examples/sndfile-info.c - Changed from using sf_perror() to using sf_error_str(). - -2002-08-06 Erik de Castro Lopo - - * doc/api.html - Added explanation of mode parameter for sf_open(). - Added explanation of usage of SFM_* values in sf_seek(). - - * src/sndfile.[ch] src/command.c src/file_io.c src/common.h - Implemented SFC_FILE_TRUNCATE to allow a file to be truncated. File - truncation was suggested by James McCartney. - - * src/command.html - Documented SFC_FILE_TRUNCATE. - - * tests/command_test.c - Add tests for SFC_FILE_TRUNCATE. - - * src/sndfile.c - Added a thrid parameter to the VALIDATE_SNDFILE_AND_ASSIGN_PSF macro to - make resetting the error number optional. All uses of the macro other than - in error reporting functions were changed to reset the error number. - - * src/pcm.c - Fixed a bug were sf_read_* was logging an SFE_SHORT_READ even when no error - occurred. - - * tests/write_read_test.tpl - Added tests of internal error state. - -2002-08-05 Erik de Castro Lopo - - * src/GSM610/private.h src/GSM610/*.c src/GSM610/Makefile.am - Renamed private.h to gsm610_priv.h to prevent clash with other headers - named private.h in other directories. (Probably only a problem on MacOS 9). - - * src/G72x/private.h src/G72x/*.c src/G72x/Makefile.am - Renamed private.h to g72x_priv.h to prevent clash with other headers - named private.h in other directories. (Probably only a problem on MacOS 9). - - * MacOS/config.h - Changed values of HAVE_LRINT and HAVE_LRINTF to force use of code in - float_cash.h. - - * src/sndfile.h - Changes the name of samples field of the SF_INFO to frames. The old name - had caused too much confusion and it simply had to be changed. There will - be at least one more pre-release. - -2002-08-04 Erik de Castro Lopo - - * doc/index.html - Updated formats matrix to include RAW (header-less) GSM 6.10. - Fix specificaltion of table and spelling mistakes. - - * src/sndfile.c src/command.c - Fixed bug in SFC_CALC_MAX_SIGNAL family and psf_calc_signal_max (). - - * tests/command.c - Removed cruft. - Added test for SFC_CALC_MAX_SIGNAL and SFC_CALC_NORM_MAX_SIGNAL. - - * configure.in - Update version to 1.0.0rc5. - - * sfendian.h - Removed inclusion of un-necessary header. - -2002-08-03 Erik de Castro Lopo - - * src/aiff.c - Minor fixes of info written to log buffer. - - * src/float_cast.h - Add definition of HAVE_LRINT_REPLACEMENT. - - * tests/floating_point_test.c - Fix file hash check on systems without lrint/lrintf. - - * tests/dft_cmp.c - Limit SNR to less than -500.0dB. - - * examples/sndfile2oct.c - Fixed compiler warnings. - - * doc/api.html - Fixed error where last parameter of sf_error_str() was sf_count_t instead - of size_t. - -2002-08-02 Erik de Castro Lopo - - * doc/FAQ.html - Why doesn't libsndfile do interleaving/de-interleaving. - - * tests/pcm_test.tpl - On Win32 do not perform hash check on files containing doubles. - -2002-08-01 Erik de Castro Lopo - - * src/common.h - Defined SF_COUNT_MAX_POSITIVE() macro, a portable way of setting variables - of type sf_count_t to their maximum positive value. - - * src/dwvw.c src/w64.c - Used SF_COUNT_MAX_POSITIVE(). - -2002-07-31 Erik de Castro Lopo - - * src/paf.c - Fixed bug in reading/writing of 24 bit PCM PAF files on big endian systems. - - * tests/floating_point_tests.c - Fixed hash values for 24 bit PCM PAF files. - Disabled file has check if lrintf() function is not available and added - warning. - Decreased level of signal from a peak of 1.0 to a value of 0.95 to prevent - problems on platforms without lrintf() ie Solaris. - -2002-07-30 Erik de Castro Lopo - - * src/wav.c - Fixed a problem with two different kinds of mal-formed WAV file header. The - first had the 'fact' chunk before the 'fmt ' chunk, the other had an - incomplete 'INFO' chunk at the end of the file. - - * src/w64.c - Added fix to allow differentiation between W64 files and ACID files. - - * src/au_g72x.c src/common.h src/sndfile.c - Added error for G72x encoded files with more than one channel. - - * tests/pcm_test.tpl tests/utils.tpl - Moved function check_file_hash_or_die() to utils.tpl. Function was then - modified to calculate the has of the whole file. - - * src/wav.c - Fixed problem writing the 'fact' chunk on big endian systems. - - * tests/sfconvert.c - Fixed bug where .paf files were being written as Sphere NIST. - -2002-07-29 Erik de Castro Lopo - - * src/voc.c - Fix for reading headers generated using SFC_UPDATE_HEADER_NOW. - - * doc/command.html - Add docs for SFC_UPDATE_HEADER_NOW and SFC_SET_UPDATE_HEADER_AUTO. - -2002-07-28 Erik de Castro Lopo - - * man/sndfile-info.1 man/sndfile-play.1 - Added manpages supplied by Joshua Haberman the Debian maintainer for - libsndfile. Additional tweaks by me. - - * configure.in man/Makefile.am - Hooked manpages into autoconf/automake system. - - * src/sndfile.c - Added hooks for SFC_SET_UPDATE_HEADER_AUTO. - - * tests/update_header_test.c - Improved rigor of testing. - - * src/*.c - Fixed problem with *_write_header() functions. - -2002-07-27 Erik de Castro Lopo - - * doc/*.html - Updates to documentation to fix problems found by wdg-html-validator. - - * src/common.h src/command.c - Added normalize parameter to calls to psf_calc_signal_max() and - psf_calc_max_all_channels(). - - * src/sndfile.c - Added handling for commands SFC_CALC_NORM_SIGNAL_MAX and - SFC_CALC_NORM_MAX_ALL_CHANNELS. - - * doc/command.html - Added entry for SFC_CALC_NORM_SIGNAL_MAX and SFC_CALC_NORM_MAX_ALL_CHANNELS. - -2002-07-26 Erik de Castro Lopo - - * examples/sndfile-play.c Win32/Makefile.msvc - Get sndfile-play program working on Win32. The Win32 PCM sample I/O API - sucks. The sndfile-play program now works on Linux, MacOSX, Solaris and - Win32. - -2002-07-25 Erik de Castro Lopo - - * doc/FAQ.html - New file for frequently asked questsions. - -2002-07-22 Erik de Castro Lopo - - * doc/api.html - Documentation fixes. - - * src/au.[ch] src/au_g72x.c src/G72x/g72x.h - Add support of 40kbps G723 ADPCM encoding. - - * tests/lossy_comp_test.c tests/floating_point_test.c - Add tests for 40kbps G723 ADPCM encoding. - - * doc/index.html - Update support matrix. - -2002-07-21 Erik de Castro Lopo - - * doc/command.html - Documented SFC_GET_SIMPLE_FORMAT_COUNT, SFC_GET_SIMPLE_FORMAT, - SFC_GET_FORMAT_* and SFC_SET_ADD_PEAK_CHUNK. - - * src/sndfile.c src/pcm.c - Add ability to turn on and off the addition of a PEAK chunk for floating - point WAV and AIFF files. - - * src/sndfile.[ch] src/common.h src/command.c - Added sf_command SFC_CALC_MAX_ALL_CHANNELS. Implemented by Maurizio Umberto - Puxeddu. - - * doc/command.html - Docs for SFC_CALC_MAX_ALL_CHANNELS (assisted by Maurizio Umberto Puxeddu). - -2002-07-18 Erik de Castro Lopo - - * src/sndfile.c src/gsm610.c - Finalised support for GSM 6.10 AIFF files and added support for GSM 6.10 - encoded RAW (header-less) files. - - * src/wav.c - Add support for IBM_FORMAT_MULAW and IBM_FORMAT_ALAW encodings. - - * src/api.html - Fixed more documentation bugs. - -2002-07-17 Erik de Castro Lopo - - * src/sndfile.h src/common.h - Moved some yet-to-be-implelmented values for SF_FORMAT_* from the public - header file sndfile.h to the private header file common.h to avoid - confusion about the actual capabilities of libsndfile. - -2002-07-16 Erik de Castro Lopo - - * src/aiff.c src/wav.c - Fixed file parsing for WAV and AIFF files containing non-audio data after - the data chunk. - - * src/aiff.c src/sndfile.c - Add support for GSM 6.10 encoded AIFF files. - - * tests/lossy_comp_test.c tests/Makefile.am - Add tests for GSM 6.10 encoded AIFF files. - - * src/*.c - Fix compiler warnings. - -2002-07-15 Erik de Castro Lopo - - * tests/command_test.c - For SFC_SET_NORM_* tests, change the file format from SF_FORMAT_WAV to - SF_FORMAT_RAW. - - * src/sndfile.c - Added sf_command(SFC_TEST_ADD_TRAILING_DATA) to allow testing of reading - from AIFF and WAV files with non-audio data after the audio chunk. - - * src/common.h - Add test commands SFC_TEST_WAV_ADD_INFO_CHUNK and - SFC_TEST_AIFF_ADD_INST_CHUNK. When these commands are working, they will be - moved to src/sndfile.h - - * src/aiff.c src/wav.c - Begin implementation of XXXX_command() hook for sf_command(). - - * tests/write_read_test.tpl - Added sf_command (SFC_TEST_ADD_TRAILING_DATA) to ensure above new code was - working. - -2002-07-13 Erik de Castro Lopo - - * tests/update_header_test.c - Allow read sample count == write sample count - 1 to fix problems with VOC - files. - - * tests/write_read_test.tpl tests/pcm_test.tpl - Fixed some problems in the test suite discovered by using Valgrind. - -2002-07-12 Erik de Castro Lopo - - * tests/utils.[ch] tests/*.c - Renamed check_log_buffer() to check_log_buffer_or_die(). - - * src/sndfile.c - SFC_UPDATE_HEADER_NOW and SFC_SETUPDATE_HEADER_AUTO almost finished. Works - for all file formats other than VOC. - -2002-07-11 Erik de Castro Lopo - - * src/sndfile.[ch] src/common.h - Started adding functionality to allow the file header to be updated before - the file is closed on files open for SFM_WRITE. This was requested by - Maurizio Umberto Puxeddu who is using libsndfile for file I/O in iCSound. - - * tests/update_header_test.c - New test program to test that the above functionality is working correctly. - - * tests/peak_chunk_test.c tests/floating_point_test.c - Cleanups. - -2002-07-10 Erik de Castro Lopo - - * src/sfendian.[ch] - Changed length count parameters for all endswap_XXX() functions from - sf_count_t (which can be 64 bit even on 32 bit architectures) to int. These - functions are only called frin inside the library, are always called with - integer parameters and doing the actual calculation on 64 bit values is - slow in comparision to doing it on ints. - - * examples/sndfile-play.c - More playback hacking for Win32. - -2002-07-09 Erik de Castro Lopo - - * src/common.c - In psf_log_printf(), changed %D format conversion specifier to %M (marker) and - added %D specifier for printing the sf_count_t type. - - * src/*.c - Changed all usage of psf_log_printf() with %D format conversion specifiers - to use %M conversion instead. - - * tests/pcm_test.tpl tests/pcm_test.def - New files to autogen pcm_test.c. - - * src/pcm.c - Fixed bug in scaling floats and doubles to 24 bit PCM and vice versa. - -2002-07-08 Erik de Castro Lopo - - * configure.in - Fix setup of $ac_cv_sys_largefile_CFLAGS so that sndfile.pc gets valid - values for CFLAGS. - - * examples/sndfile-play.c - Start adding playback support for Win32. - -2002-07-07 Erik de Castro Lopo - - * src/*.c - Worked to removed compiler warnings. - Extensive refactoring. - - * src/common.[ch] - Added function psf_memset() which works like the standard C function memset - but takes and sf_count_t as the length parameter. - - * src/sndfile.c - Replaced calls to memset(0 with calls to psf_memset() as required. - -2002-07-06 Erik de Castro Lopo - - * src/sndfile.c - Added "libsndfile : " to the start of all error messages. This was suggested - by Conrad Parker author of Sweep ( http://sweep.sourceforge.net/ ). - - * src/sfendian.[ch] - Added endswap_XXXX_copy() functions. - - * src/pcm.c src/float32.c src/double64.c - Use endswap_XXXX_copy() functions and removed dead code. - Cleanups and optimisations. - -2002-07-05 Erik de Castro Lopo - - * src/sndfile.c src/sndfile.h - Gave values to all the SFC_* enum values to allow better control of the - interface as commands are added and removed. - Added new command SFC_SET_ADD_PEAK_CHUNK. - - * src/wav.c src/aiff.c - Modified wav_write_header and aiff_write_header to make addition of a PEAK - chunk optional, even on floating point files. - - * tests/benchmark.tpl - Added call to sf_command(SFC_SET_ADD_PEAK_CHUNK) to turn off addition of a - PEAK chunk for the benchmark where we are trying to miximize speed. - - * src.pcm.c - Changed tribyte typedef to something more sensible. - Further conversion speed ups. - -2002-07-03 Erik de Castro Lopo - - * src/command.c - In major_formats rename "Sphere NIST" to "NIST Sphere". - - * src/common.c src/sfendian.c - Moved all endswap_XXX_array() functions to sfendian.c. These functions will - be tweaked to provide maximum performance. Since maximum performance on one - platform does not guarantee maximum performance on another, a small set of - functions will be written and the optimal one chosen at compile time. - - * src/common.h src/sfendian.h - Declarations of all endswap_XXX_array() functions moved to sfendian.h. - - * src/Makefile.am - Add sfendian.c to build targets. - -2002-07-01 Erik de Castro Lopo - - * src/pcm.c src/sfendian.h - Re-coded PCM encoders and decoders to match or better the speed of - libsndfile version 0.0.28. - -2002-06-30 Erik de Castro Lopo - - * src/wav.c - Add checking for WAVPACK data in standard PCM WAV file. Return error if - found. This WAVPACK is *WAY* broken. It uses the same PCM WAV file header - and then stores non-PCM data. - - * tests/benchmark.tpl - Added more tests. - -2002-06-29 Erik de Castro Lopo - - * tests/benchmark.tpl - Added conditional definition of M_PI. - For Win32, set WRITE_PERMS to 0777. - - * Win32/Makefile.msvc - Added target to make generate program on Win32. - - * src/samplitude.c - Removed handler for Samplitude RAP file format. This file type seems rarer - than hens teeth and is completely undocumented. - - * src/common.h src/sndfile.c src/Makefile.am Win32/Makefile.msvc - Removed references to sampltiude RAP format. - - * tests/benchmark.tpl - Benchmark program now prints the libsndfile version number when run. This - program was also backported to version 0 to compare results. Version - 1.0.0rc2 is faster than version 0.0.28 on most conversions but slower on - some. The slow ones need to be fixed before final release. - -2002-06-28 Erik de Castro Lopo - - * tests/benchmark.def tests/benchmark.tpl - New files which generate tests/benchmark.c using Autogen. Added int -> - SF_FORMAT_PCM_24 test. - - * tests/benchmark.c - Now and Autogen output file. - - * tests/Makefile.am - Updated for above changes. - -2002-06-27 Erik de Castro Lopo - - * tests/benchmark.c - Basic benchmark program complete. Need to convert it to Autogen. - - * Win32/Makefile.msvc - Added benchmark.exe target. - -2002-06-26 Erik de Castro Lopo - - * examples/generate.c - New program to generate a number of different output file formats from a - single input file. This allows testing of the created files. - - * tests/benchmark.c - New test program to benchmark libsndfile. Nowhere near complete yet. - - * examples/Makefile.am tests/Makefile.am - New make rules for the two new programs. - -2002-06-25 Erik de Castro Lopo - - * Win32/libsndfile.def - Removed definition for sf_signal_max(). - - * src/sndfile.c - Removed cruft. - - * doc/index.html - A number of documentation bugs were fixed. Thanks to Anand Kumria. - - * doc/version-1.html - Minor doc updates. - - * configure.in - Bumped version to 1.0.0rc2. - - * src/sf_command.h src/Makefile.am - Removed the header file as it was no longer being used. Thanks to Anand - Kunria for spotting this. - - * doc/index.html - A number of documentation bugs were fixed. Thanks to Anand Kumria. - -2002-06-24 Erik de Castro Lopo - - * src/common.h - Test for Win32 before testing SIZEOF_OFF_T so that it works correctly - on Win32.. - - * src/file_io.c - Win32 fixes to ensure O_BINARY is used for file open. - - * doc/win32.html - New file documenting the building libsndfile on Win32. - - * doc/*.html - Updating of documentation. - -2002-06-23 Erik de Castro Lopo - - * tests/pcm_test.c - Minor changes to allow easier determination of test file name. - - * src/sndfile.[ch] - Removed function sf_signal_max(). - - * examples/sndfile-play.c - Changed call to sf_signal_max() to a call to sf_command(). - -2002-06-22 Erik de Castro Lopo - - * src/format.c src/command.c - Renamed format.c to command.c which will now include code for sf_command() - calls to perform operations other than format commands. - - * src/sndfile.c src/sndfile.h - Removed function sf_get_signal_max() which is replaced by commands passed - to sf_command(). - - * src/command.c - Implement commands SFC_CALC_SIGNAL_MAX. - - * doc/command.html - Documented SFC_CALC_SIGNAL_MAX. - -2002-06-21 Erik de Castro Lopo - - * examples/sndfile-play.c - Mods to make sndfile-play work on Solaris. The program sndfile-play now - runs on Linux, MaxOSX and Solaris. Win32 to come. - - * src/format.c - Added SF_FORMAT_DWVW_* to subtype_formats array. - - * src/nist.c - Added support for 8 bit NIST Sphere files. Example file supplied by Anand - Kumria. - -2002-06-20 Erik de Castro Lopo - - * examples/sndfile-info.c - Tidy up of output format. - - * examnples/sndfile-play.c - Mods to make sndfile-play work on MacOSX using Apple's CoreAudio API. - - * configure.in - Add new variables OS_SPECIFIC_INCLUDES and OS_SPECIFIC_LINKS which were - required to supply extra include paths and link parameters to get - sndfile-play working on MacOSX. - - * examples/Makefile.am - Use OS_SPOECIFIC_INCLUDES and OS_SPECIFIC_LINKS to build commands for - sndfile-play. - -2002-06-19 Erik de Castro Lopo - - * src/nist.c - Added ability to read/write new NIST Sphere file types (A-law, u-law). - Header parser was re-written from scratch. Example files supplied by Anand - Kumria. - - * src/sndfile.c - Support for A-law and u-law NIST files. - - * tests/Makefile.am tests/lossy_comp_test.c - Tests for A-law and u-law NIST files. - -2002-06-18 Erik de Castro Lopo - - * tests/utils.c - Fixed an error in error string. - -2002-06-17 Erik de Castro Lopo - - * acinclude.m4 - Removed exit command to allow cross-compiling. - - * Win32/unistd.h src/file_io.c - Moved contents of first file into the second file (enclosed in #ifdef). - Win32/unistd.h is now an empty file but still must be there for libsndfile - to compile on Win32. - - * src/sd2.c, src/sndfile.c: - Fixes for Sound Designer II files on big endian systems. - -2002-06-16 Erik de Castro Lopo - - * configure.in - Modified to work around problems with crappy MacOSX version of sed. - Added sanity check for proper values for CFLAGS. - -2002-06-14 Erik de Castro Lopo - - * src/sndfile.c - Code clean up in sf_open (). - - * Win32/Makefile.msvc - Michael Fink's contributed MSVC++ makefile was hacked to bits and put back - together in a new improved form. - - * src/file_io.c - Fixes for Win32; _lseeki64() returns an invalid argument for calls like - _lseeki64(fd, 0, SEEK_CUR) so need to use _telli64 (fd) instead. - - * src/common.h src/sndfile.c src/wav.c src/aiff.c - Added SFE_LOG_OVERRUN error. - Added termination for potential infinite loop when parsing file headers. - - * src/wav.c src/w64.c - Fixed bug casuing incorrect header generation when opening file read/write. - -2002-06-12 Erik de Castro Lopo - - * doc/api.html - Improved the documentation to make it clearer that the file read method - and the underlying file format are completely disconnected. Suggested - by Josh Green. - - * doc/command.html - Started correcting docs to take into account changes made to the - operations of the sf_command () function. Not complete yet. - - * src/sndfile.c - Reverted some changes which had broken the partially working SDII header - parsing. Now have access to an iBook with OS X so reading and writing SDII - files on all platforms should be a reality in the near future. On Mac this - will involve reading the resource fork via the standard MacOS API. To move - a file from Mac to another OS, the resource and data forks will need to be - combined before transfer. The combined file will be read on both Mac and - other OSes like any other file. - -2002-06-08 Erik de Castro Lopo - - * ltmain.sh - Applied a patch from http://fink.sourceforge.net/doc/porting/libtool.php - which allows libsndfile to compile on MacOSX 10.1. This patch should not - interfere with compiling on other OSes. - - * src/GSM610/private.h - Changes to fix compile problems on MacOSX (see src/GSM610/ChangeLog). - - * src/float_cast.h - Added MacOSX replacements for lrint() and lrintf(). - -2002-06-05 Erik de Castro Lopo - - * src/sndfile.c - Replaced the code to print the filename to the log buffer when a file is - opened. This code seems to have been left out during the merge of - sf_open_read() and sf_open_write() to make a single functions sf_open(). - -2002-06-01 Erik de Castro Lopo - - * src/wav.c - Fixed a bug where the WAV header parser was going into an infinite loop - on a badly formed LIST chunk. File supplied by David Viens. - -2002-05-25 Erik de Castro Lopo - - * configure.in - Added a message at the end of the configuration process to warn about the - need for the use of pkg-config when linking programs against version 1 of - libsndfile. - - * doc/pkg-config.html - New documentation file containing details of how to use pkg-config to - retrieve settings for CFLAGS and library locations for linking files - against version 1 of libsndfile. - -2002-05-17 Erik de Castro Lopo - - * src/wav.c - Fixed minor bug in handling of so-called ACIDized WAV files. - -2002-05-16 Erik de Castro Lopo - - * Win32/libsndfile.def Win32/Makefile.msvc - Two new files contributed by Michael Fink (from the winLAME project) - which allows libsndfile to be built on windows in a MSDOS box by doing - "nmake -f Makefile.msvc". Way cool! - -2002-05-15 Erik de Castro Lopo - - * configure.in - MacOSX is SSSOOOOOOO screwed up!!! I can't believe how hard it is to - generate a tarball which will configure and compile on that platform. - Joined the libtool mailing list to try and get some answers. - -2002-05-13 Erik de Castro Lopo - - * configure.in - Changed to autoconf version 2.50. MacOSX uses autoconf version 2.53 which - is incompatible with with version 2.13 which had been using until now. - The AC_SYS_LARGE_FILE macro distributed withe autoconf 2.50 is missing a - few features so AC_SYS_EXTRA_LARGE file was defined to replace it. - - * configure.in - Changed to automake version 1.5 to try and make a tarball which will - work on MacOSX. - -2002-05-12 Erik de Castro Lopo - - * src/wav_gsm610.c - Changed name to gsm610.c. Added reading/writing of headerless files. - - * src/sndfile.c src/raw.c - Added ability to read/write headerless (SF_FORMAT_RAW) GSM 6.10 files. - -2002-05-11 Erik de Castro Lopo - - * tests/lossy_comp_test.c - Clean up in preparation for Autogen-ing this file. - - * src/GSM610/*.[ch] - Code cleanup and prepartion forgetting file seek working. Details in - src/GSM610/ChangeLog. - - * sndfile.pc.in - Testing complete. Is sndfile.m4 still needed? - -2002-05-09 Erik de Castro Lopo - - * tests/write_read_test.tpl tests/rdwr_test.tpl - Merged tests from these two programs into write_read_test.tpl and deleted - rdwr_test.tpl. - -2002-05-08 Erik de Castro Lopo - - * src/w64.c src/svx.c src/paf.c - Fixed bugs in read/write mode. - -2002-05-07 Erik de Castro Lopo - - * examples/Makefile.am - Renamed sfplay.c to sndfile-play.c and sndfile_info.c to sndfile-info.c for - consistency when these programs become part of the Debian package - sndfile-programs. - - * sndfile.pc.in - New file to replace sndfile-config.in. Libsndfile now uses the pkg-config - model for providing installation parameters to dependant programs. - - * src/sndfile.c - Cleanup of code in sf_open(). - -2002-05-06 Erik de Castro Lopo - - * tests/utils.tpl tests/write_read_test.tpl - More conversion to Autogen fixes and enchancements. - - * src/*.c - Read/write mode is now working for 16, 24 and 32 bit PCM as well as 32 - bit float and 64 bit double data. More tests still required. - - * src/Makefile.am - Added DISTCLEANFILES target to remove config.status and config.last. - - * Win32/Makefile.am MacOS/Makefile.am - Added DISTCLEANFILES target to remove Makefile. - -2002-05-05 Erik de Castro Lopo - - * src/*.[ch] tests/rdwr_test.c - More verifying workings of read/write mode. Fixing bugs found. - - * tests/utils.[ch] - Made these files Autogen generated files. - - * tests/util.tpl tests/util.def - New Autogen files to generate utils.[ch]. Moved some generic test functions - into this file. Autogen is such a great tool! - -2002-05-03 Erik de Castro Lopo - - * src/pcm.c src/float_cast.h Win32/config.h - Fixed a couple of Win32 specific bugs pointed out by Michael Fink - (maintainer of WinLAME) and David Viens. - - * tests/check_log_buffer.[ch] tests/utils.[ch] - Moved check_log_buffer() to utils.[ch] and deleted old file. - -2002-05-02 Erik de Castro Lopo - - * src/common.[ch] src/sndfile.c - New function psf_default_seek() which will be the default seek function - for things like PCM and floating point data. This default is set for - both read and write in sf_open() but can be over-ridden by any codec - during it's initialisation. - -2002-05-01 Erik de Castro Lopo - - * src/au.c - AU files use a data size value of -1 to mean unknown. Fixed au_open_read() - to allow opening files like this. - - * tests/rdwr_test .c - Added more tests. - - * src/sndfile.c - Fixed bugs in read/write mode found due to improvements in the test - program. - -2002-04-30 Erik de Castro Lopo - - * tests/rdwr_test .c - New file for testing read/write mode. - -2002-04-29 Erik de Castro Lopo - - * m4/* - Removed all m4 macros from this directory as they get concatenated to form - the file aclocal.m4 anyway. - - * sndfile.m4 - Moved this from the m4 directory to the root directory asn this is part of - the distribution and is installed during "make install". - -2002-04-29 Erik de Castro Lopo - - * src/float32.c - Removed logging of peaks for all file formats other than AIFF and WAV. - - * tests/write_read_test.tpl tests/write_read_test.def - New files which autogen uses to generate write_read_test.c. Doing it this - way makes write_read_test.c far easier to maintain. Other test programs - will be converted to autogen in the near future. - - * src/*.c - Fixed a few bugs found when testing on Sparc (bug endian) Solaris. - -2002-04-28 Erik de Castro Lopo - - * doc/*.html - Fixed documention versioning. - - * configure.in - Fixed a bug in the routines which search for Large File Support on systems - which have large file support by defualt. - -2002-04-27 Erik de Castro Lopo - - * src/*.[ch] - Found and fixed an issue which can cause a bug in other software (I was - porting Conrad Parker's Sweep program from version 0 of the library to - version 1). When opening a file for write, the libsndfile code would - set the sfinfo.samples field to a maximum value. - - * tests/write_read_test.c - Added tests to detect the above problem. - -2002-04-25 Erik de Castro Lopo - - * src/*.[ch] - Finished base implementation of read/write mode. Much more testing still - needed. - - * m4/largefile.m4 - Macro for detecting Large File Standard capabilities. This macro was ripped - out of the aclocal.m4 file of GNU tar-1.13. - - * configure.in - Added detection of large file support. Files larger than 2 Gigabytes should - now be supported on 64 bit platforms and many 32 bit platforms including - Linux (2.4 kernel, glibc-2.2), *BSD, MacOS, Win32. - - * libsndfile_convert_version.py - A Python script which attempts to autoconvert code written to use version 0 - to version 1. - -2002-04-24 Erik de Castro Lopo - - * src/*.[ch] - Finished base implementation of read/write mode. Much more testing still - needed. - - * tests/write_read_test.c - Preliminary tests for read/write mode added. More needed. - -2002-04-20 Erik de Castro Lopo - - * src/sndfile.[ch] - Removed sf_open_read() and sf_open_write() functions,replacting them with - sf_open() which takes an extra mode parameter (SF_OPEN_READ, SF_OPEN_WRITE, - or SF_OPEN_RDWR). This new function sf_open can now be modified to allow - opening a file formodification (RDWR). - -2002-04-19 Erik de Castro Lopo - - * src/*.c - Completed merging of separate xxx_open_read() and xxx_open_write() - functions. All tests pass. - -2002-04-18 Erik de Castro Lopo - - * src/au.c - Massive refactoring required to merge au_open_read() with au_open_write() - to create au_open(). - -2002-04-17 Erik de Castro Lopo - - * src/*.c - Started changes required to allow a sound file to be opened in read/write - mode, with separate file pointers for read and write. This involves merging - of encoder/decoder functions like pcm_read_init() and pcm_write_init() - int a new function pcm_init() as well as doing something similar for all - the file type specific functions ie aiff_open_read() and aiff_open_write() - were merged to make the function aiff_open(). - -2002-04-15 Erik de Castro Lopo - - * src/file_io.c - New file containing psf_fopen(), psf_fread(), psf_fwrite(), psf_fseek() and - psf_ftell() functions. These function will replace use of fopen/fread/fwrite - etc and allow access to files larger than 2 gigabytes on a number of 32 bit - OSes (Linux on x86, 32 bit Solaris user space apps, Win32 and MacOS). - - * src/*.c - Replaced all instances of fopen with psf_open, fread with psd_read, fwrite - with psf_write and so on. - -2002-03-11 Erik de Castro Lopo - - * src/dwvw.c - Finally fixed all known problems with 12, 16 and 24 bit DWVW encoding. - - * tests/floating_point_test.c - Added tests for 12, 16 and 24 bit DWVW encoding. - -2002-03-03 Erik de Castro Lopo - - * m4/endian.m4 - Defines a new m4 macro AC_C_FIND_ENDIAN, for determining the endian-ness of - the target CPU. It first checks for the definition of BYTE_ORDER in - , then in and . If none of these work - and the C compiler is not a cross compiler it compiles and runs a program - to test for endian-ness. If the compiler is a cross compiler it makes a - guess based on $target_cpu. - - * configure.in - Modified to use AC_C_FIND_ENDIAN. - - * src/sfendian.h - Simplified. - -2002-02-23 Erik de Castro Lopo - - * tests/floating_point_test.c - Tests completely rewritten using the dft_cmp function. Now able to - calculate a quick guesstimate of the Signal to Noise Ratio of the encoder. - -2002-02-15 Erik de Castro Lopo - - * tests/dft_cmp.[ch] - New files containing functions for comparing pre and post lossily - compressed data using a quickly hacked DFT. - - * tests/utils.[ch] - New files containing functions for saving pre and post encoded data in a - file readable by the GNU Octave package. - -2002-02-13 Erik de Castro Lopo - - * m4/lrint.m4 m4/lrintf.m4 - Fixed m4 macros to define HAVE_LRINT and HAVE_LRINTF even when the test - is cached. - -2002-02-12 Erik de Castro Lopo - - * tests/floating_point_test.c - Fixed improper use of strncat (). - -2002-02-11 Erik de Castro Lopo - - * tests/headerless_test.c - New test program to test the ability to open and read a known file type as a - RAW header-less file. - -2002-02-07 Erik de Castro Lopo - - * tests/losy_comp_test.c - Added a test to ensure that the data read from a file is not all zeros. - - * examples/sfconvert.c - Added "-gsm610" encoding types. - -2002-01-29 Erik de Castro Lopo - - * examples/sfconvert.c - Added "-dwvw12", "-dwvw16" and "-dwvw24" encoding types. - - * tests/dwvw_test.c - New file for testing DWVW encoder/decoder. - -2002-01-28 Erik de Castro Lopo - - * src/dwvw.c - Implemented writing of DWVW. 12 bit seems to work, 16 and 24 bit still broken. - - * src/aiff.c - Improved reporting of encoding types. - - * src/voc.c - Clean up. - -2002-01-27 Erik de Castro Lopo - - * src/dwvw.c - New file implementing lossless Delta Word Variable Width (DWVW) encoding. - Reading 12 bit DWVW is now working. - - * src/aiff.c common.h sndfile.c - Added hooks for DWVW encoded AIFF and RAW files. - -2002-01-15 Erik de Castro Lopo - - * src/w64.c - Robustify header parsing. - - * src/wav_w64.h - Header file wav.h was renamed to wav_w64.h to signify sharing of - definitions across the two file types. - - * src/wav.c src/w64.c src/wav_w64.c - Refactoring. - Modified and moved functions with a high degree of similarity between - wav.c and w64.c to wav_w64.c. - -2002-01-14 Erik de Castro Lopo - - * src/w64.c - Completed work on getting read and write working. - - * examples/sfplay.c - Added code to scale floating point data so it plays at a reasonable volume. - - * tests/Makefile.am tests/write_read_test.c - Added tests for W64 files. - -2002-01-13 Erik de Castro Lopo - - * src/*.c - Modded all code in file header writing routines to use - psf_new_binheader_writef(). - Removed psf_binheader_writef() from src/common.c. - Globally replaced psf_new_binheader_writef with psf_binheader_writef. - -2002-01-12 Erik de Castro Lopo - - * src/*.c - Modded all code in file parsing routines to use psf_new_binheader_readf(). - Removed psf_binheader_readf() from src/common.c. - Globally replaced psf_new_binheader_readf with psf_binheader_readf. - - * src/common.[ch] - Added new function psf_new_binheader_writef () which will soon replace - psf_binheader_writef (). The new function has basically the same function - as the original but has a more flexible and capable interface. It also - allows the writing of 64 bit integer values for files contains 64 bit file - offsets. - -2002-01-11 Erik de Castro Lopo - - * src/formats.c src/sndfile.c src/sndfile.h - Added code allowing full enumeration of supported file formats via the - sf_command () interface. - This feature will allow applications to avoid needing recompilation when - support for new file formats are added to libsndfile. - - * tests/command_test.c - Added test code for the above feature. - - * examples/list_formats.c - New file. An example of the use of the supported file enumeration - interface. This program lists all the major formats and for each major - format the supported subformats. - -2002-01-10 Erik de Castro Lopo - - * src/*.[ch] tests/*.c - Changed command parameter of sf_command () function from a test string to - an int. The valid values for the command parameter begin with SFC_ and are - listed in src/sndfile.h. - -2001-12-20 Erik de Castro Lopo - - * src/formats.c src/sndfile.c - Added an way of enumerating a set of common file formats using the - sf_command () interface. This interface was suggested by Dominic Mazzoni, - one of the main authors of Audacity (http://audacity.sourceforge.net/). - -2001-12-26 Erik de Castro Lopo - - * src/sndfile.c - Added checking of filename parameter in sf_open_read (). Previousy, if a - NULL pointer was passed the library would segfault. - -2001-12-18 Erik de Castro Lopo - - * src/common.c src/common.h - Changed the len parameter of the endswap_*_array () functions from type - int to type long. - - * src/pcm.c - Fixed a problem which - -2001-12-15 Erik de Castro Lopo - - * src/sndfile.c - Added conditional #include for EMX/gcc on OS/2. Thanks to - Paul Hartman for pointing this out. - - * tests/lossy_comp_test.c tests/floating_point_test.c - Added definitions for M_PI for when it isn't defined in . - -2001-11-30 Erik de Castro Lopo - - * src/ircam.c - Re-implemented the header reader. Old version was making incorrect - assumptions about the endian-ness of the file from the magic number at the - start of the file. The new code looks at the integer which holds the - number of channels and determines the endian-ness from that. - -2001-11-30 Erik de Castro Lopo - - * src/aiff.c - Added support for other AIFC types ('raw ', 'in32', '23ni'). - Further work on IMA ADPCM encoding. - -2001-11-29 Erik de Castro Lopo - - * src/ima_adpcm.c - Renamed from wav_ima_adpcm.c. This file will soon handle IMA ADPCM - encodings for both WAV and AIFF files. - - * src/aiff.c - Started adding IMA ADPCM support. - -2001-11-28 Erik de Castro Lopo - - * src/double.c - New file for handling double precision floating point (SF_FORMAT_DOUBLE) - data. - - * src/wav.c src/aiff.c src/au.c src/raw.c - Added support for SF_FORMAT_DOUBLE data. - - * src/common.[ch] - Addition of endswap_long_array () for endian swapping 64 bit integers. This - function will work correctly on processors with 32 bit and 64 bit longs. - Optimised endswap_short_array () and endswap_int_array (). - - * tests/pcm_test.c - Added and extra check. After the first file of each type is written to disk - a checksum is performed of the first 64 bytes and checked against a pre- - calculated value. This will work whatever the endian-ness of the host - machine. - -2001-11-27 Erik de Castro Lopo - - * src/aiff.c - Added handling of u-law, A-law encoded AIFF files. Thanks to Tom Erbe for - supplying example files. - - * tests/lossy_comp_test.c - Added tests for above. - - * src/common.h src/*.c - Removed function typedefs from common.h and function pointer casting in all - the other files. This allows the compiler to perform proper type checking. - Hopefully this will prevernt problems like the sf_seek bug for OpenBSD, - BeOS etc. - - * src/common.[ch] - Added new function psf_new_binheader_readf () which will eventually replace - psf_binheader_readf (). The new function has basically the same function as - the original but has a more flexible and capable interface. It also allows - the reading of 64 bit integer values for files contains 64 bit file - offsets. - -2001-11-26 Erik de Castro Lopo - - * src/voc.c - Completed implementation of VOC file handling. Can now handle 8 and 16 bit - PCM, u-law and A-law files with one or two channels. - - * src/write_read_test.c tests/lossy_comp_test.c - Added tests for VOC files. - -2001-11-22 Erik de Castro Lopo - - * src/float_cast.h - Added inline asm version of lrint/lrintf for MacOS. Solution provided by - Stephane Letz. - - * src/voc.c - More work on this braindamaged format. The VOC files produced by SoX also - have a number of inconsistencies. - -2001-11-19 Erik de Castro Lopo - - * src/paf.c - Added support for 8 bit PCM PAF files. - - * tests/write_read_test.c - Added tests for 8 bit PAF files. - -2001-11-18 Erik de Castro Lopo - - * tests/pcm_test.c - New test program to test for correct scaling of integer values between - different sized integer containers (ie short -> int). - The new specs for libsndfile state that when the source and destination - containers are of a different size, the most significant bit of the source - value becomes the most significant bit of the destination container. - - * src/pcm.c src/paf.c - Modified to pass the above test program. - - * tests/write_read_test.c tests/lossy_comp_test.c - Modified to work with the new scaling rules. - -2001-11-17 Erik de Castro Lopo - - * src/raw.c tests/write_read_test.c tests/write_read_test.c - Added ability to do raw reads/writes of float, u-law and A-law files. - - * src/*.[ch] examples/*.[ch] tests/*.[ch] - Removed dependance on pcmbitwidth field of SF_INFO struct and moved to new - SF_FORMAT_* types and use of SF_ENDIAN_BIG/LITTLE/CPU. - -2001-11-12 Erik de Castro Lopo - - * src/*.[ch] - Started implmentation of major changes documented in doc/version1.html. - - Removed all usage of off_t which is not part of the ISO C standard. All - places which were using it are now using type long which is the type of - the offset parameter for the fseek function. - This should fix problems on BeOS, MacOS and *BSD like systems which were - failing "make check" because sizeof (long) != sizeof (off_t). - --------------------------------------------------------------------------------- -This is the boundary between version 1 of the library above and version 0 below. --------------------------------------------------------------------------------- - -2001-11-11 Erik de Castro Lopo - - * examples/sfplay_beos.cpp - Added BeOS version of sfplay.c. This needs to be compiled using a C++ - compiler so is therefore not built by default. Thanks to Marcus Overhagen - for providing this. - -2001-11-10 Erik de Castro Lopo - - * examples/sfplay.c - New example file showing how libsndfile can be used to read and play a - sound file. - At the moment on Linux is supported. Others will follow in the near future. - -2001-11-09 Erik de Castro Lopo - - * src/pcm.c - Fixed problem with normalisation code where a value of 1.0 could map to - a value greater than MAX_SHORT or MAX_INT. Thanks to Roger Dannenberg for - pointing this out. - -2001-11-08 Erik de Castro Lopo - - * src/pcm.c - Fixed scaling issue when reading/writing 8 bit files using - sf_read/sf_write_short (). - On read, values are scaled so that the most significant bit in the char - ends up in the most significant bit of the short. On write, values are - scaled so that most significant bit in the short ends up as the most - significant bit in the char. - -2001-11-07 Erik de Castro Lopo - - * src/au.c src/sndfile.c - Added support for 32 bit float data in big and little endian AU files. - - * tests/write_read_test.c - Added tests for 32 bit float data in AU files. - -2001-11-06 Erik de Castro Lopo - - * tests/lossy_comp_test.c - Finalised testing of stereo files where possible. - -2001-11-05 Erik de Castro Lopo - - * src/wav_ms_adpcm.c - Fixed bug in writing stereo MS ADPCM WAV files. Thanks to Xu Xin for - pointing out this problem. - -2001-10-24 Erik de Castro Lopo - - * src/wav_ms_adpcm.c - Modified function srate2blocksize () to handle 44k1Hz stereo files. - -2001-10-21 Erik de Castro Lopo - - * src/w64.c - Added support for Sonic Foundry 64 bit WAV format. As Linux (my main - development platform) does not yet support 64 bit file offsets by default, - current handling of this file format treats everything as 32 bit and fails - openning the file, if it finds anything that goes beyond 32 bit values. - - * src/sndfile.[hc] src/common.h src/Makefile.am - Added hooks for W64 support. - -2001-10-21 Erik de Castro Lopo - - * configure.in - Added more warnings options to CFLAGS when the gcc compiler is detected. - - * src/*.[ch] tests/*.c examples/*.c - Started fixing the warning messages due to the new CFLASG. - - * src/voc.c - More work on VOC file read/writing. - - * src/paf.c - Found that PAF files were not checking the normalisation flag when reading - or writing floats and doubles. Fixed it. - - * tests/floating_point_test.c - Added specific test for the above problem. - - * src/float_cast.h src/pcm.c - Added a section for Win32 to define lrint () and lrintf () in the header - and implement it in the pcm.c - -2001-10-20 Erik de Castro Lopo - - * sndfile-config.in m4/sndfile.m4 - These files were donated by Conrad Parker who also provided instructions - on how to install them using autoconf/automake. - - * src/float_cast.h - Fiddled around with this file some more. On Linux and other gcc supported - OSes use the C99 functions lrintf() and lrint() for casting from floating - point to int without incurring the huge perfromance penalty (particularly - on the i386 family) caused by the regular C cast from float to int. - These new C99 functions replace the FLOAT_TO_* and DOUBLE_TO_* macros which - I had been playing with. - - * configure.in m4/lrint.m4 m4/lrintf.m4 - Add detection of these functions. - -2001-10-17 Erik de Castro Lopo - - * src/voc.c - Completed code for reading VOC files containing a single audio data - segment. - Started implementing code to handle files with multiple VOC_SOUND_DATA - segments but couldn't be bothered finishing it. Multiple segment files can - have different sample rates for different sections and other nasties like - silence and repeat segments. - -2001-10-16 Erik de Castro Lopo - - * src/common.h src/*.c - Removed SF_PRIVATE struct field fdata and replaced it with extra_data. - - * src/voc.c - Further development of the read part of this woefult file format. - -2001-10-04 Erik de Castro Lopo - - * src/float_cast.h - Implemented gcc and i386 floating point to int cast macros. Standard cast - will be used when not on gcc for i385. - - * src/pcm.c - Modified all uses of FLOAT/DOUBLE_TO_INT and FLOAT/DOUBLE_TO_SHORT casts to - comply with macros in float_cast.h. - -2001-10-04 Erik de Castro Lopo - - * src/voc.c - Changed the TYPE_xxx enum names to VOC_TYPE_xxx to prevent name clashes - on MacOS with CodeWarrior 6.0. - - * MacOS/MacOS-readme.txt - Updated the compile instructions. Probably still need work as I don't have - access to a Mac. - -2001-10-01 Erik de Castro Lopo - - * src/wav.c src/aiff.c common.c - Changed all references to snprintf to LSF_SNPRINTF and all vsnprintf to - LSF_VSNPRINTF. LSF_VSNPRINTF and LSF_VSNPRINTF are defined in common.h. - - * src/common.h - Added checking of HAVE_SNPRINTF and HAVE_VSNPRINTF and defining - LSF_VSNPRINTF and LSF_VSNPRINTF to appropriate values. - - * src/missing.c - New file containing a minimal implementation of snprintf and vsnprintf - functions named missing_snprintf and missing_vsnprintf respectively. These - are only compliled into the binary if snprintf and/or vsnprintf are not - available. - -2001-09-29 Erik de Castro Lopo - - * src/ircam.c - New file to handle Berkeley/IRCAM/CARL files. - - * src/sndfile.c src/common.h - Modified for IRCAM handling. - - * tests/*.c - Added tests for IRCAM files. - -2001-09-27 Erik de Castro Lopo - - * src/wav.c - Apparently microsoft windows (tm) doesn't like ulaw and Alaw WAV files with - 20 byte format chunks (contrary to ms's own documentation). Fixed the WAV - header writing code to generate smaller ms compliant ulaw and Alaw WAV - files. - -2001-09-17 Erik de Castro Lopo - - * tests/stdio_test.sh tests/stdio_test.c - Shell script was rewritten as a C program due to incompatibilities of the - sh shell on Linux and Solaris. - -2001-09-16 Erik de Castro Lopo - - * tests/stdio_test.sh tests/stdout_test.c tests/stdin_test.c - New test programs to verify the correct operation of reading from stdin and - writing to stdout. - - * src/sndfile.c wav.c au.c nist.c paf.c - Fixed a bugs uncovered by the new test programs above. - -2001-09-15 Erik de Castro Lopo - - * src/sndfile.c wav.c - Fixed a bug preventing reading a file from stdin. Found by T. Narita. - -2001-09-12 Erik de Castro Lopo - - * src/common.h - Fixed a problem on OpenBSD 2.9 which was causing sf_seek() to fail on IMA - WAV files. Root cause was the declaration of the func_seek typedef not - matching the functions it was actually being used to point to. In OpenBSD - sizeof (off_t) != sizeof (int). Thanks to Heikki Korpela for allowing me - to log into his OpenBSD machine to debug this problem. - -2001-09-03 Erik de Castro Lopo - - * src/sndfile.c - Implemented sf_command ("norm float"). - - * src/*.c - Implemented handling of sf_command ("set-norm-float"). Float normalization - can now be turned on and off. - - * tests/double_test.c - Renamed to floating_point_test.c. Modified to include tests for all scaled - reads and writes of floats and doubles. - - * src/au_g72x.c - Fixed bug in normalization code found with improved floating_point_test - program. - - * src/wav.c - Added code for parsing 'INFO' and 'LIST' chunks. Will be used for extract - text annotations from WAV files. - - * src/aiff.c - Added code for parsing '(c) ' and 'ANNO' chunks. Will be used for extract - text annotations from WAV files. - -2001-09-02 Erik de Castro Lopo - - * examples/sf_info.c example/Makefile.am - Renamed to sndfile_info.c. The program sndfile_info will now be installed - when the library is installed. - - * src/float_cast.h - New file defining floating point to short and int casts. These casts will - eventually replace all flot and double casts to short and int. See comments - at the top of the file for the reasoning. - - * src/*.c - Changed all default float and double casts to short or int with macros - defined in floatcast.h. At the moment these casts do nothing. They will be - replaced with faster float to int cast operations in the near future. - -2001-08-31 Erik de Castro Lopo - - * tests/command_test.c - New file for testing sf_command () functionality. - - * src/sndfile.c - Revisiting of error return values of some functions. - Started implementing sf_command () a new function will allow on-the-fly - modification of library behaviour, or instance, sample value scaling. - - * src/common.h - Added hook for format specific sf_command () calls to SNDFILE struct. - - * doc/api.html - Updated and errors corrected. - - * doc/command.html - New documentation file explaining new sf_command () function. - -2001-08-11 Erik de Castro Lopo - - * src/sndfile.c - Fixed error return values from sf_read*() and sf_write*(). There were - numerous instances of -1 being returned through size_t. These now all set - error int the SF_PRIVATE struct and return 0. Thanks to David Viens for - spotting this. - -2001-08-01 Erik de Castro Lopo - - * src/common.c - Fixed use of va_arg() calls that were causing warning messages with the - latest version of gcc (thanks Maurizio Umberto Puxeddu). - -2001-07-25 Erik de Castro Lopo - - * src/*.c src/sfendian.h - Moved definition of MAKE_MARKER macro to sfendian.h - -2001-07-23 Erik de Castro Lopo - - * src/sndfile.c - Modified sf_get_lib_version () so that version string will be visible using - the Unix strings command. - - * examples/Makefile.am examples/sfinfo.c - Renamed sfinfo program and source code to sf_info. This prevents a name - clash with the program included with libaudiofile. - -2001-07-22 Erik de Castro Lopo - - * tests/read_seek_test.c tests/lossy_comp_test.c - Added tests for sf_read_float () and sf_readf_float (). - - * src/voc.c - New files for handling Creative Voice files (not complete). - - * src/samplitude.c - New files for handling Samplitude files (not complete). - -2001-07-21 Erik de Castro Lopo - - * src/aiff.c src/au.c src/paf.c src/svx.c src/wav.c - Converted these files to using psf_binheader_readf() function. Will soon be - ready to attempt to make reading writing from pipes work reliably. - - * src/*.[ch] - Added code for sf_read_float () and sf_readf_float () methods of accessing - file data. - -2001-07-20 Erik de Castro Lopo - - * src/paf.c src/wav_gsm610.c - Removed two printf()s which had escaped notice for some time (thanks - Sigbjørn Skjæret). - -2001-07-19 Erik de Castro Lopo - - * src/wav_gsm610.c - Fixed a bug which prevented GSM 6.10 encoded WAV files generated by - libsndfile from being played in Windoze (thanks klay). - -2001-07-18 Erik de Castro Lopo - - * src/common.[ch] - Implemented psf_binheader_readf() which will do for file header reading what - psf_binheader_writef() did for writing headers. Will eventually allow - libsndfile to read and write from pipes, including named pipes. - -2001-07-16 Erik de Castro Lopo - - * MacOS/config.h Win32/config.h - Attempted to bring these two files uptodate with src/config.h. As I don't - have access to either of these systems support for them may be completely - broken. - -2001-06-18 Erik de Castro Lopo - - * src/float32.c - Fixed bug for big endian processors that can't read 32 bit IEEE floats. Now - tested on Intel x86 and UltraSparc processors. - -2001-06-13 Erik de Castro Lopo - - * src/aiff.c - Modified to allow REX files (from Propellorhead's Recycle and Reason - programs) to be read. - REX files are basically an AIFF file with slightly unusual sequence of - chunks (AIFF files are supposed to allow any sequence) and some extra - application specific information. - Not yet able to write a REX file as the details of the application specific - data is unknown. - -2001-06-12 Erik de Castro Lopo - - * src/wav.c - Fixed endian bug when reading PEAK chunk on big endian machines. - - * src/common.c - Fixed endian bug when reading PEAK chunk on big endian machines with - --enable-force-broken-float configure option. - Fix psf_binheader_writef for (FORCE_BROKEN_FLOAT ||______) - -2001-06-07 Erik de Castro Lopo - - * configure.in src/config.h.in - Removed old CAN_READ_WRITE_x86_IEEE configure variable now that float - capabilities are detected at run time. - Added FORCE_BROKEN_FLOAT to allow testing of broken float code on machines - where the processor can in fact handle floats correctly. - - * src/float32.c - Rejigged code reading and writing of floats on broken processors. - - * m4/ - Removed this directory and all its files as they are no longer needed. - -2001-06-05 Erik de Castro Lopo - - * tests/peak_chunk_test.c - New test to validate reading and writing of peak chunk. - - * examples/sfconvert - Added -float32 option. - - * src/*.c - Changed all error return values to negative values (ie the negative of what - they were). - - * src/sndfile.c tests/error_test.c - Modified to take account of the previous change. - -2001-06-04 Erik de Castro Lopo - - * src/float32.c - File renamed from wav_float.c and renamed function to something more - general. - Added runtime detection of floating point capabilities. - Added recording of peaks during write for generation of PEAK chunk. - - * src/wav.c src/aiff.c - Added handing for PEAK chunk for floating point files. PEAK is read when the - file headers are read and generated when the file is closed. Logic is in - place for adding PEAK chunk to end of file when writing to a pipe (reading - and writing from/to pipe to be implemented soon). - - * src/sndfile.c - Modified sf_signal_max () to use PEAK values if present. - -2001-06-03 Erik de Castro Lopo - - * src/*.c - Added pcm_read_init () and pcm_write_init () to src/pcm.c and removed all - other calls to functions in this file from the filetype specific files. - - * src/*.c - Added alaw_read_init (), alaw_write_int (), ulaw_read_init () and - ulaw_write_init () and removed all other calls to functions in alaw.c and - ulaw.c from the filetype specific files. - - * tests/write_read_test.c - Added tests to validate sf_seek () on all file types. - - * src/raw.c - Implemented raw_seek () function to fix a bug where - sf_seek (file, 0, SEEK_SET) on a RAW file failed. - - * src/paf.c - Fixed a bug in paf24_seek () found due to added seeks tests in - tests/write_read_test.c - -2001-06-01 Erik de Castro Lopo - - * tests/read_seek_test.c - Fixed a couple of broken binary files. - - * src/aiff.c src/wav.c - Added handling of PEAK chunks on file read. - -2001-05-31 Erik de Castro Lopo - - * check_libsndfile.py - New file for the regression testing of libsndfile. - check_libsndfile.py is a Python script which reads in a file containing - filenames of audio files. Each file is checked by running the examples/sfinfo - program on them and checking for error or warning messages in the libsndfile - log buffer. - - * check_libsndfile.list - This is an example list of audio files for use with check_libsndfile.py - - * tests/lossy_comp_test.c - Changed the defined value of M_PI for math header files which don't have it. - This fixed validation test failures on MetroWerks compilers. Thanks to Lord - Praetor Satanus of Acheron for bringing this to my attention. - -2001-05-30 Erik de Castro Lopo - - * src/common.[ch] - Removed psf_header_setf () which was no longer required after refactoring - and simplification of header writing. - Added 'z' format specifier to psf_binheader_writef () for zero filling header - with N bytes. Used by paf.c and nist.c - - * tests/check_log_buffer.c - New file implementing check_log_buffer () which reads the log buffer of a - SNDFILE* object and searches for error and warning messages. Calls exit () - if any are found. - - * tests/*.c - Added calls to check_log_buffer () after each call to sf_open_XXX (). - -2001-05-29 Erik de Castro Lopo - - * src/wav.c src/wav_ms_adpcm.c src/wav_gsm610.c - Major rehack of header writing using psf_binheader_writef (). - -2001-05-28 Erik de Castro Lopo - - * src/wav.c src/wav_ima_adpcm.c - Major rehack of header writing using psf_binheader_writef (). - -2001-05-27 Erik de Castro Lopo - - * src/wav.c - Changed return type of get_encoding_str () to prevent compiler warnings on - Mac OSX. - - * src/aiff.c src/au.c - Major rehack of header writing using psf_binheader_writef (). - -2001-05-25 Erik de Castro Lopo - - * src/common.h src/common.c - Added comments. - Name of log buffer changed from strbuffer to logbuffer. - Name of log buffer index variable changed from strindex to logindex. - - * src/*.[ch] - Changed name of internal logging function from psf_sprintf () to - psf_log_printf (). - Changed name of internal header generation functions from - psf_[ab]h_printf () to psf_asciiheader_printf () and - psf_binheader_writef (). - Changed name of internal header manipulation function psf_hsetf () to - psf_header_setf (). - -2001-05-24 Erik de Castro Lopo - - * src/nist.c - Fixed reading and writing of sample_byte_format header. "01" means little - endian and "10" means big endian regardless of bit width. - - * configure.in - Detect Mac OSX and disable -Wall and -pedantic gcc options. Mac OSX is - way screwed up and spews out buckets of warning messages from the system - headers. - Added --disable-gcc-opt configure option (sets gcc optimisation to -O0 ) for - easier debugging. - Made decision to harmonise source code version number and .so library - version number. Future releases will stick to this rule. - - * doc/new_file_type.HOWTO - New file to document the addition of new file types to libsndfile. - -2001-05-23 Erik de Castro Lopo - - * src/nist.c - New file for reading/writing Sphere NIST audio file format. - Originally requested by Elis Pomales in 1999. - Retrieved from unstable (and untouched for 18 months) branch of libsndfile. - Some vital information gleaned from the source code to Bill Schottstaedt's - sndlib library : ftp://ccrma-ftp.stanford.edu/pub/Lisp/sndlib.tar.gz - Currently reading and writing 16, 24 and 32 bit, big-endian and little - endian, stereo and mono files. - - * src/common.h src/common.c - Added psf_ah_printf () function to help construction of ASCII headers (ie NIST). - - * configure.in - Added test for vsnprintf () required by psf_ah_printf (). - - * tests/write_read_test.c - Added tests for supported NIST files. - -2001-05-22 Erik de Castro Lopo - - * tests/write_read_test.c - Added tests for little endian AIFC files. - - * src/aiff.c - Minor re-working of aiff_open_write (). - Added write support for little endian PCM encoded AIFC files. - -2001-05-13 Erik de Castro Lopo - - * src/aiff.c - Minor re-working of aiff_open_read (). - Added read support for little endian PCM encoded AIFC files from the Mac - OSX CD ripper program. Guillaume Lessard provided a couple of sample files - and a working patch. - The patch was not used as is but gave a good guide as to what to do. - -2001-05-11 Erik de Castro Lopo - - * src/sndfile.h - Fixed comments about endian-ness of WAV and AIFF files. Guillaume Lessard - pointed out the error. - -2001-04-23 Erik de Castro Lopo - - * examples/make_sine.c - Re-write of this example using sample rate and required frequency in Hz. - -2001-02-11 Erik de Castro Lopo - - * src/sndfile.c - Fixed bug that prevented known file types from being read as RAW PCM data. - -2000-12-16 Erik de Castro Lopo - - * src/aiff.c - Added handing of COMT chunk. - -2000-11-16 Erik de Castro Lopo - - * examples/sfconvert.c - Fixed bug in normalisatio code. Pointed out by Johnny Wu. - -2000-11-08 Erik de Castro Lopo - - * Win32/config.h - Fixed the incorrect setting of HAVE_ENDIAN_H parameter. Win32 only issue. - -2000-10-27 Erik de Castro Lopo - - * tests/Makefile.am - Added -lm for write_read_test_LDADD. - -2000-10-16 Erik de Castro Lopo - - * src/sndfile.c src/au.c - Fixed bug which prevented writing of G723 24kbps AU files. - - * tests/lossy_comp_test.c - Corrrection to options for G723 tests. - - * configure.in - Added --disable-gcc-pipe option for DJGPP compiler (gcc on MS-DOS) which - doesn't allow gcc -pipe option. - -2000-09-03 Erik de Castro Lopo - - * src/ulaw.c src/alaw.c src/wav_imaadpcm.c src/msadpcm.c src/wav_gsm610.c - Fixed normailsation bugs shown up by new double_test program. - -2000-08-31 Erik de Castro Lopo - - * src/pcm.c - Fixed bug in normalisation code (spotted by Steve Lhomme). - - * tests/double_test.c - New file to test scaled and unscaled sf_read_double() and sf_write_double() - functions. - -2000-08-28 Erik de Castro Lopo - - * COPYING - Changed to the LGPL COPYING file (spotted by H. S. Teoh). - -2000-08-21 Erik de Castro Lopo - - * src/sndfile.h - Removed prototype of unimplemented function sf_get_info(). Added prototype - for sf_error_number() Thanks to Sigbjørn Skjæret for spotting these. - -2000-08-18 Erik de Castro Lopo - - * src/newpcm.h - New file to contain a complete rewrite of the PCM data handling. - -2000-08-15 Erik de Castro Lopo - - * src/sndfile.c - Fixed a leak of FILE* pointers in sf_open_write(). Thanks to Sigbjørn - Skjæret for spotting this one. - -2000-08-13 Erik de Castro Lopo - - * src/au_g72x.c src/G72x/g72x.c - Added G723 encoded AU file support. - - * tests/lossy_comp_test.c - Added tests for G721 and G723 encoded AU files. - -2000-08-06 Erik de Castro Lopo - - * all files - Changed the license to LGPL. Albert Faber who had copyright on - Win32/unistd.h gave his permission to change the license on that file. All - other files were either copyright erikd AT mega-nerd DOT com or copyright - under a GPL/LGPL compatible license. - -2000-08-06 Erik de Castro Lopo - - * tests/lossy_comp_test.c - Fixed incorrect error message. - - * src/au_g72x.c src/G72x/* - G721 encoded AU files now working. - - * Win32/README-Win32.txt - Replaced this file with a new one which gives a full explanation - of how to build libsndfile under Win32. Thanks to Mike Ricos. - -2000-08-05 Erik de Castro Lopo - - * src/*.[ch] - Removed double leading underscores from the start of all variable and - function names. Identifiers with a leading underscores are reserved - for use by the compiler. - - * src/au_g72x.c src/G72x/* - Continued work on G721 encoded AU files. - -2000-07-12 Erik de Castro Lopo - - * src/G72x/* - New files for reading/writing G721 and G723 ADPCM audio. These files - are from a Sun Microsystems reference implementation released under a - free software licence. - Extensive changes to this code to make it fit in with libsndfile. - See the ChangeLog in this directory for details. - - * src/au_g72x.c - New file for G721 encoded AU files. - -2000-07-08 Erik de Castro Lopo - - * libsndfile.spec.in - Added a spec file for making RPMs. Thanks to Josh Green for supplying this. - -2000-06-28 Erik de Castro Lopo - - * src/sndfile.c src/sndfile.h - Add checking for and handling of header-less u-law encoded AU/SND files. - Any file with a ".au" or ".snd" file extension and without the normal - AU file header is treated as an 8kHz, u-law encoded file. - - * src/au.h - New function for opening a headerless u-law encoded file for read. - -2000-06-04 Erik de Castro Lopo - - * src/paf.c - Add checking for files shorter than minimal PAF file header length. - -2000-06-02 Erik de Castro Lopo - - * tests/write_read_test.c - Added extra sf_perror() calls when sf_write_XXXX fails. - -2000-05-29 Erik de Castro Lopo - - * src/common.c - Modified usage of va_arg() macro to work correctly on PowerPC - Linux. Thanks to Kyle Wheeler for giving me ssh access to his - machine while I was trying to track this down. - - * configure.in src/*.[ch] - Sorted out some endian-ness issues brought up by PowerPC Linux. - - * tests/read_seek_test.c - Added extra debugging for when tests fail. - -2000-05-18 Erik de Castro Lopo - - * src/wav.c - Fixed bug in GSM 6.10 handling for big-endian machines. Thanks - to Sigbjørn Skjæret for reporting this. - -2000-04-25 Erik de Castro Lopo - - * src/sndfile.c src/wav.c src/wav_gsm610.c - Finallised writing of GSM 6.10 WAV files. - - * tests/lossy_comp_test.c - Wrote new test code for GSM 6.10 files. - - * examples/sfinfo.c - Fixed incorrect format in printf() statement. - -2000-04-06 Erik de Castro Lopo - - * src/sndfile.h.in - Fixed comments about sf_perror () and sf_error_str (). - -2000-03-14 Erik de Castro Lopo - - * configure.in - Fixed --enable-justsrc option. - -2000-03-07 Erik de Castro Lopo - - * wav.c - Fixed checking of bytespersec field of header. Still some weirdness - with some files. - -2000-03-05 Erik de Castro Lopo - - * tests/lossy_comp_test.c - Added option to test PCM WAV files (sanity check). - Fixed bug in sf_seek() tests. - -2000-02-29 Erik de Castro Lopo - - * src/sndfile.c src/wav.c - Minor changes to allow writing of GSM 6.10 WAV files. - -2000-02-28 Erik de Castro Lopo - - * configure.in Makefile.am src/Makefile.am - Finally got around to figuring out how to build a single library from - multiple source directories. - Reading GSM 6.10 files now seems to work. - -2000-01-03 Erik de Castro Lopo - - * src/wav.c - Added more error reporting in read_fmt_chunk(). - -1999-12-21 Erik de Castro Lopo - - * examples/sfinfo.c - Modified program to accept multiple filenames from the command line. - -1999-11-27 Erik de Castro Lopo - - * src/wav_ima_adpcm.c - Moved code around in preparation to adding ability to read/write IMA ADPCM - encoded AIFF files. - -1999-11-16 Erik de Castro Lopo - - * src/common.c - Fixed put_int() and put_short() macros used by _psf_hprintf() which were - causing seg. faults on Sparc Solaris. - -1999-11-15 Erik de Castro Lopo - - * src/common.c - Added string.h to includes. Thanks to Sigbjxrn Skjfret. - - * src/svx.c - Fixed __svx_close() function to ensure FORM and BODY chunks are correctly - set. - -1999-10-01 Erik de Castro Lopo - - * src/au.c - Fixed handling of incorrect size field in AU header on read. Thanks to - Christoph Lauer for finding this problem. - -1999-09-28 Erik de Castro Lopo - - * src/aiff.c - Fixed a bug with incorrect SSND chunk length being written. This also lead - to finding an minor error in AIFF header parsing. Thanks to Dan Timis for - pointing this out. - -1999-09-24 Erik de Castro Lopo - - * src/paf.c - Fixed a bug with reading and writing 24 bit stereo PAF files. This problem - came to light when implementing tests for the new functions which operate - in terms of frames rather than items. - -1999-09-23 Erik de Castro Lopo - - * src/sndfile.c - Modified file type detection to use first 12 bytes of file rather than - file name extension. Required this because NIST files use the same - filename extension as Microsoft WAV files. - - * src/sndfile.c src/sndfile.h - Added short, int and double read/write functions which work in frames - rather than items. This was originally suggested by Maurizio Umberto - Puxeddu. - -1999-09-22 Erik de Castro Lopo - - * src/svx.c - Finished off implementation of write using __psf_hprintf(). - -1999-09-21 Erik de Castro Lopo - - * src/common.h - Added a buffer to SF_PRIVATE for writing the header. This is required - to make generating headers for IFF/SVX files easier as well as making - it easier to do re-write the headers which will be required when - sf_rewrite_header() is implemented. - - * src/common.c - Implemented __psf_hprintf() function. This is an internal function - which is documented briefly just above the code. - -1999-09-05 Erik de Castro Lopo - - * src/sndfile.c - Fixed a bug in sf_write_raw() where it was returning incorrect values - (thanks to Richard Dobson for finding this one). Must put in a test - routine for sf_read_raw and sf_write_raw. - - * src/aiff.c - Fixed default FORMsize in __aiff_open_write (). - - * src/sndfile.c - Added copy of filename to internal data structure. IFF/SVX files - contain a NAME header chunk. Both sf_open_read() and sf_open_write() - copy the file name (less the leading path information) to the - filename field. - - * src/svx.c - Started implementing writing of files. - -1999-08-04 Erik de Castro Lopo - - * src/svx.c - New file for reading/writing 8SVX and 16SVX files. - - * src/sndfile.[ch] src/common.h - Changes for SVX files. - - * src/aiff.c - Fixed header parsing when unknown chunk is found. - -1999-08-01 Erik de Castro Lopo - - * src/paf.c - New file for reading/writing Ensoniq PARIS audio file format. - - * src/sndfile.[ch] src/common.h - Changes for PAF files. - - * src/sndfile.[ch] - Added stuff for sf_get_lib_version() function. - - -1999-07-31 Erik de Castro Lopo - - * src/sndfile.h MacOS/config.h - Fixed minor MacOS configuration issues. - -1999-07-30 Erik de Castro Lopo - - * MacOS/ - Added a new directory for the MacOS config.h file and the - readme file. - - * src/aiff.c - Fixed calculation of datalength when reading SSND chunk. Thanks to - Sigbjørn Skjæret for pointing out this error. - -1999-07-29 Erik de Castro Lopo - - * src/sndfile.c src/sndfile.h src/raw.c - Further fixing of #includes for MacOS. - -1999-07-25 Erik de Castro Lopo - - * src/wav.c src/aiff.c - Added call to ferror () in main header parsing loop of __XXX_open_read - functions. This should fix problems on platforms (MacOS, AmigaOS) where - fseek()ing or fread()ing beyond the end of the file puts the FILE* - stream in an error state until clearerr() is called. - - * tests/write_read_test.c - Added tests for RAW header-less PCM files. - - * src/common.h - Moved definition of struct tribyte to pcm.c which is the only place - which needs it. - - * src/pcm.c - Modified all code which assumed sizeof (struct tribyte) == 3. This code - did not work on MacOS. Thanks to Ben "Jacobs" for pointing this out. - - * src/au.c - Removed from list of #includes (not being used). - - * src/sndfile.c - Added MacOS specific #ifdef to replace . - - * src/sndfile.h - Added MacOS specific #ifdef to replace . - - * src/sndfile.h - Added MacOS specific typedef for off_t. - - * MacOS-readme.txt - New file with instructions for building libsndfile under MacOS. Thanks - to Ben "Jacobs" for supplying these instructions. - -1999-07-24 Erik de Castro Lopo - - * configure.in - Removed sndfile.h from generated file list as there were no longer - any autoconf substitutions being made. - - * src/raw.c - New file for handling raw header-less PCM files. In order to open these - for read, the user must specify format, pcmbitwidth and channels in the - SF_INFO struct when calling sf_open_read (). - - * src/sndfile.c - Added support for raw header-less PCM files. - -1999-07-22 Erik de Castro Lopo - - * examples/sfinfo.c - Removed options so the sfinfo program always prints out all the information. - -1999-07-19 Erik de Castro Lopo - - * src/alaw.c - New file for A-law encoding (similar to u-law). - - * tests/alaw_test.c - New test program to test the A-law encode/decode lookup tables. - - * tests/lossy_comp_test.c - Added tests for a-law encoded WAV, AU and AULE files. - -1999-07-18 Erik de Castro Lopo - - * src/sndfile.c src/au.c - Removed second "#include ". Thanks to Ben "Jacobs" for pointing - this out. - -1999-07-18 Erik de Castro Lopo - - * tests/ulaw_test.c - New test program to test the u-law encode/decode lookup tables. - -1999-07-16 Erik de Castro Lopo - - * src/sndfile.h - Made corrections to comments on the return values from sf_seek (). - - * src/sndfile.c - Fixed boundary condition checking bug and accounting bug in sf_read_raw (). - -1999-07-15 Erik de Castro Lopo - - * src/au.c src/ulaw.c - Finished implementation of u-law encoded AU files. - - * src/wav.c - Implemented reading and writing of u-law encoded WAV files. - - * tests/ - Changed name of adpcm_test.c to lossy_comp_test.c. This test program - will now be used to test Ulaw and Alaw encoding as well as APDCM. - Added tests for Ulaw encoded WAV files. - -1999-07-14 Erik de Castro Lopo - - * tests/adpcm_test.c - Initialised amp variable in gen_signal() to remove compiler warning. - -1999-07-12 Erik de Castro Lopo - - * src/aiff.c - In __aiff_open_read () prevented fseek()ing beyond end of file which - was causing trouble on MacOS with the MetroWerks compiler. Thanks to - Ben "Jacobs" for pointing this out. - - *src/wav.c - Fixed as above in __wav_open_read (). - -1999-07-01 Erik de Castro Lopo - - * src/wav_ms_adpcm.c - Implemented MS ADPCM encoding. Code cleanup of decoder. - - * tests/adpcm_test.c - Added tests for MS ADPCM WAV files. - - * src/wav_ima_adpcm.c - Fixed incorrect parameter in call to srate2blocksize () from - __ima_writer_init (). - -1999-06-23 Erik de Castro Lopo - - * tests/read_seek_test.c - Added test for 8 bit AIFF files. - -1999-06-18 Erik de Castro Lopo - - * tests/write_read_test.c - Removed test for IMA ADPCM WAV files which is now done in adpcm_test.c - - * configure.in - Added -Wconversion to CFLAGS. - - * src/*.c tests/*.c examples/*.c - Fixed all warnings resulting from use of -Wconversion. - -1999-06-17 Erik de Castro Lopo - - * src/wav.c - Added fact chunk handling on read and write for all non WAVE_FORMAT_PCM - WAV files. - - * src/wav_ima.c - Changed block alignment to be dependant on sample rate. This should make - WAV files created with libsndfile compatible with the MS Windows media - players. - - * tests/adpcm_test.c - Reimplemented adpcm_test_short and implemented adpcm_test_int and - adpcm_test_double. - Now have full testing of IMA ADPCM WAV file read, write and seek. - -1999-06-15 Erik de Castro Lopo - - * src/wav_float.c - Fixed function prototype for x86f2d_array () which was causing ocassional - seg. faults on Sparc Solaris machines. - -1999-06-14 Erik de Castro Lopo - - * src/aiff.c - Fixed bug in __aiff_close where the length fields in the header were - not being correctly calculated before writing. - - * tests/write_read_test.c - Modified to detect the above bug in WAV, AIFF and AU files. - -1999-06-12 Erik de Castro Lopo - - * Win32/* - Added a contribution from Albert Faber to allow libsndfile to compile - under Win32 systems. libsndfile will now be used as part of LAME the - the MPEG 1 Layer 3 encoder (http://internet.roadrunner.com/~mt/mp3/). - -1999-06-11 Erik de Castro Lopo - - * configure.in - Changed to reflect previous changes. - - * src/wav_ima_adpcm.c - Fixed incorrect calculation of bytespersec header field (IMA ADPCM only). - - Fixed bug when writing from int or double data to IMA ADPCM file. Will need - to write test code for this. - - Fixed bug in __ima_write () whereby the length of the current block was - calculated incorrectly. Thanks to Jongcheon Park for pointing this out. - -1999-03-27 Erik de Castro Lopo - - * src/*.c - Changed all read/write/lseek function calls to fread/fwrite/ - fseek/ftell and added error checking of return values from - fread and fwrite in critical areas of the code. - - * src/au.c - Fixed incorrect datasize element in AU header on write. - - * tests/error_test.c - Add new test to check all error values have an associated error - string. This will avoid embarrassing real world core dumps. - -1999-03-23 Erik de Castro Lopo - - * src/wav.c src/aiff.c - Added handling for unknown chunk markers in the file. - -1999-03-22 Erik de Castro Lopo - - * src/sndfile.c - Filled in missing error strings in SndfileErrors array. Missing entries - can cause core dumps when calling sf_error-str (). Thanks to Sam - for finding this problem. - -1999-03-21 Erik de Castro Lopo - - * src/wav_ima_adpcm.c - Work on wav_ms_adpcm.c uncovered a bug in __ima_read () when reading - stereo files. Caused by not adjusting offset into buffer of decoded - samples for 2 channels. A similar bug existed in __ima_write (). - Need a test for stereo ADPCM files. - - * src/wav_ms_adpcm.c - Decoder working correctly. - -1999-03-18 Erik de Castro Lopo - - * configure.in Makefile.am - Added --enable-justsrc configuration variable sent by Sam - . - - * src/wav_ima_adpcm.c - Fixed bug when reading beyond end of data section due to not - checking pima->blockcount. - This uncovered __ima_seek () bug due to pima->blockcount being set - before calling __ima_init_block (). - -1999-03-17 Erik de Castro Lopo - - * src/wav.c - Started implementing MS ADPCM decoder. - If file is WAVE_FORMAT_ADPCM and length of data chunk is odd, this - encoder seems to add an extra byte. Why not just give an even data - length? - -1999-03-16 Erik de Castro Lopo - - * src/wav.c - Split code out of wav.c to create wav_float.c and wav_ima_adpcm.c. - This will make it easier to add and debug other kinds of WAV files - in future. - -1999-03-14 Erik de Castro Lopo - - * tests/ - Added adpcm_test.c which implements test functions for - IMA ADPCM reading/writing/seeking etc. - - * src/wav.c - Fixed many bugs in IMA ADPCM encoder and decoder. - -1999-03-11 Erik de Castro Lopo - - * src/wav.c - Finished implementing IMA ADPCM encoder and decoder (what a bitch!). - -1999-03-03 Erik de Castro Lopo - - * src/wav.c - Started implementing IMA ADPCM decoder. - -1999-03-02 Erik de Castro Lopo - - * src/sndfile.c - Fixed bug where the sf_read_XXX functions were returning a - incorrect read count when reading past end of file. - Fixed bug in sf_seek () when seeking backwards from end of file. - - * tests/read_seek_test.c - Added multiple read test to short_test(), int_test () and - double_test (). - Added extra chunk to all test WAV files to test that reading - stops at end of 'data' chunk. - -1999-02-21 Erik de Castro Lopo - - * tests/write_read_test.c - Added tests for little DEC endian AU files. - - * src/au.c - Add handling for DEC format little endian AU files. - -1999-02-20 Erik de Castro Lopo - - * src/aiff.c src/au.c src/wav.c - Add __psf_sprintf calls during header parsing. - - * src/sndfile.c src/common.c - Implement sf_header_info (sndfile.c) function and __psf_sprintf (common.c). - - * tests/write_read_test.c - Added tests for 8 bit PCM files (WAV, AIFF and AU). - - * src/au.c src/aiff.c - Add handling of 8 bit PCM data format. - - * src/aiff.c - On write, set blocksize in SSND chunk to zero like everybody else. - -1999-02-16 Erik de Castro Lopo - - * src/pcm.c: - Fixed bug in let2s_array (cptr was not being initialised). - - * src/sndfile.c: - Fixed bug in sf_read_raw and sf_write_raw. sf_seek should - now work when using these functions. - -1999-02-15 Erik de Castro Lopo - - * tests/write_read_test.c: - Force test_buffer array to be double aligned. Sparc Solaris - requires this. - -1999-02-14 Erik de Castro Lopo - - * src/pcm.c: - Fixed a bug which was causing errors in the reading - and writing of 24 bit PCM files. - - * doc/api.html - Finished of preliminary documentaion. - -1999-02-13 Erik de Castro Lopo - - * src/aiff.c: - Changed reading of 'COMM' chunk to avoid reading an int - which overlaps an int (4 byte) boundary. diff --git a/libs/libsndfile/INSTALL b/libs/libsndfile/INSTALL deleted file mode 100644 index b42a17ac46..0000000000 --- a/libs/libsndfile/INSTALL +++ /dev/null @@ -1,182 +0,0 @@ -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, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). - - 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 at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. - - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' 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. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure - -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 supports 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' can not 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 can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: - CPU-COMPANY-SYSTEM - -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 can also -use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. - -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. - -Operation Controls -================== - - `configure' recognizes the following options to control how it -operates. - -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. - -`--help' - Print a summary of the options to `configure', and exit. - -`--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. - -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`configure' also accepts some other, not widely useful, options. diff --git a/libs/libsndfile/M4/Makefile.am b/libs/libsndfile/M4/Makefile.am deleted file mode 100644 index e2d984a43a..0000000000 --- a/libs/libsndfile/M4/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -## Process this file with automake to produce Makefile.in - -EXTRA_DIST = add_cflags.m4 clip_mode.m4 endian.m4 \ - flexible_array.m4 llrint.m4 lrint.m4 lrintf.m4 octave.m4 extra_pkg.m4 - diff --git a/libs/libsndfile/M4/add_cflags.m4 b/libs/libsndfile/M4/add_cflags.m4 deleted file mode 100644 index 55a326c580..0000000000 --- a/libs/libsndfile/M4/add_cflags.m4 +++ /dev/null @@ -1,18 +0,0 @@ -dnl @synopsis MN_ADD_CFLAGS -dnl -dnl Add the given option to CFLAGS, if it doesn't break the compiler - -AC_DEFUN([MN_ADD_CFLAGS], -[AC_MSG_CHECKING([if $CC accepts $1]) - ac_add_cflags__old_cflags="$CFLAGS" - CFLAGS="$1" - AC_TRY_LINK([ - #include - ], - [puts("Hello, World!"); return 0;], - AC_MSG_RESULT([yes]) - CFLAGS="$ac_add_cflags__old_cflags $1", - AC_MSG_RESULT([no]) - CFLAGS="$ac_add_cflags__old_cflags" - ) -])# MN_ADD_CFLAGS diff --git a/libs/libsndfile/M4/add_cxxflags.m4 b/libs/libsndfile/M4/add_cxxflags.m4 deleted file mode 100644 index 1c0a4deb96..0000000000 --- a/libs/libsndfile/M4/add_cxxflags.m4 +++ /dev/null @@ -1,19 +0,0 @@ -dnl @synopsis MN_ADD_CXXFLAGS -dnl -dnl Add the given option to CXXFLAGS, if it doesn't break the compiler - -AC_DEFUN([MN_ADD_CXXFLAGS], -[AC_MSG_CHECKING([if $CXX accepts $1]) - AC_LANG_ASSERT([C++]) - ac_add_cxxflags__old_cxxflags="$CXXFLAGS" - CXXFLAGS="$1" - AC_TRY_LINK([ - #include - ], - [puts("Hello, World!"); return 0;], - AC_MSG_RESULT([yes]) - CXXFLAGS="$ac_add_cxxflags__old_cxxflags $1", - AC_MSG_RESULT([no]) - CXXFLAGS="$ac_add_cxxflags__old_cxxflags" - ) -])# MN_ADD_CXXFLAGS diff --git a/libs/libsndfile/M4/clang.m4 b/libs/libsndfile/M4/clang.m4 deleted file mode 100644 index 4cf3077d64..0000000000 --- a/libs/libsndfile/M4/clang.m4 +++ /dev/null @@ -1,31 +0,0 @@ -dnl @synopsis MN_C_COMPILER_IS_CLANG -dnl -dnl Find out if a compiler claiming to be gcc really is gcc (fuck you clang). -dnl @version 1.0 Oct 31 2013 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. -dnl - - -AC_DEFUN([MN_C_COMPILER_IS_CLANG], -[AC_CACHE_CHECK(whether we are using the CLANG C compiler, - mn_cv_c_compiler_clang, - [ AC_LANG_ASSERT(C) - AC_TRY_LINK([ - #include - ], - [ - #ifndef __clang__ - This is not clang! - #endif - ], - mn_cv_c_compiler_clang=yes, - mn_cv_c_compiler_clang=no - ]) - ) -]) diff --git a/libs/libsndfile/M4/clip_mode.m4 b/libs/libsndfile/M4/clip_mode.m4 deleted file mode 100644 index 4556b937a0..0000000000 --- a/libs/libsndfile/M4/clip_mode.m4 +++ /dev/null @@ -1,124 +0,0 @@ -dnl @synopsis MN_C_CLIP_MODE -dnl -dnl Determine the clipping mode when converting float to int. -dnl @version 1.0 May 17 2003 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. - - - - - - - -dnl Find the clipping mode in the following way: -dnl 1) If we are not cross compiling test it. -dnl 2) IF we are cross compiling, assume that clipping isn't done correctly. - -AC_DEFUN([MN_C_CLIP_MODE], -[AC_CACHE_CHECK(processor clipping capabilities, - ac_cv_c_clip_type, - -# Initialize to unknown -ac_cv_c_clip_positive=unknown -ac_cv_c_clip_negative=unknown - - -if test $ac_cv_c_clip_positive = unknown ; then - AC_TRY_RUN( - [[ - #define _ISOC9X_SOURCE 1 - #define _ISOC99_SOURCE 1 - #define __USE_ISOC99 1 - #define __USE_ISOC9X 1 - #include - int main (void) - { double fval ; - int k, ival ; - - fval = 1.0 * 0x7FFFFFFF ; - for (k = 0 ; k < 100 ; k++) - { ival = (lrint (fval)) >> 24 ; - if (ival != 127) - return 1 ; - - fval *= 1.2499999 ; - } ; - - return 0 ; - } - ]], - ac_cv_c_clip_positive=yes, - ac_cv_c_clip_positive=no, - ac_cv_c_clip_positive=unknown - ) - - AC_TRY_RUN( - [[ - #define _ISOC9X_SOURCE 1 - #define _ISOC99_SOURCE 1 - #define __USE_ISOC99 1 - #define __USE_ISOC9X 1 - #include - int main (void) - { double fval ; - int k, ival ; - - fval = -8.0 * 0x10000000 ; - for (k = 0 ; k < 100 ; k++) - { ival = (lrint (fval)) >> 24 ; - if (ival != -128) - return 1 ; - - fval *= 1.2499999 ; - } ; - - return 0 ; - } - ]], - ac_cv_c_clip_negative=yes, - ac_cv_c_clip_negative=no, - ac_cv_c_clip_negative=unknown - ) - fi - -if test $ac_cv_c_clip_positive = yes ; then - ac_cv_c_clip_positive=1 -else - ac_cv_c_clip_positive=0 - fi - -if test $ac_cv_c_clip_negative = yes ; then - ac_cv_c_clip_negative=1 -else - ac_cv_c_clip_negative=0 - fi - -[[ -case "$ac_cv_c_clip_positive$ac_cv_c_clip_negative" in - "00") - ac_cv_c_clip_type="none" - ;; - "10") - ac_cv_c_clip_type="positive" - ;; - "01") - ac_cv_c_clip_type="negative" - ;; - "11") - ac_cv_c_clip_type="both" - ;; - esac - ]] - -) -] - -)# MN_C_CLIP_MODE - - diff --git a/libs/libsndfile/M4/endian.m4 b/libs/libsndfile/M4/endian.m4 deleted file mode 100644 index 5d766ff39e..0000000000 --- a/libs/libsndfile/M4/endian.m4 +++ /dev/null @@ -1,155 +0,0 @@ -dnl @synopsis MN_C_FIND_ENDIAN -dnl -dnl Determine endian-ness of target processor. -dnl @version 1.1 Mar 03 2002 -dnl @author Erik de Castro Lopo -dnl -dnl Majority written from scratch to replace the standard autoconf macro -dnl AC_C_BIGENDIAN. Only part remaining from the original it the invocation -dnl of the AC_TRY_RUN macro. -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. - -dnl Find endian-ness in the following way: -dnl 1) Look in . -dnl 2) If 1) fails, look in and . -dnl 3) If 1) and 2) fails and not cross compiling run a test program. -dnl 4) If 1) and 2) fails and cross compiling then guess based on target. - -AC_DEFUN([MN_C_FIND_ENDIAN], -[AC_CACHE_CHECK(processor byte ordering, - ac_cv_c_byte_order, - -# Initialize to unknown -ac_cv_c_byte_order=unknown - -if test x$ac_cv_header_endian_h = xyes ; then - - # First try which should set BYTE_ORDER. - - [AC_TRY_LINK([ - #include - #if BYTE_ORDER != LITTLE_ENDIAN - not big endian - #endif - ], return 0 ;, - ac_cv_c_byte_order=little - )] - - [AC_TRY_LINK([ - #include - #if BYTE_ORDER != BIG_ENDIAN - not big endian - #endif - ], return 0 ;, - ac_cv_c_byte_order=big - )] - - fi - -if test $ac_cv_c_byte_order = unknown ; then - - [AC_TRY_LINK([ - #include - #include - #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN - bogus endian macros - #endif - ], return 0 ;, - - [AC_TRY_LINK([ - #include - #include - #if BYTE_ORDER != LITTLE_ENDIAN - not big endian - #endif - ], return 0 ;, - ac_cv_c_byte_order=little - )] - - [AC_TRY_LINK([ - #include - #include - #if BYTE_ORDER != LITTLE_ENDIAN - not big endian - #endif - ], return 0 ;, - ac_cv_c_byte_order=little - )] - - )] - - fi - -if test $ac_cv_c_byte_order = unknown ; then - if test $cross_compiling = yes ; then - # This is the last resort. Try to guess the target processor endian-ness - # by looking at the target CPU type. - [ - case "$target_cpu" in - alpha* | i?86* | mipsel* | ia64*) - ac_cv_c_byte_order=little - ;; - - m68* | mips* | powerpc* | hppa* | sparc*) - ac_cv_c_byte_order=big - ;; - - esac - ] - else - AC_TRY_RUN( - [[ - int main (void) - { /* Are we little or big endian? From Harbison&Steele. */ - union - { long l ; - char c [sizeof (long)] ; - } u ; - u.l = 1 ; - return (u.c [sizeof (long) - 1] == 1); - } - ]], , ac_cv_c_byte_order=big, - ) - - AC_TRY_RUN( - [[int main (void) - { /* Are we little or big endian? From Harbison&Steele. */ - union - { long l ; - char c [sizeof (long)] ; - } u ; - u.l = 1 ; - return (u.c [0] == 1); - }]], , ac_cv_c_byte_order=little, - ) - fi - fi - -) - -if test $ac_cv_c_byte_order = big ; then - ac_cv_c_big_endian=1 - ac_cv_c_little_endian=0 -elif test $ac_cv_c_byte_order = little ; then - ac_cv_c_big_endian=0 - ac_cv_c_little_endian=1 -else - ac_cv_c_big_endian=0 - ac_cv_c_little_endian=0 - - AC_MSG_WARN([[*****************************************************************]]) - AC_MSG_WARN([[*** Not able to determine endian-ness of target processor. ]]) - AC_MSG_WARN([[*** The constants CPU_IS_BIG_ENDIAN and CPU_IS_LITTLE_ENDIAN in ]]) - AC_MSG_WARN([[*** src/config.h may need to be hand editied. ]]) - AC_MSG_WARN([[*****************************************************************]]) - fi - -] -)# MN_C_FIND_ENDIAN - - diff --git a/libs/libsndfile/M4/extra_largefile.m4 b/libs/libsndfile/M4/extra_largefile.m4 deleted file mode 100644 index 3e614c3f70..0000000000 --- a/libs/libsndfile/M4/extra_largefile.m4 +++ /dev/null @@ -1,114 +0,0 @@ -dnl By default, many hosts won't let programs access large files; -dnl one must use special compiler options to get large-file access to work. -dnl For more details about this brain damage please see: -dnl http://www.sas.com/standards/large.file/x_open.20Mar96.html - -dnl Written by Paul Eggert . - -dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE. -dnl MN_SYS_EXTRA_LARGEFILE_FLAGS(FLAGSNAME) -AC_DEFUN([MN_SYS_EXTRA_LARGEFILE_FLAGS], - [AC_CACHE_CHECK([for $1 value to request large file support], - ac_cv_sys_largefile_$1, - [ac_cv_sys_largefile_$1=`($GETCONF LFS_$1) 2>/dev/null` || { - ac_cv_sys_largefile_$1=no - ifelse($1, CFLAGS, - [case "$host_os" in - # IRIX 6.2 and later require cc -n32. -changequote(, )dnl - irix6.[2-9]* | irix6.1[0-9]* | irix[7-9].* | irix[1-9][0-9]*) -changequote([, ])dnl - if test "$GCC" != yes; then - ac_cv_sys_largefile_CFLAGS=-n32 - fi - ac_save_CC="$CC" - CC="$CC $ac_cv_sys_largefile_CFLAGS" - AC_TRY_LINK(, , , ac_cv_sys_largefile_CFLAGS=no) - CC="$ac_save_CC" - esac]) - }])]) - -dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE. -dnl AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(VAR, VAL) -AC_DEFUN([AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND], - [case $2 in - no) ;; - ?*) - case "[$]$1" in - '') $1=$2 ;; - *) $1=[$]$1' '$2 ;; - esac ;; - esac]) - -dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE. -dnl AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(C-MACRO, CACHE-VAR, COMMENT, CODE-TO-SET-DEFAULT) -AC_DEFUN([AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE], - [AC_CACHE_CHECK([for $1], $2, - [$2=no -changequote(, )dnl - $4 - for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do - case "$ac_flag" in - -D$1) - $2=1 ;; - -D$1=*) - $2=`expr " $ac_flag" : '[^=]*=\(.*\)'` ;; - esac - done -changequote([, ])dnl - ]) - if test "[$]$2" != no; then - AC_DEFINE_UNQUOTED([$1], [$]$2, [$3]) - fi]) - -AC_DEFUN([AC_SYS_EXTRA_LARGEFILE], - [AC_REQUIRE([AC_CANONICAL_HOST]) - AC_ARG_ENABLE(largefile, - [ --disable-largefile omit support for large files]) - if test "$enable_largefile" != no; then - AC_CHECK_TOOL(GETCONF, getconf) - MN_SYS_EXTRA_LARGEFILE_FLAGS(CFLAGS) - MN_SYS_EXTRA_LARGEFILE_FLAGS(LDFLAGS) - MN_SYS_EXTRA_LARGEFILE_FLAGS(LIBS) - - for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do - case "$ac_flag" in - no) ;; - -D_FILE_OFFSET_BITS=*) ;; - -D_LARGEFILE_SOURCE | -D_LARGEFILE_SOURCE=*) ;; - -D_LARGE_FILES | -D_LARGE_FILES=*) ;; - -D?* | -I?*) - AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CPPFLAGS, "$ac_flag") ;; - *) - AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CFLAGS, "$ac_flag") ;; - esac - done - AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LDFLAGS, "$ac_cv_sys_largefile_LDFLAGS") - AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LIBS, "$ac_cv_sys_largefile_LIBS") - AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS, - ac_cv_sys_file_offset_bits, - [Number of bits in a file offset, on hosts where this is settable.]) - [case "$host_os" in - # HP-UX 10.20 and later - hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*) - ac_cv_sys_file_offset_bits=64 ;; - esac] - AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGEFILE_SOURCE, - ac_cv_sys_largefile_source, - [Define to make fseeko etc. visible, on some hosts.], - [case "$host_os" in - # HP-UX 10.20 and later - hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*) - ac_cv_sys_largefile_source=1 ;; - esac]) - AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGE_FILES, - ac_cv_sys_large_files, - [Define for large files, on AIX-style hosts.], - [case "$host_os" in - # AIX 4.2 and later - aix4.[2-9]* | aix4.1[0-9]* | aix[5-9].* | aix[1-9][0-9]*) - ac_cv_sys_large_files=1 ;; - esac]) - fi - ]) - diff --git a/libs/libsndfile/M4/extra_pkg.m4 b/libs/libsndfile/M4/extra_pkg.m4 deleted file mode 100644 index afe474e224..0000000000 --- a/libs/libsndfile/M4/extra_pkg.m4 +++ /dev/null @@ -1,105 +0,0 @@ -# extra_pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -# -# Copyright (c) 2008-2012 Erik de Castro Lopo -# Copyright (c) 2004 Scott James Remnant . -# -# 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. - -# -------------------------------------------------------------- -# PKG_CHECK_MOD_VERSION(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# -# This is a very slight modification to the macro PKG_CHECK_MODULES that -# is in the original pkg.m4 file. It prints the versions in the checking -# message (erikd@mega-nerd.com). - -AC_DEFUN([PKG_CHECK_MOD_VERSION], -[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 $2 ]) - -_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) -_PKG_CONFIG([$1][_LIBS], [libs], [$2]) - -pkg_link_saved_CFLAGS=$CFLAGS -pkg_link_saved_LIBS=$LIBS - -eval "pkg_CFLAGS=\${pkg_cv_[]$1[]_CFLAGS}" -eval "pkg_LIBS=\${pkg_cv_[]$1[]_LIBS}" - -CFLAGS="$CFLAGS $pkg_CFLAGS" -LIBS="$LIBS $pkg_LIBS" - -AC_TRY_LINK([], puts ("");, pkg_link=yes, pkg_link=no) - -CFLAGS=$pkg_link_saved_CFLAGS -LIBS=$pkg_link_saved_LIBS - -if test $pkg_link = no ; then - $as_echo_n "link failed ... " - pkg_failed=yes - fi - -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 - _PKG_SHORT_ERRORS_SUPPORTED - if test $_pkg_short_errors_supported = yes; then - $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` - else - $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` - fi - # Put the nasty error message in config.log where it belongs - echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD - - ifelse([$4], , [AC_MSG_ERROR(dnl -[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 -])], - [AC_MSG_RESULT([no]) - $4]) -elif test $pkg_failed = untried; then - ifelse([$4], , [AC_MSG_FAILURE(dnl -[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 .])], - [$4]) -else - $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS - $1[]_LIBS=$pkg_cv_[]$1[]_LIBS - AC_MSG_RESULT([yes]) - ifelse([$3], , :, [$3]) -fi[]dnl -])# PKG_CHECK_MOD_VERSION diff --git a/libs/libsndfile/M4/flexible_array.m4 b/libs/libsndfile/M4/flexible_array.m4 deleted file mode 100644 index 661da17b23..0000000000 --- a/libs/libsndfile/M4/flexible_array.m4 +++ /dev/null @@ -1,32 +0,0 @@ -dnl @synopsis MN_C99_FLEXIBLE_ARRAY -dnl -dnl Dose the compiler support the 1999 ISO C Standard "stuct hack". -dnl @version 1.1 Mar 15 2004 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. - -AC_DEFUN([MN_C99_FLEXIBLE_ARRAY], -[AC_CACHE_CHECK(C99 struct flexible array support, - ac_cv_c99_flexible_array, - -# Initialize to unknown -ac_cv_c99_flexible_array=no - -AC_TRY_LINK([[ - #include - typedef struct { - int k; - char buffer [] ; - } MY_STRUCT ; - ]], - [ MY_STRUCT *p = calloc (1, sizeof (MY_STRUCT) + 42); ], - ac_cv_c99_flexible_array=yes, - ac_cv_c99_flexible_array=no - ))] -) # MN_C99_FLEXIBLE_ARRAY - diff --git a/libs/libsndfile/M4/gcc_version.m4 b/libs/libsndfile/M4/gcc_version.m4 deleted file mode 100644 index f8c5cbebe4..0000000000 --- a/libs/libsndfile/M4/gcc_version.m4 +++ /dev/null @@ -1,33 +0,0 @@ -dnl @synopsis MN_GCC_VERSION -dnl -dnl Find the version of gcc. -dnl @version 1.0 Nov 05 2007 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. -dnl - -AC_DEFUN([MN_GCC_VERSION], -[ -if test "x$ac_cv_c_compiler_gnu" = "xyes" ; then - - AC_MSG_CHECKING([for version of $CC]) - GCC_VERSION=`$CC -dumpversion` - AC_MSG_RESULT($GCC_VERSION) - - changequote(,)dnl - GCC_MAJOR_VERSION=`echo $GCC_VERSION | sed "s/\..*//"` - GCC_MINOR_VERSION=`echo $GCC_VERSION | sed "s/$GCC_MAJOR_VERSION\.//" | sed "s/\..*//"` - changequote([,])dnl - fi - -AC_SUBST(GCC_VERSION) -AC_SUBST(GCC_MAJOR_VERSION) -AC_SUBST(GCC_MINOR_VERSION) - -])# MN_GCC_VERSION - diff --git a/libs/libsndfile/M4/llrint.m4 b/libs/libsndfile/M4/llrint.m4 deleted file mode 100644 index 66be206187..0000000000 --- a/libs/libsndfile/M4/llrint.m4 +++ /dev/null @@ -1,38 +0,0 @@ -dnl @synopsis MN_C99_FUNC_LLRINT -dnl -dnl Check whether C99's llrint function is available. -dnl @version 1.1 Sep 30 2002 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. -dnl -AC_DEFUN([MN_C99_FUNC_LLRINT], -[AC_CACHE_CHECK(for llrint, - ac_cv_c99_llrint, -[ -llrint_save_CFLAGS=$CFLAGS -CFLAGS="-lm" -AC_TRY_LINK([ -#define _ISOC9X_SOURCE 1 -#define _ISOC99_SOURCE 1 -#define __USE_ISOC99 1 -#define __USE_ISOC9X 1 - -#include -#include -], int64_t x ; x = llrint(3.14159) ;, ac_cv_c99_llrint=yes, ac_cv_c99_llrint=no) - -CFLAGS=$llrint_save_CFLAGS - -]) - -if test "$ac_cv_c99_llrint" = yes; then - AC_DEFINE(HAVE_LLRINT, 1, - [Define if you have C99's llrint function.]) -fi -])# MN_C99_FUNC_LLRINT - diff --git a/libs/libsndfile/M4/lrint.m4 b/libs/libsndfile/M4/lrint.m4 deleted file mode 100644 index c2c21d60f4..0000000000 --- a/libs/libsndfile/M4/lrint.m4 +++ /dev/null @@ -1,37 +0,0 @@ -dnl @synopsis MN_C99_FUNC_LRINT -dnl -dnl Check whether C99's lrint function is available. -dnl @version 1.3 Feb 12 2002 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. -dnl -AC_DEFUN([MN_C99_FUNC_LRINT], -[AC_CACHE_CHECK(for lrint, - ac_cv_c99_lrint, -[ -lrint_save_CFLAGS=$CFLAGS -CFLAGS="-lm" -AC_TRY_LINK([ -#define _ISOC9X_SOURCE 1 -#define _ISOC99_SOURCE 1 -#define __USE_ISOC99 1 -#define __USE_ISOC9X 1 - -#include -], if (!lrint(3.14159)) lrint(2.7183);, ac_cv_c99_lrint=yes, ac_cv_c99_lrint=no) - -CFLAGS=$lrint_save_CFLAGS - -]) - -if test "$ac_cv_c99_lrint" = yes; then - AC_DEFINE(HAVE_LRINT, 1, - [Define if you have C99's lrint function.]) -fi -])# MN_C99_FUNC_LRINT - diff --git a/libs/libsndfile/M4/lrintf.m4 b/libs/libsndfile/M4/lrintf.m4 deleted file mode 100644 index 04f4d6603c..0000000000 --- a/libs/libsndfile/M4/lrintf.m4 +++ /dev/null @@ -1,37 +0,0 @@ -dnl @synopsis MN_C99_FUNC_LRINTF -dnl -dnl Check whether C99's lrintf function is available. -dnl @version 1.3 Feb 12 2002 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. -dnl -AC_DEFUN([MN_C99_FUNC_LRINTF], -[AC_CACHE_CHECK(for lrintf, - ac_cv_c99_lrintf, -[ -lrintf_save_CFLAGS=$CFLAGS -CFLAGS="-lm" -AC_TRY_LINK([ -#define _ISOC9X_SOURCE 1 -#define _ISOC99_SOURCE 1 -#define __USE_ISOC99 1 -#define __USE_ISOC9X 1 - -#include -], if (!lrintf(3.14159)) lrintf(2.7183);, ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no) - -CFLAGS=$lrintf_save_CFLAGS - -]) - -if test "$ac_cv_c99_lrintf" = yes; then - AC_DEFINE(HAVE_LRINTF, 1, - [Define if you have C99's lrintf function.]) -fi -])# MN_C99_FUNC_LRINTF - diff --git a/libs/libsndfile/M4/mkoctfile_version.m4 b/libs/libsndfile/M4/mkoctfile_version.m4 deleted file mode 100644 index c17333ea25..0000000000 --- a/libs/libsndfile/M4/mkoctfile_version.m4 +++ /dev/null @@ -1,38 +0,0 @@ -dnl @synopsis OCTAVE_MKOCTFILE_VERSION -dnl -dnl Find the version of mkoctfile. -dnl @version 1.0 Aug 23 2007 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. -dnl - -AC_DEFUN([OCTAVE_MKOCTFILE_VERSION], -[ - - -AC_ARG_WITH(mkoctfile, - AC_HELP_STRING([--with-mkoctfile], [choose the mkoctfile version]), - [ with_mkoctfile=$withval ]) - -test -z "$with_mkoctfile" && with_mkoctfile=mkoctfile - -AC_CHECK_PROG(HAVE_MKOCTFILE,$with_mkoctfile,yes,no) - -if test "x$ac_cv_prog_HAVE_MKOCTFILE" = "xyes" ; then - MKOCTFILE=$with_mkoctfile - - AC_MSG_CHECKING([for version of $MKOCTFILE]) - MKOCTFILE_VERSION=`$with_mkoctfile --version 2>&1 | sed 's/mkoctfile, version //g'` - AC_MSG_RESULT($MKOCTFILE_VERSION) - fi - -AC_SUBST(MKOCTFILE) -AC_SUBST(MKOCTFILE_VERSION) - -])# OCTAVE_MKOCTFILE_VERSION - diff --git a/libs/libsndfile/M4/octave.m4 b/libs/libsndfile/M4/octave.m4 deleted file mode 100644 index 88d5a5b9b0..0000000000 --- a/libs/libsndfile/M4/octave.m4 +++ /dev/null @@ -1,143 +0,0 @@ -dnl Evaluate an expression in octave -dnl -dnl OCTAVE_EVAL(expr,var) -> var=expr -dnl -dnl Stolen from octave-forge - -AC_DEFUN([OCTAVE_EVAL], -[ -AC_MSG_CHECKING([for $1 in $OCTAVE]) -$2=`TERM=;$OCTAVE -qfH --eval "disp($1)"` -AC_MSG_RESULT($$2) -AC_SUBST($2) -]) # OCTAVE_EVAL - -dnl @synopsis AC_OCTAVE_VERSION -dnl -dnl Find the version of Octave. -dnl @version 1.0 Aug 23 2007 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. -dnl - -AC_DEFUN([AC_OCTAVE_VERSION], -[ - -AC_ARG_WITH(octave, - AC_HELP_STRING([--with-octave], [choose the octave version]), - [ with_octave=$withval ]) - -test -z "$with_octave" && with_octave=octave - -AC_CHECK_PROG(HAVE_OCTAVE,$with_octave,yes,no) - -if test "x$ac_cv_prog_HAVE_OCTAVE" = "xyes" ; then - OCTAVE=$with_octave - OCTAVE_EVAL(OCTAVE_VERSION,OCTAVE_VERSION) - fi - -AC_SUBST(OCTAVE) -AC_SUBST(OCTAVE_VERSION) - -])# AC_OCTAVE_VERSION - -dnl @synopsis AC_OCTAVE_CONFIG_VERSION -dnl -dnl Find the version of Octave. -dnl @version 1.0 Aug 23 2007 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. -dnl - -AC_DEFUN([AC_OCTAVE_CONFIG_VERSION], -[ - -AC_ARG_WITH(octave-config, - AC_HELP_STRING([--with-octave-config], [choose the octave-config version]), - [ with_octave_config=$withval ]) - -test -z "$with_octave_config" && with_octave_config=octave-config - -AC_CHECK_PROG(HAVE_OCTAVE_CONFIG,$with_octave_config,yes,no) - -if test "x$ac_cv_prog_HAVE_OCTAVE_CONFIG" = "xyes" ; then - OCTAVE_CONFIG=$with_octave_config - AC_MSG_CHECKING([for version of $OCTAVE_CONFIG]) - OCTAVE_CONFIG_VERSION=`$OCTAVE_CONFIG --version` - AC_MSG_RESULT($OCTAVE_CONFIG_VERSION) - fi - -AC_SUBST(OCTAVE_CONFIG) -AC_SUBST(OCTAVE_CONFIG_VERSION) - -])# AC_OCTAVE_CONFIG_VERSION - -dnl @synopsis AC_OCTAVE_BUILD -dnl -dnl Check programs and headers required for building octave plugins. -dnl @version 1.0 Aug 23 2007 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. - - -AC_DEFUN([AC_OCTAVE_BUILD], -[ - -dnl Default to no. -OCTAVE_BUILD=no - -AC_OCTAVE_VERSION -OCTAVE_MKOCTFILE_VERSION -AC_OCTAVE_CONFIG_VERSION - -prog_concat="$ac_cv_prog_HAVE_OCTAVE$ac_cv_prog_HAVE_OCTAVE_CONFIG$ac_cv_prog_HAVE_MKOCTFILE" - -if test "x$prog_concat" = "xyesyesyes" ; then - if test "x$OCTAVE_VERSION" != "x$MKOCTFILE_VERSION" ; then - AC_MSG_WARN([** Mismatch between versions of octave and mkoctfile. **]) - AC_MSG_WARN([** Octave libsndfile modules will not be built. **]) - elif test "x$OCTAVE_VERSION" != "x$OCTAVE_CONFIG_VERSION" ; then - AC_MSG_WARN([** Mismatch between versions of octave and octave-config. **]) - AC_MSG_WARN([** Octave libsndfile modules will not be built. **]) - else - case "$MKOCTFILE_VERSION" in - 2.*) - AC_MSG_WARN([Octave version 2.X is not supported.]) - ;; - 3.*) - OCTAVE_DEST_ODIR=`$OCTAVE_CONFIG --oct-site-dir | sed 's%^/usr%${prefix}%'` - OCTAVE_DEST_MDIR=`$OCTAVE_CONFIG --m-site-dir | sed 's%^/usr%${prefix}%'` - - OCTAVE_BUILD=yes - ;; - *) - AC_MSG_WARN([Octave version $MKOCTFILE_VERSION is not supported.]) - ;; - esac - fi - AC_MSG_RESULT([building octave libsndfile module... $OCTAVE_BUILD]) - fi - -AC_SUBST(OCTAVE_DEST_ODIR) -AC_SUBST(OCTAVE_DEST_MDIR) - -AC_SUBST(MKOCTFILE) - -AM_CONDITIONAL(BUILD_OCTAVE_MOD, test "x$OCTAVE_BUILD" = xyes) - -])# AC_OCTAVE_BUILD diff --git a/libs/libsndfile/M4/really_gcc.m4 b/libs/libsndfile/M4/really_gcc.m4 deleted file mode 100644 index 67aed7802f..0000000000 --- a/libs/libsndfile/M4/really_gcc.m4 +++ /dev/null @@ -1,33 +0,0 @@ -dnl @synopsis MN_GCC_REALLY_IS_GCC -dnl -dnl Find out if a compiler claiming to be gcc really is gcc (fuck you clang). -dnl @version 1.0 Oct 31 2013 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. -dnl - -# If the configure script has already detected GNU GCC, then make sure it -# isn't CLANG masquerading as GCC. - -AC_DEFUN([MN_GCC_REALLY_IS_GCC], -[ AC_LANG_ASSERT(C) - if test "x$ac_cv_c_compiler_gnu" = "xyes" ; then - AC_TRY_LINK([ - #include - ], - [ - #ifdef __clang__ - This is clang! - #endif - ], - ac_cv_c_compiler_gnu=yes, - ac_cv_c_compiler_gnu=no - ) - fi - -]) diff --git a/libs/libsndfile/M4/stack_protect.m4 b/libs/libsndfile/M4/stack_protect.m4 deleted file mode 100644 index bf27e6e74f..0000000000 --- a/libs/libsndfile/M4/stack_protect.m4 +++ /dev/null @@ -1,73 +0,0 @@ -dnl Copyright (C) 2013 Xiph.org Foundation -dnl -dnl Redistribution and use in source and binary forms, with or without -dnl modification, are permitted provided that the following conditions -dnl are met: -dnl -dnl - Redistributions of source code must retain the above copyright -dnl notice, this list of conditions and the following disclaimer. -dnl -dnl - Redistributions in binary form must reproduce the above copyright -dnl notice, this list of conditions and the following disclaimer in the -dnl documentation and/or other materials provided with the distribution. -dnl -dnl - Neither the name of the Xiph.org Foundation nor the names of its -dnl contributors may be used to endorse or promote products derived from -dnl this software without specific prior written permission. -dnl -dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -dnl ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -dnl LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -dnl A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR -dnl CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -dnl EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -dnl PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -dnl Want to know of GCC stack protector works, botfor the C and for the C++ -dnl compiler. -dnl -dnl Just checking if the compiler accepts the required CFLAGSs is not enough -dnl because we have seen at least one instance where this check was -dnl in-sufficient. -dnl -dnl Instead, try to compile and link a test program with the stack protector -dnl flags. If that works, we use it. - -AC_DEFUN([XIPH_GCC_STACK_PROTECTOR], -[AC_LANG_ASSERT(C) - AC_MSG_CHECKING([if $CC supports stack smash protection]) - xiph_stack_check_old_cflags="$CFLAGS" - SSP_FLAGS="-fstack-protector --param ssp-buffer-size=4" - CFLAGS=$SSP_FLAGS - AC_TRY_LINK([ - #include - ], - [puts("Hello, World!"); return 0;], - AC_MSG_RESULT([yes]) - CFLAGS="$xiph_stack_check_old_cflags $SSP_FLAGS", - AC_MSG_RESULT([no]) - CFLAGS="$xiph_stack_check_old_cflags" - ) -])# XIPH_GCC_STACK_PROTECTOR - -AC_DEFUN([XIPH_GXX_STACK_PROTECTOR], -[AC_LANG_PUSH([C++]) - AC_MSG_CHECKING([if $CXX supports stack smash protection]) - xiph_stack_check_old_cflags="$CFLAGS" - SSP_FLAGS="-fstack-protector --param ssp-buffer-size=4" - CFLAGS=$SSP_FLAGS - AC_TRY_LINK([ - #include - ], - [puts("Hello, World!"); return 0;], - AC_MSG_RESULT([yes]) - CFLAGS="$xiph_stack_check_old_cflags $SSP_FLAGS", - AC_MSG_RESULT([no]) - CFLAGS="$xiph_stack_check_old_cflags" - ) - AC_LANG_POP([C++]) -])# XIPH_GXX_STACK_PROTECTOR diff --git a/libs/libsndfile/Makefile.am b/libs/libsndfile/Makefile.am deleted file mode 100644 index a429c5b3fa..0000000000 --- a/libs/libsndfile/Makefile.am +++ /dev/null @@ -1,46 +0,0 @@ -## Process this file with automake to produce Makefile.in - -ACLOCAL_AMFLAGS = -I M4 - -DISTCHECK_CONFIGURE_FLAGS = --enable-gcc-werror - -if BUILD_OCTAVE_MOD -octave_dir = Octave -endif - -SUBDIRS = M4 Win32 src $(octave_dir) -#man doc examples regtest tests programs - -DIST_SUBDIRS = M4 man doc Win32 src Octave examples regtest tests programs - -EXTRA_DIST = libsndfile.spec.in sndfile.pc.in Scripts/android-configure.sh \ - Scripts/linux-to-win-cross-configure.sh Scripts/build-test-tarball.mk.in - -CLEANFILES = *~ - -#pkgconfig_DATA = sndfile.pc - -m4datadir = $(datadir)/aclocal - -#=============================================================================== - -test: check-recursive - -# Target to make autogenerated files. -genfiles : - (cd src ; make genfiles) -# (cd tests ; make genfiles) - -checkprograms : - (cd src ; make libsndfile.la checkprograms) -# (cd tests ; make checkprograms) - -testprogs : - (cd src ; make testprogs) -# (cd tests ; make testprogs) - - -test-tarball : Scripts/build-test-tarball.mk - (cd src ; make all libsndfile.la checkprograms) -# (cd tests ; make all checkprograms) -# make -f Scripts/build-test-tarball.mk diff --git a/libs/libsndfile/Mingw-make-dist.sh b/libs/libsndfile/Mingw-make-dist.sh deleted file mode 100755 index f2a6474233..0000000000 --- a/libs/libsndfile/Mingw-make-dist.sh +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/sh - -# Copyright (C) 2006 Erik de Castro Lopo -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# * Neither the author nor the names of any contributors may be used -# to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -set -e - -function unix_to_dos { - sed -e "s/\n/\r\n/" $1 > temp_file - mv -f temp_file $1 -} - -if [ $# -lt 1 ] || [ $# -gt 2 ]; then - echo "Usage : Mingw-make-dist.sh ." - exit 1 - fi - -TARGZ=$1 -if [ ! -f $TARGZ ]; then - echo "Can't find source tarball." - fi - -TARGZ=$1 -if [ ! -f $TARGZ.asc ]; then - echo "Can't find source tarball signature." - fi - -UNAME=`uname -s` -if [ x$UNAME != "xMINGW32_NT-5.1" ]; then - echo "Not able to build Win32 binaries on this platform." - fi - -echo "Building MinGW binary/source zip file." - -VERSION=`pwd | sed -e "s#.*/##" | sed -e s/libsndfile-//` -BUILD=`echo $VERSION | sed -e "s/\./_/g"` -INSTALL="libsndfile-$BUILD" -ZIPNAME="$INSTALL.zip" - -if [ -z "$BUILD" ]; then - echo "Bad BUILD variable : '$BUILD'" - exit 1 - fi - -if [ ! -d $INSTALL/ ]; then - mkdir $INSTALL - fi - -if [ ! -f config.status ]; then - ./configure --prefix=`pwd`/$INSTALL/ -else - teststr=`grep "with options" config.status | grep -- --prefix=` - if [ -z "$teststr" ]; then - # --disable-static doesn't work. - ./configure --prefix=`pwd`/$INSTALL/ - fi - fi - -if [ ! -f src/.libs/libsndfile-1.dll ]; then - make all check - fi - -if [ ! -f $INSTALL/bin/libsndfile-1.dll ]; then - make install - rm -f $INSTALL/bin/sndfile-regtest.exe - strip $INSTALL/bin/*.* - mv $INSTALL/bin/*.* $INSTALL/include/*.* $INSTALL/ - rmdir $INSTALL/bin - rm -rf $INSTALL/lib - rmdir $INSTALL/include - cp src/libsndfile.def $INSTALL/libsndfile-1.def - cp Win32/README-precompiled-dll.txt Win32/testprog.c $INSTALL/ - unix_to_dos $INSTALL/libsndfile-1.def - unix_to_dos $INSTALL/sndfile.h - unix_to_dos $INSTALL/README-precompiled-dll.txt - unix_to_dos $INSTALL/testprog.c - fi - -if [ ! -f $INSTALL/libsndfile-$VERSION.tar.gz ]; then - cp $TARGZ $INSTALL/ - if [ -f $TARGZ.asc ]; then - cp $TARGZ.asc $INSTALL/ - fi - fi - -if [ ! -f $ZIPNAME ]; then - zip -r $ZIPNAME $INSTALL/ - fi - diff --git a/libs/libsndfile/NEWS b/libs/libsndfile/NEWS deleted file mode 100644 index 9626d45166..0000000000 --- a/libs/libsndfile/NEWS +++ /dev/null @@ -1,175 +0,0 @@ -Version 1.0.25 (2011-07-13) - * Fix for Secunia Advisory SA45125, heap overflow in PAF file handler. - * Accept broken WAV files with blockalign == 0. - * Minor bug fixes and improvements. - -Version 1.0.24 (2011-03-23) - * WAV files now have an 18 byte u-law and A-law fmt chunk. - * Document virtual I/O functionality. - * Two new methods rawHandle() and takeOwnership() in sndfile.hh. - * AIFF fix for non-zero offset value in SSND chunk. - * Minor bug fixes and improvements. - -Version 1.0.23 (2010-10-10) - * Add version metadata to Windows DLL. - * Add a missing 'inline' to sndfile.hh. - * Update docs. - * Minor bug fixes and improvements. - -Version 1.0.22 (2010-10-04) - * Couple of fixes for SDS file writer. - * Fixes arising from static analysis. - * Handle FLAC files with ID3 meta data at start of file. - * Handle FLAC files which report zero length. - * Other minor bug fixes and improvements. - -Version 1.0.21 (2009-12-13) - * Add a couple of new binary programs to programs/ dir. - * Remove sndfile-jackplay (now in sndfile-tools package). - * Add windows only function sf_wchar_open(). - * Bunch of minor bug fixes. - -Version 1.0.20 (2009-05-14) - * Fix potential heap overflow in VOC file parser (Tobias Klein, http://www.trapkit.de/). - -Version 1.0.19 (2009-03-02) - * Fix for CVE-2009-0186 (Alin Rad Pop, Secunia Research). - * Huge number of minor bug fixes as a result of static analysis. - -Version 1.0.18 (2009-02-07) - * Add Ogg/Vorbis support (thanks to John ffitch). - * Remove captive FLAC library. - * Many new features and bug fixes. - * Generate Win32 and Win64 pre-compiled binaries. - -Version 1.0.17 (2006-08-31) - * Add sndfile.hh C++ wrapper. - * Update Win32 MinGW build instructions. - * Minor bug fixes and cleanups. - -Version 1.0.16 (2006-04-30) - * Add support for Broadcast (BEXT) chunks in WAV files. - * Implement new commands SFC_GET_SIGNAL_MAX and SFC_GET_MAX_ALL_CHANNELS. - * Add support for RIFX (big endian WAV variant). - * Fix configure script bugs. - * Fix bug in INST and MARK chunk writing for AIFF files. - -Version 1.0.15 (2006-03-16) - * Fix some ia64 issues. - * Fix precompiled DLL. - * Minor bug fixes. - -Version 1.0.14 (2006-02-19) - * Really fix MinGW compile problems. - * Minor bug fixes. - -Version 1.0.13 (2006-01-21) - * Fix for MinGW compiler problems. - * Allow readin/write of instrument chunks from WAV and AIFF files. - * Compile problem fix for Solaris compiler. - * Minor cleanups and bug fixes. - -Version 1.0.12 (2005-09-30) - * Add support for FLAC and Apple's Core Audio Format (CAF). - * Add virtual I/O interface (still needs docs). - * Cygwin and other Win32 fixes. - * Minor bug fixes and cleanups. - -Version 1.0.11 (2004-11-15) - * Add support for SD2 files. - * Add read support for loop info in WAV and AIFF files. - * Add more tests. - * Improve type safety. - * Minor optimisations and bug fixes. - -Version 1.0.10 (2004-06-15) - * Fix AIFF read/write mode bugs. - * Add support for compiling Win32 DLLS using MinGW. - * Fix problems resulting in failed compiles with gcc-2.95. - * Improve test suite. - * Minor bug fixes. - -Version 1.0.9 (2004-03-30) - * Add handling of AVR (Audio Visual Research) files. - * Improve handling of WAVEFORMATEXTENSIBLE WAV files. - * Fix for using pipes on Win32. - -Version 1.0.8 (2004-03-14) - * Correct peak chunk handing for files with > 16 tracks. - * Fix for WAV files with huge number of CUE chunks. - -Version 1.0.7 (2004-02-25) - * Fix clip mode detection on ia64, MIPS and other CPUs. - * Fix two MacOSX build problems. - -Version 1.0.6 (2004-02-08) - * Added support for native Win32 file access API (Ross Bencina). - * New mode to add clippling then a converting from float/double to integer - would otherwise wrap around. - * Fixed a bug in reading/writing files > 2Gig on Linux, Solaris and others. - * Many minor bug fixes. - * Other random fixes for Win32. - -Version 1.0.5 (2003-05-03) - * Added support for HTK files. - * Added new function sf_open_fd() to allow for secure opening of temporary - files as well as reading/writing sound files embedded within larger - container files. - * Added string support for AIFF files. - * Minor bug fixes and code cleanups. - -Version 1.0.4 (2003-02-02) - * Added suport of PVF and XI files. - * Added functionality for setting and retreiving strings from sound files. - * Minor code cleanups and bug fixes. - -Version 1.0.3 (2002-12-09) - * Minor bug fixes. - -Version 1.0.2 (2002-11-24) - * Added support for VOX ADPCM. - * Improved error reporting. - * Added version scripting on Linux and Solaris. - * Minor bug fixes. - -Version 1.0.1 (2002-09-14) - * Added MAT and MAT5 file formats. - * Minor bug fixes. - -Version 1.0.0 (2002-08-16) - * Final release for 1.0.0. - -Version 1.0.0rc6 (2002-08-14) - * Release candidate 6 for the 1.0.0 series. - * MacOS9 fixes. - -Version 1.0.0rc5 (2002-08-10) - * Release candidate 5 for the 1.0.0 series. - * Changed the definition of sf_count_t which was causing problems when - libsndfile was compiled with other libraries (ie WxWindows). - * Minor bug fixes. - * Documentation cleanup. - -Version 1.0.0rc4 (2002-08-03) - * Release candidate 4 for the 1.0.0 series. - * Minor bug fixes. - * Fix broken Win32 "make check". - -Version 1.0.0rc3 (2002-08-02) - * Release candidate 3 for the 1.0.0 series. - * Fix bug where libsndfile was reading beyond the end of the data chunk. - * Added on-the-fly header updates on write. - * Fix a couple of documentation issues. - -Version 1.0.0rc2 (2002-06-24) - * Release candidate 2 for the 1.0.0 series. - * Fix compile problem for Win32. - -Version 1.0.0rc1 (2002-06-24) - * Release candidate 1 for the 1.0.0 series. - -Version 0.0.28 (2002-04-27) - * Last offical release of 0.0.X series of the library. - -Version 0.0.8 (1999-02-16) - * First offical release. diff --git a/libs/libsndfile/Octave/Makefile.am b/libs/libsndfile/Octave/Makefile.am deleted file mode 100644 index 3f0078e18f..0000000000 --- a/libs/libsndfile/Octave/Makefile.am +++ /dev/null @@ -1,79 +0,0 @@ -## Process this file with automake to produce Makefile.in - -# Prevent any extension. -EXEEXT = - -CXXLD = $(CXX) -CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \ - $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ - -EXTRA_DIST = sndfile_load.m sndfile_save.m sndfile_play.m \ - octave_test.m octave_test.sh $(oct_module_srcs) PKG_ADD - -octconfigdir = $(exec_prefix)/share/octave/site/m -octconfig_DATA = sndfile_load.m sndfile_save.m sndfile_play.m - -OCTAVE_DEST_MDIR = @OCTAVE_DEST_MDIR@ -OCTAVE_DEST_ODIR = @OCTAVE_DEST_ODIR@/sndfile - -OCT_CXXFLAGS = @OCT_CXXFLAGS@ -OCT_LIB_DIR = @OCT_LIB_DIR@ -OCT_LIBS = @OCT_LIBS@ - -SNDFILEDIR = $(top_builddir)/src -AM_CPPFLAGS = -I$(SNDFILEDIR) - -oct_module_srcs = sndfile.cc -oct_module_files = sndfile.oct PKG_ADD - -# Make these noinst so they can be installed manually. -noinst_DATA = $(oct_module_files) - - -# Used by shave which cleans up automake generated Makefile output. -V = @ -Q = $(V:1=) -QUIET_GEN = $(Q:@=@echo ' GEN '$@;) - - -# Use Octave's mkoctfile to do all the heavy lifting. Unfortunately, its -# a little dumb so we need to guide it carefully. -sndfile.oct : sndfile.o - $(QUIET_GEN) $(MKOCTFILE) -v $(INCLUDES) $(top_builddir)/Octave/$+ -L$(SNDFILEDIR)/.libs -L$(SNDFILEDIR) -lsndfile -o $(top_builddir)/Octave/$@ > /dev/null - -sndfile.o : sndfile.cc - $(QUIET_GEN) $(MKOCTFILE) -v $(INCLUDES) -c $+ -o $(top_builddir)/Octave/$@ > /dev/null - -# Allow for the test being run in the build dir, but the test script -# being located in the source dir. -check : - octave_src_dir=$(srcdir) $(srcdir)/octave_test.sh - - -# Since the octave modules are installed in a special location, a custom install -# and uninstall routine must be specified. -install-exec-local : $(oct_module_files) - @$(NORMAL_INSTALL) - test -z "$(OCTAVE_DEST_ODIR)" || $(mkdir_p) "$(DESTDIR)$(OCTAVE_DEST_ODIR)" - @list='$(oct_module_files)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(INSTALL) '$$p' '$(DESTDIR)$(OCTAVE_DEST_ODIR)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(INSTALL) "$$p" "$(DESTDIR)$(OCTAVE_DEST_ODIR)/$$f" || exit 1; \ - else :; fi; \ - done - -uninstall-local : - @$(NORMAL_UNINSTALL) - @list='$(oct_module_files)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(OCTAVE_DEST_ODIR)/$$f'"; \ - rm -f "$(DESTDIR)$(OCTAVE_DEST_ODIR)/$$f"; \ - done - -clean-local : - rm -f sndfile.o sndfile.oct - @if test $(abs_builddir) != $(abs_srcdir) ; then rm -f PKG_ADD ; fi diff --git a/libs/libsndfile/Octave/PKG_ADD b/libs/libsndfile/Octave/PKG_ADD deleted file mode 100644 index 3efd688550..0000000000 --- a/libs/libsndfile/Octave/PKG_ADD +++ /dev/null @@ -1,3 +0,0 @@ -autoload ("sfread", "sndfile.oct"); -autoload ("sfversion", "sndfile.oct"); -autoload ("sfwrite", "sndfile.oct"); diff --git a/libs/libsndfile/Octave/Readme.txt b/libs/libsndfile/Octave/Readme.txt deleted file mode 100644 index c38605bffc..0000000000 --- a/libs/libsndfile/Octave/Readme.txt +++ /dev/null @@ -1,23 +0,0 @@ -The libsndfile Modules for GNU Octave -===================================== - -These modules are currently known to work with version 3.0 of GNU Octave on -Linux. They have not been tested elsewhere. - - -Build Requirements ------------------- - -In order to build these libsndfile related modules for GNU Octave on a Debian -GNU/Linux (or Debian derived) system, you will need (on top of what is normally -required to build libsndfile) the package: - - octaveX.Y-headers - -where X.Y matches the version number of your installation of GNU Octave. - -The configure script in the top level libsndfile directory will detect the -presence and correct versions of the Octave build tools. The building of these -modules will only go ahead if everything is correct. - - diff --git a/libs/libsndfile/Octave/format.h b/libs/libsndfile/Octave/format.h deleted file mode 100644 index ce769b2c69..0000000000 --- a/libs/libsndfile/Octave/format.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -** Copyright (C) 2007-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -int format_of_str (const std::string & fmt) ; - -void string_of_format (std::string & fmt, int format) ; diff --git a/libs/libsndfile/Octave/octave_test.m b/libs/libsndfile/Octave/octave_test.m deleted file mode 100644 index 25a922e897..0000000000 --- a/libs/libsndfile/Octave/octave_test.m +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright (C) 2007-2011 Erik de Castro Lopo -# -# This program 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 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser 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. - -# These tests are nowhere near comprehensive. - -printf (" Running Octave tests : ") ; -fflush (stdout) ; - -filename = "whatever" ; -srate_out = 32000 ; -fmt_out = "wav-float" ; - -t = (2 * pi / srate_out * (0:srate_out-1))' ; -data_out = sin (440.0 * t) ; - -# Write out a file. -sfwrite (filename, data_out, srate_out, fmt_out) ; - -# Read it back in again. -[ data_in, srate_in, fmt_in ] = sfread (filename) ; - -if (srate_in != srate_out) - error ("\n\nSample rate mismatch : %d -> %d.\n\n", srate_out, srate_in) ; - endif - -# Octave strcmp return 1 for the same. -if (strcmp (fmt_in, fmt_out) != 1) - error ("\n\nFormat error : '%s' -> '%s'.\n\n", fmt_out, fmt_in) ; - endif - -err = max (abs (data_out - data_in)) ; - -if (err > 1e-7) - error ("err : %g\n", err) ; - endif - -printf ("ok") ; - -unlink (filename) ; diff --git a/libs/libsndfile/Octave/octave_test.sh b/libs/libsndfile/Octave/octave_test.sh deleted file mode 100755 index 3c6f36e236..0000000000 --- a/libs/libsndfile/Octave/octave_test.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/bash - - -# Check where we're being run from. -if test -d Octave ; then - cd Octave - octave_src_dir=$(pwd) -elif test -z "$octave_src_dir" ; then - echo - echo "Error : \$octave_src_dir is undefined." - echo - exit 1 -else - octave_src_dir=$(cd $octave_src_dir && pwd) - fi - -# Find libsndfile shared object. -libsndfile_lib_location="" - -if test -f "../src/.libs/libsndfile.so" ; then - libsndfile_lib_location="../src/.libs/" -elif test -f "../src/libsndfile.so" ; then - libsndfile_lib_location="../src/" -elif test -f "../src/.libs/libsndfile.dylib" ; then - libsndfile_lib_location="../src/.libs/" -elif test -f "../src/libsndfile.dylib" ; then - libsndfile_lib_location="../src/" -else - echo - echo "Not able to find the libsndfile shared lib we've just built." - echo "This may cause the following test to fail." - echo - fi - -libsndfile_lib_location=`(cd $libsndfile_lib_location && pwd)` - - -# Find sndfile.oct -sndfile_oct_location="" - -if test -f .libs/sndfile.oct ; then - sndfile_oct_location=".libs" -elif test -f sndfile.oct ; then - sndfile_oct_location="." -else - echo "Not able to find the sndfile.oct binaries we've just built." - exit 1 - fi - -case `file -b $sndfile_oct_location/sndfile.oct` in - ELF*) - ;; - Mach*) - echo "Tests don't work on this platform." - exit 0 - ;; - *) - echo "Not able to find the sndfile.oct binary we just built." - exit 1 - ;; - esac - - -# Make sure the TERM environment variable doesn't contain anything wrong. -unset TERM -# echo "octave_src_dir : $octave_src_dir" -# echo "libsndfile_lib_location : $libsndfile_lib_location" -# echo "sndfile_oct_location : $sndfile_oct_location" - -if test ! -f PKG_ADD ; then - cp $octave_src_dir/PKG_ADD . - fi - -export LD_LIBRARY_PATH="$libsndfile_lib_location:$LD_LIBRARY_PATH" - -octave_script="$octave_src_dir/octave_test.m" - -(cd $sndfile_oct_location && octave -qH $octave_script) -res=$? -echo -exit $res diff --git a/libs/libsndfile/Octave/sndfile.cc b/libs/libsndfile/Octave/sndfile.cc deleted file mode 100644 index 6e9cd44cc9..0000000000 --- a/libs/libsndfile/Octave/sndfile.cc +++ /dev/null @@ -1,405 +0,0 @@ -/* -** Copyright (C) 2007-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include - -#include "sndfile.h" - -#define FOUR_GIG (0x100000000LL) -#define BUFFER_FRAMES 8192 - - -static int format_of_str (const std::string & fmt) ; -static void string_of_format (std::string & fmt, int format) ; - - -DEFUN_DLD (sfversion, args, nargout , -"-*- texinfo -*-\n\ -@deftypefn {Loadable Function} {@var{version} =} sfversion ()\n\ -@cindex Reading sound files\n\ -Return a string containing the libsndfile version.\n\ -@seealso{sfread, sfwrite}\n\ -@end deftypefn") -{ char buffer [256] ; - octave_value_list retval ; - - /* Bail out if the input parameters are bad. */ - if (args.length () != 0 || nargout > 1) - { print_usage () ; - return retval ; - } ; - - sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ; - - std::string version (buffer) ; - - retval.append (version) ; - return retval ; -} /* sfversion */ - - -DEFUN_DLD (sfread, args, nargout , -"-*- texinfo -*-\n\ -@deftypefn {Loadable Function} {@var{data},@var{srate},@var{format} =} sfread (@var{filename})\n\ -@cindex Reading sound files\n\ -Read a sound file from disk using libsndfile.\n\ -@seealso{sfversion, sfwrite}\n\ -@end deftypefn") -{ SNDFILE * file ; - SF_INFO sfinfo ; - - octave_value_list retval ; - - int nargin = args.length () ; - - /* Bail out if the input parameters are bad. */ - if ((nargin != 1) || !args (0) .is_string () || nargout < 1 || nargout > 3) - { print_usage () ; - return retval ; - } ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - std::string filename = args (0).string_value () ; - - if ((file = sf_open (filename.c_str (), SFM_READ, &sfinfo)) == NULL) - { error ("sfread: couldn't open file %s : %s", filename.c_str (), sf_strerror (NULL)) ; - return retval ; - } ; - - if (sfinfo.frames > FOUR_GIG) - printf ("This is a really huge file (%lld frames).\nYou may run out of memory trying to load it.\n", (long long) sfinfo.frames) ; - - dim_vector dim = dim_vector () ; - dim.resize (2) ; - dim (0) = sfinfo.frames ; - dim (1) = sfinfo.channels ; - - /* Should I be using Matrix instead? */ - NDArray out (dim, 0.0) ; - - float buffer [BUFFER_FRAMES * sfinfo.channels] ; - int readcount ; - sf_count_t total = 0 ; - - do - { readcount = sf_readf_float (file, buffer, BUFFER_FRAMES) ; - - /* Make sure we don't read more frames than we allocated. */ - if (total + readcount > sfinfo.frames) - readcount = sfinfo.frames - total ; - - for (int ch = 0 ; ch < sfinfo.channels ; ch++) - { for (int k = 0 ; k < readcount ; k++) - out (total + k, ch) = buffer [k * sfinfo.channels + ch] ; - } ; - - total += readcount ; - } while (readcount > 0 && total < sfinfo.frames) ; - - retval.append (out.squeeze ()) ; - - if (nargout >= 2) - retval.append ((octave_uint32) sfinfo.samplerate) ; - - if (nargout >= 3) - { std::string fmt ("") ; - string_of_format (fmt, sfinfo.format) ; - retval.append (fmt) ; - } ; - - /* Clean up. */ - sf_close (file) ; - - return retval ; -} /* sfread */ - -DEFUN_DLD (sfwrite, args, nargout , -"-*- texinfo -*-\n\ -@deftypefn {Function File} sfwrite (@var{filename},@var{data},@var{srate},@var{format})\n\ -Write a sound file to disk using libsndfile.\n\ -@seealso{sfread, sfversion}\n\ -@end deftypefn\n\ -") -{ SNDFILE * file ; - SF_INFO sfinfo ; - - octave_value_list retval ; - - int nargin = args.length () ; - - /* Bail out if the input parameters are bad. */ - if (nargin != 4 || !args (0).is_string () || !args (1).is_real_matrix () - || !args (2).is_real_scalar () || !args (3).is_string () - || nargout != 0) - { print_usage () ; - return retval ; - } ; - - std::string filename = args (0).string_value () ; - std::string format = args (3).string_value () ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - sfinfo.format = format_of_str (format) ; - if (sfinfo.format == 0) - { error ("Bad format '%s'", format.c_str ()) ; - return retval ; - } ; - - sfinfo.samplerate = lrint (args (2).scalar_value ()) ; - if (sfinfo.samplerate < 1) - { error ("Bad sample rate : %d.\n", sfinfo.samplerate) ; - return retval ; - } ; - - Matrix data = args (1).matrix_value () ; - long rows = args (1).rows () ; - long cols = args (1).columns () ; - - if (cols > rows) - { error ("Audio data should have one column per channel, but supplied data " - "has %ld rows and %ld columns.\n", rows, cols) ; - return retval ; - } ; - - sfinfo.channels = cols ; - - if ((file = sf_open (filename.c_str (), SFM_WRITE, &sfinfo)) == NULL) - { error ("Couldn't open file %s : %s", filename.c_str (), sf_strerror (NULL)) ; - return retval ; - } ; - - float buffer [BUFFER_FRAMES * sfinfo.channels] ; - int writecount ; - long total = 0 ; - - do - { - writecount = BUFFER_FRAMES ; - - /* Make sure we don't read more frames than we allocated. */ - if (total + writecount > rows) - writecount = rows - total ; - - for (int ch = 0 ; ch < sfinfo.channels ; ch++) - { for (int k = 0 ; k < writecount ; k++) - buffer [k * sfinfo.channels + ch] = data (total + k, ch) ; - } ; - - if (writecount > 0) - sf_writef_float (file, buffer, writecount) ; - - total += writecount ; - } while (writecount > 0 && total < rows) ; - - /* Clean up. */ - sf_close (file) ; - - return retval ; -} /* sfwrite */ - - -static void -str_split (const std::string & str, const std::string & delim, std::vector & output) -{ - unsigned int offset = 0 ; - size_t delim_index = 0 ; - - delim_index = str.find (delim, offset) ; - - while (delim_index != std::string::npos) - { - output.push_back (str.substr(offset, delim_index - offset)) ; - offset += delim_index - offset + delim.length () ; - delim_index = str.find (delim, offset) ; - } - - output.push_back (str.substr (offset)) ; -} /* str_split */ - -static int -hash_of_str (const std::string & str) -{ - int hash = 0 ; - - for (unsigned k = 0 ; k < str.length () ; k++) - hash = (hash * 3) + tolower (str [k]) ; - - return hash ; -} /* hash_of_str */ - -static int -major_format_of_hash (const std::string & str) -{ int hash ; - - hash = hash_of_str (str) ; - - switch (hash) - { - case 0x5c8 : /* 'wav' */ return SF_FORMAT_WAV ; - case 0xf84 : /* 'aiff' */ return SF_FORMAT_AIFF ; - case 0x198 : /* 'au' */ return SF_FORMAT_AU ; - case 0x579 : /* 'paf' */ return SF_FORMAT_PAF ; - case 0x5e5 : /* 'svx' */ return SF_FORMAT_SVX ; - case 0x1118 : /* 'nist' */ return SF_FORMAT_NIST ; - case 0x5d6 : /* 'voc' */ return SF_FORMAT_VOC ; - case 0x324a : /* 'ircam' */ return SF_FORMAT_IRCAM ; - case 0x505 : /* 'w64' */ return SF_FORMAT_W64 ; - case 0x1078 : /* 'mat4' */ return SF_FORMAT_MAT4 ; - case 0x1079 : /* 'mat5' */ return SF_FORMAT_MAT5 ; - case 0x5b8 : /* 'pvf' */ return SF_FORMAT_PVF ; - case 0x1d1 : /* 'xi' */ return SF_FORMAT_XI ; - case 0x56f : /* 'htk' */ return SF_FORMAT_HTK ; - case 0x5aa : /* 'sds' */ return SF_FORMAT_SDS ; - case 0x53d : /* 'avr' */ return SF_FORMAT_AVR ; - case 0x11d0 : /* 'wavx' */ return SF_FORMAT_WAVEX ; - case 0x569 : /* 'sd2' */ return SF_FORMAT_SD2 ; - case 0x1014 : /* 'flac' */ return SF_FORMAT_FLAC ; - case 0x504 : /* 'caf' */ return SF_FORMAT_CAF ; - case 0x5f6 : /* 'wve' */ return SF_FORMAT_WVE ; - default : break ; - } ; - - printf ("%s : hash '%s' -> 0x%x\n", __func__, str.c_str (), hash) ; - - return 0 ; -} /* major_format_of_hash */ - -static int -minor_format_of_hash (const std::string & str) -{ int hash ; - - hash = hash_of_str (str) ; - - switch (hash) - { - case 0x1085 : /* 'int8' */ return SF_FORMAT_PCM_S8 ; - case 0x358a : /* 'uint8' */ return SF_FORMAT_PCM_U8 ; - case 0x31b0 : /* 'int16' */ return SF_FORMAT_PCM_16 ; - case 0x31b1 : /* 'int24' */ return SF_FORMAT_PCM_24 ; - case 0x31b2 : /* 'int32' */ return SF_FORMAT_PCM_32 ; - case 0x3128 : /* 'float' */ return SF_FORMAT_FLOAT ; - case 0x937d : /* 'double' */ return SF_FORMAT_DOUBLE ; - case 0x11bd : /* 'ulaw' */ return SF_FORMAT_ULAW ; - case 0xfa1 : /* 'alaw' */ return SF_FORMAT_ALAW ; - case 0xfc361 : /* 'ima_adpcm' */ return SF_FORMAT_IMA_ADPCM ; - case 0x5739a : /* 'ms_adpcm' */ return SF_FORMAT_MS_ADPCM ; - case 0x9450 : /* 'gsm610' */ return SF_FORMAT_GSM610 ; - case 0x172a3 : /* 'g721_32' */ return SF_FORMAT_G721_32 ; - case 0x172d8 : /* 'g723_24' */ return SF_FORMAT_G723_24 ; - case 0x172da : /* 'g723_40' */ return SF_FORMAT_G723_40 ; - default : break ; - } ; - - printf ("%s : hash '%s' -> 0x%x\n", __func__, str.c_str (), hash) ; - - return 0 ; -} /* minor_format_of_hash */ - - -static const char * -string_of_major_format (int format) -{ - switch (format & SF_FORMAT_TYPEMASK) - { - case SF_FORMAT_WAV : return "wav" ; - case SF_FORMAT_AIFF : return "aiff" ; - case SF_FORMAT_AU : return "au" ; - case SF_FORMAT_PAF : return "paf" ; - case SF_FORMAT_SVX : return "svx" ; - case SF_FORMAT_NIST : return "nist" ; - case SF_FORMAT_VOC : return "voc" ; - case SF_FORMAT_IRCAM : return "ircam" ; - case SF_FORMAT_W64 : return "w64" ; - case SF_FORMAT_MAT4 : return "mat4" ; - case SF_FORMAT_MAT5 : return "mat5" ; - case SF_FORMAT_PVF : return "pvf" ; - case SF_FORMAT_XI : return "xi" ; - case SF_FORMAT_HTK : return "htk" ; - case SF_FORMAT_SDS : return "sds" ; - case SF_FORMAT_AVR : return "avr" ; - case SF_FORMAT_WAVEX : return "wavx" ; - case SF_FORMAT_SD2 : return "sd2" ; - case SF_FORMAT_FLAC : return "flac" ; - case SF_FORMAT_CAF : return "caf" ; - case SF_FORMAT_WVE : return "wfe" ; - default : break ; - } ; - - return "unknown" ; -} /* string_of_major_format */ - -static const char * -string_of_minor_format (int format) -{ - switch (format & SF_FORMAT_SUBMASK) - { - case SF_FORMAT_PCM_S8 : return "int8" ; - case SF_FORMAT_PCM_U8 : return "uint8" ; - case SF_FORMAT_PCM_16 : return "int16" ; - case SF_FORMAT_PCM_24 : return "int24" ; - case SF_FORMAT_PCM_32 : return "int32" ; - case SF_FORMAT_FLOAT : return "float" ; - case SF_FORMAT_DOUBLE : return "double" ; - case SF_FORMAT_ULAW : return "ulaw" ; - case SF_FORMAT_ALAW : return "alaw" ; - case SF_FORMAT_IMA_ADPCM : return "ima_adpcm" ; - case SF_FORMAT_MS_ADPCM : return "ms_adpcm" ; - case SF_FORMAT_GSM610 : return "gsm610" ; - case SF_FORMAT_G721_32 : return "g721_32" ; - case SF_FORMAT_G723_24 : return "g723_24" ; - case SF_FORMAT_G723_40 : return "g723_40" ; - default : break ; - } ; - - return "unknown" ; -} /* string_of_minor_format */ - -static int -format_of_str (const std::string & fmt) -{ - std::vector split ; - - str_split (fmt, "-", split) ; - - if (split.size () != 2) - return 0 ; - - int major_fmt = major_format_of_hash (split.at (0)) ; - if (major_fmt == 0) - return 0 ; - - int minor_fmt = minor_format_of_hash (split.at (1)) ; - if (minor_fmt == 0) - return 0 ; - - return major_fmt | minor_fmt ; -} /* format_of_str */ - -static void -string_of_format (std::string & fmt, int format) -{ - char buffer [64] ; - - snprintf (buffer, sizeof (buffer), "%s-%s", string_of_major_format (format), string_of_minor_format (format)) ; - - fmt = buffer ; - - return ; -} /* string_of_format */ diff --git a/libs/libsndfile/Octave/sndfile_load.m b/libs/libsndfile/Octave/sndfile_load.m deleted file mode 100644 index c66198fa35..0000000000 --- a/libs/libsndfile/Octave/sndfile_load.m +++ /dev/null @@ -1,52 +0,0 @@ -## Copyright (C) 2002-2011 Erik de Castro Lopo -## -## 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 file. If not, write to the Free Software Foundation, -## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -## -*- texinfo -*- -## @deftypefn {Function File} {} sndfile_load (@var{filename}) -## Load data from the file given by @var{filename}. -## @end deftypefn - -## Author: Erik de Castro Lopo -## Description: Load the sound data from the given file name - -function [data fs] = sndfile_load (filename) - -if (nargin != 1), - error ("Need an input filename") ; - endif - -samplerate = -1 ; -samplingrate = -1 ; -wavedata = -1 ; - - -eval (sprintf ('load -f %s', filename)) ; - -if (samplerate > 0), - fs = samplerate ; -elseif (samplingrate > 0), - fs = samplingrate ; -else - error ("Not able to find sample rate.") ; - endif - -if (max (size (wavedata)) > 1), - data = wavedata ; -else - error ("Not able to find waveform data.") ; - endif - -endfunction diff --git a/libs/libsndfile/Octave/sndfile_play.m b/libs/libsndfile/Octave/sndfile_play.m deleted file mode 100644 index e8a34a74cb..0000000000 --- a/libs/libsndfile/Octave/sndfile_play.m +++ /dev/null @@ -1,59 +0,0 @@ -## Copyright (C) 2002-2011 Erik de Castro Lopo -## -## 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 file. If not, write to the Free Software Foundation, -## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -## -*- texinfo -*- -## @deftypefn {Function File} {} sndfile_play (@var{data, fs}) -## Play @var{data} at sample rate @var{fs} using the sndfile-play -## program. -## @end deftypefn - -## Author: Erik de Castro Lopo -## Description: Play the given data as a sound file - -function sndfile_play (data, fs) - -if nargin != 2, - error ("Need two input arguments: data and fs.") ; - endif - -if (max (size (fs)) > 1), - error ("Second parameter fs must be a single value.") ; - endif - -[nr nc] = size (data) ; - -if (nr > nc), - data = data' ; - endif - -samplerate = fs ; -wavedata = data ; - -filename = tmpnam () ; - -cmd = sprintf ("save -mat-binary %s fs data", filename) ; - -eval (cmd) ; - -cmd = sprintf ("sndfile-play %s", filename) ; - -[output, status] = system (cmd) ; - -if (status), - disp (outout) ; - endif - -endfunction diff --git a/libs/libsndfile/Octave/sndfile_save.m b/libs/libsndfile/Octave/sndfile_save.m deleted file mode 100644 index 5b7e7c7d0f..0000000000 --- a/libs/libsndfile/Octave/sndfile_save.m +++ /dev/null @@ -1,53 +0,0 @@ -## Copyright (C) 2002-2011 Erik de Castro Lopo -## -## 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 file. If not, write to the Free Software Foundation, -## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -## -*- texinfo -*- -## @deftypefn {Function File} {} sndfile_save (@var{filename, data, fs}) -## Save the given @var{data} as audio data to the given at @var{fs}. Set -## the sample rate to @var{fs}. -## @end deftypefn - -## Author: Erik de Castro Lopo -## Description: Save data as a sound file - -function sndfile_save (filename, data, fs) - -if nargin != 3, - error ("Need three input arguments: filename, data and fs.") ; - endif - -if (! isstr (filename)), - error ("First parameter 'filename' is must be a string.") ; - endif - -if (max (size (fs)) > 1), - error ("Second parameter 'fs' must be a single value, not an array or matrix.") ; - endif - -[nr nc] = size (data) ; - -if (nr > nc), - data = data' ; - endif - -samplerate = fs ; -wavedata = data ; - -str = sprintf ("save -mat-binary %s samplerate wavedata", filename) ; - -eval (str) ; - -endfunction diff --git a/libs/libsndfile/README b/libs/libsndfile/README deleted file mode 100644 index 8df79c7d9f..0000000000 --- a/libs/libsndfile/README +++ /dev/null @@ -1,68 +0,0 @@ -This is libsndfile, 1.0.25 - -libsndfile is a library of C routines for reading and writing -files containing sampled audio data. - -The src/ directory contains the source code for library itself. - -The doc/ directory contains the libsndfile documentation. - -The examples/ directory contains examples of how to write code using -libsndfile. - -The tests/ directory contains programs which link against libsndfile -and test its functionality. - -The src/GSM610 directory contains code written by Jutta Degener and Carsten -Bormann. Their original code can be found at : - http://kbs.cs.tu-berlin.de/~jutta/toast.html - -The src/G72x directory contains code written and released by Sun Microsystems -under a suitably free license. - -The src/ALAC directory contains code written and released by Apple Inc and -released under the Apache license. - - -LINUX ------ -Whereever possible, you should use the packages supplied by your Linux -distribution. - -If you really do need to compile from source it should be as easy as: - - ./configure - make - make install - -Since libsndfile optionally links against libFLAC, libogg and libvorbis, you -will need to install appropriate versions of these libraries before running -configure as above. - - -UNIX ----- -Compile as for Linux. - - -Win32/Win64 ------------ -The default Windows compilers are nowhere near compliant with the 1999 ISO -C Standard and hence not able to compile libsndfile. - -Please use the libsndfile binaries available on the libsndfile web site. - - -MacOSX ------- -Building on MacOSX should be the same as building it on any other Unix. - - -CONTACTS --------- - -libsndfile was written by Erik de Castro Lopo (erikd AT mega-nerd DOT com). -The libsndfile home page is at : - - http://www.mega-nerd.com/libsndfile/ - diff --git a/libs/libsndfile/README.md b/libs/libsndfile/README.md deleted file mode 100644 index a7fdaea71f..0000000000 --- a/libs/libsndfile/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# libsndfile - -libsndfile is a C library for reading and writing files containing sampled audio -data. - -## Hacking - -The canonical source code repository for libsndfile is at -[https://github.com/erikd/libsndfile/][github]. - -You can grab the source code using: - - $ git clone git://github.com/erikd/libsndfile.git - -Building on Linux, OSX and Windows (Using GNU GCC) will require a number of GNU -and other Free and Open Source Software tools including: - -* [Autoconf][autoconf] -* [Autogen][autogen] -* [Automake][automake] -* [Libtool][libtool] -* [Pkgconfig][pkgconfig] -* [Python][python] - -If you are on Linux, its probably best to install these via your Linux -distribution's package manager. - -If you want to compile libsndfile with support for formats like FLAC and -Ogg/Vorbis you will also need to install the following optional libraries: - -* [FLAC][flac] -* [libogg][libogg] -* [libvorbis][libvorbis] - -Support for these extra libraries is an all or nothing affair. Unless all of -them are installed none of them will be supported. - - $ ./autogen.sh - -Running `autogen.sh` also installs a git pre-commit hook. The pre-commit hook -is run each time a user tries to commit and checks code about to be committed -against coding guidelines. - -Nest step is to run configure, with the following configure options being -recommended for anyone contemplating sending libsndfile patches: - - $ ./configure --enable-gcc-werror - -Finally libsndfile can be built and tested: - - $ make - $ make check - -## Submitting Patches. - -* Patches should pass all pre-commit hook tests. -* Patches should always be submitted via a either Github "pull request" or a - via emailed patches created using "git format-patch". -* Patches for new features should include tests and documentation. -* Patches to fix bugs should either pass all tests, or modify the tests in some - sane way. -* When a new feature is added for a particular file format and that feature - makes sense for other formats, then it should also be implemented for one - or two of the other formats. - - - - - -[autoconf]: http://www.gnu.org/s/autoconf/ -[autogen]: http://www.gnu.org/s/autogen/ -[automake]: http://www.gnu.org/software/automake/ -[flac]: http://flac.sourceforge.net/ -[github]: https://github.com/erikd/libsndfile/ -[libogg]: http://xiph.org/ogg/ -[libtool]: http://www.gnu.org/software/libtool/ -[libvorbis]: http://www.vorbis.com/ -[pkgconfig]: http://www.freedesktop.org/wiki/Software/pkg-config -[python]: http://www.python.org/ diff --git a/libs/libsndfile/Scripts/android-configure.sh b/libs/libsndfile/Scripts/android-configure.sh deleted file mode 100644 index c981d4927a..0000000000 --- a/libs/libsndfile/Scripts/android-configure.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/bash -e - -# Copyright (C) 2013 Erik de Castro Lopo -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Neither the author nor the names of any contributors may be used -# to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# Android NDK version number; eg r8e, r9 etc -ANDROID_NDK_VER=r9 - -# Android NDK gcc version; eg 4.7, 4.9 etc. -ANDROID_GCC_VER=4.8 - -# Android API version; eg 9 (Android 2.3), 14 (Android 4.0) etc. -ANDROID_API_VER=9 - -#------------------------------------------------------------------------------- -# No more user config beyond here. - -BUILD_MACHINE=$(uname -s | tr 'A-Z' 'a-z')-$(uname -m) - -function die_with { - echo $1 - exit 1 -} - -export CROSS_COMPILE=arm-linux-androideabi - -# I put all my dev stuff in here -export DEV_PREFIX=$HOME/Android -test -d ${DEV_PREFIX} || die_with "Error : DEV_PREFIX '$DEV_PREFIX' does not exist." - -# Don't forget to adjust this to your NDK path -export ANDROID_NDK=${DEV_PREFIX}/android-ndk-${ANDROID_NDK_VER} -test -d ${ANDROID_NDK} || die_with "Error : ANDROID_NDK '$ANDROID_NDK' does not exist." - -export ANDROID_PREFIX=${ANDROID_NDK}/toolchains/arm-linux-androideabi-${ANDROID_GCC_VER}/prebuilt/${BUILD_MACHINE} -test -d ${ANDROID_PREFIX} || die_with "Error : ANDROID_PREFIX '$ANDROID_PREFIX' does not exist." - -export SYSROOT=${ANDROID_NDK}/platforms/android-${ANDROID_API_VER}/arch-arm -test -d ${SYSROOT} || die_with "Error : SYSROOT '$SYSROOT' does not exist." - -export CROSS_PREFIX=${ANDROID_PREFIX}/bin/${CROSS_COMPILE} -test -f ${CROSS_PREFIX}-gcc || die_with "Error : CROSS_PREFIX compiler '${CROSS_PREFIX}-gcc' does not exist." - - -# Non-exhaustive lists of compiler + binutils -# Depending on what you compile, you might need more binutils than that -export CPP=${CROSS_PREFIX}-cpp -export AR=${CROSS_PREFIX}-ar -export AS=${CROSS_PREFIX}-as -export NM=${CROSS_PREFIX}-nm -export CC=${CROSS_PREFIX}-gcc -export CXX=${CROSS_PREFIX}-g++ -export LD=${CROSS_PREFIX}-ld -export RANLIB=${CROSS_PREFIX}-ranlib - -# Don't mix up .pc files from your host and build target -export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig - -# Set up the needed FLAGS. -export CFLAGS="${CFLAGS} -gstabs --sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I${ANDROID_PREFIX}/include" -export CXXFLAGS="${CXXFLAGS} -gstabs -fno-exceptions --sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I${ANDROID_PREFIX}/include -I${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_GCC_VER}/include/ -I${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_GCC_VER}/libs/armeabi/include" - -export CPPFLAGS="${CFLAGS}" -export LDFLAGS="${LDFLAGS} -L${SYSROOT}/usr/lib -L${ANDROID_PREFIX}/lib" - -# Create a symlink to the gdbclient. -test -h gdbclient || ln -s ${ANDROID_PREFIX}/bin/arm-linux-androideabi-gdb gdbclient - -./configure --host=${CROSS_COMPILE} --with-sysroot=${SYSROOT} "$@" diff --git a/libs/libsndfile/Scripts/build-test-tarball.mk.in b/libs/libsndfile/Scripts/build-test-tarball.mk.in deleted file mode 100644 index 931edb6464..0000000000 --- a/libs/libsndfile/Scripts/build-test-tarball.mk.in +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/make -f - -# This is probably only going to work with GNU Make. -# This in a separate file instead of in Makefile.am because Automake complains -# about the GNU Make-isms. - -EXEEXT = @EXEEXT@ - -PACKAGE_VERSION = @PACKAGE_VERSION@ - -HOST_TRIPLET = @HOST_TRIPLET@ - -SRC_BINDIR = @SRC_BINDIR@ -TEST_BINDIR = @TEST_BINDIR@ - -LIBRARY := $(SRC_BINDIR)libsndfile.so.$(LIB_VERSION) - -LIB_VERSION := $(shell echo $(PACKAGE_VERSION) | sed -e 's/[a-z].*//') - -TESTNAME = libsndfile-testsuite-$(HOST_TRIPLET)-$(PACKAGE_VERSION) - -TARBALL = $(TESTNAME).tar.gz - -# Find the test programs by grepping the script for the programs it executes. -testprogs := $(shell grep '^\./' tests/test_wrapper.sh | sed -e "s|./||" -e "s/ .*//" | sort | uniq) -# Also add the programs not found by the above. -testprogs += sfversion@EXEEXT@ stdin_test@EXEEXT@ stdout_test@EXEEXT@ cpp_test@EXEEXT@ win32_test@EXEEXT@ - -# Find the single test program in src/ . -srcprogs := $(shell if test -x src/.libs/test_main$(EXEEXT) ; then echo "src/.libs/test_main$(EXEEXT)" ; else echo "src/test_main$(EXEEXT)" ; fi) - -libfiles := $(shell if test ! -z $(EXEEXT) ; then echo "src/libsndfile-1.def src/.libs/libsndfile-1.dll" ; elif test -f $(LIBRARY) ; then echo $(LIBRARY) ; fi ; fi) - -testbins := $(addprefix $(TEST_BINDIR),$(subst @EXEEXT@,$(EXEEXT),$(testprogs))) $(libfiles) $(srcprogs) - - -all : $(TARBALL) - -clean : - rm -rf $(TARBALL) $(TESTNAME)/ - -check : $(TESTNAME)/test_wrapper.sh - (cd ./$(TESTNAME)/ && ./test_wrapper.sh) - -$(TARBALL) : $(TESTNAME)/test_wrapper.sh - tar zcf $@ $(TESTNAME) - rm -rf $(TESTNAME) - @echo - @echo "Created : $(TARBALL)" - @echo - -$(TESTNAME)/test_wrapper.sh : $(testbins) tests/test_wrapper.sh tests/pedantic-header-test.sh - rm -rf $(TESTNAME) - mkdir -p $(TESTNAME)/tests/ - cp $(testbins) $(TESTNAME)/tests/ - cp tests/test_wrapper.sh $(TESTNAME)/ - cp tests/pedantic-header-test.sh $(TESTNAME)/tests/ - chmod u+x $@ - -tests/test_wrapper.sh : tests/test_wrapper.sh.in - (cd tests/ ; make $@) diff --git a/libs/libsndfile/Scripts/clang-sanitize.sh b/libs/libsndfile/Scripts/clang-sanitize.sh deleted file mode 100644 index 2898883c21..0000000000 --- a/libs/libsndfile/Scripts/clang-sanitize.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -# This is known to work with clang-3.4 from Debian testing/unstable. -# 2013/07/14 - -export CC=clang -export CXX=clang++ -export CFLAGS="-O3 -fsanitize=address,integer,undefined" -export CXXFLAGS="-O3 -fsanitize=address,integer,undefined" - -./configure --enable-gcc-werror - -make clean all check diff --git a/libs/libsndfile/Scripts/cstyle.py b/libs/libsndfile/Scripts/cstyle.py deleted file mode 100644 index 94a969c6e2..0000000000 --- a/libs/libsndfile/Scripts/cstyle.py +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/python -tt -# -# Copyright (C) 2005-2012 Erik de Castro Lopo -# -# Released under the 2 clause BSD license. - -""" -This program checks C code for compliance to coding standards used in -libsndfile and other projects I run. -""" - -import re -import sys - - -class Preprocessor: - """ - Preprocess lines of C code to make it easier for the CStyleChecker class to - test for correctness. Preprocessing works on a single line at a time but - maintains state between consecutive lines so it can preprocessess multi-line - comments. - Preprocessing involves: - - Strip C++ style comments from a line. - - Strip C comments from a series of lines. When a C comment starts and - ends on the same line it will be replaced with 'comment'. - - Replace arbitrary C strings with the zero length string. - - Replace '#define f(x)' with '#define f (c)' (The C #define requires that - there be no space between defined macro name and the open paren of the - argument list). - Used by the CStyleChecker class. - """ - def __init__ (self): - self.comment_nest = 0 - self.leading_space_re = re.compile ('^(\t+| )') - self.trailing_space_re = re.compile ('(\t+| )$') - self.define_hack_re = re.compile ("(#\s*define\s+[a-zA-Z0-9_]+)\(") - - def comment_nesting (self): - """ - Return the currect comment nesting. At the start and end of the file, - this value should be zero. Inside C comments it should be 1 or - (possibly) more. - """ - return self.comment_nest - - def __call__ (self, line): - """ - Strip the provided line of C and C++ comments. Stripping of multi-line - C comments works as expected. - """ - - line = self.define_hack_re.sub (r'\1 (', line) - - line = self.process_strings (line) - - # Strip C++ style comments. - if self.comment_nest == 0: - line = re.sub ("( |\t*)//.*", '', line) - - # Strip C style comments. - open_comment = line.find ('/*') - close_comment = line.find ('*/') - - if self.comment_nest > 0 and close_comment < 0: - # Inside a comment block that does not close on this line. - return "" - - if open_comment >= 0 and close_comment < 0: - # A comment begins on this line but doesn't close on this line. - self.comment_nest += 1 - return self.trailing_space_re.sub ('', line [:open_comment]) - - if open_comment < 0 and close_comment >= 0: - # Currently open comment ends on this line. - self.comment_nest -= 1 - return self.trailing_space_re.sub ('', line [close_comment + 2:]) - - if open_comment >= 0 and close_comment > 0 and self.comment_nest == 0: - # Comment begins and ends on this line. Replace it with 'comment' - # so we don't need to check whitespace before and after the comment - # we're removing. - newline = line [:open_comment] + "comment" + line [close_comment + 2:] - return self.__call__ (newline) - - return line - - def process_strings (self, line): - """ - Given a line of C code, return a string where all literal C strings have - been replaced with the empty string literal "". - """ - for k in range (0, len (line)): - if line [k] == '"': - start = k - for k in range (start + 1, len (line)): - if line [k] == '"' and line [k - 1] != '\\': - return line [:start + 1] + '"' + self.process_strings (line [k + 1:]) - return line - - -class CStyleChecker: - """ - A class for checking the whitespace and layout of a C code. - """ - def __init__ (self, debug): - self.debug = debug - self.filename = None - self.error_count = 0 - self.line_num = 1 - self.orig_line = '' - self.trailing_newline_re = re.compile ('[\r\n]+$') - self.indent_re = re.compile ("^\s*") - self.last_line_indent = "" - self.last_line_indent_curly = False - self.re_checks = \ - [ ( re.compile (" "), "multiple space instead of tab" ) - , ( re.compile ("\t "), "space after tab" ) - , ( re.compile ("[^ ];"), "missing space before semi-colon" ) - , ( re.compile ("{[^\s}]"), "missing space after open brace" ) - , ( re.compile ("[^{\s]}"), "missing space before close brace" ) - , ( re.compile ("[ \t]+$"), "contains trailing whitespace" ) - - , ( re.compile (",[^\s\n]"), "missing space after comma" ) - , ( re.compile (";[a-zA-Z0-9]"), "missing space after semi-colon" ) - , ( re.compile ("=[^\s\"'=]"), "missing space after assignment" ) - - # Open and close parenthesis. - , ( re.compile ("[^\s\(\[\*&']\("), "missing space before open parenthesis" ) - , ( re.compile ("\)(-[^>]|[^,'\s\n\)\]-])"), "missing space after close parenthesis" ) - , ( re.compile ("\s(do|for|if|when)\s.*{$"), "trailing open parenthesis at end of line" ) - , ( re.compile ("\( [^;]"), "space after open parenthesis" ) - , ( re.compile ("[^;] \)"), "space before close parenthesis" ) - - # Open and close square brace. - , ( re.compile ("[^\s\(\]]\["), "missing space before open square brace" ) - , ( re.compile ("\][^,\)\]\[\s\.-]"), "missing space after close square brace" ) - , ( re.compile ("\[ "), "space after open square brace" ) - , ( re.compile (" \]"), "space before close square brace" ) - - # Space around operators. - , ( re.compile ("[^\s][\*/%+-][=][^\s]"), "missing space around opassign" ) - , ( re.compile ("[^\s][<>!=^/][=]{1,2}[^\s]"), "missing space around comparison" ) - - # Parens around single argument to return. - , ( re.compile ("\s+return\s+\([a-zA-Z0-9_]+\)\s+;"), "parens around return value" ) - ] - - def get_error_count (self): - """ - Return the current error count for this CStyleChecker object. - """ - return self.error_count - - def check_files (self, files): - """ - Run the style checker on all the specified files. - """ - for filename in files: - self.check_file (filename) - - def check_file (self, filename): - """ - Run the style checker on the specified file. - """ - self.filename = filename - cfile = open (filename, "r") - - self.line_num = 1 - - preprocess = Preprocessor () - while 1: - line = cfile.readline () - if not line: - break - - line = self.trailing_newline_re.sub ('', line) - self.orig_line = line - - self.line_checks (preprocess (line)) - - self.line_num += 1 - - cfile.close () - self.filename = None - - # Check for errors finding comments. - if preprocess.comment_nesting () != 0: - print ("Weird, comments nested incorrectly.") - sys.exit (1) - - return - - def line_checks (self, line): - """ - Run the style checker on provided line of text, but within the context - of how the line fits within the file. - """ - - indent = len (self.indent_re.search (line).group ()) - if re.search ("^\s+}", line): - if not self.last_line_indent_curly and indent != self.last_line_indent: - None # self.error ("bad indent on close curly brace") - self.last_line_indent_curly = True - else: - self.last_line_indent_curly = False - - # Now all the regex checks. - for (check_re, msg) in self.re_checks: - if check_re.search (line): - self.error (msg) - - if re.search ("[a-zA-Z0-9][<>!=^/&\|]{1,2}[a-zA-Z0-9]", line): - if not re.search (".*#include.*[a-zA-Z0-9]/[a-zA-Z]", line): - self.error ("missing space around operator") - - self.last_line_indent = indent - return - - def error (self, msg): - """ - Print an error message and increment the error count. - """ - print ("%s (%d) : %s" % (self.filename, self.line_num, msg)) - if self.debug: - print ("'" + self.orig_line + "'") - self.error_count += 1 - -#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -if len (sys.argv) < 1: - print ("Usage : yada yada") - sys.exit (1) - -# Create a new CStyleChecker object -if sys.argv [1] == '-d' or sys.argv [1] == '--debug': - cstyle = CStyleChecker (True) - cstyle.check_files (sys.argv [2:]) -else: - cstyle = CStyleChecker (False) - cstyle.check_files (sys.argv [1:]) - - -if cstyle.get_error_count (): - sys.exit (1) - -sys.exit (0) diff --git a/libs/libsndfile/Scripts/git-pre-commit-hook b/libs/libsndfile/Scripts/git-pre-commit-hook deleted file mode 100644 index 6df1308ac3..0000000000 --- a/libs/libsndfile/Scripts/git-pre-commit-hook +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/sh -# - -if git rev-parse --verify HEAD >/dev/null 2>&1 ; then - against=HEAD -else - # Initial commit: diff against an empty tree object - against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 - fi - -files=$(git diff-index --name-status --cached HEAD | grep -v ^D | sed -r "s/^[A-Z]+[A-Z0-9]*[ \t]+/ /") - -# Redirect output to stderr. -exec 1>&2 - -#------------------------------------------------------------------------------- -# Check the copyright notice of all files to be commited. - -user=`git config --global user.email` -year=`date +"%Y"` - -missing_copyright_year="" -if test $user = "erikd@mega-nerd.com" ; then - for f in $files ; do - if test `head -5 $f | grep -c -i copyright` -gt 0 ; then - user_copyright=`grep -i copyright $f | grep $user | grep -c $year` - if test $user_copyright -lt 1 ; then - missing_copyright_year="$missing_copyright_year $f" - fi - fi - done - fi - -if test -n "$missing_copyright_year" ; then - echo "Missing current year in the copyright notice of the following files:" - for f in $missing_copyright_year ; do - echo " $f" - done - echo "Commit aborted." - exit 1 - fi - -#------------------------------------------------------------------------------- -# Check the formatting of all C files. - -cfiles="" -for f in $files ; do - if test `dirname $f` = "src/ALAC" ; then - echo "Skipping cstyle checking on $f" - elif test `echo $f | grep -c "\.[ch]$"` -gt 0 ; then - cfiles="$cfiles $f" - fi - done - -if test -n "$cfiles" ; then - Scripts/cstyle.py $cfiles - if test $? -ne 0 ; then - echo - echo "Commit aborted. Fix the above error before trying again." - exit 1 - fi - fi - -#------------------------------------------------------------------------------- -# Prevent files with non-ascii filenames from being committed. - -if test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 ; then - echo "Error: Attempt to add a non-ascii file name." - echo - echo "This can cause problems if you want to work" - echo "with people on other platforms." - echo - echo "To be portable it is advisable to rename the file ..." - echo - echo "Commit aborted." - exit 1 - fi - -exit 0 diff --git a/libs/libsndfile/Scripts/linux-to-win-cross-configure.sh b/libs/libsndfile/Scripts/linux-to-win-cross-configure.sh deleted file mode 100644 index c1fdc072b3..0000000000 --- a/libs/libsndfile/Scripts/linux-to-win-cross-configure.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -case "$1" in - w32) - compiler_name=i686-w64-mingw32 - ;; - w64) - compiler_name=x86_64-w64-mingw32 - ;; - *) - echo "$0 (w32|w64) " - exit 0 - ;; - esac - -shift - -build_cpu=$(dpkg-architecture -qDEB_BUILD_GNU_CPU) -build_host=$build_cpu-linux - -./configure --host=$compiler_name --target=$compiler_name --build=$build_host \ - --program-prefix='' --disable-sqlite --disable-static $@ diff --git a/libs/libsndfile/TODO b/libs/libsndfile/TODO deleted file mode 100644 index f6da6dff6a..0000000000 --- a/libs/libsndfile/TODO +++ /dev/null @@ -1,42 +0,0 @@ -Here's a list of what I (erikd AT mega-nerd DOT com) think needs to be -done. The list is by no means exhaustive and people are encouraged to -email me with suggestions. - - o Add pipe in/out capabilities. libsndfile should be able to read - its input from a pipe and write its output to a pipe. - - o Add checks of the error state after fseek???? Use ferror (). - - o Modify tests/lossy_comp_test.c to add tests for stereo files. - - o Testing compilation and correctness on more platforms. - - o Improve testing routines. Must test all combinations of inputs - and outputs. - - o Test sf_seek function on write??? - - o Add more sound file formats. People should contact me with their - requirements. - - o Add support for accessing sound formats with multiple audio - data sections (ie samples within tracker files, Soundfont II and - multi-sample sampler formats). - - o Add an interface to allow reading and writing of sample loop points - and other info within AIFF and other file formats. This must be a - general solution. - - o Improve documentation. Is HTML documentation good enough? - - o Look into the possibility of optional sample rate convert on file - read. - -As I am the person who knows libsndfile best, I can probably implement -any new features faster than anybody else (and you can spend your time -writing applications with libsndfile). All I need is some -documentation and some sample files. Please contact me before emailing -me documentation and sample files. I would much rather pull them off -the web than have them clogging up my email inbox. - - diff --git a/libs/libsndfile/Win32/Makefile.am b/libs/libsndfile/Win32/Makefile.am deleted file mode 100644 index 4fe8efa7b9..0000000000 --- a/libs/libsndfile/Win32/Makefile.am +++ /dev/null @@ -1,4 +0,0 @@ -## Process this file with automake to produce Makefile.in - -EXTRA_DIST = README-precompiled-dll.txt testprog.c - diff --git a/libs/libsndfile/Win32/README-precompiled-dll.txt b/libs/libsndfile/Win32/README-precompiled-dll.txt deleted file mode 100644 index bde8124219..0000000000 --- a/libs/libsndfile/Win32/README-precompiled-dll.txt +++ /dev/null @@ -1,40 +0,0 @@ -Notes on Using the Pre-compiled libsndfile DLL. -=============================================== - -In order to use this pre-compiled DLL with Visual Studio, you will need to -generate a .LIB file from the DLL. - -This can be achieved as follows: - - 1) In a CMD window, change to the directory containing this file and - run the command: - - lib /machine:i386 /def:libsndfile-1.def - -You now have two files: - - libsndfile-1.dll - libsndfile-1.lib - -to be used with VisualStudio. - -If the lib command fails with a command saying "'lib' is not recognized as -an internal or external command, operable program or batch file", you need -to find the location of "lib.exe" and add that directory to your PATH -environment variable. Another alternative is to use the "Visual Studio 2005 -Command Prompt" Start menu item: - - Start -> - All Programs -> - Visual Studio 2005 -> - Visual Studio Tools -> - Visual Studio 2005 Command Prompt - -If for some reason these instructions don't work for you or you are still -not able to use the libsndfile DLL with you project, please do not contact -the main author of libsndfile. Instead, join the libsndfile-users mailing -list : - - http://www.mega-nerd.com/libsndfile/lists.html - -and ask a question there. diff --git a/libs/libsndfile/Win32/testprog.c b/libs/libsndfile/Win32/testprog.c deleted file mode 100644 index d26d844adf..0000000000 --- a/libs/libsndfile/Win32/testprog.c +++ /dev/null @@ -1,16 +0,0 @@ -/* Simple test program to make sure that Win32 linking to libsndfile is -** working. -*/ - -#include - -#include "sndfile.h" - -int -main (void) -{ static char strbuffer [256] ; - sf_command (NULL, SFC_GET_LIB_VERSION, strbuffer, sizeof (strbuffer)) ; - puts (strbuffer) ; - return 0 ; -} - diff --git a/libs/libsndfile/acinclude.m4 b/libs/libsndfile/acinclude.m4 deleted file mode 100644 index c411cebbda..0000000000 --- a/libs/libsndfile/acinclude.m4 +++ /dev/null @@ -1,637 +0,0 @@ -dnl By default, many hosts won't let programs access large files; -dnl one must use special compiler options to get large-file access to work. -dnl For more details about this brain damage please see: -dnl http://www.sas.com/standards/large.file/x_open.20Mar96.html - -dnl Written by Paul Eggert . - -m4_include([M4/gcc_version.m4]) -m4_include([M4/octave.m4]) -m4_include([M4/mkoctfile_version.m4]) -m4_include([M4/extra_pkg.m4]) -m4_include([M4/lrint.m4]) -m4_include([M4/lrintf.m4]) -m4_include([M4/clang.m4]) -m4_include([M4/really_gcc.m4]) -m4_include([M4/stack_protect.m4]) -m4_include([M4/clip_mode.m4]) -m4_include([M4/add_cflags.m4]) -m4_include([M4/add_cxxflags.m4]) -m4_include([M4/flexible_array.m4]) -m4_include([M4/endian.m4]) -m4_include([M4/extra_largefile.m4]) - -dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE. -dnl AC_SYS_EXTRA_LARGEFILE_FLAGS(FLAGSNAME) -AC_DEFUN([AC_SYS_EXTRA_LARGEFILE_FLAGS], - [AC_CACHE_CHECK([for $1 value to request large file support], - ac_cv_sys_largefile_$1, - [ac_cv_sys_largefile_$1=`($GETCONF LFS_$1) 2>/dev/null` || { - ac_cv_sys_largefile_$1=no - ifelse($1, CFLAGS, - [case "$host_os" in - # IRIX 6.2 and later require cc -n32. -changequote(, )dnl - irix6.[2-9]* | irix6.1[0-9]* | irix[7-9].* | irix[1-9][0-9]*) -changequote([, ])dnl - if test "$GCC" != yes; then - ac_cv_sys_largefile_CFLAGS=-n32 - fi - ac_save_CC="$CC" - CC="$CC $ac_cv_sys_largefile_CFLAGS" - AC_TRY_LINK(, , , ac_cv_sys_largefile_CFLAGS=no) - CC="$ac_save_CC" - esac]) - }])]) - -dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE. -dnl AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(VAR, VAL) -AC_DEFUN([AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND], - [case $2 in - no) ;; - ?*) - case "[$]$1" in - '') $1=$2 ;; - *) $1=[$]$1' '$2 ;; - esac ;; - esac]) - -dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE. -dnl AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(C-MACRO, CACHE-VAR, COMMENT, CODE-TO-SET-DEFAULT) -AC_DEFUN([AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE], - [AC_CACHE_CHECK([for $1], $2, - [$2=no -changequote(, )dnl - $4 - for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do - case "$ac_flag" in - -D$1) - $2=1 ;; - -D$1=*) - $2=`expr " $ac_flag" : '[^=]*=\(.*\)'` ;; - esac - done -changequote([, ])dnl - ]) - if test "[$]$2" != no; then - AC_DEFINE_UNQUOTED([$1], [$]$2, [$3]) - fi]) - -AC_DEFUN([AC_SYS_EXTRA_LARGEFILE], - [AC_REQUIRE([AC_CANONICAL_HOST]) - AC_ARG_ENABLE(largefile, - [ --disable-largefile omit support for large files]) - if test "$enable_largefile" != no; then - AC_CHECK_TOOL(GETCONF, getconf) - AC_SYS_EXTRA_LARGEFILE_FLAGS(CFLAGS) - AC_SYS_EXTRA_LARGEFILE_FLAGS(LDFLAGS) - AC_SYS_EXTRA_LARGEFILE_FLAGS(LIBS) - - for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do - case "$ac_flag" in - no) ;; - -D_FILE_OFFSET_BITS=*) ;; - -D_LARGEFILE_SOURCE | -D_LARGEFILE_SOURCE=*) ;; - -D_LARGE_FILES | -D_LARGE_FILES=*) ;; - -D?* | -I?*) - AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CPPFLAGS, "$ac_flag") ;; - *) - AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CFLAGS, "$ac_flag") ;; - esac - done - AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LDFLAGS, "$ac_cv_sys_largefile_LDFLAGS") - AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LIBS, "$ac_cv_sys_largefile_LIBS") - AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS, - ac_cv_sys_file_offset_bits, - [Number of bits in a file offset, on hosts where this is settable.]) - [case "$host_os" in - # HP-UX 10.20 and later - hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*) - ac_cv_sys_file_offset_bits=64 ;; - esac] - AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGEFILE_SOURCE, - ac_cv_sys_largefile_source, - [Define to make fseeko etc. visible, on some hosts.], - [case "$host_os" in - # HP-UX 10.20 and later - hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*) - ac_cv_sys_largefile_source=1 ;; - esac]) - AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGE_FILES, - ac_cv_sys_large_files, - [Define for large files, on AIX-style hosts.], - [case "$host_os" in - # AIX 4.2 and later - aix4.[2-9]* | aix4.1[0-9]* | aix[5-9].* | aix[1-9][0-9]*) - ac_cv_sys_large_files=1 ;; - esac]) - fi - ]) - - - - - - -dnl @synopsis AC_C_FIND_ENDIAN -dnl -dnl Determine endian-ness of target processor. -dnl @version 1.1 Mar 03 2002 -dnl @author Erik de Castro Lopo -dnl -dnl Majority written from scratch to replace the standard autoconf macro -dnl AC_C_BIGENDIAN. Only part remaining from the original it the invocation -dnl of the AC_TRY_RUN macro. -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. - -dnl Find endian-ness in the following way: -dnl 1) Look in . -dnl 2) If 1) fails, look in and . -dnl 3) If 1) and 2) fails and not cross compiling run a test program. -dnl 4) If 1) and 2) fails and cross compiling then guess based on target. - -AC_DEFUN([AC_C_FIND_ENDIAN], -[AC_CACHE_CHECK(processor byte ordering, - ac_cv_c_byte_order, - -# Initialize to unknown -ac_cv_c_byte_order=unknown - -if test x$ac_cv_header_endian_h = xyes ; then - - # First try which should set BYTE_ORDER. - - [AC_TRY_LINK([ - #include - #if BYTE_ORDER != LITTLE_ENDIAN - not big endian - #endif - ], return 0 ;, - ac_cv_c_byte_order=little - )] - - [AC_TRY_LINK([ - #include - #if BYTE_ORDER != BIG_ENDIAN - not big endian - #endif - ], return 0 ;, - ac_cv_c_byte_order=big - )] - - fi - -if test $ac_cv_c_byte_order = unknown ; then - - [AC_TRY_LINK([ - #include - #include - #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN - bogus endian macros - #endif - ], return 0 ;, - - [AC_TRY_LINK([ - #include - #include - #if BYTE_ORDER != LITTLE_ENDIAN - not big endian - #endif - ], return 0 ;, - ac_cv_c_byte_order=little - )] - - [AC_TRY_LINK([ - #include - #include - #if BYTE_ORDER != LITTLE_ENDIAN - not big endian - #endif - ], return 0 ;, - ac_cv_c_byte_order=little - )] - - )] - - fi - -if test $ac_cv_c_byte_order = unknown ; then - if test $cross_compiling = yes ; then - # This is the last resort. Try to guess the target processor endian-ness - # by looking at the target CPU type. - [ - case "$target_cpu" in - alpha* | i?86* | mipsel* | ia64*) - ac_cv_c_big_endian=0 - ac_cv_c_little_endian=1 - ;; - - m68* | mips* | powerpc* | hppa* | sparc*) - ac_cv_c_big_endian=1 - ac_cv_c_little_endian=0 - ;; - - esac - ] - else - AC_TRY_RUN( - [[ - int main (void) - { /* Are we little or big endian? From Harbison&Steele. */ - union - { long l ; - char c [sizeof (long)] ; - } u ; - u.l = 1 ; - return (u.c [sizeof (long) - 1] == 1); - } - ]], , ac_cv_c_byte_order=big, - ac_cv_c_byte_order=unknown - ) - - AC_TRY_RUN( - [[int main (void) - { /* Are we little or big endian? From Harbison&Steele. */ - union - { long l ; - char c [sizeof (long)] ; - } u ; - u.l = 1 ; - return (u.c [0] == 1); - }]], , ac_cv_c_byte_order=little, - ac_cv_c_byte_order=unknown - ) - fi - fi - -) -] - -if test $ac_cv_c_byte_order = big ; then - ac_cv_c_big_endian=1 - ac_cv_c_little_endian=0 -elif test $ac_cv_c_byte_order = little ; then - ac_cv_c_big_endian=0 - ac_cv_c_little_endian=1 -else - ac_cv_c_big_endian=0 - ac_cv_c_little_endian=0 - - fi - -)# AC_C_FIND_ENDIAN - - - - - -dnl @synopsis AC_C99_FLEXIBLE_ARRAY -dnl -dnl Dose the compiler support the 1999 ISO C Standard "stuct hack". -dnl @version 1.1 Mar 15 2004 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. - -AC_DEFUN([AC_C99_FLEXIBLE_ARRAY], -[AC_CACHE_CHECK(C99 struct flexible array support, - ac_cv_c99_flexible_array, - -# Initialize to unknown -ac_cv_c99_flexible_array=no - -AC_TRY_LINK([[ - #include - typedef struct { - int k; - char buffer [] ; - } MY_STRUCT ; - ]], - [ MY_STRUCT *p = calloc (1, sizeof (MY_STRUCT) + 42); ], - ac_cv_c99_flexible_array=yes, - ac_cv_c99_flexible_array=no - ))] -) # AC_C99_FLEXIBLE_ARRAY - - - - - -dnl @synopsis AC_C99_FUNC_LRINT -dnl -dnl Check whether C99's lrint function is available. -dnl @version 1.3 Feb 12 2002 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. -dnl -AC_DEFUN([AC_C99_FUNC_LRINT], -[AC_CACHE_CHECK(for lrint, - ac_cv_c99_lrint, -[ -lrint_save_CFLAGS=$CFLAGS -CFLAGS="-lm" -AC_TRY_LINK([ -#define _ISOC9X_SOURCE 1 -#define _ISOC99_SOURCE 1 -#define __USE_ISOC99 1 -#define __USE_ISOC9X 1 - -#include -], if (!lrint(3.14159)) lrint(2.7183);, ac_cv_c99_lrint=yes, ac_cv_c99_lrint=no) - -CFLAGS=$lrint_save_CFLAGS - -]) - -if test "$ac_cv_c99_lrint" = yes; then - AC_DEFINE(HAVE_LRINT, 1, - [Define if you have C99's lrint function.]) -fi -])# AC_C99_FUNC_LRINT -dnl @synopsis AC_C99_FUNC_LRINTF -dnl -dnl Check whether C99's lrintf function is available. -dnl @version 1.3 Feb 12 2002 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. -dnl -AC_DEFUN([AC_C99_FUNC_LRINTF], -[AC_CACHE_CHECK(for lrintf, - ac_cv_c99_lrintf, -[ -AC_TRY_LINK([ -#define _ISOC9X_SOURCE 1 -#define _ISOC99_SOURCE 1 -#define __USE_ISOC99 1 -#define __USE_ISOC9X 1 - -#include -], if (!lrintf(3.14159)) lrintf(2.7183);, ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no) -]) - -if test "$ac_cv_c99_lrintf" = yes; then - AC_DEFINE(HAVE_LRINTF, 1, - [Define if you have C99's lrintf function.]) -fi -])# AC_C99_FUNC_LRINTF - - - - -dnl @synopsis AC_C99_FUNC_LLRINT -dnl -dnl Check whether C99's llrint function is available. -dnl @version 1.1 Sep 30 2002 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. -dnl -AC_DEFUN([AC_C99_FUNC_LLRINT], -[AC_CACHE_CHECK(for llrint, - ac_cv_c99_llrint, -[ -AC_TRY_LINK([ -#define _ISOC9X_SOURCE 1 -#define _ISOC99_SOURCE 1 -#define __USE_ISOC99 1 -#define __USE_ISOC9X 1 - -#include -#include -], int64_t x ; x = llrint(3.14159) ;, ac_cv_c99_llrint=yes, ac_cv_c99_llrint=no) -]) - -if test "$ac_cv_c99_llrint" = yes; then - AC_DEFINE(HAVE_LLRINT, 1, - [Define if you have C99's llrint function.]) -fi -])# AC_C99_FUNC_LLRINT - - - -dnl @synopsis AC_C_CLIP_MODE -dnl -dnl Determine the clipping mode when converting float to int. -dnl @version 1.0 May 17 2003 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. - - - -dnl Find the clipping mode in the following way: -dnl 1) If we are not cross compiling test it. -dnl 2) IF we are cross compiling, assume that clipping isn't done correctly. - -AC_DEFUN([AC_C_CLIP_MODE], -[AC_CACHE_CHECK(processor clipping capabilities, - ac_cv_c_clip_type, - -# Initialize to unknown -ac_cv_c_clip_positive=unknown -ac_cv_c_clip_negative=unknown - -if test $ac_cv_c_clip_positive = unknown ; then - AC_TRY_RUN( - [[ - #define _ISOC9X_SOURCE 1 - #define _ISOC99_SOURCE 1 - #define __USE_ISOC99 1 - #define __USE_ISOC9X 1 - #include - int main (void) - { double fval ; - int k, ival ; - - fval = 1.0 * 0x7FFFFFFF ; - for (k = 0 ; k < 100 ; k++) - { ival = (lrint (fval)) >> 24 ; - if (ival != 127) - return 1 ; - - fval *= 1.2499999 ; - } ; - - return 0 ; - } - ]], - ac_cv_c_clip_positive=yes, - ac_cv_c_clip_positive=no, - ac_cv_c_clip_positive=unknown - ) - - AC_TRY_RUN( - [[ - #define _ISOC9X_SOURCE 1 - #define _ISOC99_SOURCE 1 - #define __USE_ISOC99 1 - #define __USE_ISOC9X 1 - #include - int main (void) - { double fval ; - int k, ival ; - - fval = -8.0 * 0x10000000 ; - for (k = 0 ; k < 100 ; k++) - { ival = (lrint (fval)) >> 24 ; - if (ival != -128) - return 1 ; - - fval *= 1.2499999 ; - } ; - - return 0 ; - } - ]], - ac_cv_c_clip_negative=yes, - ac_cv_c_clip_negative=no, - ac_cv_c_clip_negative=unknown - ) - fi - -if test $ac_cv_c_clip_positive = yes ; then - ac_cv_c_clip_positive=1 -else - ac_cv_c_clip_positive=0 - fi - -if test $ac_cv_c_clip_negative = yes ; then - ac_cv_c_clip_negative=1 -else - ac_cv_c_clip_negative=0 - fi - -[[ -case "$ac_cv_c_clip_positive$ac_cv_c_clip_negative" in - "00") - ac_cv_c_clip_type="none" - ;; - "10") - ac_cv_c_clip_type="positive" - ;; - "01") - ac_cv_c_clip_type="negative" - ;; - "11") - ac_cv_c_clip_type="both" - ;; - esac - ]] - -) -] - -)# AC_C_CLIP_MODE - - -dnl @synopsis AC_ADD_CFLAGS -dnl -dnl Add the given option to CFLAGS, if it doesn't break the compiler - -AC_DEFUN([AC_ADD_CFLAGS], -[AC_MSG_CHECKING([if $CC accepts $1]) - ac_add_cflags__old_cflags="$CFLAGS" - CFLAGS="$CFLAGS $1" - AC_TRY_LINK([#include ], - [printf("Hello, World!\n"); return 0;], - AC_MSG_RESULT([yes]), - AC_MSG_RESULT([no]) - CFLAGS="$ac_add_cflags__old_cflags") -]) - - - -dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not) -dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page -dnl also defines GSTUFF_PKG_ERRORS on error -AC_DEFUN([PKG_CHECK_MODULES], [ - succeeded=no - - if test -z "$PKG_CONFIG"; then - AC_PATH_PROG(PKG_CONFIG, pkg-config, no) - fi - - if test "$PKG_CONFIG" = "no" ; then - echo "*** The pkg-config script could not be found. Make sure it is" - echo "*** in your path, or set the PKG_CONFIG environment variable" - echo "*** to the full path to pkg-config." - echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." - else - PKG_CONFIG_MIN_VERSION=0.9.0 - if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then - AC_MSG_CHECKING(for $2) - - if $PKG_CONFIG --exists "$2" ; then - AC_MSG_RESULT(yes) - succeeded=yes - - AC_MSG_CHECKING($1_CFLAGS) - $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` - AC_MSG_RESULT($$1_CFLAGS) - - AC_MSG_CHECKING($1_LIBS) - $1_LIBS=`$PKG_CONFIG --libs "$2"` - AC_MSG_RESULT($$1_LIBS) - else - $1_CFLAGS="" - $1_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. - $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` - ifelse([$4], ,echo $$1_PKG_ERRORS,) - fi - - AC_SUBST($1_CFLAGS) - AC_SUBST($1_LIBS) - else - echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." - echo "*** See http://www.freedesktop.org/software/pkgconfig" - fi - fi - - if test $succeeded = yes; then - ifelse([$3], , :, [$3]) - else - ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) - fi -]) - - - - -ifelse(dnl - - Do not edit or modify anything in this comment block. - The arch-tag line is a file identity tag for the GNU Arch - revision control system. - - arch-tag: bc38294d-bb5c-42ad-90b9-779def5eaab7 - -)dnl diff --git a/libs/libsndfile/autogen.sh b/libs/libsndfile/autogen.sh deleted file mode 100644 index 5047159fe4..0000000000 --- a/libs/libsndfile/autogen.sh +++ /dev/null @@ -1,179 +0,0 @@ -#!/bin/sh -# Run this to set up the build system: configure, makefiles, etc. -# (based on the version in enlightenment's cvs) - -package="libsndfile" - -ACLOCAL_FLAGS="-I M4" - -olddir=`pwd` -srcdir=`dirname $0` -test -z "$srcdir" && srcdir=. - -cd "$srcdir" -DIE=0 - -printf "checking for autogen ... " -result="yes" -(autogen --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have GNU autogen installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - result="no" - DIE=1 -} -echo $result - -printf "checking for autoconf ... " -result="yes" -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - result="no" - DIE=1 -} -echo $result - -VERSIONGREP="sed -e s/.*[^0-9\.]\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/" -VERSIONMKMAJ="sed -e s/\([0-9][0-9]*\)[^0-9].*/\\1/" -VERSIONMKMIN="sed -e s/.*[0-9][0-9]*\.//" - -# do we need automake? -if test -r Makefile.am; then - AM_OPTIONS=`fgrep AUTOMAKE_OPTIONS Makefile.am` - AM_NEEDED=`echo $AM_OPTIONS | $VERSIONGREP` - if test x"$AM_NEEDED" = "x$AM_OPTIONS"; then - AM_NEEDED="" - fi - if test -z $AM_NEEDED; then - printf "checking for automake ... " - AUTOMAKE=automake - ACLOCAL=aclocal - if ($AUTOMAKE --version < /dev/null > /dev/null 2>&1); then - echo "yes" - else - echo "no" - AUTOMAKE= - fi - else - printf "checking for automake $AM_NEEDED or later ... " - majneeded=`echo $AM_NEEDED | $VERSIONMKMAJ` - minneeded=`echo $AM_NEEDED | $VERSIONMKMIN` - for am in automake-$AM_NEEDED automake$AM_NEEDED \ - automake automake-1.7 automake-1.8 automake-1.9 automake-1.10; do - ($am --version < /dev/null > /dev/null 2>&1) || continue - ver=`$am --version < /dev/null | head -n 1 | $VERSIONGREP` - maj=`echo $ver | $VERSIONMKMAJ` - min=`echo $ver | $VERSIONMKMIN` - if test $maj -eq $majneeded -a $min -ge $minneeded; then - AUTOMAKE=$am - echo $AUTOMAKE - break - fi - done - test -z $AUTOMAKE && echo "no" - printf "checking for aclocal $AM_NEEDED or later ... " - for ac in aclocal-$AM_NEEDED aclocal$AM_NEEDED \ - aclocal aclocal-1.7 aclocal-1.8 aclocal-1.9 aclocal-1.10; do - ($ac --version < /dev/null > /dev/null 2>&1) || continue - ver=`$ac --version < /dev/null | head -n 1 | $VERSIONGREP` - maj=`echo $ver | $VERSIONMKMAJ` - min=`echo $ver | $VERSIONMKMIN` - if test $maj -eq $majneeded -a $min -ge $minneeded; then - ACLOCAL=$ac - echo $ACLOCAL - break - fi - done - test -z $ACLOCAL && echo "no" - fi - test -z $AUTOMAKE || test -z $ACLOCAL && { - echo - echo "You must have automake installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - exit 1 - } -fi - -printf "checking for libtool ... " -for LIBTOOLIZE in libtoolize glibtoolize nope; do - ($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 && break -done -if test x$LIBTOOLIZE = xnope; then - echo "nope." - LIBTOOLIZE=libtoolize -else - echo $LIBTOOLIZE -fi -($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have libtool installed to compile $package." - echo "Download the appropriate package for your system," - echo "or get the source from one of the GNU ftp sites" - echo "listed in http://www.gnu.org/order/ftp.html" - DIE=1 -} - -printf "checking for pkg-config ... " -result="yes" -(pkg-config --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have pkg-config installed to compile $package." - echo "Download the appropriate package for your distribution." - result="no" - DIE=1 -} -echo $result - - -printf "checking for python ... " -result="yes" -(python --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have Python installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at http://python.org/" - result="no" - DIE=1 -} -echo $result - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test ! -d Cfg ; then - echo "Creating 'Cfg' directory." - mkdir Cfg -fi - -echo "Generating configuration files for $package, please wait ... " - -echo " $ACLOCAL $ACLOCAL_FLAGS" -$ACLOCAL $ACLOCAL_FLAGS || exit 1 -echo " $LIBTOOLIZE --automake --force" -$LIBTOOLIZE --automake --force || exit 1 -echo " autoheader" -autoheader || exit 1 -echo " $AUTOMAKE --add-missing $AUTOMAKE_FLAGS" -$AUTOMAKE --add-missing $AUTOMAKE_FLAGS || exit 1 -echo " autoconf" -autoconf || exit 1 - -cd $olddir - -fprecommit=.git/hooks/pre-commit -if test ! -f $fprecommit ; then - echo - echo "Installing git pre-commit hook for this project." - cat > $fprecommit << 'foobar' -#!/bin/sh -exec Scripts/git-pre-commit-hook -foobar - chmod u+x $fprecommit - echo - fi diff --git a/libs/libsndfile/binheader_readf_check.py b/libs/libsndfile/binheader_readf_check.py deleted file mode 100644 index 774abcd988..0000000000 --- a/libs/libsndfile/binheader_readf_check.py +++ /dev/null @@ -1,62 +0,0 @@ -g#!/usr/bin/python - -import re, string, sys - -def trim_function_and_params (section): - k = string.find (section, "(") + 1 - brackets = 1 - section_len = len (section) - while k < section_len: - if section [k] == '(': - brackets += 1 - elif section [k] == ')': - brackets -= 1 - if brackets < 1: - return section [:k+1] - k += 1 - print "Whoops!!!!" - sys.exit (1) - -def get_function_calls (filedata): - filedata = string.split (filedata, "psf_binheader_readf") - filedata = filedata [1:] - - func_calls = [] - for section in filedata: - section = "psf_binheader_readf" + section - func_calls.append (trim_function_and_params (section)) - - return func_calls - -def search_for_problems (filename): - filedata = open (filename, "r").read () - - if len (filedata) < 1: - print "Error : file '%s' contains no data." % filename - sys.exit (1) - - count = 0 - - calls = get_function_calls (filedata) - for call in calls: - if string.find (call, "sizeof") > 0: - print "Found : ", call - count += 1 - - if count == 0: - print "%-20s : No problems found." % filename - else: - print "\n%-20s : Found %d errors." % (filename, count) - sys.exit (1) - return - - -#------------------------------------------------------------------------------- - -if len (sys.argv) < 2: - print "Usage : %s " % sys.argv [0] - sys.exit (1) - -for file in sys.argv [1:]: - search_for_problems (file) - diff --git a/libs/libsndfile/configure.ac b/libs/libsndfile/configure.ac deleted file mode 100644 index 5893db2a66..0000000000 --- a/libs/libsndfile/configure.ac +++ /dev/null @@ -1,697 +0,0 @@ -# Copyright (C) 1999-2013 Erik de Castro Lopo . - -dnl Require autoconf version -AC_PREREQ(2.57) - -AC_INIT([libsndfile],[1.0.26pre5],[sndfile@mega-nerd.com], - [libsndfile],[http://www.mega-nerd.com/libsndfile/]) - -# Put config stuff in Cfg. -AC_CONFIG_AUX_DIR(Cfg) - -AC_CONFIG_SRCDIR([src/sndfile.c]) -AC_CANONICAL_TARGET([]) - -AC_CONFIG_MACRO_DIR([M4]) -AC_CONFIG_HEADERS([src/config.h]) - -CFLAGS="$CFLAGS $CONFIGURE_CFLAGS" -CXXFLAGS="$CXXFLAGS $CONFIGURE_CXXFLAGS" -LDFLAGS="$LDFLAGS $CONFIGURE_LDFLAGS" - -AM_INIT_AUTOMAKE -AC_SUBST(ACLOCAL_AMFLAGS, "-I M4") -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) - -AC_LANG([C]) - -AC_PROG_CC_STDC -AC_USE_SYSTEM_EXTENSIONS -AM_PROG_CC_C_O -AC_PROG_CXX - -MN_C_COMPILER_IS_CLANG -MN_GCC_REALLY_IS_GCC - -AC_PROG_SED - -# Do not check for F77. -define([AC_LIBTOOL_LANG_F77_CONFIG], [:])dnl - -AM_PROG_LIBTOOL -LT_PROG_RC - -AC_PROG_INSTALL -AC_PROG_LN_S - -AC_CHECK_PROG(HAVE_AUTOGEN, autogen, yes, no) -AC_CHECK_PROG(HAVE_WINE, wine, yes, no) -AC_CHECK_PROG(HAVE_XCODE_SELECT, xcode-select, yes, no) - -#------------------------------------------------------------------------------------ -# Rules for library version information: -# -# 1. Start with version information of `0:0:0' for each libtool library. -# 2. Update the version information only immediately before a public release of -# your software. More frequent updates are unnecessary, and only guarantee -# that the current interface number gets larger faster. -# 3. If the library source code has changed at all since the last update, then -# increment revision (`c:r:a' becomes `c:r+1:a'). -# 4. If any interfaces have been added, removed, or changed since the last update, -# increment current, and set revision to 0. -# 5. If any interfaces have been added since the last public release, then increment -# age. -# 6. If any interfaces have been removed since the last public release, then set age -# to 0. - -CLEAN_VERSION=`echo $PACKAGE_VERSION | $SED "s/p.*//"` -VERSION_MINOR=`echo $CLEAN_VERSION | $SED "s/.*\.//"` - -SHARED_VERSION_INFO="1:$VERSION_MINOR:0" - -#------------------------------------------------------------------------------------ - -AC_HEADER_STDC - -AC_CHECK_HEADERS(endian.h) -AC_CHECK_HEADERS(byteswap.h) -AC_CHECK_HEADERS(locale.h) -AC_CHECK_HEADERS(sys/time.h) - -AC_HEADER_SYS_WAIT - -AC_CHECK_DECLS(S_IRGRP) -if test x$ac_cv_have_decl_S_IRGRP = xyes ; then - AC_DEFINE_UNQUOTED([HAVE_DECL_S_IRGRP],1,[Set to 1 if S_IRGRP is defined.]) -else - AC_DEFINE_UNQUOTED([HAVE_DECL_S_IRGRP],0) - fi - -AM_CONDITIONAL([LINUX_MINGW_CROSS_TEST], - [test "$build_os:$target_os:$host_os:$HAVE_WINE" = "linux-gnu:mingw32msvc:mingw32msvc:yes"]) - -#==================================================================================== -# Couple of initializations here. Fill in real values later. - -SHLIB_VERSION_ARG="" - -#==================================================================================== -# Finished checking, handle options. - -AC_ARG_ENABLE(experimental, - AC_HELP_STRING([--enable-experimental], [enable experimental code])) - -EXPERIMENTAL_CODE=0 -if test x$enable_experimental = xyes ; then - EXPERIMENTAL_CODE=1 - fi -AC_DEFINE_UNQUOTED([ENABLE_EXPERIMENTAL_CODE],${EXPERIMENTAL_CODE}, [Set to 1 to enable experimental code.]) - -AC_ARG_ENABLE(werror, - AC_HELP_STRING([--enable-werror], [enable -Werror in all Makefiles])) - -AC_ARG_ENABLE(stack-smash-protection, - AC_HELP_STRING([--enable-stack-smash-protection], [Enable GNU GCC stack smash protection])) - -AC_ARG_ENABLE(gcc-pipe, - AC_HELP_STRING([--disable-gcc-pipe], [disable gcc -pipe option])) - -AC_ARG_ENABLE(gcc-opt, - AC_HELP_STRING([--disable-gcc-opt], [disable gcc optimisations])) - -AC_ARG_ENABLE(cpu-clip, - AC_HELP_STRING([--disable-cpu-clip], [disable tricky cpu specific clipper])) - -AC_ARG_ENABLE(bow-docs, - AC_HELP_STRING([--enable-bow-docs], [enable black-on-white html docs])) - -AC_ARG_ENABLE(sqlite, - AC_HELP_STRING([--disable-sqlite], [disable use of sqlite])) - -AC_ARG_ENABLE(alsa, - AC_HELP_STRING([--disable-alsa], [disable use of ALSA])) - -AC_ARG_ENABLE(external-libs, - AC_HELP_STRING([--disable-external-libs], [disable use of FLAC, Ogg and Vorbis [[default=no]]])) - -AC_ARG_ENABLE(octave, - AC_HELP_STRING([--enable-octave], [disable building of GNU Octave module])) - -AC_ARG_ENABLE(test-coverage, - AC_HELP_STRING([--enable-test-coverage], [enable test coverage])) -AM_CONDITIONAL([ENABLE_TEST_COVERAGE], [test "$enable_test_coverage" = yes]) - -#==================================================================================== -# Check types and their sizes. - -AC_CHECK_SIZEOF(wchar_t,4) -AC_CHECK_SIZEOF(short,2) -AC_CHECK_SIZEOF(int,4) -AC_CHECK_SIZEOF(long,4) -AC_CHECK_SIZEOF(float,4) -AC_CHECK_SIZEOF(double,4) -AC_CHECK_SIZEOF(void*,8) -AC_CHECK_SIZEOF(size_t,4) -AC_CHECK_SIZEOF(int64_t,8) -AC_CHECK_SIZEOF(long long,8) - -#==================================================================================== -# Find an appropriate type for sf_count_t. -# On systems supporting files larger than 2 Gig, sf_count_t must be a 64 bit value. -# Unfortunately there is more than one way of ensuring this so need to do some -# pretty rigourous testing here. - -# Check for common 64 bit file offset types. -AC_CHECK_SIZEOF(off_t,1) -AC_CHECK_SIZEOF(loff_t,1) -AC_CHECK_SIZEOF(off64_t,1) - -if test "$enable_largefile:$ac_cv_sizeof_off_t" = "no:8" ; then - echo - echo "Error : Cannot disable large file support because sizeof (off_t) == 8." - echo - exit 1 - fi - - -case "$host_os" in - mingw32msvc | mingw32) - TYPEOF_SF_COUNT_T="__int64" - SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" - SIZEOF_SF_COUNT_T=8 - AC_DEFINE([__USE_MINGW_ANSI_STDIO],1,[Set to 1 to use C99 printf/snprintf in MinGW.]) - ;; - *) - SIZEOF_SF_COUNT_T=0 - if test "x$ac_cv_sizeof_off_t" = "x8" ; then - # If sizeof (off_t) is 8, no further checking is needed. - TYPEOF_SF_COUNT_T="int64_t" - SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" - SIZEOF_SF_COUNT_T=8 - elif test "x$ac_cv_sizeof_loff_t" = "x8" ; then - TYPEOF_SF_COUNT_T="int64_t" - SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" - SIZEOF_SF_COUNT_T=8 - elif test "x$ac_cv_sizeof_off64_t" = "x8" ; then - TYPEOF_SF_COUNT_T="int64_t" - SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" - SIZEOF_SF_COUNT_T=8 - else - # Save the old sizeof (off_t) value and then unset it to see if it - # changes when Large File Support is enabled. - pre_largefile_sizeof_off_t=$ac_cv_sizeof_off_t - unset ac_cv_sizeof_off_t - - AC_SYS_LARGEFILE - - if test "x$ac_cv_sys_largefile_CFLAGS" = "xno" ; then - ac_cv_sys_largefile_CFLAGS="" - fi - if test "x$ac_cv_sys_largefile_LDFLAGS" = "xno" ; then - ac_cv_sys_largefile_LDFLAGS="" - fi - if test "x$ac_cv_sys_largefile_LIBS" = "xno" ; then - ac_cv_sys_largefile_LIBS="" - fi - - AC_CHECK_SIZEOF(off_t,1) - - if test "x$ac_cv_sizeof_off_t" = "x8" ; then - TYPEOF_SF_COUNT_T="int64_t" - SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" - elif test "x$TYPEOF_SF_COUNT_T" = "xunknown" ; then - echo - echo "*** The configure process has determined that this system is capable" - echo "*** of Large File Support but has not been able to find a type which" - echo "*** is an unambiguous 64 bit file offset." - echo "*** Please contact the author to help resolve this problem." - echo - AC_MSG_ERROR([[Bad file offset type.]]) - fi - fi - ;; - esac - -if test $SIZEOF_SF_COUNT_T = 4 ; then - SF_COUNT_MAX="0x7FFFFFFF" - fi - -AC_DEFINE_UNQUOTED([TYPEOF_SF_COUNT_T],${TYPEOF_SF_COUNT_T}, [Set to long if unknown.]) -AC_SUBST(TYPEOF_SF_COUNT_T) - -AC_DEFINE_UNQUOTED([SIZEOF_SF_COUNT_T],${SIZEOF_SF_COUNT_T}, [Set to sizeof (long) if unknown.]) -AC_SUBST(SIZEOF_SF_COUNT_T) - -AC_DEFINE_UNQUOTED([SF_COUNT_MAX],${SF_COUNT_MAX}, [Set to maximum allowed value of sf_count_t type.]) -AC_SUBST(SF_COUNT_MAX) - -AC_CHECK_TYPES(ssize_t) -AC_CHECK_SIZEOF(ssize_t,4) - -#==================================================================================== -# Determine endian-ness of target processor. - -MN_C_FIND_ENDIAN - -AC_DEFINE_UNQUOTED(CPU_IS_BIG_ENDIAN, ${ac_cv_c_big_endian}, - [Target processor is big endian.]) -AC_DEFINE_UNQUOTED(CPU_IS_LITTLE_ENDIAN, ${ac_cv_c_little_endian}, - [Target processor is little endian.]) -AC_DEFINE_UNQUOTED(WORDS_BIGENDIAN, ${ac_cv_c_big_endian}, - [Target processor is big endian.]) - -#==================================================================================== -# Check for functions. - -AC_CHECK_FUNCS(malloc calloc realloc free) -AC_CHECK_FUNCS(open read write lseek lseek64) -AC_CHECK_FUNCS(fstat fstat64 ftruncate fsync) -AC_CHECK_FUNCS(snprintf vsnprintf) -AC_CHECK_FUNCS(gmtime gmtime_r localtime localtime_r gettimeofday) -AC_CHECK_FUNCS(mmap getpagesize) -AC_CHECK_FUNCS(setlocale) -AC_CHECK_FUNCS(pipe waitpid) - -AC_CHECK_LIB([m],floor) -AC_CHECK_FUNCS(floor ceil fmod lround) - -MN_C99_FUNC_LRINT -MN_C99_FUNC_LRINTF - -#==================================================================================== -# Check for requirements for building plugins for other languages/enviroments. - -dnl Octave maths environment http://www.octave.org/ -if test x$cross_compiling = xno ; then - if test x$enable_octave = xno ; then - AM_CONDITIONAL(BUILD_OCTAVE_MOD, false) - else - AC_OCTAVE_BUILD - fi -else - AM_CONDITIONAL(BUILD_OCTAVE_MOD, false) - fi - -#==================================================================================== -# Check for Ogg, Vorbis and FLAC. - -HAVE_EXTERNAL_LIBS=0 -EXTERNAL_CFLAGS="" -EXTERNAL_LIBS="" - -# Check for pkg-config outside the if statement. -#PKG_PROG_PKG_CONFIG -#m4_ifdef([PKG_INSTALLDIR], [PKG_INSTALLDIR], AC_SUBST([pkgconfigdir], ${libdir}/pkgconfig)) - -#if test -n "$PKG_CONFIG" ; then -# if test x$enable_external_libs = xno ; then -# AC_MSG_WARN([[*** External libs (FLAC, Ogg, Vorbis) disabled. ***]]) -# else -# PKG_CHECK_MOD_VERSION([FLAC], [flac >= 1.2.1], [ac_cv_flac=yes], [ac_cv_flac=no]) - - # Make sure the FLAC_CFLAGS value is sane. -# FLAC_CFLAGS=`echo $FLAC_CFLAGS | $SED "s|include/FLAC|include|"` - -# PKG_CHECK_MOD_VERSION([OGG], [ogg >= 1.1.3], [ac_cv_ogg=yes], [ac_cv_ogg=no]) - -# if test x$enable_experimental = xyes ; then -# PKG_CHECK_MOD_VERSION([SPEEX], [speex >= 1.2], [ac_cv_speex=yes], [ac_cv_speex=no]) -# else -# SPEEX_CFLAGS="" -# SPEEX_LIBS="" -# fi - - # Vorbis versions earlier than 1.2.3 have bugs that cause the libsndfile - # test suite to fail on MIPS, PowerPC and others. - # See: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=549899 -# PKG_CHECK_MOD_VERSION([VORBIS], [vorbis >= 1.2.3], [ac_cv_vorbis=yes], [ac_cv_vorbis=no]) -# PKG_CHECK_MOD_VERSION([VORBISENC], [vorbisenc >= 1.2.3], [ac_cv_vorbisenc=yes], [ac_cv_vorbisenc=no]) -# enable_external_libs=yes -# fi - -# if test x$ac_cv_flac$ac_cv_ogg$ac_cv_vorbis$ac_cv_vorbisenc = "xyesyesyesyes" ; then -# HAVE_EXTERNAL_LIBS=1 -# enable_external_libs=yes - -# EXTERNAL_CFLAGS="$FLAC_CFLAGS $OGG_CFLAGS $VORBIS_CFLAGS $VORBISENC_CFLAGS $SPEEX_CFLAGS" -# EXTERNAL_LIBS="$FLAC_LIBS $OGG_LIBS $VORBIS_LIBS $VORBISENC_LIBS $SPEEX_LIBS " -# else -# echo -# AC_MSG_WARN([[*** One or more of the external libraries (ie libflac, libogg and]]) -# AC_MSG_WARN([[*** libvorbis) is either missing (possibly only the development]]) -# AC_MSG_WARN([[*** headers) or is of an unsupported version.]]) -# AC_MSG_WARN([[***]]) -# AC_MSG_WARN([[*** Unfortunately, for ease of maintenance, the external libs]]) -# AC_MSG_WARN([[*** are an all or nothing affair.]]) -# echo -# enable_external_libs=no -# fi -# fi - -AC_DEFINE_UNQUOTED([HAVE_EXTERNAL_LIBS], $HAVE_EXTERNAL_LIBS, [Will be set to 1 if flac, ogg and vorbis are available.]) - -#==================================================================================== -# Check for libsqlite3 (only used in regtest). - -ac_cv_sqlite3=no -#if test x$enable_sqlite != xno ; then -# PKG_CHECK_MOD_VERSION([SQLITE3], [sqlite3 >= 3.2], [ac_cv_sqlite3=yes], [ac_cv_sqlite3=no]) -# fi - -if test x$ac_cv_sqlite3 = "xyes" ; then - HAVE_SQLITE3=1 -else - HAVE_SQLITE3=0 - fi - -AC_DEFINE_UNQUOTED([HAVE_SQLITE3],$HAVE_SQLITE3,[Set to 1 if you have libsqlite3.]) - -#==================================================================================== -# Determine if the processor can do clipping on float to int conversions. - -if test x$enable_cpu_clip != "xno" ; then - MN_C_CLIP_MODE -else - echo "checking processor clipping capabilities... disabled" - ac_cv_c_clip_positive=0 - ac_cv_c_clip_negative=0 - fi - -AC_DEFINE_UNQUOTED(CPU_CLIPS_POSITIVE, ${ac_cv_c_clip_positive}, - [Target processor clips on positive float to int conversion.]) -AC_DEFINE_UNQUOTED(CPU_CLIPS_NEGATIVE, ${ac_cv_c_clip_negative}, - [Target processor clips on negative float to int conversion.]) - -#==================================================================================== -# Target OS specific stuff. - -OS_SPECIFIC_CFLAGS="" -OS_SPECIFIC_LINKS="" -os_is_win32=0 -use_windows_api=0 -osx_darwin_version=0 - -case "$host_os" in - darwin* | rhapsody*) - osx_darwin_version=$(echo "$host_os" | sed 's/\..*//;s/darwin//g') - if test x$HAVE_XCODE_SELECT = xyes ; then - developer_path=`xcode-select --print-path` - else - developer_path="/Developer" - fi - OS_SPECIFIC_CFLAGS="-I${developer_path}/Headers/FlatCarbon" - OS_SPECIFIC_LINKS="-framework CoreAudio -framework AudioToolbox -framework CoreFoundation" - ;; - mingw*) - os_is_win32=1 - use_windows_api=1 - OS_SPECIFIC_LINKS="-lwinmm" - ;; - esac - -AC_DEFINE_UNQUOTED(OS_IS_WIN32, ${os_is_win32}, [Set to 1 if compiling for Win32]) -AC_DEFINE_UNQUOTED(USE_WINDOWS_API, ${use_windows_api}, [Set to 1 to use the native windows API]) -AC_DEFINE_UNQUOTED(OSX_DARWIN_VERSION, ${osx_darwin_version}, [The darwin version, no-zero is valid]) -AM_CONDITIONAL(USE_WIN_VERSION_FILE, test ${use_windows_api} -eq 1) - -#==================================================================================== -# Check for ALSA. - -ALSA_LIBS="" - -if test x$enable_alsa != xno ; then - AC_CHECK_HEADERS(alsa/asoundlib.h) - if test x$ac_cv_header_alsa_asoundlib_h = xyes ; then - ALSA_LIBS="-lasound" - enable_alsa=yes - fi - fi - -#==================================================================================== -# Check for OpenBSD's sndio. - -SNDIO_LIBS="" -AC_CHECK_HEADERS(sndio.h) -if test x$ac_cv_header_sndio_h = xyes ; then - SNDIO_LIBS="-lsndio" - fi - -#==================================================================================== -# Test for sanity when cross-compiling. - -if test $ac_cv_sizeof_short != 2 ; then - AC_MSG_WARN([[******************************************************************]]) - AC_MSG_WARN([[*** sizeof (short) != 2. ]]) - AC_MSG_WARN([[******************************************************************]]) - fi - -if test $ac_cv_sizeof_int != 4 ; then - AC_MSG_WARN([[******************************************************************]]) - AC_MSG_WARN([[*** sizeof (int) != 4 ]]) - AC_MSG_WARN([[******************************************************************]]) - fi - -if test $ac_cv_sizeof_float != 4 ; then - AC_MSG_WARN([[******************************************************************]]) - AC_MSG_WARN([[*** sizeof (float) != 4. ]]) - AC_MSG_WARN([[******************************************************************]]) - fi - -if test $ac_cv_sizeof_double != 8 ; then - AC_MSG_WARN([[******************************************************************]]) - AC_MSG_WARN([[*** sizeof (double) != 8. ]]) - AC_MSG_WARN([[******************************************************************]]) - fi - -if test x"$ac_cv_prog_HAVE_AUTOGEN" = "xno" ; then - AC_MSG_WARN([[Touching files in directory tests/.]]) - touch tests/*.c tests/*.h - fi - -#==================================================================================== -# Settings for the HTML documentation. - -if test x$enable_bow_docs = "xyes" ; then - HTML_BGCOLOUR="white" - HTML_FGCOLOUR="black" -else - HTML_BGCOLOUR="black" - HTML_FGCOLOUR="white" - fi - -#==================================================================================== -# Now use the information from the checking stage. - -win32_target_dll=0 -COMPILER_IS_GCC=0 - -if test x$ac_cv_c_compiler_gnu = xyes ; then - MN_ADD_CFLAGS(-std=gnu99) - - MN_GCC_VERSION - - if test "x$GCC_MAJOR_VERSION$GCC_MINOR_VERSION" = "x42" ; then - AC_MSG_WARN([****************************************************************]) - AC_MSG_WARN([** GCC version 4.2 warns about the inline keyword for no good **]) - AC_MSG_WARN([** reason but the maintainers do not see it as a bug. **]) - AC_MSG_WARN([** See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33995 **]) - AC_MSG_WARN([** Using -fgnu-inline to avoid this stupidity. **]) - AC_MSG_WARN([****************************************************************]) - MN_ADD_CFLAGS([-fgnu89-inline]) - fi - - CFLAGS="$CFLAGS -Wall" - CXXFLAGS="$CXXFLAGS -Wall" - - MN_ADD_CFLAGS([-Wextra]) - - AC_LANG_PUSH([C++]) - MN_ADD_CXXFLAGS([-Wextra]) - AC_LANG_POP([C++]) - - MN_ADD_CFLAGS([-Wdeclaration-after-statement]) - MN_ADD_CFLAGS([-Wpointer-arith]) - MN_ADD_CFLAGS([-funsigned-char]) - - MN_ADD_CFLAGS([-D_FORTIFY_SOURCE=2]) - - if test x$enable_stack_smash_protection = "xyes" ; then - XIPH_GCC_STACK_PROTECTOR - XIPH_GXX_STACK_PROTECTOR - fi - - if test x$enable_test_coverage = "xyes" ; then - # MN_ADD_CFLAGS([-ftest-coverage]) - MN_ADD_CFLAGS([-coverage]) - fi - - CFLAGS="$CFLAGS -Wcast-align -Wcast-qual -Wshadow -Wbad-function-cast -Wwrite-strings -Wundef -Wuninitialized -Winit-self -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Waggregate-return" - # -Winline -Wconversion -Wunreachable-code" - CXXFLAGS="$CXXFLAGS -Wcast-align -Wcast-qual -Wshadow -Wwrite-strings -Wctor-dtor-privacy -Wnon-virtual-dtor -Woverloaded-virtual -Wreorder -Wsign-promo -Wundef -Wuninitialized -Winit-self" - - if test "x$enable_gcc_opt" = "xno" ; then - temp_CFLAGS=`echo $CFLAGS | $SED "s/O2/O0/"` - CFLAGS=$temp_CFLAGS - AC_MSG_WARN([[*** Compiler optimisations switched off. ***]]) - fi - - # OS specific tweaks. - case "$host_os" in - darwin* | rhapsody*) - # Disable -Wall, -pedantic and -Wshadow for Apple Darwin/Rhapsody. - # System headers on these systems are broken. - temp_CFLAGS=`echo $CFLAGS | $SED "s/-Wall -pedantic//" | $SED "s/-Wshadow//" | $SED "s/-Waggregate-return//"` - CFLAGS=$temp_CFLAGS - SHLIB_VERSION_ARG="-Wl,-exported_symbols_list -Wl,\$(builddir)/Symbols.darwin" - ;; - linux*|kfreebsd*-gnu*|gnu*) - SHLIB_VERSION_ARG="-Wl,--version-script=\$(builddir)/Symbols.gnu-binutils" - ;; - mingw*) - # Linker flag '-Wl,--out-implib' does not work with mingw cross compiler - # so we don't use it here. - SHLIB_VERSION_ARG="-Wl,\$(builddir)/libsndfile-1.def" - win32_target_dll=1 - if test x"$enable_shared" = xno ; then - win32_target_dll=0 - fi - ;; - os2*) - SHLIB_VERSION_ARG="-Wl,-export-symbols \$(builddir)/Symbols.os2" - ;; - *) - ;; - esac - if test x$enable_gcc_pipe != "xno" ; then - CFLAGS="$CFLAGS -pipe" - fi - - COMPILER_IS_GCC=1 - fi - -if test x$enable_werror = "xyes" ; then - MN_ADD_CFLAGS([-Werror]) - - AC_LANG_PUSH([C++]) - MN_ADD_CXXFLAGS([-Werror]) - AC_LANG_POP([C++]) - fi - - -AC_DEFINE_UNQUOTED([WIN32_TARGET_DLL], ${win32_target_dll}, [Set to 1 if windows DLL is being built.]) -AC_DEFINE_UNQUOTED([COMPILER_IS_GCC], ${COMPILER_IS_GCC}, [Set to 1 if the compile is GNU GCC.]) - -CFLAGS="$CFLAGS $OS_SPECIFIC_CFLAGS" - -if test x"$CFLAGS" = x ; then - echo "Error in configure script. CFLAGS has been screwed up." - exit - fi - -HOST_TRIPLET="${host_cpu}-${host_vendor}-${host_os}" - -AC_DEFINE_UNQUOTED([HOST_TRIPLET], "${HOST_TRIPLET}", [The host triplet of the compiled binary.]) - -if test "$HOST_TRIPLET" = "x86_64-w64-mingw32" ; then - OS_SPECIFIC_LINKS=" -static-libgcc $OS_SPECIFIC_LINKS" - fi - -WIN_RC_VERSION=`echo $PACKAGE_VERSION | $SED -e "s/p.*//" -e "s/\./,/g"` - - -if test "$enable_static" = no ; then - SRC_BINDIR=src/.libs/ - TEST_BINDIR=tests/.libs/ -else - SRC_BINDIR=src/ - TEST_BINDIR=tests/ - fi - -#------------------------------------------------------------------------------- - -AC_SUBST(HOST_TRIPLET) - -AC_SUBST(HTML_BGCOLOUR) -AC_SUBST(HTML_FGCOLOUR) - -AC_SUBST(SHLIB_VERSION_ARG) -AC_SUBST(SHARED_VERSION_INFO) -AC_SUBST(CLEAN_VERSION) -AC_SUBST(WIN_RC_VERSION) - -AC_SUBST(OS_SPECIFIC_CFLAGS) -AC_SUBST(OS_SPECIFIC_LINKS) -AC_SUBST(ALSA_LIBS) -AC_SUBST(SNDIO_LIBS) - -AC_SUBST(EXTERNAL_CFLAGS) -AC_SUBST(EXTERNAL_LIBS) -AC_SUBST(SRC_BINDIR) -AC_SUBST(TEST_BINDIR) - -dnl The following line causes the libtool distributed with the source -dnl to be replaced if the build system has a more recent version. -AC_SUBST(LIBTOOL_DEPS) - -AC_CONFIG_FILES([ \ - src/Makefile man/Makefile examples/Makefile tests/Makefile regtest/Makefile \ - M4/Makefile Win32/Makefile Octave/Makefile programs/Makefile \ - Makefile \ - src/version-metadata.rc tests/test_wrapper.sh tests/pedantic-header-test.sh \ - doc/libsndfile.css Scripts/build-test-tarball.mk libsndfile.spec sndfile.pc \ - src/sndfile.h \ - echo-install-dirs - ]) -AC_OUTPUT - -# Make sure these are executable. -chmod u+x tests/test_wrapper.sh build-test-tarball.mk echo-install-dirs - -#==================================================================================== - -AC_MSG_RESULT([ --=-=-=-=-=-=-=-=-=-= Configuration Complete =-=-=-=-=-=-=-=-=-=- - - Configuration summary : - - libsndfile version : .................. ${VERSION} - - Host CPU : ............................ ${host_cpu} - Host Vendor : ......................... ${host_vendor} - Host OS : ............................. ${host_os} - - Experimental code : ................... ${enable_experimental:-no} - Using ALSA in example programs : ...... ${enable_alsa:-no} - External FLAC/Ogg/Vorbis : ............ ${enable_external_libs:-no} -]) - -if test -z "$PKG_CONFIG" ; then - echo " *****************************************************************" - echo " *** The pkg-config program is missing. ***" - echo " *** External FLAC/Ogg/Vorbis libs cannot be found without it. ***" - echo " *** http://pkg-config.freedesktop.org/wiki/ ***" - echo " *****************************************************************" - echo - fi - -echo " Tools :" -echo -echo " Compiler is Clang : ................... ${mn_cv_c_compiler_clang}" -echo " Compiler is GCC : ..................... ${ac_cv_c_compiler_gnu}" - -if test x$ac_cv_c_compiler_gnu = xyes ; then - echo " GCC version : ......................... ${GCC_VERSION}" - if test $GCC_MAJOR_VERSION -lt 3 ; then - echo "\n" - echo " ** This compiler version allows applications to write" - echo " ** to static strings within the library." - echo " ** Compile with GCC version 3.X or above to avoid this problem." - fi - fi - -./echo-install-dirs - -# Remove symlink created by Scripts/android-configure.sh. -test -h gdbclient && rm -f gdbclient - -(cd src && make genfiles) diff --git a/libs/libsndfile/configure.gnu b/libs/libsndfile/configure.gnu deleted file mode 100644 index 80e107f2be..0000000000 --- a/libs/libsndfile/configure.gnu +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -srcpath=$(dirname $0 2>/dev/null ) || srcpath="." -$srcpath/configure "$@" --disable-sqlite --disable-shared --with-pic --disable-octave --disable-external-libs - diff --git a/libs/libsndfile/doc/FAQ.html b/libs/libsndfile/doc/FAQ.html deleted file mode 100644 index 4465b77bd5..0000000000 --- a/libs/libsndfile/doc/FAQ.html +++ /dev/null @@ -1,851 +0,0 @@ - - - - - - libsndfile : Frequently Asked Questions. - - - - - - - - - - -

libsndfile : Frequently Asked Questions.

-

-Q1 : Do you plan to support XYZ codec in libsndfile?
-Q2 : In version 0 the SF_INFO struct had a pcmbitwidth field - but version 1 does not. Why?
-Q3 : Compiling is really slow on MacOS X. Why?
-Q4 : When trying to compile libsndfile on Solaris I get a "bad - substitution" error during linking. What can I do to fix this?
-Q5 : Why doesn't libsndfile do interleaving/de-interleaving?
-Q6 : What's the best format for storing temporary files?
-Q7 : On Linux/Unix/MacOS X, what's the best way of detecting the - presence of libsndfile?
-Q8 : I have libsndfile installed and now I want to use it. I - just want a simple Makefile! What do I do?
-Q9 : How about adding the ability to write/read sound files to/from - memory buffers?
-Q10 : Reading a 16 bit PCM file as normalised floats and then - writing them back changes some sample values. Why?
-Q11 : I'm having problems with u-law encoded WAV files generated by - libsndfile in Winamp. Why?
-Q12 : I'm looking at sf_read*. What are items? What are frames?
-Q13 : Why can't libsndfile open this Sound Designer II (SD2) - file?
-Q14 : I'd like to statically link libsndfile to my closed source - application. Can I buy a license so that this is possible?
-Q15 : My program is crashing during a call to a function in libsndfile. - Is this a bug in libsndfile?
-Q16 : Will you accept a fix for compiling libsndfile with compiler X? -
-Q17 : Can libsndfile read/write files from/to UNIX pipes? -
-Q18 : Is it possible to build a Universal Binary on Mac OS X? -
-Q19 : I have project files for Visual Studio / XCode / Whatever. Why - don't you distribute them with libsndfile? -
-Q20 : Why doesn't libsndfile support MP3? Lots of other Open Source - projects support it! -
-Q21 : How do I use libsndfile in a closed source or commercial program - and comply with the license? -
-Q22 : What versions of windows does libsndfile work on? -
-Q23 : I'm cross compiling libsndfile for another platform. How can I - run the test suite? -
-


- - - -


Q1 : Do you plan to support XYZ codec in libsndfile?

-

-If source code for XYZ codec is available under a suitable license (LGPL, BSD, -MIT etc) then yes, I'd like to add it. -

-

-If suitable documentation is available on how to decode and encode the format -then maybe, depending on how much work is involved. -

-

-If XYZ is some proprietary codec where no source code or documentation is -available then no. -

-

-So if you want support for XYZ codec, first find existing source code or -documentation. -If you can't find either then the answer is no. -

- - -


Q2 : In version 0 the SF_INFO struct had a pcmbitwidth field - but version 1 does not. Why?

-

- This was dropped for a number of reasons: -

-
    -
  • pcmbitwidth makes little sense on compressed or floating point formats -
  • with the new API you really don't need to know it -
-

-As documented - here -there is now a well defined behaviour which ensures that no matter what the -bit width of the source file, the scaling always does something sensible. -This makes it safe to read 8, 16, 24 and 32 bit PCM files using sf_read_short() -and always have the optimal behaviour. -

- - - -


Q3 : Compiling is really slow on MacOS X. Why?

-

-When you configure and compile libsndfile, it uses the /bin/sh shell for a number -of tasks (ie configure script and libtool). -Older versions of OS X (10.2?) shipped a really crappy Bourne shell as /bin/sh -which resulted in really slow compiles. -Newer version of OS X ship GNU Bash as /bin/sh and this answer doesn't apply in that -case. -

-

-To fix this I suggest that you install the GNU Bash shell, rename /bin/sh to -/bin/sh.old and make a symlink from /bin/sh to the bash shell. -Bash is designed to behave as a Bourne shell when is is called as /bin/sh. -

-

-When I did this on my iBook running MacOS X, compile times dropped from 13 minutes -to 3 minutes. -

- - - -


Q4 : When trying to compile libsndfile on Solaris I get a "bad - substitution" error on linking. Why?

-

-It seems that the Solaris Bourne shell disagrees with GNU libtool. -

-

-To fix this I suggest that you install the GNU Bash shell, rename /bin/sh to -/bin/sh.old and make a symlink from /bin/sh to the bash shell. -Bash is designed to behave as a Bourne shell when is is called as /bin/sh. -

- - - -


Q5 : Why doesn't libsndfile do interleaving/de-interleaving?

-

-This problem is bigger than it may seem at first. -

-

-For a stereo file, it is a pretty safe bet that a simple interleaving/de-interleaving -could satisfy most users. -However, for files with more than 2 channels this is unlikely to be the case. -If the user has a 4 channel file and want to play that file on a stereo output -sound card they either want the first 2 channels or they want some mixed combination -of the 4 channels. -

-

-When you add more channels, the combinations grow exponentially and it becomes -increasingly difficult to cover even a sensible subset of the possible combinations. -On top of that, coding any one style of interleaver/de-interleaver is trivial, while -coding one that can cover all combinations is far from trivial. -This means that this feature will not be added any time soon. -

- - - -


Q6 : What's the best format for storing temporary files?

- -

-When you want to store temporary data there are a number of requirements; -

-
    -
  • A simple, easy to parse header. -
  • The format must provide the fastest possible read and write rates (ie - avoid conversions and encoding/decoding). -
  • The file format must be reasonably common and playable by most players. -
  • Able to store data in either endian-ness. -
-

-The format which best meets these requirements is AU, which allows data to be -stored in any one of short, int, float and double (among others) formats. -

-

-For instance, if an application uses float data internally, its temporary files -should use a format of (SF_ENDIAN_CPU | SF_FORMAT_AU | SF_FORMAT_FLOAT) which -will store big endian float data in big endian CPUs and little endian float data -on little endian CPUs. -Reading and writing this format will not require any conversions or byte swapping -regardless of the host CPU. -

- - - - -


Q7 : On Linux/Unix/MaxOS X, what's the best way of detecting the presence - of libsndfile using autoconf?

- -

-libsndfile uses the pkg-config (man pkg-config) method of registering itself with the -host system. -The best way of detecting its presence is using something like this in configure.ac -(or configure.in): -

-
-        PKG_CHECK_MODULES(SNDFILE, sndfile >= 1.0.2, ac_cv_sndfile=1, ac_cv_sndfile=0)
-
-        AC_DEFINE_UNQUOTED([HAVE_SNDFILE],${ac_cv_sndfile},
-			[Set to 1 if you have libsndfile.])
-
-        AC_SUBST(SNDFILE_CFLAGS)
-        AC_SUBST(SNDFILE_LIBS)
-
-

-This will automatically set the SNDFILE_CFLAGS and SNDFILE_LIBS -variables which can be used in Makefile.am like this: -

-
-        SNDFILE_CFLAGS = @SNDFILE_CFLAGS@
-        SNDFILE_LIBS = @SNDFILE_LIBS@
-
-

-If you install libsndfile from source, you will probably need to set the -PKG_CONFIG_PATH environment variable as suggested at the end of the -libsndfile configure process. For instance on my system I get this: -

-
-        -=-=-=-=-=-=-=-=-=-= Configuration Complete =-=-=-=-=-=-=-=-=-=-
-
-          Configuration summary :
-
-            Version : ..................... 1.0.5
-            Experimental code : ........... no
-
-          Tools :
-
-            Compiler is GCC : ............. yes
-            GCC major version : ........... 3
-
-          Installation directories :
-
-            Library directory : ........... /usr/local/lib
-            Program directory : ........... /usr/local/bin
-            Pkgconfig directory : ......... /usr/local/lib/pkgconfig
-
-        Compiling some other packages against libsndfile may require
-        the addition of "/usr/local/lib/pkgconfig" to the
-        PKG_CONFIG_PATH environment variable.
-
- - - - -


Q8 : I have libsndfile installed and now I want to use it. I just want - a simple Makefile! What do I do?

- -

-The pkg-config program makes finding the correct compiler flag values and -library location far easier. -During the installation of libsndfile, a file named sndfile.pc is installed -in the directory ${libdir}/pkgconfig (ie if libsndfile is installed in -/usr/local/lib, sndfile.pc will be installed in -/usr/local/lib/pkgconfig/). -

-

-In order for pkg-config to find sndfile.pc it may be necessary to point the -environment variable PKG_CONFIG_PATH in the right direction. -

-
-        export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
-
- -

-Then, to compile a C file into an object file, the command would be: -

-
-        gcc `pkg-config --cflags sndfile` -c somefile.c
-
-

-and to link a number of objects into an executable that links against libsndfile, -the command would be: -

-
-        gcc `pkg-config --libs sndfile` obj1.o obj2.o -o program
-
- - - - -


Q9 : How about adding the ability to write/read sound files to/from - memory buffers?

- -

-This has been added for version 1.0.13. -

- - - - -


Q10 : Reading a 16 bit PCM file as normalised floats and then - writing them back changes some sample values. Why?

- -

-This is caused by the fact that the conversion from 16 bit short to float is -done by dividing by 32768 (0x8000 in hexadecimal) while the conversion from -float to 16 bit short is done by multiplying by 32767 (0x7FFF in hex). -So for instance, a value in a 16 bit PCM file of 20000 gets read as a floating -point number of 0.6103515625 (20000.0 / 0x8000). -Converting that back to a 16 bit short results in a value of 19999.3896484375 -(0.6103515625 * 0x7FFF) which then gets rounded down to 19999. -

-

-You will notice that for this particular case, the error is 1 in 20000 or -0.005%. -Interestingly, for values of less than 16369, dividing by 0x8000 followed -by multiplying by 0x7FFF and then rounding the result, gives back the -original value. -It turns out that as long as the host operating system supplies the 1999 ISO -C Standard functions lrintf and lrint (or a replacement has -been supplied) then the maximum possible error is 1 in 16369 or about 0.006%. -

-

-Regardless of the size of the error, the reason why this is done is rather -subtle. -

-

-In a file containing 16 bit PCM samples, the values are restricted to the range -[-32768, 32767] while we want floating point values in the range [-1.0, 1.0]. -The only way to do this conversion is to do a floating point division by a value -of 0x8000. -Converting the other way, the only way to ensure that floating point values in -the range [-1.0, 1.0] are within the valid range allowed by a 16 bit short is -to multiply by 0x7FFF. -

-

-Some people would say that this is a severe short-coming of libsndfile. -I would counter that anybody who is constantly converting back and forth -between 16 bit shorts and normalised floats is going to suffer other losses -in audio quality that they should also be concerned about. -

-

-Since this problem only occurs when converting between integer data on disk and -normalized floats in the application, it can be avoided by using something -other than normalized floats in the application. -Alternatives to normalized floats are the short and int data -types (ie using sf_read_short or sf_read_int) or using un-normalized floats -(see - - SFC_SET_NORM_FLOAT). -

-

-Another way to deal with this problem is to consider 16 bit short data as a -final destination format only, not as an intermediate storage format. -All intermediate data (ie which is going to be processed further) should be -stored in floating point format which is supported by all of the most common -file formats. -If floating point files are considered too large (2 times the size of a 16 bit -PCM file), it would also be possible to use 24 bit PCM as an intermediate -storage format (and which is also supported by most common file types). -

- - - - -


Q11 : I'm having problems with u-law encoded WAV files generated by - libsndfile in Winamp. Why? -

- -

-This is actually a Winamp problem. -The official Microsoft spec suggests that the 'fmt ' chunk should be 18 bytes. -Unfortunately at least one of Microsoft's own applications (Sound Recorder on -Win98 I believe) did not accept 18 bytes 'fmt ' chunks. -

-

-Michael Lee did some experimenting and found that: -

-
-    I have checked that Windows Media Player 9, QuickTime Player 6.4,
-    RealOne Player 2.0 and GoldWave 5.06 can all play u-law files with
-    16-byte or 18-byte 'fmt ' chunk. Only Winamp (2.91) and foobar2000
-    are unable to play u-law files with 16-byte 'fmt ' chunk.
-
- -

-Even this is a very small sampling of all the players out there. -For that reason it is probably not a good idea to change this now because there -is the risk of breaking something that currently works. -

- - - - -


Q12 : I'm looking at sf_read*. What are items? What are frames? -

- -

-An item is a single sample of the data type you are reading; ie a -single short value for sf_read_short or a single float -for sf_read_float. -

- -

-For a sound file with only one channel, a frame is the same as a item (ie a -single sample) while for multi channel sound files, a single frame contains a -single item for each channel. -

- -

-Here are two simple, correct examples, both of which are assumed to be working -on a stereo file, first using items: -

- -
-        #define CHANNELS 2
-        short data [CHANNELS * 100] ;
-        sf_count items_read = sf_read_short (file, data, 200) ;
-        assert (items_read == 200) ;
-
- -

-and now readng the exact same amount of data using frames: -

- -
-        #define CHANNELS 2
-        short data [CHANNELS * 100] ;
-        sf_count frames_read = sf_readf_short (file, data, 100) ;
-        assert (frames_read == 100) ;
-
- - - - -


Q13 : Why can't libsndfile open this Sound Designer II (SD2) file? -

- -

-This is somewhat complicated. -First some background. -

- -

-SD2 files are native to the Apple Macintosh platform and use features of -the Mac filesystem (file resource forks) to store the file's sample rate, -number of channels, sample width and more. -When you look at a file and its resource fork on Mac OS X it looks like -this: -

- -
-        -rw-r--r--  1 erikd erikd   46512 Oct 18 22:57 file.sd2
-        -rw-r--r--  1 erikd erikd     538 Oct 18 22:57 file.sd2/rsrc
-
- -

-Notice how the file itself looks like a directory containing a single file -named rsrc. -When libsndfile is compiled for MacOS X, it should open (for write and read) -SD2 file with resource forks like this without any problems. -It will also handle files with the resource fork in a separate file as -described below. -

- -

-When SD2 files are moved to other platforms, the resource fork of the file -can sometimes be dropped altogether. -All that remains is the raw audio data and no information about the number -of channels, sample rate or bit width which makes it a little difficult for -libsndfile to open the file. -

- -

-However, it is possible to safely move an SD2 file to a Linux or Windows -machine. -For instance, when an SD2 file is copied from inside MacOS X to a windows -shared directory or a Samba share (ie Linux), MacOS X is clever enough to -store the resource fork of the file in a separate hidden file in the -same directory like this: -

-
-        -rw-r--r--  1 erikd erikd     538 Oct 18 22:57 ._file.sd2
-        -rw-r--r--  1 erikd erikd   46512 Oct 18 22:57 file.sd2
-
- -

-Regardless of what platform it is running on, when libsndfile is asked to -open a file named "foo" and it can't recognize the file type from -the data in the file, it will attempt to open the resource fork and if -that fails, it then tries to open a file named "._foo" to see if -the file has a valid resource fork. -This is the same regardless of whether the file is being opened for read -or write. -

- -

-In short, libsndfile should open SD2 files with a valid resource fork on -all of the platforms that libsndfile supports. -If a file has lost its resource fork, the only option is the open the file -using the SF_FORMAT_RAW option and guessing its sample rate, channel count -and bit width. -

- -

-Occasionally, when SD2 files are moved to other systems, the file is - BinHexed -which wraps the resource fork and the data fork together. -For these files, it would be possible to write a BinHex parser but -there is not a lot to gain considering how rare these BinHexed SD2 -files are. -

- - - -


Q14 : I'd like to statically link libsndfile to my closed source - application. Can I buy a license so that this is possible? -

- -

-Unfortunately no. -libsndfile contains code written by other people who have agreed that their -code be used under the GNU LGPL but no more. -Even if they were to agree, there would be significant difficulties in -dividing up the payments fairly. -

- -

-The only way you can legally use libsndfile as a statically linked -library is if your application is released under the GNU GPL or LGPL. -

- - - -


Q15 : My program is crashing during a call to a function in libsndfile. - Is this a bug in libsndfile? -

- -

-libsndfile is being used by large numbers of people all over the world -without any problems like this. That means that it is much more likely -that your code has a bug than libsndfile. However, it is still possible -that there is a bug in libsndfile. -

-

-To figure out whether it is your code or libsndfile you should do the -following: -

-
    -
  • Make sure you are compiling your code with warnings switched on and - that you fix as many warnings as possible. - With the GNU compiler (gcc) I would recommend at least - -W -Wall -Werror which will force you to fix all warnings - before you can run the code. -
  • Try using a memory debugger. - Valgrind on x86 Linux is excellent. - Purify also - has a good reputation. -
  • If the code is clean after the above two steps and you still get - a crash in libsndfile, then send me a small snippet of code (no - more than 30-40 lines) which includes the call to sf_open() and - also shows how all variables passed to/returned from sf_open() - are defined. -
- - - -


Q16 : Will you accept a fix for compiling libsndfile with compiler X? -

- -

-If compiler X is a C++ compiler then no. -C and C++ are different enough to make writing code that compiles as valid C -and valid C++ too difficult. -I would rather spend my time fixing bugs and adding features. -

- -

-If compiler X is a C compiler then I will do what I can as long as that does -not hamper the correctness, portability and maintainability of the existing -code. -It should be noted however that libsndfile uses features specified by the 1999 -ISO C Standard. -This can make compiling libsndfile with some older compilers difficult. -

- - - -


Q17 : Can libsndfile read/write files from/to UNIX pipes? -

- -

-Yes, libsndfile can read files from pipes. -Unfortunately, the write case is much more complicated. -

- -

-File formats like AIFF and WAV have information at the start of the file (the -file header) which states the length of the file, the number of sample frames -etc. -This information must be filled in correctly when the file header is written, -but this information is not reliably known until the file is closed. -This means that libsndfile cannot write AIFF, WAV and many other file types -to a pipe. -

- -

-However, there is at least one file format (AU) which is specifically designed -to be written to a pipe. -Like AIFF and WAV, AU has a header with a sample frames field, but it is -specifically allowable to set that frames field to 0x7FFFFFFF if the file -length is not known when the header is written. -The AU file format can also hold data in many of the standard formats (ie -SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_FLOAT etc) as well as allowing -data in both big and little endian format. -

- -

-See also FAQ Q6. -

- - - -


Q18 : Is it possible to build a Universal Binary on Mac OS X? -

- -

-Yes, but you must do two separate configure/build/test runs; one on PowerPC -and one on Intel. -It is then possible to merge the binaries into a single universal binary using -one of the programs in the Apple tool chain. -

- -

-It is not possible to build a working universal binary via a single -compile/build run on a single CPU. -

- -

-The problem is that the libsndfile build process detects features of the CPU its -being built for during the configure process and when building a universal binary, -configure is only run once and that data is then used for both CPUs. -That configure data will be wrong for one of those CPUs. -You will still be able to compile libsndfile, and the test suite will pass on -the machine you compiled it on. -However, if you take the universal binary test suite programs compiled on one -CPU and run them on the other, the test suite will fail. -

- -

-Part of the problem is the the CPU endian-ness is detected at configure time. -Yes, I know the Apple compiler defines one of the macros __LITTLE_ENDIAN__ -and __BIG_ENDIAN__, but those macros are not part of the 1999 ISO C Standard -and they are not portable. -

- -

-Endian issues are not the only reason why the cross compiled binary will fail. -The configure script also detects other CPU specific idiosyncrasies to provide -more optimized code. -

- -

-Finally, the real show stopper problem with universal binaries is the problem -with the test suite. -libsndfile contains a huge, comprehensive test suite. -When you compile a universal binary and run the test suite, you only test the -native compile. -The cross compiled binary (the one with the much higher chance of having -problems) cannot be tested. -

- -

-Now, if you have read this far you're probably thinking there must be a way -to fix this and there probably is. -The problem is that its a hell of a lot of work and would require significant -changes to the configure process, the internal code and the test suite. -In addition, these changes must not break compilation on any of the platforms -libsndfile is currently working on. -

- - - - -


Q19 : I have project files for Visual Studio / XCode / Whatever. Why - don't you distribute them with libsndfile? -

- -

-There's a very good reason for this. -I will only distribute things that I actually have an ability to test and -maintain. -Project files for a bunch of different compilers and Integrated Development -Environments are simply too difficult to maintain. -

- -

-The problem is that every time I add a new file to libsndfile or rename an -existing file I would have to modify all the project files and then test that -libsndfile still built with all the different compilers. -

- -

-Maintaining these project files is also rather difficult if I don't have access -to the required compiler/IDE. -If I just edit the project files without testing them I will almost certainly -get it wrong. -If I release a version of libsndfile with broken project files, I'll get a bunch -of emails from people complaining about it not building and have no way of -fixing or even testing it. -

- -

-I currently release sources that I personally test on Win32, Linux and -MacOS X (PowerPC) using the compiler I trust (GNU GCC). -Supporting one compiler on three (actually much more because GCC is available -almost everywhere) platforms is doable without too much pain. -I also release binaries for Win32 with instructions on how to use those -binaries with Visual Studio. -As a guy who is mainly interested in Linux, I'm not to keen to jump through -a bunch of hoops to support compilers and operating systems I don't use. -

- -

-So, I hear you want to volunteer to maintain the project files for Some Crappy -Compiler 2007? -Well sorry, that won't work either. -I have had numerous people over the years offer to maintaining the project -files for Microsoft's Visual Studio. -Every single time that happened, they maintained it for a release or two and -then disappeared off the face of the earth. -Hence, I'm not willing to enter into an arrangement like that again. -

- - - -


Q20 : Why doesn't libsndfile support MP3? Lots of other Open Source - projects support it! -

- -

-MP3 is not supported for one very good reason; doing so requires the payment -of licensing fees. -As can be seen from - - mp3licensing.com -the required royalty payments are not cheap. -

- -

-Yes, I know other libraries ignore the licensing requirements, but their legal -status is extremely dubious. -At any time, the body selling the licenses could go after the authors of those -libraries. -Some of those authors may be students and hence wouldn't be worth pursuing. -

- -

-However, libsndfile is released under the name of a company, Mega Nerd Pty Ltd; -a company which has income from from libsamplerate licensing, libsndfile based -consulting income and other unrelated consulting income. -Adding MP3 support to libsndfile could place that income under legal threat. -

- -

-Fortunately, Ogg Vorbis exists as an alternative to MP3. -Support for Ogg Vorbis was added to libsndfile (mostly due to the efforts of -John ffitch of the Csound project) in version 1.0.18. -

- - - - -


Q21 : How do I use libsndfile in a closed source or commercial program - and comply with the license? -

- -

-Here is a checklist of things you need to do to make sure your use of libsndfile -in a closed source or commercial project complies with the license libsndfile is -released under, the GNU Lesser General Public License (LGPL): -

- -
    -
  • Make sure you are linking to libsndfile as a shared library (Linux and Unix - systems), Dynamic Link Library (Microsoft Windows) or dynlib (Mac OS X). - If you are using some other operating system that doesn't allow dynamically - linked libraries, you will not be able to use libsndfile unless you release - the source code to your program. -
  • In the licensing documentation for your program, add a statement that your - software depends on libsndfile and that libsndfile is released under the GNU - Lesser General Public License, either - version 2.1 - or optionally - version 3. -
  • Include the text for both versions of the license, possibly as separate - files named libsndfile_lgpl_v2_1.txt and libsndfile_lgpl_v3.txt. -
- - - -


Q22 : What versions of Windows does libsndfile work on? -

- -

-Currently the precompiled windows binaries are thoroughly tested on Windows XP. -As such, they should also work on Win2k and Windows Vista. -They may also work on earlier versions of Windows. -

- -

-Since version 0.1.18 I have also been releasing precompiled binaries for Win64, -the 64 bit version of Windows. -These binaries have received much less testing than the 32 bit versions, but -should work as expected. -I'd be very interested in receiving feedback on these binaries. -

- - - -


Q23 : I'm cross compiling libsndfile for another platform. How can I - run the test suite? -

- -

-

- -

-Since version 1.0.21 the top level Makefile has an extra make target, -'test-tarball'. -Building this target creates a tarball called called: -

- -
-libsndfile-testsuite-${host_triplet}-${version}.tar.gz -
- -

-in the top level directory. -This tarball can then be copied to the target platform. -Once untarred and test script test_wrapper.sh can be run from -the top level of the extracted tarball. -

- - -
-

- The libsndfile home page is here : - - http://www.mega-nerd.com/libsndfile/. -
-Version : 1.0.25 -

- - - diff --git a/libs/libsndfile/doc/Makefile.am b/libs/libsndfile/doc/Makefile.am deleted file mode 100644 index b89f1454aa..0000000000 --- a/libs/libsndfile/doc/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -## Process this file with automake to produce Makefile.in - -html_DATA = index.html libsndfile.jpg libsndfile.css api.html command.html \ - bugs.html sndfile_info.html new_file_type.HOWTO \ - win32.html FAQ.html lists.html embedded_files.html octave.html \ - dither.html tutorial.html - -EXTRA_DIST = $(html_DATA) - diff --git a/libs/libsndfile/doc/api.html b/libs/libsndfile/doc/api.html deleted file mode 100644 index 33d53dd02f..0000000000 --- a/libs/libsndfile/doc/api.html +++ /dev/null @@ -1,781 +0,0 @@ - - - - - - The libsndfile API - - - - - - - - - - -
-

libsndfile

-

- Libsndfile is a library designed to allow the reading and writing of many - different sampled sound file formats (such as MS Windows WAV and the Apple/SGI - AIFF format) through one standard library interface. -

- -

- During read and write operations, formats are seamlessly converted between the - format the application program has requested or supplied and the file's data - format. The application programmer can remain blissfully unaware of issues - such as file endian-ness and data format. See Note 1 and - Note 2. -

- -

- Every effort is made to keep these documents up-to-date, error free and - unambiguous. - However, since maintaining the documentation is the least fun part of working - on libsndfile, these docs can and do fall behind the behaviour of library. - If any errors, omissions or ambiguities are found, please notify me (erikd) - at mega-nerd dot com. -

- -

- To supplement this reference documentation, there are simple example programs - included in the source code tarball. - The test suite which is also part of the source code tarball is also a good - place to look for the correct usage of the library functions. -

- -

- Finally, if you think there is some feature missing from libsndfile, check that - it isn't already implemented (and documented) - here. - -

- -

Synopsis

-

-The functions of libsndfile are defined as follows: -

- -
-      #include <stdio.h>
-      #include <sndfile.h>
-
-      SNDFILE*    sf_open          (const char *path, int mode, SF_INFO *sfinfo) ;
-      SNDFILE*    sf_open_fd       (int fd, int mode, SF_INFO *sfinfo, int close_desc) ;
-      SNDFILE* 	  sf_open_virtual  (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ;
-      int         sf_format_check  (const SF_INFO *info) ;
-
-      sf_count_t  sf_seek          (SNDFILE *sndfile, sf_count_t frames, int whence) ;
-
-      int         sf_command       (SNDFILE *sndfile, int cmd, void *data, int datasize) ;
-
-      int         sf_error         (SNDFILE *sndfile) ;
-      const char* sf_strerror      (SNDFILE *sndfile) ;
-      const char* sf_error_number  (int errnum) ;
-
-      int         sf_perror        (SNDFILE *sndfile) ;
-      int         sf_error_str     (SNDFILE *sndfile, char* str, size_t len) ;
-
-      int         sf_close         (SNDFILE *sndfile) ;
-      void        sf_write_sync    (SNDFILE *sndfile) ;
-
-      sf_count_t  sf_read_short    (SNDFILE *sndfile, short *ptr, sf_count_t items) ;
-      sf_count_t  sf_read_int      (SNDFILE *sndfile, int *ptr, sf_count_t items) ;
-      sf_count_t  sf_read_float    (SNDFILE *sndfile, float *ptr, sf_count_t items) ;
-      sf_count_t  sf_read_double   (SNDFILE *sndfile, double *ptr, sf_count_t items) ;
-
-      sf_count_t  sf_readf_short   (SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
-      sf_count_t  sf_readf_int     (SNDFILE *sndfile, int *ptr, sf_count_t frames) ;
-      sf_count_t  sf_readf_float   (SNDFILE *sndfile, float *ptr, sf_count_t frames) ;
-      sf_count_t  sf_readf_double  (SNDFILE *sndfile, double *ptr, sf_count_t frames) ;
-
-      sf_count_t  sf_write_short   (SNDFILE *sndfile, short *ptr, sf_count_t items) ;
-      sf_count_t  sf_write_int     (SNDFILE *sndfile, int *ptr, sf_count_t items) ;
-      sf_count_t  sf_write_float   (SNDFILE *sndfile, float *ptr, sf_count_t items) ;
-      sf_count_t  sf_write_double  (SNDFILE *sndfile, double *ptr, sf_count_t items) ;
-
-      sf_count_t  sf_writef_short  (SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
-      sf_count_t  sf_writef_int    (SNDFILE *sndfile, int *ptr, sf_count_t frames) ;
-      sf_count_t  sf_writef_float  (SNDFILE *sndfile, float *ptr, sf_count_t frames) ;
-      sf_count_t  sf_writef_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) ;
-
-      sf_count_t  sf_read_raw      (SNDFILE *sndfile, void *ptr, sf_count_t bytes) ;
-      sf_count_t  sf_write_raw     (SNDFILE *sndfile, void *ptr, sf_count_t bytes) ;
-
-      const char* sf_get_string    (SNDFILE *sndfile, int str_type) ;
-      int         sf_set_string    (SNDFILE *sndfile, int str_type, const char* str) ;
-
-
- -

-SNDFILE* is an anonymous pointer to data which is private to the library. -

- - - -

File Open Function

- -
-      SNDFILE*  sf_open    (const char *path, int mode, SF_INFO *sfinfo) ;
-
- -

-The SF_INFO structure is for passing data between the calling function and the library -when opening a file for reading or writing. It is defined in sndfile.h as follows: -

- -
-      typedef struct
-      {    sf_count_t  frames ;     /* Used to be called samples. */
-           int         samplerate ;
-           int         channels ;
-           int         format ;
-           int         sections ;
-           int         seekable ;
-       } SF_INFO ;
-
- -

-The mode parameter for this function can be any one of the following three values: -

- -
-      SFM_READ    - read only mode
-      SFM_WRITE   - write only mode
-      SFM_RDWR    - read/write mode
-
- -

-When opening a file for read, the format field should be set to zero before -calling sf_open(). -The only exception to this is the case of RAW files where the caller has to set -the samplerate, channels and format fields to valid values. -All other fields of the structure are filled in by the library. -

- -

-When opening a file for write, the caller must fill in structure members samplerate, -channels, and format. -

- -

-The format field in the above SF_INFO structure is made up of the bit-wise OR of a -major format type (values between 0x10000 and 0x08000000), a minor format type -(with values less than 0x10000) and an optional endian-ness value. -The currently understood formats are listed in sndfile.h as follows and also include -bitmasks for separating major and minor file types. -Not all combinations of endian-ness and major and minor file types are valid. -

- -
-      enum
-      {   /* Major formats. */
-          SF_FORMAT_WAV          = 0x010000,     /* Microsoft WAV format (little endian). */
-          SF_FORMAT_AIFF         = 0x020000,     /* Apple/SGI AIFF format (big endian). */
-          SF_FORMAT_AU           = 0x030000,     /* Sun/NeXT AU format (big endian). */
-          SF_FORMAT_RAW          = 0x040000,     /* RAW PCM data. */
-          SF_FORMAT_PAF          = 0x050000,     /* Ensoniq PARIS file format. */
-          SF_FORMAT_SVX          = 0x060000,     /* Amiga IFF / SVX8 / SV16 format. */
-          SF_FORMAT_NIST         = 0x070000,     /* Sphere NIST format. */
-          SF_FORMAT_VOC          = 0x080000,     /* VOC files. */
-          SF_FORMAT_IRCAM        = 0x0A0000,     /* Berkeley/IRCAM/CARL */
-          SF_FORMAT_W64          = 0x0B0000,     /* Sonic Foundry's 64 bit RIFF/WAV */
-          SF_FORMAT_MAT4         = 0x0C0000,     /* Matlab (tm) V4.2 / GNU Octave 2.0 */
-          SF_FORMAT_MAT5         = 0x0D0000,     /* Matlab (tm) V5.0 / GNU Octave 2.1 */
-          SF_FORMAT_PVF          = 0x0E0000,     /* Portable Voice Format */
-          SF_FORMAT_XI           = 0x0F0000,     /* Fasttracker 2 Extended Instrument */
-          SF_FORMAT_HTK          = 0x100000,     /* HMM Tool Kit format */
-          SF_FORMAT_SDS          = 0x110000,     /* Midi Sample Dump Standard */
-          SF_FORMAT_AVR          = 0x120000,     /* Audio Visual Research */
-          SF_FORMAT_WAVEX        = 0x130000,     /* MS WAVE with WAVEFORMATEX */
-          SF_FORMAT_SD2          = 0x160000,     /* Sound Designer 2 */
-          SF_FORMAT_FLAC         = 0x170000,     /* FLAC lossless file format */
-          SF_FORMAT_CAF          = 0x180000,     /* Core Audio File format */
-          SF_FORMAT_WVE          = 0x190000,     /* Psion WVE format */
-          SF_FORMAT_OGG          = 0x200000,     /* Xiph OGG container */
-          SF_FORMAT_MPC2K        = 0x210000,     /* Akai MPC 2000 sampler */
-          SF_FORMAT_RF64         = 0x220000,     /* RF64 WAV file */
-
-          /* Subtypes from here on. */
-
-          SF_FORMAT_PCM_S8       = 0x0001,       /* Signed 8 bit data */
-          SF_FORMAT_PCM_16       = 0x0002,       /* Signed 16 bit data */
-          SF_FORMAT_PCM_24       = 0x0003,       /* Signed 24 bit data */
-          SF_FORMAT_PCM_32       = 0x0004,       /* Signed 32 bit data */
-
-          SF_FORMAT_PCM_U8       = 0x0005,       /* Unsigned 8 bit data (WAV and RAW only) */
-
-          SF_FORMAT_FLOAT        = 0x0006,       /* 32 bit float data */
-          SF_FORMAT_DOUBLE       = 0x0007,       /* 64 bit float data */
-
-          SF_FORMAT_ULAW         = 0x0010,       /* U-Law encoded. */
-          SF_FORMAT_ALAW         = 0x0011,       /* A-Law encoded. */
-          SF_FORMAT_IMA_ADPCM    = 0x0012,       /* IMA ADPCM. */
-          SF_FORMAT_MS_ADPCM     = 0x0013,       /* Microsoft ADPCM. */
-
-          SF_FORMAT_GSM610       = 0x0020,       /* GSM 6.10 encoding. */
-          SF_FORMAT_VOX_ADPCM    = 0x0021,       /* Oki Dialogic ADPCM encoding. */
-
-          SF_FORMAT_G721_32      = 0x0030,       /* 32kbs G721 ADPCM encoding. */
-          SF_FORMAT_G723_24      = 0x0031,       /* 24kbs G723 ADPCM encoding. */
-          SF_FORMAT_G723_40      = 0x0032,       /* 40kbs G723 ADPCM encoding. */
-
-          SF_FORMAT_DWVW_12      = 0x0040,       /* 12 bit Delta Width Variable Word encoding. */
-          SF_FORMAT_DWVW_16      = 0x0041,       /* 16 bit Delta Width Variable Word encoding. */
-          SF_FORMAT_DWVW_24      = 0x0042,       /* 24 bit Delta Width Variable Word encoding. */
-          SF_FORMAT_DWVW_N       = 0x0043,       /* N bit Delta Width Variable Word encoding. */
-
-          SF_FORMAT_DPCM_8       = 0x0050,       /* 8 bit differential PCM (XI only) */
-          SF_FORMAT_DPCM_16      = 0x0051,       /* 16 bit differential PCM (XI only) */
-
-          SF_FORMAT_VORBIS       = 0x0060,       /* Xiph Vorbis encoding. */
-
-          /* Endian-ness options. */
-
-          SF_ENDIAN_FILE         = 0x00000000,   /* Default file endian-ness. */
-          SF_ENDIAN_LITTLE       = 0x10000000,   /* Force little endian-ness. */
-          SF_ENDIAN_BIG          = 0x20000000,   /* Force big endian-ness. */
-          SF_ENDIAN_CPU          = 0x30000000,   /* Force CPU endian-ness. */
-
-          SF_FORMAT_SUBMASK      = 0x0000FFFF,
-          SF_FORMAT_TYPEMASK     = 0x0FFF0000,
-          SF_FORMAT_ENDMASK      = 0x30000000
-      } ;
-
- -

-Every call to sf_open() should be matched with a call to sf_close() to free up -memory allocated during the call to sf_open(). -

- -

-On success, the sf_open function returns a non-NULL pointer which should be -passed as the first parameter to all subsequent libsndfile calls dealing with -that audio file. -On fail, the sf_open function returns a NULL pointer. -An explanation of the error can obtained by passing NULL to - sf_strerror. -

- - -

File Descriptor Open

- -
-      SNDFILE*  sf_open_fd (int fd, int mode, SF_INFO *sfinfo, int close_desc) ;
-
- -

-Note: On Microsoft Windows, this function does not work if the -application and the libsndfile DLL are linked to different versions of the -Microsoft C runtime DLL. -

-

-The second open function takes a file descriptor of a file that has already been -opened. -Care should be taken to ensure that the mode of the file represented by the -descriptor matches the mode argument. -This function is useful in the following circumstances: -

- -
    -
  • Opening temporary files securely (ie use the tmpfile() to return a - FILE* pointer and then using fileno() to retrieve the file descriptor - which is then passed to libsndfile). -
  • Opening files with file names using OS specific character encodings - and then passing the file descriptor to sf_open_fd(). -
  • Opening sound files embedded within larger files. - More info. -
- -

-Every call to sf_open_fd() should be matched with a call to sf_close() to free up -memory allocated during the call to sf_open(). -

- -

-When sf_close() is called, the file descriptor is only closed if the close_desc -parameter was TRUE when the sf_open_fd() function was called. -

- -

-On success, the sf_open_fd function returns a non-NULL pointer which should be -passed as the first parameter to all subsequent libsndfile calls dealing with -that audio file. -On fail, the sf_open_fd function returns a NULL pointer. -

- - -

Virtual File Open Function

-
-      SNDFILE* 	sf_open_virtual	(SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ;
-
-

- Opens a soundfile from a virtual file I/O context which is provided - by the caller. This is usually used to interface libsndfile to a stream or buffer - based system. Apart from the sfvirtual and the user_data parameters this function behaves - like sf_open. -

- -
-      typedef struct
-      {    sf_vio_get_filelen  get_filelen ;
-           sf_vio_seek         seek ;
-           sf_vio_read         read ;
-           sf_vio_write        write ;
-           sf_vio_tell         tell ;
-      } SF_VIRTUAL_IO ;
-
-

-Libsndfile calls the callbacks provided by the SF_VIRTUAL_IO structure when opening, reading -and writing to the virtual file context. The user_data pointer is a user defined context which -will be available in the callbacks. -

-
-      typedef sf_count_t  (*sf_vio_get_filelen) (void *user_data) ;
-      typedef sf_count_t  (*sf_vio_seek)        (sf_count_t offset, int whence, void *user_data) ;
-      typedef sf_count_t  (*sf_vio_read)        (void *ptr, sf_count_t count, void *user_data) ;
-      typedef sf_count_t  (*sf_vio_write)       (const void *ptr, sf_count_t count, void *user_data) ;
-      typedef sf_count_t  (*sf_vio_tell)        (void *user_data) ;
-
-

sf_vio_get_filelen

-
-      typedef sf_count_t  (*sf_vio_get_filelen) (void *user_data) ;
-
-

-The virtual file contex must return the length of the virtual file in bytes.
-

-

sf_vio_seek

-
-      typedef sf_count_t  (*sf_vio_seek)        (sf_count_t offset, int whence, void *user_data) ;
-
-

-The virtual file context must seek to offset using the seek mode provided by whence which is one of
-

-
-      SEEK_CUR
-      SEEK_SET
-      SEEK_END
-
-

-The return value must contain the new offset in the file. -

-

sf_vio_read

-
-      typedef sf_count_t  (*sf_vio_read)        (void *ptr, sf_count_t count, void *user_data) ;
-
-

-The virtual file context must copy ("read") "count" bytes into the -buffer provided by ptr and return the count of actually copied bytes. -

-

sf_vio_write

-
-      typedef sf_count_t  (*sf_vio_write)       (const void *ptr, sf_count_t count, void *user_data) ;
-
-

-The virtual file context must process "count" bytes stored in the -buffer passed with ptr and return the count of actually processed bytes.
-

-

sf_vio_tell

-
-      typedef sf_count_t  (*sf_vio_tell)        (void *user_data) ;
-
-

-Return the current position of the virtual file context.
-

- - - -

Format Check Function

- -
-      int  sf_format_check (const SF_INFO *info) ;
-
- -

-This function allows the caller to check if a set of parameters in the SF_INFO struct -is valid before calling sf_open (SFM_WRITE). -

-

-sf_format_check returns TRUE if the parameters are valid and FALSE otherwise. -

- - -

File Seek Functions

- -
-      sf_count_t  sf_seek  (SNDFILE *sndfile, sf_count_t frames, int whence) ;
-
- -

-The file seek functions work much like lseek in unistd.h with the exception that -the non-audio data is ignored and the seek only moves within the audio data section of -the file. -In addition, seeks are defined in number of (multichannel) frames. -Therefore, a seek in a stereo file from the current position forward with an offset -of 1 would skip forward by one sample of both channels. -

- -

-like lseek(), the whence parameter can be any one of the following three values: -

- -
-      SEEK_SET  - The offset is set to the start of the audio data plus offset (multichannel) frames.
-      SEEK_CUR  - The offset is set to its current location plus offset (multichannel) frames.
-      SEEK_END  - The offset is set to the end of the data plus offset (multichannel) frames.
-
- -

-Internally, libsndfile keeps track of the read and write locations using separate -read and write pointers. -If a file has been opened with a mode of SFM_RDWR, bitwise OR-ing the standard whence -values above with either SFM_READ or SFM_WRITE allows the read and write pointers to -be modified separately. -If the SEEK_* values are used on their own, the read and write pointers are -both modified. -

- -

-Note that the frames offset can be negative and in fact should be when SEEK_END is used for the -whence parameter. -

-

-sf_seek will return the offset in (multichannel) frames from the start of the audio data -or -1 if an error occured (ie an attempt is made to seek beyond the start or end of the file). -

- - -


Error Reporting Functions

- - -
-      int         sf_error        (SNDFILE *sndfile) ;
-
-

-This function returns the current error number for the given SNDFILE. -The error number may be one of the following: -

-
-        enum
-        {   SF_ERR_NO_ERROR             = 0,
-            SF_ERR_UNRECOGNISED_FORMAT  = 1,
-            SF_ERR_SYSTEM               = 2,
-            SF_ERR_MALFORMED_FILE       = 3,
-            SF_ERR_UNSUPPORTED_ENCODING = 4
-        } ;
-
- -

-or any one of many other internal error values. -Applications should only test the return value against error values defined in -<sndfile.h> as the internal error values are subject to change at any -time. -For errors not in the above list, the function sf_error_number() can be used to -convert it to an error string. -

- -
-      const char* sf_strerror     (SNDFILE *sndfile) ;
-      const char* sf_error_number (int errnum) ;
-
- -

-The error functions sf_strerror() and sf_error_number() convert the library's internal -error enumerations into text strings. -

-
-      int         sf_perror     (SNDFILE *sndfile) ;
-      int         sf_error_str  (SNDFILE *sndfile, char* str, size_t len) ;
-
- -

-The functions sf_perror() and sf_error_str() are deprecated and will be dropped -from the library at some later date. -

- - -


File Close Function

- -
-      int  sf_close  (SNDFILE *sndfile) ;
-
- -

-The close function closes the file, deallocates its internal buffers and returns -0 on success or an error value otherwise. -

-
- - -


Write Sync Function

- -
-      void  sf_write_sync  (SNDFILE *sndfile) ;
-
- -

-If the file is opened SFM_WRITE or SFM_RDWR, call the operating system's function -to force the writing of all file cache buffers to disk. If the file is opened -SFM_READ no action is taken. -

-
- - - -


File Read Functions (Items)

- -
-      sf_count_t  sf_read_short   (SNDFILE *sndfile, short *ptr, sf_count_t items) ;
-      sf_count_t  sf_read_int     (SNDFILE *sndfile, int *ptr, sf_count_t items) ;
-      sf_count_t  sf_read_float   (SNDFILE *sndfile, float *ptr, sf_count_t items) ;
-      sf_count_t  sf_read_double  (SNDFILE *sndfile, double *ptr, sf_count_t items) ;
-
- -

-The file read items functions fill the array pointed to by ptr with the requested -number of items. The items parameter must be an integer product of the number -of channels or an error will occur. -

- -

-It is important to note that the data type used by the calling program and the data -format of the file do not need to be the same. For instance, it is possible to open -a 16 bit PCM encoded WAV file and read the data using sf_read_float(). The library -seamlessly converts between the two formats on-the-fly. See -Note 1. -

- -

-The sf_read_XXXX functions return the number of items read. -Unless the end of the file was reached during the read, the return value should -equal the number of items requested. -Attempts to read beyond the end of the file will not result in an error but will -cause the sf_read_XXXX functions to return less than the number of items requested -or 0 if already at the end of the file. -

- - -


File Read Functions (Frames)

- -
-      sf_count_t  sf_readf_short   (SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
-      sf_count_t  sf_readf_int     (SNDFILE *sndfile, int *ptr, sf_count_t frames) ;
-      sf_count_t  sf_readf_float   (SNDFILE *sndfile, float *ptr, sf_count_t frames) ;
-      sf_count_t  sf_readf_double  (SNDFILE *sndfile, double *ptr, sf_count_t frames) ;
-
- -

-The file read frames functions fill the array pointed to by ptr with the requested -number of frames of data. The array must be large enough to hold the product of -frames and the number of channels. -

- -

-Care must be taken to ensure that there is enough space in the array pointed to by -ptr, to take (frames * channels) number of items (shorts, ints, floats or doubles). -

- -

-The sf_readf_XXXX functions return the number of frames read. -Unless the end of the file was reached during the read, the return value should equal -the number of frames requested. -Attempts to read beyond the end of the file will not result in an error but will cause -the sf_readf_XXXX functions to return less than the number of frames requested or 0 if -already at the end of the file. -

- - -


File Write Functions (Items)

- -
-      sf_count_t  sf_write_short   (SNDFILE *sndfile, short *ptr, sf_count_t items) ;
-      sf_count_t  sf_write_int     (SNDFILE *sndfile, int *ptr, sf_count_t items) ;
-      sf_count_t  sf_write_float   (SNDFILE *sndfile, float *ptr, sf_count_t items) ;
-      sf_count_t  sf_write_double  (SNDFILE *sndfile, double *ptr, sf_count_t items) ;
-
- -

-The file write items functions write the data in the array pointed to by ptr to the file. -The items parameter must be an integer product of the number of channels or an error -will occur. -

- -

-It is important to note that the data type used by the calling program and the data -format of the file do not need to be the same. For instance, it is possible to open -a 16 bit PCM encoded WAV file and write the data using sf_write_float(). The library -seamlessly converts between the two formats on-the-fly. See -Note 1. -

-

-The sf_write_XXXX functions return the number of items written (which should be the -same as the items parameter). -

- - -


File Write Functions (Frames)

- -
-      sf_count_t  sf_writef_short  (SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
-      sf_count_t  sf_writef_int    (SNDFILE *sndfile, int *ptr, sf_count_t frames) ;
-      sf_count_t  sf_writef_float  (SNDFILE *sndfile, float *ptr, sf_count_t frames) ;
-      sf_count_t  sf_writef_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) ;
-
- -

-The file write frames functions write the data in the array pointed to by ptr to the file. -The array must be large enough to hold the product of frames and the number of channels. -

-

-The sf_writef_XXXX functions return the number of frames written (which should be the -same as the frames parameter). -

- - -


Raw File Read and Write Functions

- -
-      sf_count_t  sf_read_raw     (SNDFILE *sndfile, void *ptr, sf_count_t bytes) ;
-      sf_count_t  sf_write_raw    (SNDFILE *sndfile, void *ptr, sf_count_t bytes) ;
-
- -

-Note: Unless you are writing an external decoder/encode that uses -libsndfile to handle the file headers, you should not be using these -functions. -

- -

-The raw read and write functions read raw audio data from the audio file (not to be -confused with reading RAW header-less PCM files). The number of bytes read or written -must always be an integer multiple of the number of channels multiplied by the number -of bytes required to represent one sample from one channel. -

- -

-The raw read and write functions return the number of bytes read or written (which -should be the same as the bytes parameter). -

- -

- -Note : The result of using of both regular reads/writes and raw reads/writes on -compressed file formats other than SF_FORMAT_ALAW and SF_FORMAT_ULAW is undefined. - -

- -

-See also : SFC_RAW_NEEDS_ENDSWAP -

- - -


Functions for Reading and Writing String Data

- - -
-      const char* sf_get_string   (SNDFILE *sndfile, int str_type) ;
-      int         sf_set_string   (SNDFILE *sndfile, int str_type, const char* str) ;
-
- -

-These functions allow strings to be set on files opened for write and to be -retrieved from files opened for read where supported by the given file type. -The str_type parameter can be any one of the following string types: -

- -
-          enum
-          {   SF_STR_TITLE,
-              SF_STR_COPYRIGHT,
-              SF_STR_SOFTWARE,
-              SF_STR_ARTIST,
-              SF_STR_COMMENT,
-              SF_STR_DATE,
-              SF_STR_ALBUM,
-              SF_STR_LICENSE,
-              SF_STR_TRACKNUMBER,
-              SF_STR_GENRE
-          } ;
-
- -

-The sf_get_string() function returns the specified string if it exists and a -NULL pointer otherwise. -In addition to the string ids above, SF_STR_FIRST (== SF_STR_TITLE) and -SF_STR_LAST (always the same as the highest numbers string id) are also -available to allow iteration over all the available string ids. -

- -

-The sf_set_string() function sets the string data. -It returns zero on success and non-zero on error. -The error code can be converted to a string using sf_error_number(). -

- - -

- -

- -
- - -


Note 1

- -

-When converting between integer PCM formats of differing size (ie using sf_read_int() -to read a 16 bit PCM encoded WAV file) libsndfile obeys one simple rule: -

- -

-Whenever integer data is moved from one sized container to another sized container, -the most significant bit in the source container will become the most significant bit -in the destination container. -

- -

-When converting between integer data and floating point data, different rules apply. -The default behaviour when reading floating point data (sf_read_float() or -sf_read_double ()) from a file with integer data is normalisation. Regardless of -whether data in the file is 8, 16, 24 or 32 bit wide, the data will be read as -floating point data in the range [-1.0, 1.0]. Similarly, data in the range [-1.0, 1.0] -will be written to an integer PCM file so that a data value of 1.0 will be the largest -allowable integer for the given bit width. This normalisation can be turned on or off -using the sf_command interface. -

- - -


Note 2

- -

-Reading a file containg floating point data (allowable with WAV, AIFF, AU and other -file formats) using integer read methods (sf_read_short() or sf_read_int()) can -produce unexpected results. -For instance the data in the file may have a maximum absolute value < 1.0 which -would mean that all sample values read from the file will be zero. -In order to read these files correctly using integer read methods, it is recommended -that you use the - sf_command -interface, a command of - SFC_SET_SCALE_FLOAT_INT_READ -and a parameter of SF_TRUE to force correct scaling. -

- -
- -

- The libsndfile home page is - here. -

-

-Version : 1.0.25 -

- - - - - - - diff --git a/libs/libsndfile/doc/bugs.html b/libs/libsndfile/doc/bugs.html deleted file mode 100644 index 3a441fef11..0000000000 --- a/libs/libsndfile/doc/bugs.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - Bug Reporting - - - - - - - - -
-

Reporting Bugs in libsndfile

-
-

- Before even attempting to report a bug in libsndfile please make sure you have - read the - Frequently Asked Questions. - If you are having a problem writing code using libsndfile make sure you read - the - Application Programming Interface - documentation. -

-

- That said, I am interested in finding and fixing all genuine bugs in libsndfile. - Bugs I want to fix include any of the following problems (and probably others) : -

-
    -
  • Compilation problems on new platforms. -
  • Errors being detected during the `make check' process. -
  • Segmentation faults occuring inside libsndfile. -
  • libsndfile hanging when opening a file. -
  • Supported sound file types being incorrectly read or written. -
  • Omissions, errors or spelling mistakes in the documentation. -
- -

- When submitting a bug report you must include : -

-
    -
  • Your system (CPU and memory size should be enough). -
  • The operating system you are using. -
  • Whether you are using a package provided by your distribution or you - compiled it youself. -
  • If you compiled it yourself, the compiler you are using. (Also make - sure to run 'make check'.) -
  • A description of the problem. -
  • Information generated by the sndfile-info program (see next paragraph). -
  • If you are having problems with sndfile-play and ALSA on Linux, I will - need information about your kernel, ALSA version, compiler version, - whether you compiled the kernel/ALSA your self or installed from a - package etc. -
- -

- If libsndfile compiles and installs correctly but has difficulty reading a particular - file or type of file you should run the sndfile-info program (from the examples - directory of the libsndfile distribution) on the file. See - here - for an example of the use of the sndfile-info program. -

-

- Please do not send me a sound file which fails to open under libsndfile unless I - specifically ask you to. The above information should usually suffice for most - problems. -

-

- Once you have the above information you should submit a ticket on the libsnfile - github issue tracker. - -

- - diff --git a/libs/libsndfile/doc/command.html b/libs/libsndfile/doc/command.html deleted file mode 100644 index f2ed083760..0000000000 --- a/libs/libsndfile/doc/command.html +++ /dev/null @@ -1,1687 +0,0 @@ - - - - - - libsndfile : the sf_command function. - - - - - - - - - - - -

sf_command

-
-
-        int    sf_command (SNDFILE *sndfile, int cmd, void *data, int datasize) ;
-
-

- This function allows the caller to retrieve information from or change aspects of the - library behaviour. - Examples include retrieving a string containing the library version or changing the - scaling applied to floating point sample data during read and write. - Most of these operations are performed on a per-file basis. -

-

- The cmd parameter is an integer identifier which is defined in <sndfile.h>. - All of the valid command identifiers have names beginning with "SFC_". - Data is passed to and returned from the library by use of a void pointer. - The library will not read or write more than datasize bytes from the void pointer. - For some calls no data is required in which case data should be NULL and datasize - may be used for some other purpose. -

-

- The available commands are as follows: -

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SFC_GET_LIB_VERSIONRetrieve the version of the library.
SFC_GET_LOG_INFORetrieve the internal per-file operation log.
SFC_CALC_SIGNAL_MAXCalculate the measured maximum signal value.
SFC_CALC_NORM_SIGNAL_MAXCalculate the measured normalised maximum signal value.
SFC_CALC_MAX_ALL_CHANNELSCalculate the peak value for each channel.
SFC_CALC_NORM_MAX_ALL_CHANNELSCalculate the normalised peak for each channel.
SFC_GET_SIGNAL_MAXRetrieve the peak value for the file (as stored in the file header).
SFC_GET_MAX_ALL_CHANNELSRetrieve the peak value for each channel (as stored in the file header).
SFC_SET_NORM_FLOATModify the normalisation behaviour of the floating point reading and writing functions.
SFC_SET_NORM_DOUBLEModify the normalisation behaviour of the double precision floating point reading and writing functions.
SFC_GET_NORM_FLOATRetrieve the current normalisation behaviour of the floating point reading and writing functions.
SFC_GET_NORM_DOUBLERetrieve the current normalisation behaviour of the double precision floating point reading and writing functions.
SFC_SET_SCALE_FLOAT_INT_READSet/clear the scale factor when integer (short/int) data is read from a file - containing floating point data.
SFC_SET_SCALE_INT_FLOAT_WRITESet/clear the scale factor when integer (short/int) data is written to a file - as floating point data.
SFC_GET_SIMPLE_FORMAT_COUNTRetrieve the number of simple formats supported by libsndfile.
SFC_GET_SIMPLE_FORMATRetrieve information about a simple format.
SFC_GET_FORMAT_INFORetrieve information about a major or subtype format.
SFC_GET_FORMAT_MAJOR_COUNTRetrieve the number of major formats.
SFC_GET_FORMAT_MAJORRetrieve information about a major format type.
SFC_GET_FORMAT_SUBTYPE_COUNTRetrieve the number of subformats.
SFC_GET_FORMAT_SUBTYPERetrieve information about a subformat.
SFC_SET_ADD_PEAK_CHUNKSwitch the code for adding the PEAK chunk to WAV and AIFF files on or off.
SFC_UPDATE_HEADER_NOWUsed when a file is open for write, this command will update the file - header to reflect the data written so far.
SFC_SET_UPDATE_HEADER_AUTOUsed when a file is open for write, this command will cause the file header - to be updated after each write to the file.
SFC_FILE_TRUNCATETruncate a file open for write or for read/write.
SFC_SET_RAW_START_OFFSETChange the data start offset for files opened up as SF_FORMAT_RAW.
SFC_SET_CLIPPINGTurn on/off automatic clipping when doing floating point to integer - conversion.
SFC_GET_CLIPPINGRetrieve current clipping setting.
SFC_GET_EMBED_FILE_INFORetrieve information about audio files embedded inside other files.
SFC_GET_AMBISONICTest a WAVEX file for Ambisonic format
SFC_SET_AMBISONICModify a WAVEX header for Ambisonic format
SFC_SET_VBR_ENCODING_QUALITYSet the Variable Bit Rate encoding quality
SFC_SET_COMPRESSION_LEVELSet the compression level.
SFC_RAW_NEEDS_ENDSWAPDetermine if raw data needs endswapping
SFC_GET_BROADCAST_INFORetrieve the Broadcast Chunk info
SFC_SET_BROADCAST_INFOSet the Broadcast Chunk info
SFC_SET_CART_INFOSet the Cart Chunk info
SFC_GET_CART_INFORetrieve the Cart Chunk info
SFC_GET_LOOP_INFOGet loop info
SFC_GET_INSTRUMENTGet instrument info
SFC_SET_INSTRUMENTSet instrument info
-
- -

- -
- - - -


SFC_GET_LIB_VERSION

-

-Retrieve the version of the library as a string. -

-

-Parameters: -

-        sndfile  : Not used
-        cmd      : SFC_GET_LIB_VERSION
-        data     : A pointer to a char buffer
-        datasize : The size of the the buffer
-
-

-Example: -

-
-        char  buffer [128] ;
-        sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ;
-
- -
-
Return value:
-
This call will return the length of the retrieved version string. -
-
-
Notes:
-
-The string returned in the buffer passed to this function will not overflow -the buffer and will always be null terminated . -
- - - -


SFC_GET_LOG_INFO

-

-Retrieve the log buffer generated when opening a file as a string. This log -buffer can often contain a good reason for why libsndfile failed to open a -particular file. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_GET_LOG_INFO
-        data     : A pointer to a char buffer
-        datasize : The size of the the buffer
-
-

-Example: -

-
-        char  buffer [2048] ;
-        sf_command (sndfile, SFC_GET_LOG_INFO, buffer, sizeof (buffer)) ;
-
- -
-
Return value:
-
This call will return the length of the retrieved version string. -
-
-
Notes:
-
-The string returned in the buffer passed to this function will not overflow -the buffer and will always be null terminated . -
- - - -


SFC_CALC_SIGNAL_MAX

-

-Retrieve the measured maximum signal value. This involves reading through -the whole file which can be slow on large files. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_CALC_SIGNAL_MAX
-        data     : A pointer to a double
-        datasize : sizeof (double)
-
-

-Example: -

-
-        double   max_val ;
-        sf_command (sndfile, SFC_CALC_SIGNAL_MAX, &max_val, sizeof (max_val)) ;
-
- -
-
Return value:
-
Zero on success, non-zero otherwise. -
- - - -


SFC_CALC_NORM_SIGNAL_MAX

-

-Retrieve the measured normalised maximum signal value. This involves reading -through the whole file which can be slow on large files. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_CALC_NORM_SIGNAL_MAX
-        data     : A pointer to a double
-        datasize : sizeof (double)
-
-

-Example: -

-
-        double   max_val ;
-        sf_command (sndfile, SFC_CALC_NORM_SIGNAL_MAX, &max_val, sizeof (max_val)) ;
-
- -
-
Return value:
-
Zero on success, non-zero otherwise. -
- - - -


SFC_CALC_MAX_ALL_CHANNELS

-

-Calculate the peak value (ie a single number) for each channel. -This involves reading through the whole file which can be slow on large files. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_CALC_MAX_ALL_CHANNELS
-        data     : A pointer to a double
-        datasize : sizeof (double) * number_of_channels
-
-

-Example: -

-
-        double   peaks [number_of_channels] ;
-        sf_command (sndfile, SFC_CALC_MAX_ALL_CHANNELS, peaks, sizeof (peaks)) ;
-
-
-
Return value:
-
Zero if peaks have been calculated successfully and non-zero otherwise. -
- - - - -


SFC_CALC_NORM_MAX_ALL_CHANNELS

-

-Calculate the normalised peak for each channel. -This involves reading through the whole file which can be slow on large files. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_CALC_NORM_MAX_ALL_CHANNELS
-        data     : A pointer to a double
-        datasize : sizeof (double) * number_of_channels
-
-

-Example: -

-
-        double   peaks [number_of_channels] ;
-        sf_command (sndfile, SFC_CALC_NORM_MAX_ALL_CHANNELS, peaks, sizeof (peaks)) ;
-
-
-
Return value:
-
Zero if peaks have been calculated successfully and non-zero otherwise. -
- - - - - - -


SFC_GET_SIGNAL_MAX

-

-Retrieve the peak value for the file as stored in the file header. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_GET_SIGNAL_MAX
-        data     : A pointer to a double
-        datasize : sizeof (double)
-
-

-Example: -

-
-        double   max_peak ;
-        sf_command (sndfile, SFC_GET_SIGNAL_MAX, &max_peak, sizeof (max_peak)) ;
-
-
-
Return value:
-
SF_TRUE if the file header contained the peak value. SF_FALSE otherwise. -
- - - -


SFC_GET_MAX_ALL_CHANNELS

-

-Retrieve the peak value for the file as stored in the file header. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_GET_SIGNAL_MAX
-        data     : A pointer to an array of doubles
-        datasize : sizeof (double) * number_of_channels
-
-

-Example: -

-
-        double   peaks [number_of_channels] ;
-        sf_command (sndfile, SFC_GET_MAX_ALL_CHANNELS, peaks, sizeof (peaks)) ;
-
-
-
Return value:
-
SF_TRUE if the file header contains per channel peak values for the file. - SF_FALSE otherwise. -
- - - - -


SFC_SET_NORM_FLOAT

-

-This command only affects data read from or written to using the floating point functions: -

-
-	size_t    sf_read_float    (SNDFILE *sndfile, float *ptr, size_t items) ;
-	size_t    sf_readf_float   (SNDFILE *sndfile, float *ptr, size_t frames) ;
-
-	size_t    sf_write_float   (SNDFILE *sndfile, float *ptr, size_t items) ;
-	size_t    sf_writef_float  (SNDFILE *sndfile, float *ptr, size_t frames) ;
-
-

-Parameters: -

-
-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_NORM_FLOAT
-        data     : NULL
-        datasize : SF_TRUE or SF_FALSE
-
-

-For read operations setting normalisation to SF_TRUE means that the data from all -subsequent reads will be be normalised to the range [-1.0, 1.0]. -

-

-For write operations, setting normalisation to SF_TRUE means than all data supplied -to the float write functions should be in the range [-1.0, 1.0] and will be scaled -for the file format as necessary. -

-

-For both cases, setting normalisation to SF_FALSE means that no scaling will take place. -

-

-Example: -

-
-        sf_command (sndfile, SFC_SET_NORM_FLOAT, NULL, SF_TRUE) ;
-
-        sf_command (sndfile, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
-
-
-
Return value:
-
Returns the previous float normalisation mode. -
- - - -


SFC_SET_NORM_DOUBLE

-

-This command only affects data read from or written to using the double precision -floating point functions: -

-
-	size_t    sf_read_double    (SNDFILE *sndfile, double *ptr, size_t items) ;
-	size_t    sf_readf_double   (SNDFILE *sndfile, double *ptr, size_t frames) ;
-
-	size_t    sf_write_double   (SNDFILE *sndfile, double *ptr, size_t items) ;
-	size_t    sf_writef_double  (SNDFILE *sndfile, double *ptr, size_t frames) ;
-
-

-Parameters: -

-
-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_NORM_DOUBLE
-        data     : NULL
-        datasize : SF_TRUE or SF_FALSE
-
-

-For read operations setting normalisation to SF_TRUE means that the data -from all subsequent reads will be be normalised to the range [-1.0, 1.0]. -

-

-For write operations, setting normalisation to SF_TRUE means than all data supplied -to the double write functions should be in the range [-1.0, 1.0] and will be scaled -for the file format as necessary. -

-

-For both cases, setting normalisation to SF_FALSE means that no scaling will take place. -

-

-Example: -

-
-        sf_command (sndfile, SFC_SET_NORM_DOUBLE, NULL, SF_TRUE) ;
-
-        sf_command (sndfile, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
-
-
-
Return value:
-
Returns the previous double normalisation mode. -
- - - -


SFC_GET_NORM_FLOAT

-

-Retrieve the current float normalisation mode. -

-

-Parameters: -

-
-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_GET_NORM_FLOAT
-        data     : NULL
-        datasize : anything
-
-

-Example: -

-
-        normalisation = sf_command (sndfile, SFC_GET_NORM_FLOAT, NULL, 0) ;
-
-
-
Return value:
-
Returns TRUE if normalisation is on and FALSE otherwise. -
- - - -


SFC_GET_NORM_DOUBLE

-

-Retrieve the current float normalisation mode. -

-

-Parameters: -

-
-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_GET_NORM_DOUBLE
-        data     : NULL
-        datasize : anything
-
-

-Example: -

-
-        normalisation = sf_command (sndfile, SFC_GET_NORM_DOUBLE, NULL, 0) ;
-
-
-
Return value:
-
Returns TRUE if normalisation is on and FALSE otherwise. -
- - - - -


SFC_SET_SCALE_FLOAT_INT_READ

-

-Set/clear the scale factor when integer (short/int) data is read from a file -containing floating point data. -

-

-Parameters: -

-
-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_SCALE_FLOAT_INT_READ
-        data     : NULL
-        datasize : TRUE or FALSE
-
-

-Example: -

-
-        sf_command (sndfile, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ;
-
-
-
Return value:
-
Returns the previous SFC_SET_SCALE_FLOAT_INT_READ setting for this file. -
- - - - -


SFC_SET_SCALE_INT_FLOAT_WRITE

-

-Set/clear the scale factor when integer (short/int) data is written to a file -as floating point data. -

-

-Parameters: -

-
-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_SCALE_FLOAT_INT_READ
-        data     : NULL
-        datasize : TRUE or FALSE
-
-

-Example: -

-
-        sf_command (sndfile, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_TRUE) ;
-
-
-
Return value:
-
Returns the previous SFC_SET_SCALE_INT_FLOAT_WRITE setting for this file. -
- - - -


SFC_GET_SIMPLE_FORMAT_COUNT

-

-Retrieve the number of simple formats supported by libsndfile. -

-

-Parameters: -

-
-        sndfile  : Not used.
-        cmd      : SFC_GET_SIMPLE_FORMAT_COUNT
-        data     : a pointer to an int
-        datasize : sizeof (int)
-
-

-Example: -

-
-        int  count ;
-        sf_command (sndfile, SFC_GET_SIMPLE_FORMAT_COUNT, &count, sizeof (int)) ;
-
-
-
Return value:
-
0 -
- - - -


SFC_GET_SIMPLE_FORMAT

-

-Retrieve information about a simple format. -

-

-Parameters: -

-
-        sndfile  : Not used.
-        cmd      : SFC_GET_SIMPLE_FORMAT
-        data     : a pointer to an  SF_FORMAT_INFO struct
-        datasize : sizeof (SF_FORMAT_INFO)
-
-

-The SF_FORMAT_INFO struct is defined in <sndfile.h> as: -

-
-        typedef struct
-        {   int         format ;
-            const char  *name ;
-            const char  *extension ;
-        } SF_FORMAT_INFO ;
-
-

-When sf_command() is called with SF_GET_SIMPLE_FORMAT, the value of the format -field should be the format number (ie 0 <= format <= count value obtained using -SF_GET_SIMPLE_FORMAT_COUNT). -

-

-Example: -

-
-        SF_FORMAT_INFO	format_info ;
-        int             k, count ;
-
-        sf_command (sndfile, SFC_GET_SIMPLE_FORMAT_COUNT, &count, sizeof (int)) ;
-
-        for (k = 0 ; k < count ; k++)
-        {   format_info.format = k ;
-            sf_command (sndfile, SFC_GET_SIMPLE_FORMAT, &format_info, sizeof (format_info)) ;
-            printf ("%08x  %s %s\n", format_info.format, format_info.name, format_info.extension) ;
-            } ;
-
-
-
Return value:
-
0 on success and non-zero otherwise. -
The value of the format field of the SF_FORMAT_INFO struct will be a value which - can be placed in the format field of an SF_INFO struct when a file is to be opened - for write. -
The name field will contain a char* pointer to the name of the string, eg. "WAV (Microsoft 16 bit PCM)". -
The extension field will contain the most commonly used file extension for that file type. -
- - - -


SFC_GET_FORMAT_INFO

-

-Retrieve information about a major or subtype format. -

-

-Parameters: -

-
-        sndfile  : Not used.
-        cmd      : SFC_GET_FORMAT_INFO
-        data     : a pointer to an SF_FORMAT_INFO struct
-        datasize : sizeof (SF_FORMAT_INFO)
-
-

-The SF_FORMAT_INFO struct is defined in <sndfile.h> as: -

-
-        typedef struct
-        {   int         format ;
-            const char  *name ;
-            const char  *extension ;
-        } SF_FORMAT_INFO ;
-
-

-When sf_command() is called with SF_GET_FORMAT_INFO, the format field is -examined and if (format & SF_FORMAT_TYPEMASK) is a valid format then the struct -is filled in with information about the given major type. -If (format & SF_FORMAT_TYPEMASK) is FALSE and (format & SF_FORMAT_SUBMASK) is a -valid subtype format then the struct is filled in with information about the given -subtype. -

-

-Example: -

-
-        SF_FORMAT_INFO	format_info ;
-
-        format_info.format = SF_FORMAT_WAV ;
-        sf_command (sndfile, SFC_GET_FORMAT_INFO, &format_info, sizeof (format_info)) ;
-        printf ("%08x  %s %s\n", format_info.format, format_info.name, format_info.extension) ;
-
-        format_info.format = SF_FORMAT_ULAW ;
-        sf_command (sndfile, SFC_GET_FORMAT_INFO, &format_info, sizeof (format_info)) ;
-        printf ("%08x  %s\n", format_info.format, format_info.name) ;
-
-
-
Return value:
-
0 on success and non-zero otherwise. -
- - -


SFC_GET_FORMAT_MAJOR_COUNT

-

-Retrieve the number of major formats. -

-

-Parameters: -

-
-        sndfile  : Not used.
-        cmd      : SFC_GET_FORMAT_MAJOR_COUNT
-        data     : a pointer to an int
-        datasize : sizeof (int)
-
-

-Example: -

-
-        int  count ;
-        sf_command (sndfile, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof (int)) ;
-
-
-
Return value:
-
0 -
- - - -


SFC_GET_FORMAT_MAJOR

-

-Retrieve information about a major format type. -

-

-Parameters: -

-
-        sndfile  : Not used.
-        cmd      : SFC_GET_FORMAT_MAJOR
-        data     : a pointer to an  SF_FORMAT_INFO struct
-        datasize : sizeof (SF_FORMAT_INFO)
-
-

-Example: -

-
-        SF_FORMAT_INFO	format_info ;
-        int             k, count ;
-
-        sf_command (sndfile, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof (int)) ;
-
-        for (k = 0 ; k < count ; k++)
-        {   format_info.format = k ;
-            sf_command (sndfile, SFC_GET_FORMAT_MAJOR, &format_info, sizeof (format_info)) ;
-            printf ("%08x  %s %s\n", format_info.format, format_info.name, format_info.extension) ;
-            } ;
-
-

-For a more comprehensive example, see the program list_formats.c in the examples/ -directory of the libsndfile source code distribution. -

-
-
Return value:
-
0 on success and non-zero otherwise. -
The value of the format field will be one of the major format identifiers such as - SF_FORMAT_WAV or SF_FORMAT_AIFF. -
The name field will contain a char* pointer to the name of the string, eg. "WAV (Microsoft)". -
The extension field will contain the most commonly used file extension for that file type. -
- - - -


SFC_GET_FORMAT_SUBTYPE_COUNT

-

-Retrieve the number of subformats. -

-

-Parameters: -

-
-        sndfile  : Not used.
-        cmd      : SFC_GET_FORMAT_SUBTYPE_COUNT
-        data     : a pointer to an int
-        datasize : sizeof (int)
-
-

-Example: -

-
-        int   count ;
-        sf_command (sndfile, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int)) ;
-
-
-
Return value:
-
0 -
- - - -


SFC_GET_FORMAT_SUBTYPE

-

-Enumerate the subtypes (this function does not translate a subtype into -a string describing that subtype). -A typical use case might be retrieving a string description of all subtypes -so that a dialog box can be filled in. -

-

- -

-

-Parameters: -

-
-        sndfile  : Not used.
-        cmd      : SFC_GET_FORMAT_SUBTYPE
-        data     : a pointer to an SF_FORMAT_INFO struct
-        datasize : sizeof (SF_FORMAT_INFO)
-
-

-Example 1: Retrieve all sybtypes supported by the WAV format. -

-
-        SF_FORMAT_INFO	format_info ;
-        int             k, count ;
-
-        sf_command (sndfile, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int)) ;
-
-        for (k = 0 ; k < count ; k++)
-        {   format_info.format = k ;
-            sf_command (sndfile, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)) ;
-            if (! sf_format_check (format_info.format | SF_FORMAT_WAV))
-               continue ;
-            printf ("%08x  %s\n", format_info.format, format_info.name) ;
-            } ;
-
-

-Example 2: Print a string describing the SF_FORMAT_PCM_16 subtype. -

-
-        SF_FORMAT_INFO	format_info ;
-        int             k, count ;
-
-        sf_command (sndfile, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int)) ;
-
-        for (k = 0 ; k < count ; k++)
-        {   format_info.format = k ;
-            sf_command (sndfile, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)) ;
-            if (format_info.format == SF_FORMAT_PCM_16)
-            {   printf ("%08x  %s\n", format_info.format, format_info.name) ;
-                break ;
-                } ;
-            } ;
-
-

-For a more comprehensive example, see the program list_formats.c in the examples/ -directory of the libsndfile source code distribution. -

-
-
Return value:
-
0 on success and non-zero otherwise. -
The value of the format field will be one of the major format identifiers such as - SF_FORMAT_WAV or SF_FORMAT_AIFF. -
The name field will contain a char* pointer to the name of the string; for instance - "WAV (Microsoft)" or "AIFF (Apple/SGI)". -
The extension field will be a NULL pointer. -
- - - -


SFC_SET_ADD_PEAK_CHUNK

-

-By default, WAV and AIFF files which contain floating point data (subtype SF_FORMAT_FLOAT -or SF_FORMAT_DOUBLE) have a PEAK chunk. -By using this command, the addition of a PEAK chunk can be turned on or off. -

-

-Note : This call must be made before any data is written to the file. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_ADD_PEAK_CHUNK
-        data     : Not used (should be NULL)
-        datasize : TRUE or FALSE.
-
-

-Example: -

-
-        /* Turn on the PEAK chunk. */
-        sf_command (sndfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ;
-
-        /* Turn off the PEAK chunk. */
-        sf_command (sndfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ;
-
-
-
Return value:
-
Returns SF_TRUE if the peak chunk will be written after this call. -
Returns SF_FALSE if the peak chunk will not be written after this call. -
- - - -


SFC_UPDATE_HEADER_NOW

-

-The header of an audio file is normally written by libsndfile when the file is -closed using sf_close(). -

-

-There are however situations where large files are being generated and it would -be nice to have valid data in the header before the file is complete. -Using this command will update the file header to reflect the amount of data written -to the file so far. -Other programs opening the file for read (before any more data is written) will -then read a valid sound file header. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_UPDATE_HEADER_NOW
-        data     : Not used (should be NULL)
-        datasize : Not used.
-
-

-Example: -

-
-        /* Update the header now. */
-        sf_command (sndfile, SFC_UPDATE_HEADER_NOW, NULL, 0) ;
-
-
-
Return value:
-
0 -
- - - -


SFC_SET_UPDATE_HEADER_AUTO

-

-Similar to SFC_UPDATE_HEADER_NOW but updates the header at the end of every call -to the sf_write* functions. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_UPDATE_HEADER_NOW
-        data     : Not used (should be NULL)
-        datasize : SF_TRUE or SF_FALSE
-
-

-Example: -

-
-        /* Turn on auto header update. */
-        sf_command (sndfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ;
-
-        /* Turn off auto header update. */
-        sf_command (sndfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_FALSE) ;
-
-
-
Return value:
-
TRUE if auto update header is now on; FALSE otherwise. -
- - - -


SFC_FILE_TRUNCATE

-

-Truncate a file that was opened for write or read/write. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_FILE_TRUNCATE
-        data     : A pointer to an sf_count_t.
-        datasize : sizeof (sf_count_t)
-
- -

-Truncate the file to the number of frames specified by the sf_count_t pointed -to by data. -After this command, both the read and the write pointer will be -at the new end of the file. -This command will fail (returning non-zero) if the requested truncate position -is beyond the end of the file. -

-

-Example: -

-
-        /* Truncate the file to a length of 20 frames. */
-        sf_count_t  frames = 20 ;
-        sf_command (sndfile, SFC_FILE_TRUNCATE, &frames, sizeof (frames)) ;
-
-
-
Return value:
-
Zero on sucess, non-zero otherwise. -
- - - -


SFC_SET_RAW_START_OFFSET

-

-Change the data start offset for files opened up as SF_FORMAT_RAW. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_RAW_START_OFFSET
-        data     : A pointer to an sf_count_t.
-        datasize : sizeof (sf_count_t)
-
- -

-For a file opened as format SF_FORMAT_RAW, set the data offset to the value -given by data. -

-

-Example: -

-
-        /* Reset the data offset to 5 bytes from the start of the file. */
-        sf_count_t  offset = 5 ;
-        sf_command (sndfile, SFC_SET_RAW_START_OFFSET, &offset, sizeof (offset)) ;
-
-
-
Return value:
-
Zero on success, non-zero otherwise. -
- - - -


SFC_SET_CLIPPING

-

-Turn on/off automatic clipping when doing floating point to integer conversion. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_CLIPPING
-        data     : NULL
-        datasize : SF_TRUE or SF_FALSE.
-
- -

-Turn on (datasize == SF_TRUE) or off (datasize == SF_FALSE) clipping. -

-

-Example: -

-
-        sf_command (sndfile, SFC_SET_CLIPPING, NULL, SF_TRUE) ;
-
-
-
Return value:
-
Clipping mode (SF_TRUE or SF_FALSE). -
- - - - -


SFC_GET_CLIPPING

-

-Turn on/off automatic clipping when doing floating point to integer conversion. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_GET_CLIPPING
-        data     : NULL
-        datasize : 0
-
- -

-Retrieve the current cliiping setting. -

-

-Example: -

-
-        sf_command (sndfile, SFC_GET_CLIPPING, NULL, 0) ;
-
-
-
Return value:
-
Clipping mode (SF_TRUE or SF_FALSE). -
- - - -


SFC_GET_EMBED_FILE_INFO

-

-Get the file offset and file length of a file enbedded within another -larger file. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_GET_CLIPPING
-        data     : a pointer to an  SF_EMBED_FILE_INFO struct
-        datasize : sizeof (SF_EMBED_FILE_INFO)
-
-

-The SF_EMBED_FILE_INFO struct is defined in <sndfile.h> as: -

-
-        typedef struct
-        {   sf_count_t	offset ;
-            sf_count_t	length ;
-        } SF_EMBED_FILE_INFO ;
-
-
-
Return value:
-
0 on success and non-zero otherwise. -
The value of the offset field of the SF_EMBED_FILE_INFO struct will be - the offsets in bytes from the start of the outer file to the start of - the audio file. -
The value of the offset field of the SF_EMBED_FILE_INFO struct will be - the length in bytes of the embedded file. -
- - - - - -


SFC_WAVEX_GET_AMBISONIC

-

-Test if the current file has the GUID of a WAVEX file for any of the Ambisonic -formats. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_WAVEX_GET_AMBISONIC
-        data     : NULL
-        datasize : 0
-
-

- The Ambisonic WAVEX formats are defined here : - - http://dream.cs.bath.ac.uk/researchdev/wave-ex/bformat.html. -

-
-
Return value:
-
SF_AMBISONIC_NONE or SF_AMBISONIC_B_FORMAT or zero if the file format - does not support ambisonic formats. -
- - - -


SFC_WAVEX_SET_AMBISONIC

-

-Set the GUID of a new WAVEX file to indicate an Ambisonics format. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_WAVEX_SET_AMBISONIC
-        data     : NULL
-        datasize : SF_AMBISONIC_NONE or SF_AMBISONIC_B_FORMAT
-
-

-Turn on (SF_AMBISONIC_B_FORMAT) or off (SF_AMBISONIC_NONE) encoding. -This command is currently only supported for files with SF_FORMAT_WAVEX format. -

-

- The Ambisonic WAVEX formats are defined here : - - http://dream.cs.bath.ac.uk/researchdev/wave-ex/bformat.html. -

-
-
Return value:
-
Return the ambisonic value that has just been set or zero if the file - format does not support ambisonic encoding. -
- - - -


SFC_SET_VBR_ENCODING_QUALITY

-

-Set the Variable Bit Rate encoding quality. -The encoding quality value should be between 0.0 (lowest quality) and 1.0 -(highest quality). -Currenly this command is only implemented for FLAC and Ogg/Vorbis files. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_VBR_ENCODING_QUALITY
-        data     : A pointer to a double value
-        datasize : sizeof (double)
-
-

-The command must be sent before any audio data is written to the file. -

-

-

-
-
Return value:
-
SF_TRUE if VBR encoding quality was set. - SF_FALSE otherwise. -
- - - -


SFC_SET_COMPRESSION_LEVEL

-

-Set the compression level. -The compression level should be between 0.0 (minimum compression level) and 1.0 -(highest compression level). -Currenly this command is only implemented for FLAC and Ogg/Vorbis files. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_COMPRESSION_LEVEL
-        data     : A pointer to a double value
-        datasize : sizeof (double)
-
-

-The command must be sent before any audio data is written to the file. -

-

-

-
-
Return value:
-
SF_TRUE if compression level was set. - SF_FALSE otherwise. -
- - - -


SFC_RAW_NEEDS_ENDSWAP

-

-Determine if raw data read using - - sf_read_raw -needs to be end swapped on the host CPU. -

-

-For instance, will return SF_TRUE on when reading WAV containing -SF_FORMAT_PCM_16 data on a big endian machine and SF_FALSE on a little endian -machine. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_RAW_NEEDS_ENDSWAP
-        data     : NULL
-        datasize : 0
-
- -
-
Return value:
-
SF_TRUE or SF_FALSE -
- - - - -


SFC_GET_BROADCAST_INFO

-

-Retrieve the Broadcast Extension Chunk from WAV (and related) files. -

-

-Parameters: -

-
-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_GET_BROADCAST_INFO
-        data     : a pointer to an SF_BROADCAST_INFO struct
-        datasize : sizeof (SF_BROADCAST_INFO)
-
-

-The SF_BROADCAST_INFO struct is defined in <sndfile.h> as: -

-
-    typedef struct
-    {   char            description [256] ;
-        char            originator [32] ;
-        char            originator_reference [32] ;
-        char            origination_date [10] ;
-        char            origination_time [8] ;
-        unsigned int    time_reference_low ;
-        unsigned int    time_reference_high ;
-        short           version ;
-        char            umid [64] ;
-        char            reserved [190] ;
-        unsigned int    coding_history_size ;
-        char            coding_history [256] ;
-    } SF_BROADCAST_INFO ;
-
- -
-
Return value:
-
SF_TRUE if the file contained a Broadcast Extension chunk or SF_FALSE - otherwise. -
- - - -


SFC_SET_BROADCAST_INFO

-

-Set the Broadcast Extension Chunk for WAV (and related) files. -

-

-Parameters: -

-
-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_BROADCAST_INFO
-        data     : a pointer to an SF_BROADCAST_INFO struct
-        datasize : sizeof (SF_BROADCAST_INFO)
-
- -
-
Return value:
-
SF_TRUE if setting the Broadcast Extension chunk was successful and SF_FALSE - otherwise. - -
- - - -


SFC_GET_CART_INFO

-

Retrieve the Cart Chunk from WAV (and related) files. Based on AES46 standard for CartChunk (see CartChunk.org for more information. -

-

-Parameters: -

-
-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_GET_CART_INFO
-        data     : a pointer to an SF_CART_INFO struct
-        datasize : sizeof (SF_CART_INFO)
-
-

-The SF_CART_INFO struct is defined in <sndfile.h> as: -

-
-#define SF_CART_INFO_VAR(p_tag_text_size) \
-                        struct
-                        {       char            version [4] ;
-                                char            title [64] ;
-                                char            artist [64] ;
-                                char            cut_id [64] ;
-                                char            client_id [64] ;
-                                char            category [64] ;
-                                char            classification [64] ;
-                                char            out_cue [64] ;
-                                char            start_date [10] ;
-                                char            start_time [8] ;
-                                char            end_date [10] ;
-                                char            end_time [8] ;
-                                char            producer_app_id [64] ;
-                                char            producer_app_version [64] ;
-                                char            user_def [64] ;
-                                long    level_reference ;
-                                SF_CART_TIMER   post_timers [8] ;
-                                char            reserved [276] ;
-                                char            url [1024] ;
-                                unsigned int    tag_text_size ;
-                                char            tag_text[p_tag_text_size] ;
-                        }
-
- -
-
Return value:
-
SF_TRUE if the file contained a Cart chunk or SF_FALSE - otherwise. -
- - - -


SFC_SET_CART_INFO

-

-Set the Cart Chunk for WAV (and related) files. -

-

-Parameters: -

-
-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_CART_INFO
-        data     : a pointer to an SF_CART_INFO struct
-        datasize : sizeof (SF_CART_INFO)
-
- -
-
Return value:
-
SF_TRUE if setting the Cart chunk was successful and SF_FALSE - otherwise. -
- - - -


SFC_GET_LOOP_INFO

-

-Retrieve loop information for file including time signature, length in -beats and original MIDI base note -

-

-Parameters: -

-
-         sndfile  : A valid SNDFILE* pointer
-         cmd      : SFC_GET_LOOP_INFO
-         data     : a pointer to an SF_LOOP_INFO struct
-         datasize : sizeof (SF_LOOP_INFO)
-
-

-The SF_BROADCAST_INFO struct is defined in <sndfile.h> as: -

-
-        typedef struct
-        {   short    time_sig_num ;   /* any positive integer    > 0  */
-            short    time_sig_den ;   /* any positive power of 2 > 0  */
-            int        loop_mode ;    /* see SF_LOOP enum             */
-
-            int        num_beats ;    /* this is NOT the amount of quarter notes !!!*/
-                                      /* a full bar of 4/4 is 4 beats */
-                                      /* a full bar of 7/8 is 7 beats */
-
-            float    bpm ;            /* suggestion, as it can be calculated using other fields:*/
-                                      /* file's lenght, file's sampleRate and our time_sig_den*/
-                                      /* -> bpms are always the amount of _quarter notes_ per minute */
-
-            int    root_key ;         /* MIDI note, or -1 for None */
-            int future [6] ;
-        } SF_LOOP_INFO ;
-
-

-Example: -

-
-         SF_LOOP_INFO loop;
-         sf_command (sndfile, SFC_GET_LOOP_INFO, &loop, sizeof (loop)) ;
-
-
-
Return value:
-
SF_TRUE if the file header contains loop information for the file. - SF_FALSE otherwise. -
- - - - - -


SFC_GET_INSTRUMENT

-

-Retrieve instrument information from file including MIDI base note, -keyboard mapping and looping informations(start/stop and mode). -

-

-Parameters: -

-
-         sndfile  : A valid SNDFILE* pointer
-         cmd      : SFC_GET_INSTRUMENT
-         data     : a pointer to an SF_INSTRUMENT struct
-         datasize : sizeof (SF_INSTRUMENT)
-
- -

-The SF_INSTRUMENT struct is defined in <sndfile.h> as: -

-
-        enum
-        {    /*
-            **    The loop mode field in SF_INSTRUMENT will be one of the following.
-            */
-            SF_LOOP_NONE = 800,
-            SF_LOOP_FORWARD,
-            SF_LOOP_BACKWARD,
-            SF_LOOP_ALTERNATING
-        } ;
-
-        typedef struct
-        {   int gain ;
-            char basenote, detune ;
-            char velocity_lo, velocity_hi ;
-            char key_lo, key_hi ;
-            int loop_count ;
-
-            struct
-            {   int mode ;
-                unsigned int start ;
-                unsigned int end ;
-                unsigned int count ;
-            } loops [16] ; /* make variable in a sensible way */
-        } SF_INSTRUMENT ;
-
- -

-Example: -

-
-         SF_INSTRUMENT inst ;
-         sf_command (sndfile, SFC_GET_INSTRUMENT, &inst, sizeof (inst)) ;
-
-
-
Return value:
-
SF_TRUE if the file header contains instrument information for the - file. SF_FALSE otherwise. -
- - - - - -


SFC_SET_INSTRUMENT

-

-Set the instrument information for the file. -

-

-Parameters: -

-
-         sndfile  : A valid SNDFILE* pointer
-         cmd      : SFC_GET_INSTRUMENT
-         data     : a pointer to an SF_INSTRUMENT struct
-         datasize : sizeof (SF_INSTRUMENT)
-
-

-Example: -

-
-         SF_INSTRUMENT inst ;
-         sf_command (sndfile, SFC_SET_INSTRUMENT, &inst, sizeof (inst)) ;
-
-
-
Return value:
-
SF_TRUE if the file header contains instrument information for the - file. SF_FALSE otherwise. -
- - - - -
-

- The libsndfile home page is here : - - http://www.mega-nerd.com/libsndfile/. -
-Version : 1.0.25 -

- - - diff --git a/libs/libsndfile/doc/development.html b/libs/libsndfile/doc/development.html deleted file mode 100644 index 4236cdbb87..0000000000 --- a/libs/libsndfile/doc/development.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - libsndfile Development - - - - - - - - -


libsndfile Development

- -

-libsndfile is being developed by a small but growing community of users -and hackers led by Erik de Castro Lopo. -People interested in helping should join the libsndfile-devel - mailing list -where most of the discussion about new features takes place. -

- -

-The main repository can be found on Github: -

- -
- - https://github.com/erikd/libsndfile/ -
- -

-and includes - - instuctions -on how to build libsndfilefrom the Git repo. -

- - - - diff --git a/libs/libsndfile/doc/dither.html b/libs/libsndfile/doc/dither.html deleted file mode 100644 index 01a416f8b3..0000000000 --- a/libs/libsndfile/doc/dither.html +++ /dev/null @@ -1,1017 +0,0 @@ - - - - - - libsndfile : the sf_command function. - - - - - - - - - - - -

sf_command

-
-
-        int    sf_command (SNDFILE *sndfile, int cmd, void *data, int datasize) ;
-
-

- This function allows the caller to retrieve information from or change aspects of the - library behaviour. - Examples include retrieving a string containing the library version or changing the - scaling applied to floating point sample data during read and write. - Most of these operations are performed on a per-file basis. -

-

- The cmd parameter is a integer identifier which is defined in <sndfile.h>. - All of the valid command identifiers have names begining with "SFC_". - Data is passed to and returned from the library by use of a void pointer. - The library will not read or write more than datasize bytes from the void pointer. - For some calls no data is required in which case data should be NULL and datasize - may be used for some other purpose. -

-

- The available commands are as follows: -

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SFC_GET_LIB_VERSIONRetrieve the version of the library.
SFC_GET_LOG_INFORetrieve the internal per-file operation log.
SFC_CALC_SIGNAL_MAXRetrieve the measured maximum signal value.
SFC_CALC_NORM_SIGNAL_MAXRetrieve the measured normalised maximum signal value.
SFC_CALC_MAX_ALL_CHANNELSCalculate peaks for all channels.
SFC_CALC_NORM_MAX_ALL_CHANNELSCalculate normalised peaks for all channels.
SFC_SET_NORM_FLOATModify the normalisation behaviour of the floating point reading and writing functions.
SFC_SET_NORM_DOUBLEModify the normalisation behaviour of the double precision floating point reading and writing functions.
SFC_GET_NORM_FLOATRetrieve the current normalisation behaviour of the floating point reading and writing functions.
SFC_GET_NORM_DOUBLERetrieve the current normalisation behaviour of the double precision floating point reading and writing functions.
SFC_GET_SIMPLE_FORMAT_COUNTRetrieve the number of simple formats supported by libsndfile.
SFC_GET_SIMPLE_FORMATRetrieve information about a simple format.
SFC_GET_FORMAT_INFORetrieve information about a major or subtype format.
SFC_GET_FORMAT_MAJOR_COUNTRetrieve the number of major formats.
SFC_GET_FORMAT_MAJORRetrieve information about a major format type.
SFC_GET_FORMAT_SUBTYPE_COUNTRetrieve the number of subformats.
SFC_GET_FORMAT_SUBTYPERetrieve information about a subformat.
SFC_SET_ADD_PEAK_CHUNKSwitch the code for adding the PEAK chunk to WAV and AIFF files on or off.
SFC_UPDATE_HEADER_NOWUsed when a file is open for write, this command will update the file - header to reflect the data written so far.
SFC_SET_UPDATE_HEADER_AUTOUsed when a file is open for write, this command will cause the file header - to be updated after each write to the file.
SFC_FILE_TRUNCATETruncate a file open for write or for read/write.
SFC_SET_RAW_START_OFFSETChange the data start offset for files opened up as SF_FORMAT_RAW.
-
- -

- -
- - - -


SFC_GET_LIB_VERSION

-

-Retrieve the version of the library as a string. -

-

-Parameters: -

-        sndfile  : Not used
-        cmd      : SFC_GET_LIB_VERSION
-        data     : A pointer to a char buffer
-        datasize : The size of the the buffer
-
-

-Example: -

-
-        char  buffer [128] ;
-        sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ;
-
- -
-
Return value:
-
This call will return the length of the retrieved version string. -
-
-
Notes:
-
-The string returned in the buffer passed to this function will not overflow -the buffer and will always be null terminated . -
- - - -


SFC_GET_LOG_INFO

-

-Retrieve the log buffer generated when opening a file as a string. This log -buffer can often contain a good reason for why libsndfile failed to open a -particular file. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_GET_LOG_INFO
-        data     : A pointer to a char buffer
-        datasize : The size of the the buffer
-
-

-Example: -

-
-        char  buffer [2048] ;
-        sf_command (sndfile, SFC_GET_LOG_INFO, buffer, sizeof (buffer)) ;
-
- -
-
Return value:
-
This call will return the length of the retrieved version string. -
-
-
Notes:
-
-The string returned in the buffer passed to this function will not overflow -the buffer and will always be null terminated . -
- - - -


SFC_CALC_SIGNAL_MAX

-

-Retrieve the measured maximum signal value. This involves reading through -the whole file which can be slow on large files. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_CALC_SIGNAL_MAX
-        data     : A pointer to a double
-        datasize : sizeof (double)
-
-

-Example: -

-
-        double   max_val ;
-        sf_command (sndfile, SFC_CALC_SIGNAL_MAX, &max_val, sizeof (max_val)) ;
-
- -
-
Return value:
-
Zero on success, non-zero otherwise. -
- - - -


SFC_CALC_NORM_SIGNAL_MAX

-

-Retrieve the measured normailised maximum signal value. This involves reading -through the whole file which can be slow on large files. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_CALC_NORM_SIGNAL_MAX
-        data     : A pointer to a double
-        datasize : sizeof (double)
-
-

-Example: -

-
-        double   max_val ;
-        sf_command (sndfile, SFC_CALC_NORM_SIGNAL_MAX, &max_val, sizeof (max_val)) ;
-
- -
-
Return value:
-
Zero on success, non-zero otherwise. -
- - - -


SFC_CALC_MAX_ALL_CHANNELS

-

-Calculate peaks for all channels. This involves reading through -the whole file which can be slow on large files. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_CALC_MAX_ALL_CHANNELS
-        data     : A pointer to a double
-        datasize : sizeof (double) * number_of_channels
-
-

-Example: -

-
-        double   peaks [number_of_channels] ;
-        sf_command (sndfile, SFC_CALC_MAX_ALL_CHANNELS, peaks, sizeof (peaks)) ;
-
-
-
Return value:
-
Zero if peaks have been calculated successfully and non-zero otherwise. -
- - - - -


SFC_CALC_NORM_MAX_ALL_CHANNELS

-

-Calculate normalised peaks for all channels. This involves reading through -the whole file which can be slow on large files. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_CALC_NORM_MAX_ALL_CHANNELS
-        data     : A pointer to a double
-        datasize : sizeof (double) * number_of_channels
-
-

-Example: -

-
-        double   peaks [number_of_channels] ;
-        sf_command (sndfile, SFC_CALC_NORM_MAX_ALL_CHANNELS, peaks, sizeof (peaks)) ;
-
-
-
Return value:
-
Zero if peaks have been calculated successfully and non-zero otherwise. -
- - - - - - - - - - - -


SFC_SET_NORM_FLOAT

-

-This command only affects data read from or written to using the floating point functions: -

-
-	size_t    sf_read_float    (SNDFILE *sndfile, float *ptr, size_t items) ;
-	size_t    sf_readf_float   (SNDFILE *sndfile, float *ptr, size_t frames) ;
-
-	size_t    sf_write_float   (SNDFILE *sndfile, float *ptr, size_t items) ;
-	size_t    sf_writef_float  (SNDFILE *sndfile, float *ptr, size_t frames) ;
-
-

-Parameters: -

-
-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_NORM_FLOAT
-        data     : NULL
-        datasize : SF_TRUE or SF_FALSE
-
-

-For read operations setting normalisation to SF_TRUE means that the data from all -subsequent reads will be be normalised to the range [-1.0, 1.0]. -

-

-For write operations, setting normalisation to SF_TRUE means than all data supplied -to the float write functions should be in the range [-1.0, 1.0] and will be scaled -for the file format as necessary. -

-

-For both cases, setting normalisation to SF_FALSE means that no scaling will take place. -

-

-Example: -

-
-        sf_command (sndfile, SFC_SET_NORM_FLOAT, NULL, SF_TRUE) ;
-
-        sf_command (sndfile, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
-
-
-
Return value:
-
Returns 1 on success or 0 for failure. -
- - - -


SFC_SET_NORM_DOUBLE

-

-This command only affects data read from or written to using the double precision -floating point functions: -

-
-	size_t    sf_read_double    (SNDFILE *sndfile, double *ptr, size_t items) ;
-	size_t    sf_readf_double   (SNDFILE *sndfile, double *ptr, size_t frames) ;
-
-	size_t    sf_write_double   (SNDFILE *sndfile, double *ptr, size_t items) ;
-	size_t    sf_writef_double  (SNDFILE *sndfile, double *ptr, size_t frames) ;
-
-

-Parameters: -

-
-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_NORM_DOUBLE
-        data     : NULL
-        datasize : SF_TRUE or SF_FALSE
-
-

-For read operations setting normalisation to SF_TRUE means that the data -from all subsequent reads will be be normalised to the range [-1.0, 1.0]. -

-

-For write operations, setting normalisation to SF_TRUE means than all data supplied -to the double write functions should be in the range [-1.0, 1.0] and will be scaled -for the file format as necessary. -

-

-For both cases, setting normalisation to SF_FALSE means that no scaling will take place. -

-

-Example: -

-
-        sf_command (sndfile, SFC_SET_NORM_DOUBLE, NULL, SF_TRUE) ;
-
-        sf_command (sndfile, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
-
-
-
Return value:
-
Returns 1 on success or 0 for failure. -
- - - -


SFC_GET_NORM_FLOAT

-

-Retrieve the current float normalisation mode. -

-

-Parameters: -

-
-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_GET_NORM_FLOAT
-        data     : NULL
-        datasize : anything
-
-

-Example: -

-
-        normalisation = sf_command (sndfile, SFC_GET_NORM_FLOAT, NULL, 0) ;
-
-
-
Return value:
-
Returns TRUE if normaisation is on and FALSE otherwise. -
- - - -


SFC_GET_NORM_DOUBLE

-

-Retrieve the current float normalisation mode. -

-

-Parameters: -

-
-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_GET_NORM_DOUBLE
-        data     : NULL
-        datasize : anything
-
-

-Example: -

-
-        normalisation = sf_command (sndfile, SFC_GET_NORM_DOUBLE, NULL, 0) ;
-
-
-
Return value:
-
Returns TRUE if normalisation is on and FALSE otherwise. -
- - - -


SFC_GET_SIMPLE_FORMAT_COUNT

-

-Retrieve the number of simple formats supported by libsndfile. -

-

-Parameters: -

-
-        sndfile  : Not used.
-        cmd      : SFC_GET_SIMPLE_FORMAT_COUNT
-        data     : a pointer to an int
-        datasize : sizeof (int)
-
-

-Example: -

-
-        int  count ;
-        sf_command (sndfile, SFC_GET_SIMPLE_FORMAT_COUNT, &count, sizeof (int)) ;
-
-
-
Return value:
-
0 -
- - - -


SFC_GET_SIMPLE_FORMAT

-

-Retrieve information about a simple format. -

-

-Parameters: -

-
-        sndfile  : Not used.
-        cmd      : SFC_GET_SIMPLE_FORMAT
-        data     : a pointer to an  SF_FORMAT_INFO struct
-        datasize : sizeof (SF_FORMAT_INFO)
-
-

-The SF_FORMAT_INFO struct is defined in <sndfile.h> as: -

-
-        typedef struct
-        {   int         format ;
-            const char  *name ;
-            const char  *extension ;
-        } SF_FORMAT_INFO ;
-
-

-When sf_command() is called with SF_GET_SIMPLE_FORMAT, the value of the format -field should be the format number (ie 0 <= format <= count value obtained using -SF_GET_SIMPLE_FORMAT_COUNT). -

-

-Example: -

-
-        SF_FORMAT_INFO	format_info ;
-        int             k, count ;
-
-        sf_command (sndfile, SFC_GET_SIMPLE_FORMAT_COUNT, &count, sizeof (int)) ;
-
-        for (k = 0 ; k < count ; k++)
-        {   format_info.format = k ;
-            sf_command (sndfile, SFC_GET_SIMPLE_FORMAT, &format_info, sizeof (format_info)) ;
-            printf ("%08x  %s %s\n", format_info.format, format_info.name, format_info.extension) ;
-            } ;
-
-
-
Return value:
-
0 on success and non-zero otherwise. -
The value of the format field of the SF_FORMAT_INFO struct will be an value which - can be placed in the format field of an SF_INFO struct when a file is to be opened - for write. -
The name field will contain a char* pointer to the name of the string ie "WAV (Microsoft 16 bit PCM)". -
The extention field will contain the most commonly used file extension for that file type. -
- - - -


SFC_GET_FORMAT_INFO

-

-Retrieve information about a major or subtype format. -

-

-Parameters: -

-
-        sndfile  : Not used.
-        cmd      : SFC_GET_FORMAT_INFO
-        data     : a pointer to an SF_FORMAT_INFO struct
-        datasize : sizeof (SF_FORMAT_INFO)
-
-

-The SF_FORMAT_INFO struct is defined in <sndfile.h> as: -

-
-        typedef struct
-        {   int         format ;
-            const char  *name ;
-            const char  *extension ;
-        } SF_FORMAT_INFO ;
-
-

-When sf_command() is called with SF_GET_FORMAT_INFO, the format field is -examined and if (format & SF_FORMAT_TYPEMASK) is a valid format then the struct -is filled in with information about the given major type. -If (format & SF_FORMAT_TYPEMASK) is FALSE and (format & SF_FORMAT_SUBMASK) is a -valid subtype format then the struct is filled in with information about the given -subtype. -

-

-Example: -

-
-        SF_FORMAT_INFO	format_info ;
-
-        format_info.format = SF_FORMAT_WAV ;
-        sf_command (sndfile, SFC_GET_FORMAT_INFO, &format_info, sizeof (format_info)) ;
-        printf ("%08x  %s %s\n", format_info.format, format_info.name, format_info.extension) ;
-
-        format_info.format = SF_FORMAT_ULAW ;
-        sf_command (sndfile, SFC_GET_FORMAT_INFO, &format_info, sizeof (format_info)) ;
-        printf ("%08x  %s\n", format_info.format, format_info.name) ;
-
-
-
Return value:
-
0 on success and non-zero otherwise. -
- - -


SFC_GET_FORMAT_MAJOR_COUNT

-

-Retrieve the number of major formats. -

-

-Parameters: -

-
-        sndfile  : Not used.
-        cmd      : SFC_GET_FORMAT_MAJOR_COUNT
-        data     : a pointer to an int
-        datasize : sizeof (int)
-
-

-Example: -

-
-        int  count ;
-        sf_command (sndfile, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof (int)) ;
-
-
-
Return value:
-
0 -
- - - -


SFC_GET_FORMAT_MAJOR

-

-Retrieve information about a major format type. -

-

-Parameters: -

-
-        sndfile  : Not used.
-        cmd      : SFC_GET_FORMAT_MAJOR
-        data     : a pointer to an  SF_FORMAT_INFO struct
-        datasize : sizeof (SF_FORMAT_INFO)
-
-

-Example: -

-
-        SF_FORMAT_INFO	format_info ;
-        int             k, count ;
-
-        sf_command (sndfile, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof (int)) ;
-
-        for (k = 0 ; k < count ; k++)
-        {   format_info.format = k ;
-            sf_command (sndfile, SFC_GET_FORMAT_MAJOR, &format_info, sizeof (format_info)) ;
-            printf ("%08x  %s %s\n", format_info.format, format_info.name, format_info.extension) ;
-            } ;
-
-

-For a more comprehensive example, see the program list_formats.c in the examples/ -directory of the libsndfile source code distribution. -

-
-
Return value:
-
0 on success and non-zero otherwise. -
The value of the format field will one of the major format identifiers suc as SF_FORMAT_WAV - SF_FORMAT_AIFF. -
The name field will contain a char* pointer to the name of the string ie "WAV (Microsoft)". -
The extention field will contain the most commonly used file extension for that file type. -
- - - -


SFC_GET_FORMAT_SUBTYPE_COUNT

-

-Retrieve the number of subformats. -

-

-Parameters: -

-
-        sndfile  : Not used.
-        cmd      : SFC_GET_FORMAT_SUBTYPE_COUNT
-        data     : a pointer to an int
-        datasize : sizeof (int)
-
-

-Example: -

-
-        int   count ;
-        sf_command (sndfile, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int)) ;
-
-
-
Return value:
-
0 -
- - - -


SFC_GET_FORMAT_SUBTYPE

-

-Retrieve information about a subformat. -

-

-Parameters: -

-
-        sndfile  : Not used.
-        cmd      : SFC_GET_FORMAT_SUBTYPE
-        data     : a pointer to an SF_FORMAT_INFO struct
-        datasize : sizeof (SF_FORMAT_INFO)
-
-

-Example: -

-
-        SF_FORMAT_INFO	format_info ;
-        int             k, count ;
-
-        sf_command (sndfile, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int)) ;
-
-        /* Retrieve all the subtypes supported by the WAV format. */
-        for (k = 0 ; k < count ; k++)
-        {   format_info.format = k ;
-            sf_command (sndfile, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)) ;
-            if (! sf_format_check (format.info | SF_FORMAT_WAV))
-               continue ;
-            printf ("%08x  %s\n", format_info.format, format_info.name) ;
-            } ;
-
-

-For a more comprehensive example, see the program list_formats.c in the examples/ -directory of the libsndfile source code distribution. -

-
-
Return value:
-
0 on success and non-zero otherwise. -
The value of the format field will one of the major format identifiers such as SF_FORMAT_WAV - SF_FORMAT_AIFF. -
The name field will contain a char* pointer to the name of the string; for instance - "WAV (Microsoft)" or "AIFF (Apple/SGI)". -
The extention field will be a NULL pointer. -
- - - -


SFC_SET_ADD_PEAK_CHUNK

-

-By default, WAV and AIFF files which contain floating point data (subtype SF_FORMAT_FLOAT -or SF_FORMAT_DOUBLE) have a PEAK chunk. -By using this command, the addition of a PEAK chunk can be turned on or off. -

-

-Note : This call must be made before any data is written to the file. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_ADD_PEAK_CHUNK
-        data     : Not used (should be NULL)
-        datasize : TRUE or FALSE.
-
-

-Example: -

-
-        /* Turn on the PEAK chunk. */
-        sf_command (sndfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ;
-
-        /* Turn off the PEAK chunk. */
-        sf_command (sndfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ;
-
-
-
Return value:
-
Returns SF_TRUE if the peak chunk will be written after this call. -
Returns SF_FALSE if the peak chunk will not be written after this call. -
- - - -


SFC_UPDATE_HEADER_NOW

-

-The header of an audio file is normally written by libsndfile when the file is -closed using sf_close(). -

-

-There are however situations where large files are being generated and it would -be nice to have valid data in the header before the file is complete. -Using this command will update the file header to reflect the amount of data written -to the file so far. -Other programs opening the file for read (before any more data is written) will -then read a valid sound file header. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_UPDATE_HEADER_NOW
-        data     : Not used (should be NULL)
-        datasize : Not used.
-
-

-Example: -

-
-        /* Update the header now. */
-        sf_command (sndfile, SFC_UPDATE_HEADER_NOW, NULL, 0) ;
-
-
-
Return value:
-
0 -
- - - -


SFC_SET_UPDATE_HEADER_AUTO

-

-Similar to SFC_UPDATE_HEADER_NOW but updates the header at the end of every call -to the sf_write* functions. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_UPDATE_HEADER_NOW
-        data     : Not used (should be NULL)
-        datasize : SF_TRUE or SF_FALSE
-
-

-Example: -

-
-        /* Turn on auto header update. */
-        sf_command (sndfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ;
-
-        /* Turn off auto header update. */
-        sf_command (sndfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_FALSE) ;
-
-
-
Return value:
-
TRUE if auto update header is now on; FALSE otherwise. -
- - - -


SFC_FILE_TRUNCATE

-

-Truncate a file open for write or for read/write. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_FILE_TRUNCATE
-        data     : A pointer to an sf_count_t.
-        datasize : sizeof (sf_count_t)
-
- -

-Truncate the file to the number of frames specified by the sf_count_t pointed -to by data. -After this command, both the read and the write pointer will be -at the new end of the file. -This command will fail (returning non-zero) if the requested truncate position -is beyond the end of the file. -

-

-Example: -

-
-        /* Truncate the file to a length of 20 frames. */
-        sf_count_t  frames = 20 ;
-        sf_command (sndfile, SFC_FILE_TRUNCATE, &frames, sizeof (frames)) ;
-
-
-
Return value:
-
Zero on sucess, non-zero otherwise. -
- - - -


SFC_SET_RAW_START_OFFSET

-

-Change the data start offset for files opened up as SF_FORMAT_RAW. -

-

-Parameters: -

-        sndfile  : A valid SNDFILE* pointer
-        cmd      : SFC_SET_RAW_START_OFFSET
-        data     : A pointer to an sf_count_t.
-        datasize : sizeof (sf_count_t)
-
- -

-For a file opened as format SF_FORMAT_RAW, set the data offset to the value -given by data. -

-

-Example: -

-
-        /* Reset the data offset to 5 bytes from the start of the file. */
-        sf_count_t  offset = 5 ;
-        sf_command (sndfile, SFC_SET_RAW_START_OFFSET, &offset, sizeof (offset)) ;
-
-
-
Return value:
-
Zero on sucess, non-zero otherwise. -
- - - -
-

- The libsndfile home page is here : - - http://www.mega-nerd.com/libsndfile/. -
-Version : 1.0.25 -

- - - diff --git a/libs/libsndfile/doc/donate.html b/libs/libsndfile/doc/donate.html deleted file mode 100644 index c611f47ffd..0000000000 --- a/libs/libsndfile/doc/donate.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - libsndfile : donate. - - - - - - - - - - - -
- -
- libsndfile.jpg -
- -
- -

-Dear libsndfile user, -

- -

-This library was developed on Linux for Linux. I am not a Windows user and -maintaining this library for Windows costs me significant amounts of time above -and beyond the time taken to make it work on Linux and Unix-like systems. -

- -

-I therefore ask Windows users of libsndfile to donate to ensure that libsndfile's -support for Windows continues. As long as donations continue to flow in at a decent -rate, I will continue to release precompiled Windows binaries in sync with the -Linux/Unix version. If donations are poor, support for windows will fall behind. -

- - -

-You are free to donate any amount you chose. -As a guideline: -

- -
    -
  • If you are simply a user of libsndfile that would like to ensure that - the development of libsndfile continues, a donation of $10US would be more - than adequate. -
  • -
  • If you are shareware author that distributes libsndfile with your app and - makes more than $1000 a year from your shareware, a one off donation of $50 - would be appropriate. -
  • -
  • If your company is a commercial software house that distributes one or more - products that ship with libsndfile, a donation of $100 every second or third - year would be appropriate. -
  • -
- - -

-Donations can be made in Bitcoin to the Bitcoin address - 15hVWemFiH6DLJ22SBYPk9b4fgWtxBEvfQ - -which can be verified by checking the following GPG signature. -

- -
------BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA256
-
-libsndfile Bitcoin address : 15hVWemFiH6DLJ22SBYPk9b4fgWtxBEvfQ
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.12 (GNU/Linux)
-
-iQIcBAEBCAAGBQJSK7MUAAoJEEXYQ7zIiotIgXEP/R8hy65tlV7TiPw9bY9BklXS
-/Vl8FU2RhDkBt61ZmxbfDTybyQ5Vce/3wWph15L4RvpoX1OyeintQFmwwuPjOGiq
-eIz0nT9vDorG37Xdo5NZNBu9Tp1Od9MNtxFaAsRWFrDfvKEKljBHrcfM972cYrAp
-DaFd0Ik+bHKom9iQXFB7TFd0w2V4uszVMQDUGqb/vRNeRURZS7ypeMNwc8tZyTKR
-waEGMTa5sxxRjs7MqGRxSovnFT7JV3TNfdkBInUliIR/XvrudFR9J4Fiv+8Dk9P8
-WNjm6uFxvgIqiu1G9bjrwwr+DsBju93ljGNcZoayAKw5vwbX6KTcCbc31k9dP8Hf
-p6YdmPlZVKZmva+P3nLSJBTlxNu24Jm+ha+ZM/svDXTaPFWC8l5FP17kK0Bj8wCq
-N7pDz6RchEn10u+HdhfT1XiUjxj0zNXrr0GGj9apjl0RlT0O49eBttV0oXIdBRLi
-nTEaOWITpCgu7ggw1kWXHIWEncuiaSuJy/iH8PgNepWVj/6PxQRMrTqG4ux2Snk8
-Ua4vO8YHLMZX/XvSUS7eMtgfM7AO6YjJ/ac9bQif9bh6LsYEVVklysMUin6ZRS7Z
-Cms23FnqeQKtJOzdvqSJiV06lK6fP+tYdM4WSYn+AfL4IfYl2v48xXVU8XOOK9BH
-bJPKMDcz1ZvfYtX5mSW1
-=WXGB
------END PGP SIGNATURE-----
-
- -

-Thanks and regards, -
-Erik de Castro Lopo -
-Main libsndfile author and maintainer -

- - - - - - - - diff --git a/libs/libsndfile/doc/embedded_files.html b/libs/libsndfile/doc/embedded_files.html deleted file mode 100644 index c73e86a3b5..0000000000 --- a/libs/libsndfile/doc/embedded_files.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - libsndfile : Embedded Sound Files. - - - - - - - - - - -

Embedded Sound Files.

- -

-By using the open SNDFILE with a file descriptor function: -

- -
-      SNDFILE*  sf_open_fd (int fd, int mode, SF_INFO *sfinfo, int close_desc) ;
-
- -

-it is possible to open sound files embedded within larger files. -There are however a couple of caveats: -

- -

    -
  • Read/Write mode (SFM_RDWR) is not supported. -
  • Writing of embedded files is only supported at the end of the file. -
  • Reading of embedded files is only supported at file offsets greater - than zero. -
  • Not all file formats are supported (currently only WAV, AIFF and AU). -
- -

-The test program multi_file_test.c in the tests/ directory of the -source code tarball shows how this functionality is used to read and write -embedded files. -

- - - diff --git a/libs/libsndfile/doc/index.html b/libs/libsndfile/doc/index.html deleted file mode 100644 index bdd25aad10..0000000000 --- a/libs/libsndfile/doc/index.html +++ /dev/null @@ -1,493 +0,0 @@ - - - - - - libsndfile - - - - - - - - - - - - -
- libsndfile.jpg -
- -
- History -+- - Features -+- - Similar or Related Projects -+- - News -
- Development -+- - Programming Interface -+- - Bug Reporting -+- - Download -
- FAQ -+- - Mailing Lists -+- - Change Log -+- - Licensing Information -+- - See Also -
- -

-

- Libsndfile is a C library for reading and writing files containing sampled sound - (such as MS Windows WAV and the Apple/SGI AIFF format) through one standard - library interface. It is released in source code format under the - Gnu Lesser General Public License. -

- -

- The library was written to compile and run on a Linux system but should compile - and run on just about any Unix (including MacOS X). - There are also pre-compiled binaries available for 32 and 64 bit windows. -

-

- It was designed to handle both little-endian (such as WAV) and big-endian - (such as AIFF) data, and to compile and run correctly on little-endian (such as Intel - and DEC/Compaq Alpha) processor systems as well as big-endian processor systems such - as Motorola 68k, Power PC, MIPS and Sparc. - Hopefully the design of the library will also make it easy to extend for reading and - writing new sound file formats. -

- -

- It has been compiled and tested (at one time or another) on the following systems: -

- -
    -
  • Every platform supported by Debian GNU/Linux including x86_64-linux-gnu, - i486-linux-gnu, powerpc-linux-gnu, sparc-linux-gnu, alpha-linux-gnu, - mips-linux-gnu and armel-linux-gnu.
  • -
  • powerpc-apple-darwin7.0 (Mac OS X 10.3)
  • -
  • sparc-sun-solaris2.8 (using gcc)
  • -
  • mips-sgi-irix5.3 (using gcc)
  • -
  • QNX 6.0
  • -
  • i386-unknown-openbsd2.9
  • -
- -

- At the moment, each new release is being tested on i386 Linux, x86_64 Linux, - PowerPC Linux, Win32 and Win64. -

- - - - -

Features

-

- libsndfile has the following main features : -

-
    -
  • Ability to read and write a large number of file formats. -
  • A simple, elegant and easy to use Applications Programming Interface. -
  • Usable on Unix, Win32, MacOS and others. -
  • On the fly format conversion, including endian-ness swapping, type conversion - and bitwidth scaling. -
  • Optional normalisation when reading floating point data from files containing - integer data. -
  • Ability to open files in read/write mode. -
  • The ability to write the file header without closing the file (only on files - open for write or read/write). -
  • Ability to query the library about all supported formats and retrieve text - strings describing each format. -
-

- libsndfile has a comprehensive test suite so that each release is as bug free - as possible. - When new bugs are found, new tests are added to the test suite to ensure that - these bugs don't creep back into the code. - When new features are added, tests are added to the test suite to make sure that - these features continue to work correctly even when they are old features. -

-

- The following table lists the file formats and encodings that libsndfile can read - and write. - The file formats are arranged across the top and encodings along the left - edge. -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Micro- soft
WAV
SGI / Apple
AIFF / AIFC
Sun / DEC /
NeXT
AU / SND
Header- less
RAW
Paris Audio
File
PAF
Commo- dore
Amiga
IFF / SVX
Sphere
Nist
WAV
IRCAM
SF
Creative
VOC
Sound forge
W64
GNU Octave 2.0
MAT4
GNU Octave 2.1
MAT5
Portable Voice Format
PVF
Fasttracker 2
XI
HMM Tool Kit
HTK
Apple
CAF
Sound
Designer II
SD2
Free Lossless Audio Codec
FLAC
Unsigned 8 bit PCMR/WR/W R/W    R/WR/W R/W      
Signed 8 bit PCM R/WR/WR/WR/WR/WR/W     R/W  R/WR/WR/W
Signed 16 bit PCMR/WR/WR/WR/WR/WR/WR/WR/WR/WR/WR/WR/WR/W R/WR/WR/WR/W
Signed 24 bit PCMR/WR/WR/WR/WR/W R/WR/W R/W     R/WR/WR/W
Signed 32 bit PCMR/WR/WR/WR/W  R/WR/W R/WR/WR/WR/W  R/W  
32 bit floatR/WR/WR/WR/W   R/W R/WR/WR/W   R/W  
64 bit doubleR/WR/WR/WR/W     R/WR/WR/W   R/W  
u-law encodingR/WR/WR/WR/W  R/WR/WR/WR/W     R/W  
A-law encodingR/WR/WR/WR/W  R/WR/WR/WR/W     R/W  
IMA ADPCMR/W        R/W        
MS ADPCMR/W        R/W        
GSM 6.10R/WR/W R/W     R/W        
G721 ADPCM 32kbpsR/W R/W               
G723 ADPCM 24kbps  R/W               
G723 ADPCM 40kbps  R/W               
12 bit DWVW R/W R/W              
16 bit DWVW R/W R/W              
24 bit DWVW R/W R/W              
Ok Dialogic ADPCM   R/W              
8 bit DPCM             R/W    
16 bit DPCM             R/W    
- -

-From version 1.0.18, libsndfile also reads and writes - FLAC -and - Ogg/Vorbis. -

- - - -

- Some of the file formats I am also interested in adding are: -

-
    -
  • Kurzweil K2000 sampler files. -
  • Ogg Speex. -
-

- I have decided that I will not be adding support for MPEG Layer 3 (commonly - known as MP3) due to the patent issues surrounding this file format. - See - - the FAQ - for more. -

-

- Other file formats may also be added on request. -

- - - - -

History

-

- My first attempt at reading and writing WAV files was in 1990 or so under Windows - 3.1. - I started using Linux in early 1995 and contributed some code to the - wavplay - program. - That contributed code would eventually mutate into this library. - As one of my interests is Digital Signal Processing (DSP) I decided that as well as - reading data from an audio file in the native format (typically 16 bit short integers) - it would also be useful to be able to have the library do the conversion to floating - point numbers for DSP applications. - It then dawned on me that whatever file format (anything from 8 bit unsigned chars, - to 32 bit floating point numbers) the library should be able to convert the data to - whatever format the library user wishes to use it in. - For example, in a sound playback program, the library caller typically wants the sound - data in 16 bit short integers to dump into a sound card even though the data in the - file may be 32 bit floating point numbers (ie Microsoft's WAVE_FORMAT_IEEE_FLOAT - format). - Another example would be someone doing speech recognition research who has recorded - some speech as a 16 bit WAV file but wants to process it as double precision floating - point numbers. -

-

- Here is the release history for libsndfile : -

-
    -
  • Version 0.0.8 (Feb 15 1999) First official release. -
  • Version 0.0.28 (Apr 26 2002) Final release of version 0 of libsndfile. -
  • Version 1.0.0rc1 (Jun 24 2002) Release candidate 1 of version 1 of libsndfile. -
  • Version 1.0.0rc6 (Aug 14 2002) MacOS 9 fixes. -
  • Version 1.0.0 (Aug 16 2002) First 1.0.X release. -
  • Version 1.0.1 (Sep 14 2002) Added MAT4 and MAT5 file formats. -
  • Version 1.0.2 (Nov 24 2002) Added VOX ADPCM format. -
  • Version 1.0.3 (Dec 09 2002) Fixes for Linux on ia64 CPUs. -
  • Version 1.0.4 (Feb 02 2003) New file formats and functionality. -
  • Version 1.0.5 (May 03 2003) One new file format and new functionality. -
  • Version 1.0.6 (Feb 08 2004) Large file fix for Linux/Solaris, new functionality - and Win32 improvements. -
  • Version 1.0.7 (Feb 24 2004) Fix build problems on MacOS X and fix ia64/MIPS etc - clip mode detction. -
  • Version 1.0.8 (Mar 14 2004) Minor bug fixes. -
  • Version 1.0.9 (Mar 30 2004) Add AVR format. Improve handling of some WAV files. -
  • Version 1.0.10 (Jun 15 2004) Minor bug fixes. Fix support for Win32 MinGW compiler. -
  • Version 1.0.11 (Nov 15 2004) Add SD2 file support, reading of loop data in WAV and AIFF. - Minor bug fixes. -
  • Version 1.0.12 (Sep 30 2005) Add FLAC and CAF file support, virtual I/O interface. - Minor bug fixes and cleanups. -
  • Version 1.0.13 (Jan 21 2006) Add read/write of instrument chunks. Minor bug fixes. -
  • Version 1.0.14 (Feb 19 2006) Minor bug fixes. Start shipping windows binary/source ZIP. -
  • Version 1.0.15 (Mar 16 2006) Minor bug fixes. -
  • Version 1.0.16 (Apr 30 2006) Add support for RIFX. Other minor feature enhancements and - bug fixes. -
  • Version 1.0.17 (Aug 31 2006) Add C++ wrapper sndfile.hh. Minor bug fixes and cleanups. -
  • Version 1.0.18 (Feb 07 2009) Add Ogg/Vorbis suppport, remove captive libraries, many - new features and bug fixes. Generate Win32 and Win64 pre-compiled binaries. -
  • Version 1.0.19 (Mar 02 2009) Fix for CVE-2009-0186. Huge number of minor fixes as a - result of static analysis. -
  • Version 1.0.20 (May 14 2009) Fix for potential heap overflow. -
  • Version 1.0.21 (December 13 2009) Bunch of minor bug fixes. -
  • Version 1.0.22 (October 04 2010) Bunch of minor bug fixes. -
  • Version 1.0.23 (October 10 2010) Minor bug fixes. -
  • Version 1.0.24 (March 23 2011) Minor bug fixes. -
  • Version 1.0.25 (July 13 2011) Fix for Secunia Advisory SA45125. Minor bug fixes and - improvements. -
- - -

Similar or Related Projects

- -
    -
  • SoX is a program for - converting between sound file formats. -
  • Wavplay started out - as a minimal WAV file player under Linux and has mutated into Gnuwave, a client/server - application for more general multimedia and games sound playback. -
  • Audiofile (libaudiofile) is - a library similar to libsndfile but with a different programming interface. The - author Michael Pruett has set out to clone (and fix some bugs in) the libaudiofile - library which ships with SGI's IRIX OS. -
  • sndlib.tar.gz is - another library written by Bill Schottstaedt of CCRMA. -
- - -

Licensing

-

- libsndfile is released under the terms of the GNU Lesser General Public License, - of which there are two versions; - version 2.1 - and - version 3. - To maximise the compatibility of libsndfile, the user may choose to use libsndfile - under either of the above two licenses. - You can also read a simple explanation of the ideas behind the GPL and the LGPL - here. -

-

- You can use libsndfile with - Free Software, - Open Source, - proprietary, shareware or other closed source applications as long as libsndfile - is used as a dynamically loaded library and you abide by a small number of other - conditions (read the LGPL for more info). - With applications released under the GNU GPL you can also use libsndfile statically - linked to your application. -

-

- I would like to see libsndfile used as widely as possible but I would prefer it - if you released software that uses libsndfile as - Free Software - or - Open Source. - However, if you put in a great deal of effort building a significant application - which simply uses libsndfile for file I/O, then I have no problem with you releasing - that as closed source and charging as much money as you want for it as long as you - abide by the license. -

- - -

Download

-

- Here is the latest version. It is available in the following formats: -

- - -

-The Win32 installer was compiled for Windows XP but should also work on Windows -2000, Vista and Windows 7. -

- -

- Pre-release versions of libsndfile are available - here - and are announced on the - libsndfile-devel - mailing list. -

- - -

See Also

- - -

- -
- -

- The latest version of this document can be found - here. -

-

-Author : - - Erik de Castro Lopo -

- -

-This page has been accessed - counter.gif -times. -

- - - - -

- - diff --git a/libs/libsndfile/doc/libsndfile.css.in b/libs/libsndfile/doc/libsndfile.css.in deleted file mode 100644 index 40fca0f145..0000000000 --- a/libs/libsndfile/doc/libsndfile.css.in +++ /dev/null @@ -1,92 +0,0 @@ -body { - background : @HTML_BGCOLOUR@ ; - color : @HTML_FGCOLOUR@ ; - font-family : arial, helvetica, sans-serif ; - line-height: 1.5 ; -} -td { - font-family : arial, helvetica, sans-serif ; - background : @HTML_BGCOLOUR@ ; - color : @HTML_FGCOLOUR@ ; -} -center { - font-family : arial, helvetica, sans-serif ; -} -p { - font-family : arial, helvetica, sans-serif ; - text-align : left ; - margin-left : 3% ; - margin-right : 3% ; -} -.indent_block { - font-family : arial, helvetica, sans-serif ; - text-align : left ; - margin-left : 10% ; - margin-right : 10% ; -} -br { - font-family : arial, helvetica, sans-serif ; -} -form { - font-family : arial, helvetica, sans-serif ; -} -ul { - font-family : arial, helvetica, sans-serif ; - text-align : left ; - margin-left : 3% ; - margin-right : 6% ; -} -ol { - font-family : arial, helvetica, sans-serif ; - text-align : left ; - margin-left : 3% ; - margin-right : 6% ; -} -dl { - font-family : arial, helvetica, sans-serif ; - text-align : left ; - margin-left : 3% ; - margin-right : 3% ; -} -h1 { - font-size : xx-large ; - background : @HTML_BGCOLOUR@ ; - color : #5050FF ; - text-align : left ; - margin-left : 3% ; - margin-right : 3% ; -} -h2 { - font-size : x-large ; - background : @HTML_BGCOLOUR@ ; - color : #5050FF ; - text-align : left ; - margin-left : 3% ; - margin-right : 3% ; -} -h3 { - font-size : large ; - background : @HTML_BGCOLOUR@ ; - color : #5050FF ; - text-align : left ; - margin-left : 3% ; - margin-right : 3% ; -} -h4 { - font-size : medium ; - background : @HTML_BGCOLOUR@ ; - color : #5050FF ; - text-align : left ; - margin-left : 3% ; - margin-right : 3% ; -} -pre { - font-family : courier, monospace ; - font-size : medium ; - margin-left : 6% ; - margin-right : 6% ; -} -a:link { color : #9090FF ; } -a:visited { color : #5050FF ; } -a:active { color : #FF00FF ; } -a:hover { background-color : #202080 ; } diff --git a/libs/libsndfile/doc/linux_games_programming.txt b/libs/libsndfile/doc/linux_games_programming.txt deleted file mode 100644 index 747f59db26..0000000000 --- a/libs/libsndfile/doc/linux_games_programming.txt +++ /dev/null @@ -1,434 +0,0 @@ -# Here are some some emails I exchanged with a guy trying to use -# libsndfile version 1 with code from the book "Linux Games Programming" -# by John Hall. The email addresses have been changed to foil the spam -# bots. - -Date: Tue, 20 Jul 2004 22:49:21 +0100 -From: Paul -To: erikd@fake-domain-name.com -Subject: Can you help with a problem? -Date: Tue, 20 Jul 2004 22:49:21 +0100 - -Hi, - -I'm trying to get the source examples in the "Programming Linux Games" -(NoStarch, Loki Software + John R. Hall) which use sndfile.h/libsndfile. - -While I can guess some of the newer versions of function calls and -enumerations, there are some which I cannot guess. - -Would you be able to translate them to the current version of -enumeration and function calls so that I can update the source? - -These are the three currently failing me: - - sf_open_read(filename, SF_INFO *sfinfo) (guess: sf_open(filename,SFM_READ, &sfinfo)) - SF_FORMAT_PCM (guess: either SF_FORMAT_PCM_U8 or _RAW) - SF_INFO.pcmbitwidth (guess: no idea!) - -There are probably more. I'm happy to send you the source files for -sound calls, scan the pages or anything else. Failing that, is there -somewhere with the changes listed so I can try and fix the code for myself? - -Thanks - -TTFN - -Paul - -================================================================================ - -Date: Wed, 21 Jul 2004 17:38:08 +1000 -From: Erik de Castro Lopo -To: Paul -Subject: Re: Can you help with a problem? - -On Tue, 20 Jul 2004 22:49:21 +0100 -Paul wrote: - -> Hi, -> -> I'm trying to get the source examples in the "Programming Linux Games" -> (NoStarch, Loki Software + John R. Hall) which use sndfile.h/libsndfile. -> -> While I can guess some of the newer versions of function calls and -> enumerations, there are some which I cannot guess. -> -> Would you be able to translate them to the current version of -> enumeration and function calls so that I can update the source? -> -> These are the three currently failing me: -> -> sf_open_read(filename, SF_INFO *sfinfo) (guess: sf_open(filename, -> SFM_READ, &sfinfo)) - -yes. - -> SF_FORMAT_PCM (guess: either SF_FORMAT_PCM_U8 or _RAW) - -Actually this list: - - SF_FORMAT_PCM_U8 - SF_FORMAT_PCM_S8 - SF_FORMAT_PCM_16 - SF_FORMAT_PCM_24 - SF_FORMAT_PCM_32 - -> SF_INFO.pcmbitwidth (guess: no idea!) - -WIth the above change, pcmbitwidth becomes redundant. - -> There are probably more. I'm happy to send you the source files for -> sound calls, scan the pages or anything else. Failing that, is there -> somewhere with the changes listed so I can try and fix the code for -> myself? - -Version 1.0.0 came out some time ago, but I think this: - - http://www.mega-nerd.com/libsndfile/version-1.html - -lists most of the changes. You should also look at the API docs: - - http://www.mega-nerd.com/libsndfile/api.html - -HTH, -Erik --- -+-----------------------------------------------------------+ - Erik de Castro Lopo nospam@fake-domain-name.com -+-----------------------------------------------------------+ -"There is no reason why anyone would want a computer in their home" -Ken Olson, DEC, 1977 - -================================================================================ - -From: PFJ -To: Erik de Castro Lopo -Subject: Re: Can you help with a problem? -Date: Wed, 21 Jul 2004 09:07:39 +0100 - - -Hi Erik, - -Thanks for getting back to me. - -> > sf_open_read(filename, SF_INFO *sfinfo) (guess: sf_open(filename, SFM_READ, &sfinfo)) -> -> yes. - -Yay! - -> > SF_FORMAT_PCM (guess: either SF_FORMAT_PCM_U8 or _RAW) -> -> Actually this list: -> -> SF_FORMAT_PCM_U8 -> SF_FORMAT_PCM_S8 -> SF_FORMAT_PCM_16 -> SF_FORMAT_PCM_24 -> SF_FORMAT_PCM_32 - -I know, but the source code explicitly has SF_FORMAT_PCM which given the -code afterwards would equate to one of the above, but given that PCM -files can have a varied bitwidth the author probably wanted to cover all -bases. - -> Version 1.0.0 came out some time ago, but I think this: -> -> http://www.mega-nerd.com/libsndfile/version-1.html -> -> lists most of the changes. You should also look at the API docs: -> -> http://www.mega-nerd.com/libsndfile/api.html - -I'll download them and see what I can gleen. - -Thanks again for getting back to me - -TTFN - -Paul - -================================================================================ - -Date: Wed, 21 Jul 2004 18:20:29 +1000 -From: Erik de Castro Lopo -To: PFJ -Subject: Re: Can you help with a problem? - -On Wed, 21 Jul 2004 09:07:39 +0100 -PFJ wrote: - -> I know, but the source code explicitly has SF_FORMAT_PCM which given the -> code afterwards would equate to one of the above, but given that PCM -> files can have a varied bitwidth the author probably wanted to cover all -> bases. - -But surely the existing code does something like: - - sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM; - sfinfo.pcmbitwidth = 16; - -which can be directly translated to: - - sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; - -and the same for pcmbitwitdhs of 24 and 32. For pcmbitwidth of 8 -you need to know that WAV files use SF_FORMAT_PCM_U8 and AIFF -files use SF_FORMAT_PCM_S8. Thats all there is to it. - -Erik --- -+-----------------------------------------------------------+ - Erik de Castro Lopo nospam@fake-domain-name.com -+-----------------------------------------------------------+ -"Python addresses true pseudocode's two major failings: that it -isn't standardized, and it isn't executable." -- Grant R. Griffin in comp.dsp - -================================================================================ - -Subject: Re: Can you help with a problem? -From: PFJ -To: Erik de Castro Lopo -Date: Wed, 21 Jul 2004 09:50:55 +0100 - -Hi Erik, - -> > I know, but the source code explicitly has SF_FORMAT_PCM which given the -> > code afterwards would equate to one of the above, but given that PCM -> > files can have a varied bitwidth the author probably wanted to cover all -> > bases. -> -> But surely the existing code does something like: -> -> sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM; -> sfinfo.pcmbitwidth = 16; - -If only! - -The actual code is this - -int LoadSoundFile(char *filename, sound_p sound) -{ - SNDFILE *file; - SF_INFO file_info; - short *buffer_short = NULL; - u_int8_t *buffer_8 = NULL; - int16_t *buffer_16 = NULL; - unsigned int i; - - /* Open the file and retrieve sample information. */ - file = sf_open_read(filename, &file_info); - // I've sorted this one already - PFJ - - /* Make sure the format is acceptable. */ - if ((file_info.format & 0x0F) != SF_FORMAT_PCM) { - printf("'%s' is not a PCM-based audio file.\n", filename); - sf_close(file); - return -1; - } - - if ((file_info.pcmbitwidth == 8) && (file_info.channels == 1)) { - sound->format = AL_FORMAT_MONO8; - } else if ((file_info.pcmbitwidth == 8) && (file_info.channels == 2)) { - sound->format = AL_FORMAT_STEREO8; - } else if ((file_info.pcmbitwidth == 16) && (file_info.channels == 1)) { - sound->format = AL_FORMAT_MONO16; - } else if ((file_info.pcmbitwidth == 16) && (file_info.channels == 2)) { - sound->format = AL_FORMAT_STEREO16; - } else { - printf("Unknown sample format in %s.\n", filename); - sf_close(file); - return -1; - } - - /* Allocate buffers. */ - buffer_short = (short *)malloc(file_info.samples * file_info.channels * sizeof (short)); - - buffer_8 = (u_int8_t *)malloc(file_info.samples * file_info.channels * file_info.pcmbitwidth / 8); - - buffer_16 = (int16_t *)buffer_8; - - if (buffer_short == NULL || buffer_8 == NULL) { - printf("Unable to allocate enough memory for '%s'.\n", filename); - goto error_cleanup; - } - - /* Read the entire sound file. */ - if (sf_readf_short(file,buffer_short,file_info.samples) == (size_t)-1) { - printf("Error while reading samples from '%s'.\n", filename); - goto error_cleanup; - } - - - - /* Fill in the sound data structure. */ - sound->freq = file_info.samplerate; - sound->size = file_info.samples * file_info.channels * file_info.pcmbitwidth / 8; - - /* Give our sound data to OpenAL. */ - alGenBuffers(1, &sound->name); - if (alGetError() != AL_NO_ERROR) { - printf("Error creating an AL buffer name for %s.\n", filename); - goto error_cleanup; - } - - alBufferData(sound->name, sound->format, buffer_8, sound->size,sound->freq); - if (alGetError() != AL_NO_ERROR) { - printf("Error sending buffer data to OpenAL for %s.\n", filename); - goto error_cleanup; - } - - /* Close the file and return success. */ - sf_close(file); - free(buffer_short); - free(buffer_8); - - return 0; - - error_cleanup: - if (file != NULL) fclose(file); - free(buffer_short); - free(buffer_8); - return -1; -} - -As you can see, the PCM material in the listing will not currently -compile and for the other sndfile material, it probably won't either. - -Any help would be appreciated. - -TTFN - -Paul - -================================================================================ - -From: Erik de Castro Lopo -To: PFJ -Subject: Re: Can you help with a problem? -Date: Wed, 21 Jul 2004 19:36:46 +1000 - -On Wed, 21 Jul 2004 09:50:55 +0100 -PFJ wrote: - -> Hi Erik, -> -> > > I know, but the source code explicitly has SF_FORMAT_PCM which given the -> > > code afterwards would equate to one of the above, but given that PCM -> > > files can have a varied bitwidth the author probably wanted to cover all -> > > bases. -> > -> > But surely the existing code does something like: -> > -> > sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM; -> > sfinfo.pcmbitwidth = 16; -> -> If only! - -No, really. - -Drop this completely: - -> /* Make sure the format is acceptable. */ -> if ((file_info.format & 0x0F) != SF_FORMAT_PCM) { -> printf("'%s' is not a PCM-based audio file.\n", filename); -> sf_close(file); -> return -1; -> } - -Replace this block: - -> if ((file_info.pcmbitwidth == 8) && (file_info.channels == 1)) { -> sound->format = AL_FORMAT_MONO8; -> } else if ((file_info.pcmbitwidth == 8) && (file_info.channels == 2)) { -> sound->format = AL_FORMAT_STEREO8; -> } else if ((file_info.pcmbitwidth == 16) && (file_info.channels == 1)) { -> sound->format = AL_FORMAT_MONO16; -> } else if ((file_info.pcmbitwidth == 16) && (file_info.channels == 2)) { -> sound->format = AL_FORMAT_STEREO16; -> } else { -> printf("Unknown sample format in %s.\n", filename); -> sf_close(file); -> return -1; -> } - -with: - - int pcmbitwidth = 0; - - if (file_info.format & SF_FORMAT_SUBMASK != SF_FORMAT_PCM_16) - { printf("'%s' is not a PCM-based audio file.\n", filename); - sf_close(file); - return -1; - } - - if (file_info.channels < 1 || file_info.channels > 2) - { printf("'%s' bad channel count.\n", filename); - sf_close(file); - return -1; - } - - switch (file_info.format & SF_FORMAT_SUBMASK + file_info.channels << 16) - { case (SF_FORMAT_PCM_U8 + 1 << 16): - sound->format = AL_FORMAT_MONO8; - pcmbitwidth = 8; - break; - case (SF_FORMAT_PCM_U8 + 2 << 16): - sound->format = AL_FORMAT_STEREO8; - pcmbitwidth = 8; - break; - case (SF_FORMAT_PCM_16 + 1 << 16): - sound->format = AL_FORMAT_MONO16; - pcmbitwidth = 16; - break; - case (SF_FORMAT_PCM_16 + 2 << 16): - sound->format = AL_FORMAT_STEREO16; - pcmbitwidth = 16; - break; - default: - printf("Unknown sample format in %s.\n", filename); - sf_close(file); - return -1; - } - -> /* Allocate buffers. */ -> buffer_short = (short *)malloc(file_info.samples * -> file_info.channels * -> sizeof (short)); -> -> buffer_8 = (u_int8_t *)malloc(file_info.samples * -> file_info.channels * -> file_info.pcmbitwidth / 8); - -Use pcmbitwidth as calculated above. - -> buffer_16 = (int16_t *)buffer_8; -> -> if (buffer_short == NULL || buffer_8 == NULL) { -> printf("Unable to allocate enough memory for '%s'.\n", filename); -> goto error_cleanup; -> } -> -> /* Read the entire sound file. */ -> if (sf_readf_short(file,buffer_short,file_info.samples) == (size_t)- 1) { - -Replace "(size_t) - 1" with " < 0". - -> As you can see, the PCM material in the listing will not currently -> compile and for the other sndfile material, it probably won't either. - -None of the changes above should have been very difficult to figure -out. - -Erik --- -+-----------------------------------------------------------+ - Erik de Castro Lopo nospam@fake-domain-name.com -+-----------------------------------------------------------+ -Microsoft is finally bringing all of its Windows operating system families -under one roof. It will combine all of the features of CE, stability and -support of ME and the speed of NT. -It will be called Windows CEMENT... - diff --git a/libs/libsndfile/doc/lists.html b/libs/libsndfile/doc/lists.html deleted file mode 100644 index 7d95170271..0000000000 --- a/libs/libsndfile/doc/lists.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - libsndfile Mailing Lists - - - - - - - - -


libsndfile Mailing Lists

- -

-There are three mailing lists for libsndfile: -

- -
    -
  • libsndfile-announce@mega-nerd.com   - Subscribe -
    - A list which will announce each new release of libsndfile. - Noone can post to this list except the author. -

    - -
  • libsndfile-devel@mega-nerd.com   - Subscribe -
    - A list for discussing bugs, porting issues and feature requests. - Posting is restricted to subscribers. -

    - -
  • libsndfile-users@mega-nerd.com   - Subscribe -
    - A list for discussing the use of libsndfile in other programs. - Posting is restricted to subscribers. - -

    -
- -

-The libsndfile-devel and libsndfile-users list will automatically receive a -copy of all emails to the libsndfile-announce list. -

-
- - - diff --git a/libs/libsndfile/doc/new_file_type.HOWTO b/libs/libsndfile/doc/new_file_type.HOWTO deleted file mode 100644 index a6da80aeff..0000000000 --- a/libs/libsndfile/doc/new_file_type.HOWTO +++ /dev/null @@ -1,135 +0,0 @@ -new_file_type.HOWTO -=================== - - Original : Wed May 23 19:05:07 EST 2001 - Update 1 : Fri Jul 11 22:12:38 EST 2003 - -This document will attempt to explain as fully as possible how to add code to -libsndfile to allow the reading and writing of new file types. By new file -type I particularly mean a new header type rather than a new encoding method -for an existing file type. - -This HOWTO will take the form of a step by step guide. It will assume that you -have all required tools including : - - - gcc - - make (should really be the GNU version) - - autoconf - - automake - - libtool - -These should all be available on the GNU ftp site: ftp://ftp.gnu.org/pub/gnu/. - -To help make these steps clearer let's suppose we are adding support for the -Whacky file format whose files contain 'W','A','C' and 'K' as the first four -bytes of the file format. Lets also assume that Whacky files contain PCM encoded -data. - -Step 1 ------- -Create a new .c file in the src/ directory of the libsndfile source tree. The -file name should be reasonable descriptive so that is is obvious that files of -the new type are handled by this file. In this particular case the file might -be named 'whacky.c'. - -Step 2 ------- -Add your new source code file to the build process. - -Edit the file src/Makefile.am and add the name of your file handler to the -FILESPECIFIC list of handlers. This list looks something like this: - -FILESPECIFIC = aiff.c au.c au_g72x.c nist.c paf.c raw.c samplitude.c \ - svx.c wav.c wav_float.c wav_gsm610.c wav_ima_adpcm.c \ - wav_ms_adpcm.c - -Then, run the script named 'reconf' in the libsndfile top level directory, -which will run autoconf and other associated tools. Finally run "./configure" -in the top level directory. You may want to use the "--disable-gcc-opt" option -to disable gcc optimisations and make debugging with gdb/ddd easier. - -Step 3 ------- -Add a unique identifier for the new file type. - -Edit src/sndfile.h.in and find the enum containing the SF_FORMAT_XXX identifiers. -Since you will be adding a major file type you should add your identifier to the -top part of the list where the values are above 0x10000 in value. The easiest -way to do this is to find the largest value in the list, add 0x10000 to it and -make that your new identifier value. The identifier should be something like -SF_FORMAT_WACK. - -Step 4 ------- -Add code to the file type recogniser function. - -Edit src/sndfile.c and find the function guess_file_type (). This function -reads the first 3 ints of the file and from that makes a guess at the file -type. In our case we would add: - - - if (buffer [0] == MAKE_MARKER ('W','A','C','K')) - return SF_FORMAT_WACK ; - -The use of the MAKE_MARKER macro should be pretty obvious and it is defined at the -top of file should you need to have a look at it. - -Step 5 ------- -Add a call to your open function from psf_open_file (). - -Edit src/sndfile.c and find the switch statement in psf_open_file (). It starts -like this: - - switch (filetype) - { case SF_FORMAT_WAV : - error = wav_open (psf) ; - break ; - - case SF_FORMAT_AIFF : - error = aiff_open (psf) ; - break ; - -Towards the bottom of this switch statement your should add one for the new file -type. Something like: - - case SF_FORMAT_WACK : - sf_errno = whacky_open (psf) ; - break ; - -Setp 6 ------- -Add prototypes for new open read and open write functions. - -Edit src/common.h, go to the bottom of the file and add something like - - int whacky_open (SF_PRIVATE *psf) ; - -Step 7 ------- - -Implement your open read function. The best way to do this is by coding -something much like one of the other file formats. The file src/au.c might be -a good place to start. - -In src/whacky.c you should now implement the function whacky_open() which -was prototyped in src/common.h. This function should return 0 on success and -a non-zero number on error. - -Error values are defined in src/common.h in a enum which starts at SFE_NO_ERROR. -When adding a new error value, you also need to add an error string to the -SndfileErrors array in src/sndfile.c. - -To parse the header of your new file type you should avoid using standard read/ -write/seek functions (and the fread/fwrite/fseek etc) and instead use -psf_binheader_readf () which is implemented and documented in src/common.h. - -During the parsing process, you should also print logging information to -libsndfile's internal log buffer using the psf_log_printf() function. - -At the end of the open read process, you should have set a number of fields in the -SF_PRIVATE structure pointed to by psf. - - - -*** THIS FILE IS INCOMPLETE *** diff --git a/libs/libsndfile/doc/octave.html b/libs/libsndfile/doc/octave.html deleted file mode 100644 index b696e6b81a..0000000000 --- a/libs/libsndfile/doc/octave.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - libsndfile and GNU Octave - - - - - - - - -
-

libsndfile and GNU Octave

-

- GNU Octave is a high-level interactive - language for numerical computations. - There are currently two development streams, a stable 2.0.X series and a - development 2.1.X series. - Octave reads and writes data in binary formats that were originally developed - for - MATLAB. - Version 2.0.X of Octave uses binary data files compatible with MATLAB - version 4.2 while Octave 2.1.X uses binary data files compatible - with MATLAB version 5.0 as well as being able to read the older MATLAB 4.2 - format. -

-

- From version 1.0.1 of libsndfile onwards, libsndfile has the ability of reading - and writing a small subset of the binary data files used by both versions - of GNU Octave. - This gives people using GNU Octave for audio based work an easy method of - moving audio data between GNU Octave and other programs which use libsndfile. -

-

- For instance it is now possible to do the following: -

- -
    -
  • Load a WAV file into a sound file editor such as - Sweep. -
  • Save it as a MAT4 file. -
  • Load the data into Octave for manipulation. -
  • Save the modified data. -
  • Reload it in Sweep. -
-

- Another example would be using the MAT4 or MAT5 file formats as a format which - can be easily loaded into Octave for viewing/analyzing as well as a format - which can be played with command line players such as the one included with - libsndfile. -

- -

Details

-

- Octave, like most programming languages, uses variables to store data, and - Octave variables can contain both arrays and matrices. - It is also able to store one or more of these variables in a file. - When reading Octave files, libsndfile expects a file to contain two - variables and their associated data. - The first variable should contain a variable holding the file sample rate - while the second variable contains the audio data. -

-

- For example, to generate a sine wave and store it as a binary file which - is compatible with libsndfile, do the following: -

-
-        octave:1 > samplerate = 44100 ;
-        octave:2 > wavedata = sin ((0:1023)*2*pi/1024) ;
-        octave:3 > save sine.mat samplerate wavedata
-
- -

- The process of reading and writing files compatible with libsndfile can be - made easier by use of two Octave script files : -

-
-        octave:4 > [data fs] = sndfile_load ("sine.mat") ;
-        octave:5 > sndfile_save ("sine2.mat", data, fs) ;
-
-

- In addition, libsndfile contains a command line program which which is able - to play the correct types of Octave files. - Using this command line player sndfile-play and a third Octave script - file allows Octave data to be played from within Octave on any of the platforms - which sndfile-play supports (at the moment: Linux, MacOS X, Solaris and - Win32). -

-
-        octave:6 > sndfile_play (data, fs) ;
-
-

- These three Octave scripts are installed automatically in Octave's site - script directory when libsndfile is installed (except on Win32) ie when - libsndfile is being installed into /usr/local, the Octave scripts will - be installed in /usr/local/share/octave/site/m/. -

- -

- There are some other Octave scripts for audio to be found - here. -

- -
- - -
-

- The libsndfile home page is here : - - http://www.mega-nerd.com/libsndfile/. -

- - - diff --git a/libs/libsndfile/doc/pkgconfig.html b/libs/libsndfile/doc/pkgconfig.html deleted file mode 100644 index c89193d1ed..0000000000 --- a/libs/libsndfile/doc/pkgconfig.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - libsndfile : pkg-config - - - - - - - - -
-

libsndfile and pkg-config

- -

- From version 1.0.0 libsndfile has had the ability to read and write files of - greater than 2 Gig in size on most OSes even if sizeof (long) == 4. - OSes which support this feature include Linux (2.4 kernel, glibc6) on x86, PPC and - probably others, Win32, MacOS X, *BSD, Solaris and probably others. - OSes on 64 bit processors where the default compile environment is LP64 (longs and - pointers are 64 bit ie Linux on DEC/Compaq/HP Alpha processors) automatically - support large file access. -

-

- Other OSes including Linux on 32 bit processors, 32 bit Solaris and others require - special compiler flags to add large file support. - This applies to both the compilation of the library itself and the compilation of - programs which link to the library. -

-

- Note : People using Win32, MacOS (both OS X and pre-OS X) or *BSD can disregard the - rest of this document as it does not apply to either of these OSes. -

-

- The pkg-config program makes finding the correct compiler flag values and - library location far easier. - During the installation of libsndfile, a file named sndfile.pc is installed - in the directory ${libdir}/pkgconfig (ie if libsndfile is installed in - /usr/local/lib, sndfile.pc will be installed in - /usr/local/lib/pkgconfig/). -

-

- In order for pkg-config to find sndfile.pc it may be necessary to point the - environment variable PKG_CONFIG_PATH in the right direction. -

-
-        export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
-	
- -

- Then, to compile a C file into an object file, the command would be: -

-
-        gcc `pkg-config --cflags sndfile` -c somefile.c
-	
-

- and to link a number of objects into an executable that links against libsndfile, - the command would be: -

-
-        gcc `pkg-config --libs sndfile` obj1.o obj2.o -o program
-	
- -

- Obviously all this can be rolled into a Makefile for easier maintenance. -

- - diff --git a/libs/libsndfile/doc/print.css b/libs/libsndfile/doc/print.css deleted file mode 100644 index deb5b13da0..0000000000 --- a/libs/libsndfile/doc/print.css +++ /dev/null @@ -1,14 +0,0 @@ -body { - background:white; - color:black; -} - -h1{ - background:white; - color:black; -} - -h2 { - background:white; - color:#666; -} diff --git a/libs/libsndfile/doc/sndfile_info.html b/libs/libsndfile/doc/sndfile_info.html deleted file mode 100644 index a84f24150f..0000000000 --- a/libs/libsndfile/doc/sndfile_info.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - sndfile-info - - - - - - - - -

- Here is an example of the output from the sndfile-info program distributed with - libsndfile. -

- -

- This file was opened and parsed correctly but had been truncated so that the values - in the FORM and SSND chunks were incorrect. -

-
-        erikd@hendrix > examples/sndfile-info truncated.aiff 
-        truncated.aiff
-        size : 200000
-        FORM : 307474 (should be 199992)
-         AIFF
-         COMM : 18
-          Sample Rate : 16000
-          Samples     : 76857
-          Channels    : 2
-          Sample Size : 16
-         SSND : 307436 (should be 199946)
-          Offset     : 0
-          Block Size : 0
-        
-        --------------------------------
-        Sample Rate : 16000
-        Frames      : 76857
-        Channels    : 2
-        Bit Width   : 16
-        Format      : 0x00020001
-        Sections    : 1
-        Seekable    : TRUE
-        Signal Max  : 32766
-        	
-
- - - - diff --git a/libs/libsndfile/doc/tutorial.html b/libs/libsndfile/doc/tutorial.html deleted file mode 100644 index e3112393ad..0000000000 --- a/libs/libsndfile/doc/tutorial.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - libsndfile Tutorial - - - - - - - - -


libsndfile Tutorial

- -

-More coming soon. -

- -

-For now, the best place to look for example code is the examples/ -directory of the source code distribution and the libsndfile test suite which -is located in the tests/ directory of the source code distribution. -

- - - - - - - - - diff --git a/libs/libsndfile/doc/win32.html b/libs/libsndfile/doc/win32.html deleted file mode 100644 index 6ee3153c7d..0000000000 --- a/libs/libsndfile/doc/win32.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - Building libsndfile on Win32 - - - - - - - - -


Building libsndfile on Win32

- -

-Note : For pre-compiled binaries for windows, both for win32 and win64, see the -main web page. -

- -

-There is currently only one way of building libsndfile for Win32 and Win64; -cross compiling from Linux using the MinGW cross compiler. -

- -

-libsndfile is written to be compiled by a compiler which supports large -chunks of the 1999 ISO C Standard. -Unfortunately, the microsoft compiler supports close to nothing of this -standard and hence is not suitable for libsndfile. -

- -

-It may be possible to compile libsndfile on windows using the - MinGW -compiler suite, but I haven't tested that and have no interest in supporting -that. -

- - - - - - -
- - - - - - - diff --git a/libs/libsndfile/echo-install-dirs.in b/libs/libsndfile/echo-install-dirs.in deleted file mode 100644 index 48d54b4e2d..0000000000 --- a/libs/libsndfile/echo-install-dirs.in +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -# @configure_input@ - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -bindir=@bindir@ -pkgconfigdir=@pkgconfigdir@ -datadir=@datadir@ -datarootdir=@datarootdir@ -docdir=@docdir@ -htmldir=@htmldir@ - -echo " - Installation directories : - - Library directory : ................... $libdir - Program directory : ................... $bindir - Pkgconfig directory : ................. $pkgconfigdir - HTML docs directory : ................. $htmldir -" -echo "Compiling some other packages against libsndfile may require" -echo "the addition of '$pkgconfigdir' to the" -echo "PKG_CONFIG_PATH environment variable." -echo diff --git a/libs/libsndfile/examples/Makefile.am b/libs/libsndfile/examples/Makefile.am deleted file mode 100644 index da841fa218..0000000000 --- a/libs/libsndfile/examples/Makefile.am +++ /dev/null @@ -1,25 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_PROGRAMS = make_sine sfprocess list_formats generate sndfilehandle sndfile-to-text - -AM_CPPFLAGS = -I$(top_srcdir)/src - -sndfile_to_text_SOURCES = sndfile-to-text.c -sndfile_to_text_LDADD = $(top_builddir)/src/libsndfile.la - -make_sine_SOURCES = make_sine.c -make_sine_LDADD = $(top_builddir)/src/libsndfile.la - -sfprocess_SOURCES = sfprocess.c -sfprocess_LDADD = $(top_builddir)/src/libsndfile.la - -list_formats_SOURCES = list_formats.c -list_formats_LDADD = $(top_builddir)/src/libsndfile.la - -generate_SOURCES = generate.c -generate_LDADD = $(top_builddir)/src/libsndfile.la - -sndfilehandle_SOURCES = sndfilehandle.cc -sndfilehandle_LDADD = $(top_builddir)/src/libsndfile.la - -CLEANFILES = *~ *.exe diff --git a/libs/libsndfile/examples/cooledit-fixer.c b/libs/libsndfile/examples/cooledit-fixer.c deleted file mode 100644 index 06ceae6a92..0000000000 --- a/libs/libsndfile/examples/cooledit-fixer.c +++ /dev/null @@ -1,231 +0,0 @@ -/* -** Copyright (C) 2002-2005 Erik de Castro Lopo -** -** 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. -*/ - -#include -#include -#include -#include -#include - -#include - -#define BUFFER_LEN 1024 - -static void usage_exit (char *progname) ; -static int is_data_really_float (SNDFILE *sndfile) ; -static void fix_file (char *filename) ; -static off_t file_size (char *filename) ; - -static union -{ int i [BUFFER_LEN] ; - float f [BUFFER_LEN] ; -} buffer ; - -int -main (int argc, char *argv []) -{ SNDFILE *sndfile ; - SF_INFO sfinfo ; - int k, data_is_float, converted = 0 ; - - puts ("\nCooledit Fixer.\n---------------") ; - - if (argc < 2) - usage_exit (argv [0]) ; - - for (k = 1 ; k < argc ; k++) - { if ((sndfile = sf_open (argv [k], SFM_READ, &sfinfo)) == NULL) - { /*-printf ("Failed to open : %s\n", argv [k]) ;-*/ - continue ; - } ; - - if (sfinfo.format != (SF_FORMAT_WAV | SF_FORMAT_PCM_32)) - { /*-printf ("%-50s : not a 32 bit PCM WAV file.\n", argv [k]) ;-*/ - sf_close (sndfile) ; - continue ; - } ; - - data_is_float = is_data_really_float (sndfile) ; - - sf_close (sndfile) ; - - if (data_is_float == SF_FALSE) - { /*-printf ("%-50s : not a Cooledit abomination.\n", argv [k]) ;-*/ - continue ; - } ; - - fix_file (argv [k]) ; - converted ++ ; - } ; - - if (converted == 0) - puts ("\nNo files converted.") ; - - puts ("") ; - - return 0 ; -} /* main */ - - -static void -usage_exit (char *progname) -{ char *cptr ; - - if ((cptr = strrchr (progname, '/'))) - progname = cptr + 1 ; - if ((cptr = strrchr (progname, '\\'))) - progname = cptr + 1 ; - - printf ("\n Usage : %s \n", progname) ; - puts ("\n" - "Fix broken files created by Syntrillium's Cooledit. These files are \n" - "marked as containing PCM data but actually contain floating point \n" - "data. Only the broken files created by Cooledit are processed. All \n" - "other files remain untouched.\n" - "\n" - "More than one file may be included on the command line. \n" - ) ; - - exit (1) ; -} /* usage_exit */ - -static int -is_data_really_float (SNDFILE *sndfile) -{ int k, readcount ; - - while ((readcount = sf_read_int (sndfile, buffer.i, BUFFER_LEN)) > 0) - { for (k = 0 ; k < readcount ; k++) - { if (buffer.i [k] == 0) - continue ; - - if (fabs (buffer.f [k]) > 32768.0) - return SF_FALSE ; - } ; - } ; - - return SF_TRUE ; -} /* is_data_really_float */ - -static void -fix_file (char *filename) -{ static char newfilename [512] ; - - SNDFILE *infile, *outfile ; - SF_INFO sfinfo ; - int readcount, k ; - float normfactor ; - char *cptr ; - - printf ("\nFixing : %s\n", filename) ; - - if ((infile = sf_open (filename, SFM_READ, &sfinfo)) == NULL) - { printf ("Not able to open input file %s\n", filename) ; - exit (1) ; - } ; - - if (strlen (filename) >= sizeof (newfilename) - 1) - { puts ("Error : Path name too long.\n") ; - exit (1) ; - } ; - - strncpy (newfilename, filename, sizeof (newfilename)) ; - newfilename [sizeof (newfilename) - 1] = 0 ; - - if ((cptr = strrchr (newfilename, '/')) == NULL) - cptr = strrchr (newfilename, '\\') ; - - if (cptr) - { cptr [1] = 0 ; - strncat (newfilename, "fixed.wav", sizeof (newfilename) - strlen (newfilename) - 1) ; - } - else - strncpy (newfilename, "fixed.wav", sizeof (newfilename) - 1) ; - - newfilename [sizeof (newfilename) - 1] = 0 ; - - printf (" Output : %s\n", newfilename) ; - - sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_FLOAT ; - - if ((outfile = sf_open (newfilename, SFM_WRITE, &sfinfo)) == NULL) - { printf ("Not able to output open file %s\n", filename) ; - exit (1) ; - } ; - - /* Find the file peak. sf-command (SFC_CALC_SIGNAL_MAX) cannot be used. */ - - normfactor = 0.0 ; - - while ((readcount = sf_read_int (infile, buffer.i, BUFFER_LEN)) > 0) - { for (k = 0 ; k < readcount ; k++) - if (fabs (buffer.f [k]) > normfactor) - normfactor = fabs (buffer.f [k]) ; - } ; - - printf (" Peak : %g\n", normfactor) ; - - normfactor = 1.0 / normfactor ; - - sf_seek (infile, 0, SEEK_SET) ; - - while ((readcount = sf_read_int (infile, buffer.i, BUFFER_LEN)) > 0) - { for (k = 0 ; k < readcount ; k++) - buffer.f [k] *= normfactor ; - sf_write_float (outfile, buffer.f, readcount) ; - } ; - - sf_close (infile) ; - sf_close (outfile) ; - - if (abs (file_size (filename) - file_size (newfilename)) > 50) - { puts ("Error : file size mismatch.\n") ; - exit (1) ; - } ; - - printf (" Renaming : %s\n", filename) ; - - if (remove (filename) != 0) - { perror ("rename") ; - exit (1) ; - } ; - - if (rename (newfilename, filename) != 0) - { perror ("rename") ; - exit (1) ; - } ; - - return ; -} /* fix_file */ - -static off_t -file_size (char *filename) -{ struct stat buf ; - - if (stat (filename, &buf) != 0) - { perror ("stat") ; - exit (1) ; - } ; - - return buf.st_size ; -} /* file_size */ -/* -** Do not edit or modify anything in this comment block. -** The arch-tag line is a file identity tag for the GNU Arch -** revision control system. -** -** arch-tag: 5475655e-3898-40ff-969b-c8ab2351b0e4 -*/ diff --git a/libs/libsndfile/examples/generate.c b/libs/libsndfile/examples/generate.c deleted file mode 100644 index 884e8d79d3..0000000000 --- a/libs/libsndfile/examples/generate.c +++ /dev/null @@ -1,133 +0,0 @@ -/* -** Copyright (C) 2002-2011 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include - -#define BUFFER_LEN 4096 - -static void encode_file (const char *infilename, const char *outfilename, int filetype) ; - -int -main (int argc, char **argv) -{ - if (argc != 2) - { puts ("\nEncode a single input file into a number of different output ") ; - puts ("encodings. These output encodings can then be moved to another ") ; - puts ("OS for testing.\n") ; - puts (" Usage : generate \n") ; - exit (1) ; - } ; - - /* A couple of standard WAV files. Make sure Win32 plays these. */ - encode_file (argv [1], "pcmu8.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_U8) ; - encode_file (argv [1], "pcm16.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - encode_file (argv [1], "imaadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM) ; - encode_file (argv [1], "msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM) ; - encode_file (argv [1], "gsm610.wav" , SF_FORMAT_WAV | SF_FORMAT_GSM610) ; - - /* Soundforge W64. */ - encode_file (argv [1], "pcmu8.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_U8) ; - encode_file (argv [1], "pcm16.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_16) ; - encode_file (argv [1], "imaadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM) ; - encode_file (argv [1], "msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM) ; - encode_file (argv [1], "gsm610.w64" , SF_FORMAT_W64 | SF_FORMAT_GSM610) ; - - return 0 ; -} /* main */ - -/*============================================================================================ -** Helper functions and macros. -*/ - -#define PUT_DOTS(k) \ - { while (k--) \ - putchar ('.') ; \ - putchar (' ') ; \ - } - -/*======================================================================================== -*/ - -static void -encode_file (const char *infilename, const char *outfilename, int filetype) -{ static float buffer [BUFFER_LEN] ; - - SNDFILE *infile, *outfile ; - SF_INFO sfinfo ; - int k, readcount ; - - printf (" %s -> %s ", infilename, outfilename) ; - fflush (stdout) ; - - k = 16 - strlen (outfilename) ; - PUT_DOTS (k) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - if (! (infile = sf_open (infilename, SFM_READ, &sfinfo))) - { printf ("Error : could not open file : %s\n", infilename) ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } - - sfinfo.format = filetype ; - - if (! sf_format_check (&sfinfo)) - { sf_close (infile) ; - printf ("Invalid encoding\n") ; - return ; - } ; - - if (! (outfile = sf_open (outfilename, SFM_WRITE, &sfinfo))) - { printf ("Error : could not open file : %s\n", outfilename) ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - while ((readcount = sf_read_float (infile, buffer, BUFFER_LEN)) > 0) - sf_write_float (outfile, buffer, readcount) ; - - sf_close (infile) ; - sf_close (outfile) ; - - printf ("ok\n") ; - - return ; -} /* encode_file */ - diff --git a/libs/libsndfile/examples/generate.cs b/libs/libsndfile/examples/generate.cs deleted file mode 100644 index 1817856fa7..0000000000 --- a/libs/libsndfile/examples/generate.cs +++ /dev/null @@ -1,250 +0,0 @@ -/* (c) 2004 James Robson, http://www.arbingersys.com -** -** 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. -** -** **************************** -** -** How to use: -** - libsndfile.dll must have already been compiled and be in this -** application's search path -** -** - You must edit this file to point to the file you want to convert. Set -** the following line of code (found in the Main() function further below) -** to the name of a .WAV file that exists on your system. -** 186: string sfn = "input.wav"; -** -** - From a command prompt type -** csc generate.cs -** -** - Run the resulting executable 'generate.exe' -** -** -** Note: You will obviously need the csc compiler and the .NET runtime. I think -** these are freely available for download from Microsoft's website -** (part of the .NET SDK?). -*/ - - -using System; -using System.Runtime.InteropServices; -using sf_count_t = System.Int64; //alias; see SF_INFO struct - -#if PLATFORM_64 -using size_t = System.UInt64; -#else -using size_t = System.UInt32; -#endif - - -class lsndf_example { - - -//sound file formats - public enum lsndf_frmts { - SF_FORMAT_WAV = 0x010000, /* Microsoft WAV format (little endian). */ - SF_FORMAT_AIFF = 0x020000, /* Apple/SGI AIFF format (big endian). */ - SF_FORMAT_AU = 0x030000, /* Sun/NeXT AU format (big endian). */ - SF_FORMAT_RAW = 0x040000, /* RAW PCM data. */ - SF_FORMAT_PAF = 0x050000, /* Ensoniq PARIS file format. */ - SF_FORMAT_SVX = 0x060000, /* Amiga IFF / SVX8 / SV16 format. */ - SF_FORMAT_NIST = 0x070000, /* Sphere NIST format. */ - SF_FORMAT_VOC = 0x080000, /* VOC files. */ - SF_FORMAT_IRCAM = 0x0A0000, /* Berkeley/IRCAM/CARL */ - SF_FORMAT_W64 = 0x0B0000, /* Sonic Foundry's 64 bit RIFF/WAV */ - SF_FORMAT_MAT4 = 0x0C0000, /* Matlab (tm) V4.2 / GNU Octave 2.0 */ - SF_FORMAT_MAT5 = 0x0D0000, /* Matlab (tm) V5.0 / GNU Octave 2.1 */ - SF_FORMAT_PVF = 0x0E0000, /* Portable Voice Format */ - SF_FORMAT_XI = 0x0F0000, /* Fasttracker 2 Extended Instrument */ - SF_FORMAT_HTK = 0x100000, /* HMM Tool Kit format */ - SF_FORMAT_SDS = 0x110000, /* Midi Sample Dump Standard */ - - /* Subtypes from here on. */ - - SF_FORMAT_PCM_S8 = 0x0001, /* Signed 8 bit data */ - SF_FORMAT_PCM_16 = 0x0002, /* Signed 16 bit data */ - SF_FORMAT_PCM_24 = 0x0003, /* Signed 24 bit data */ - SF_FORMAT_PCM_32 = 0x0004, /* Signed 32 bit data */ - - SF_FORMAT_PCM_U8 = 0x0005, /* Unsigned 8 bit data (WAV and RAW only) */ - - SF_FORMAT_FLOAT = 0x0006, /* 32 bit float data */ - SF_FORMAT_DOUBLE = 0x0007, /* 64 bit float data */ - - SF_FORMAT_ULAW = 0x0010, /* U-Law encoded. */ - SF_FORMAT_ALAW = 0x0011, /* A-Law encoded. */ - SF_FORMAT_IMA_ADPCM = 0x0012, /* IMA ADPCM. */ - SF_FORMAT_MS_ADPCM = 0x0013, /* Microsoft ADPCM. */ - - SF_FORMAT_GSM610 = 0x0020, /* GSM 6.10 encoding. */ - SF_FORMAT_VOX_ADPCM = 0x0021, /* OKI / Dialogix ADPCM */ - - SF_FORMAT_G721_32 = 0x0030, /* 32kbs G721 ADPCM encoding. */ - SF_FORMAT_G723_24 = 0x0031, /* 24kbs G723 ADPCM encoding. */ - SF_FORMAT_G723_40 = 0x0032, /* 40kbs G723 ADPCM encoding. */ - - SF_FORMAT_DWVW_12 = 0x0040, /* 12 bit Delta Width Variable Word encoding. */ - SF_FORMAT_DWVW_16 = 0x0041, /* 16 bit Delta Width Variable Word encoding. */ - SF_FORMAT_DWVW_24 = 0x0042, /* 24 bit Delta Width Variable Word encoding. */ - SF_FORMAT_DWVW_N = 0x0043, /* N bit Delta Width Variable Word encoding. */ - - SF_FORMAT_DPCM_8 = 0x0050, /* 8 bit differential PCM (XI only) */ - SF_FORMAT_DPCM_16 = 0x0051, /* 16 bit differential PCM (XI only) */ - - - /* Endian-ness options. */ - - SF_ENDIAN_FILE = 0x00000000, /* Default file endian-ness. */ - SF_ENDIAN_LITTLE = 0x10000000, /* Force little endian-ness. */ - SF_ENDIAN_BIG = 0x20000000, /* Force big endian-ness. */ - SF_ENDIAN_CPU = 0x30000000, /* Force CPU endian-ness. */ - - SF_FORMAT_SUBMASK = 0x0000FFFF, - SF_FORMAT_TYPEMASK = 0x0FFF0000, - SF_FORMAT_ENDMASK = 0x30000000 - } - - -//modes and other - public enum lsndf_tf - { /* True and false */ - SF_FALSE = 0, - SF_TRUE = 1, - - /* Modes for opening files. */ - SFM_READ = 0x10, - SFM_WRITE = 0x20, - SFM_RDWR = 0x30 - } - - -//important SF_INFO structure - [StructLayout(LayoutKind.Sequential)] - public struct SF_INFO - { - public sf_count_t frames ; // Used to be called samples. Changed to avoid confusion. - public int samplerate ; - public int channels ; - public int format ; - public int sections ; - public int seekable ; - }; - - -//function declarations -//Note: Not all functions have been prototyped here. Only the ones necessary to -// make this application work. The below code should give some clues as to -// how to add the rest since they have a lot of parameter and return type -// similarities. - [DllImport("libsndfile.dll")] - public static extern IntPtr sf_open ([MarshalAs(UnmanagedType.LPStr)] string path, int mode, ref SF_INFO sfinfo); - - [DllImport("libsndfile.dll")] - static extern int sf_error (IntPtr sndfile); - - [DllImport("libsndfile.dll")] - static extern IntPtr sf_strerror (IntPtr sndfile); - - [DllImport("libsndfile.dll")] - static extern int sf_format_check (ref SF_INFO info); - - [DllImport("libsndfile.dll")] - static extern sf_count_t sf_read_float (IntPtr sndfile, float[] ptr, sf_count_t items); - - [DllImport("libsndfile.dll")] - static extern sf_count_t sf_write_float (IntPtr sndfile, float[] ptr, sf_count_t items); - - [DllImport("libsndfile.dll")] - static extern int sf_close (IntPtr sndfile); - - - public const sf_count_t BUFFER_LEN = 4096; - - -//program entry - static void Main( ) { - - -//declarations - SF_INFO sfinfo = new SF_INFO(); - float[] buffer = new float[BUFFER_LEN]; - sf_count_t rcnt; - -//set the input file - string sfn = "input.wav"; //set to a file on YOUR system - //string sfn = "noexist.wav"; //test with non-existent file - -//set the output file - string ofn = "output.wav"; - -//read in sound file to convert - IntPtr infile = sf_open (sfn, (int)lsndf_tf.SFM_READ, ref sfinfo); - -//exit if error was thrown - if ( (int)infile == 0 ) { - Console.WriteLine("Error opening " + sfn); - Console.WriteLine("Error #" + sf_error(infile)); - return; - } - -//set the file type for the output file -//uncomment one and only one of the statements below to change the output -//file encoding. - //sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_WAV | lsndf_frmts.SF_FORMAT_PCM_U8); - //sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_WAV | lsndf_frmts.SF_FORMAT_PCM_16); - //sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_WAV | lsndf_frmts.SF_FORMAT_MS_ADPCM); - sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_WAV | lsndf_frmts.SF_FORMAT_IMA_ADPCM); - //sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_WAV | lsndf_frmts.SF_FORMAT_GSM610); - /* Soundforge W64. */ - //sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_W64 | lsndf_frmts.SF_FORMAT_PCM_U8); - //sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_W64 | lsndf_frmts.SF_FORMAT_PCM_16); - //sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_W64 | lsndf_frmts.SF_FORMAT_MS_ADPCM); - //sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_W64 | lsndf_frmts.SF_FORMAT_IMA_ADPCM); - //sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_W64 | lsndf_frmts.SF_FORMAT_GSM610); - - -//check that SF_INFO is valid - if ( sf_format_check(ref sfinfo) == 0 ) { - Console.WriteLine("sf_format_check failed. Invalid encoding"); - return; - } - -//open output file - IntPtr outfile = sf_open (ofn, (int)lsndf_tf.SFM_WRITE, ref sfinfo); - -//exit if error was thrown - if ( (int)outfile == 0 ) { - Console.WriteLine("Error opening " + ofn); - Console.WriteLine("Error #" + sf_error(outfile)); - return; - } - -//infile -> outfile - Console.Write(sfn + " -> " + ofn); - while ( (rcnt = sf_read_float (infile, buffer, BUFFER_LEN)) > 0) { - Console.Write("."); - sf_write_float (outfile, buffer, BUFFER_LEN); - } - Console.WriteLine("done."); - -//close up shop - sf_close(infile); - sf_close(outfile); - - - } //main() - - -} //class lsndf_example {} - diff --git a/libs/libsndfile/examples/list_formats.c b/libs/libsndfile/examples/list_formats.c deleted file mode 100644 index 6d462f0790..0000000000 --- a/libs/libsndfile/examples/list_formats.c +++ /dev/null @@ -1,83 +0,0 @@ -/* -** Copyright (C) 2001-2011 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#include - -#include - -int -main (void) -{ SF_FORMAT_INFO info ; - SF_INFO sfinfo ; - char buffer [128] ; - int format, major_count, subtype_count, m, s ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - buffer [0] = 0 ; - sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ; - if (strlen (buffer) < 1) - { printf ("Line %d: could not retrieve lib version.\n", __LINE__) ; - exit (1) ; - } ; - printf ("Version : %s\n\n", buffer) ; - - sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &major_count, sizeof (int)) ; - sf_command (NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &subtype_count, sizeof (int)) ; - - sfinfo.channels = 1 ; - for (m = 0 ; m < major_count ; m++) - { info.format = m ; - sf_command (NULL, SFC_GET_FORMAT_MAJOR, &info, sizeof (info)) ; - printf ("%s (extension \"%s\")\n", info.name, info.extension) ; - - format = info.format ; - - for (s = 0 ; s < subtype_count ; s++) - { info.format = s ; - sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &info, sizeof (info)) ; - - format = (format & SF_FORMAT_TYPEMASK) | info.format ; - - sfinfo.format = format ; - if (sf_format_check (&sfinfo)) - printf (" %s\n", info.name) ; - } ; - puts ("") ; - } ; - puts ("") ; - - return 0 ; -} /* main */ - diff --git a/libs/libsndfile/examples/make_sine.c b/libs/libsndfile/examples/make_sine.c deleted file mode 100644 index 1db0e00d26..0000000000 --- a/libs/libsndfile/examples/make_sine.c +++ /dev/null @@ -1,96 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#include - -#include - -#ifndef M_PI -#define M_PI 3.14159265358979323846264338 -#endif - -#define SAMPLE_RATE 44100 -#define SAMPLE_COUNT (SAMPLE_RATE * 4) /* 4 seconds */ -#define AMPLITUDE (1.0 * 0x7F000000) -#define LEFT_FREQ (344.0 / SAMPLE_RATE) -#define RIGHT_FREQ (466.0 / SAMPLE_RATE) - -int -main (void) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k ; - int *buffer ; - - if (! (buffer = malloc (2 * SAMPLE_COUNT * sizeof (int)))) - { printf ("Malloc failed.\n") ; - exit (0) ; - } ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = SAMPLE_COUNT ; - sfinfo.channels = 2 ; - sfinfo.format = (SF_FORMAT_WAV | SF_FORMAT_PCM_24) ; - - if (! (file = sf_open ("sine.wav", SFM_WRITE, &sfinfo))) - { printf ("Error : Not able to open output file.\n") ; - return 1 ; - } ; - - if (sfinfo.channels == 1) - { for (k = 0 ; k < SAMPLE_COUNT ; k++) - buffer [k] = AMPLITUDE * sin (LEFT_FREQ * 2 * k * M_PI) ; - } - else if (sfinfo.channels == 2) - { for (k = 0 ; k < SAMPLE_COUNT ; k++) - { buffer [2 * k] = AMPLITUDE * sin (LEFT_FREQ * 2 * k * M_PI) ; - buffer [2 * k + 1] = AMPLITUDE * sin (RIGHT_FREQ * 2 * k * M_PI) ; - } ; - } - else - { printf ("makesine can only generate mono or stereo files.\n") ; - exit (1) ; - } ; - - if (sf_write_int (file, buffer, sfinfo.channels * SAMPLE_COUNT) != - sfinfo.channels * SAMPLE_COUNT) - puts (sf_strerror (file)) ; - - sf_close (file) ; - return 0 ; -} /* main */ - diff --git a/libs/libsndfile/examples/sfprocess.c b/libs/libsndfile/examples/sfprocess.c deleted file mode 100644 index 1c141a4981..0000000000 --- a/libs/libsndfile/examples/sfprocess.c +++ /dev/null @@ -1,142 +0,0 @@ -/* -** Copyright (C) 2001-2013 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include - -/* Include this header file to use functions from libsndfile. */ -#include - -/* This will be the length of the buffer used to hold.frames while -** we process them. -*/ -#define BUFFER_LEN 1024 - -/* libsndfile can handle more than 6 channels but we'll restrict it to 6. */ -#define MAX_CHANNELS 6 - -/* Function prototype. */ -static void process_data (double *data, int count, int channels) ; - - -int -main (void) -{ /* This is a buffer of double precision floating point values - ** which will hold our data while we process it. - */ - static double data [BUFFER_LEN] ; - - /* A SNDFILE is very much like a FILE in the Standard C library. The - ** sf_open function return an SNDFILE* pointer when they sucessfully - ** open the specified file. - */ - SNDFILE *infile, *outfile ; - - /* A pointer to an SF_INFO struct is passed to sf_open. - ** On read, the library fills this struct with information about the file. - ** On write, the struct must be filled in before calling sf_open. - */ - SF_INFO sfinfo ; - int readcount ; - const char *infilename = "input.wav" ; - const char *outfilename = "output.wav" ; - - /* The SF_INFO struct must be initialized before using it. - */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - /* Here's where we open the input file. We pass sf_open the file name and - ** a pointer to an SF_INFO struct. - ** On successful open, sf_open returns a SNDFILE* pointer which is used - ** for all subsequent operations on that file. - ** If an error occurs during sf_open, the function returns a NULL pointer. - ** - ** If you are trying to open a raw headerless file you will need to set the - ** format and channels fields of sfinfo before calling sf_open(). For - ** instance to open a raw 16 bit stereo PCM file you would need the following - ** two lines: - ** - ** sfinfo.format = SF_FORMAT_RAW | SF_FORMAT_PCM_16 ; - ** sfinfo.channels = 2 ; - */ - if (! (infile = sf_open (infilename, SFM_READ, &sfinfo))) - { /* Open failed so print an error message. */ - printf ("Not able to open input file %s.\n", infilename) ; - /* Print the error message from libsndfile. */ - puts (sf_strerror (NULL)) ; - return 1 ; - } ; - - if (sfinfo.channels > MAX_CHANNELS) - { printf ("Not able to process more than %d channels\n", MAX_CHANNELS) ; - return 1 ; - } ; - /* Open the output file. */ - if (! (outfile = sf_open (outfilename, SFM_WRITE, &sfinfo))) - { printf ("Not able to open output file %s.\n", outfilename) ; - puts (sf_strerror (NULL)) ; - return 1 ; - } ; - - /* While there are.frames in the input file, read them, process - ** them and write them to the output file. - */ - while ((readcount = sf_read_double (infile, data, BUFFER_LEN))) - { process_data (data, readcount, sfinfo.channels) ; - sf_write_double (outfile, data, readcount) ; - } ; - - /* Close input and output files. */ - sf_close (infile) ; - sf_close (outfile) ; - - return 0 ; -} /* main */ - -static void -process_data (double *data, int count, int channels) -{ double channel_gain [MAX_CHANNELS] = { 0.5, 0.8, 0.1, 0.4, 0.4, 0.9 } ; - int k, chan ; - - /* Process the data here. - ** If the soundfile contains more then 1 channel you need to take care of - ** the data interleaving youself. - ** Current we just apply a channel dependant gain. - */ - - for (chan = 0 ; chan < channels ; chan ++) - for (k = chan ; k < count ; k+= channels) - data [k] *= channel_gain [chan] ; - - return ; -} /* process_data */ - diff --git a/libs/libsndfile/examples/sndfile-convert.c b/libs/libsndfile/examples/sndfile-convert.c deleted file mode 100644 index e1422579bd..0000000000 --- a/libs/libsndfile/examples/sndfile-convert.c +++ /dev/null @@ -1,376 +0,0 @@ -/* -** Copyright (C) 1999-2005 Erik de Castro Lopo -** -** 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. -*/ - - -#include -#include -#include -#include - -#include - -#define BUFFER_LEN 1024 - - -typedef struct -{ char *infilename, *outfilename ; - SF_INFO infileinfo, outfileinfo ; -} OptionData ; - -typedef struct -{ const char *ext ; - int len ; - int format ; -} OUTPUT_FORMAT_MAP ; - -static void copy_metadata (SNDFILE *outfile, SNDFILE *infile) ; -static void copy_data_fp (SNDFILE *outfile, SNDFILE *infile, int channels) ; -static void copy_data_int (SNDFILE *outfile, SNDFILE *infile, int channels) ; - -static OUTPUT_FORMAT_MAP format_map [] = -{ - { "aif", 3, SF_FORMAT_AIFF }, - { "wav", 0, SF_FORMAT_WAV }, - { "au", 0, SF_FORMAT_AU }, - { "caf", 0, SF_FORMAT_CAF }, - { "flac", 0, SF_FORMAT_FLAC }, - { "snd", 0, SF_FORMAT_AU }, - { "svx", 0, SF_FORMAT_SVX }, - { "paf", 0, SF_ENDIAN_BIG | SF_FORMAT_PAF }, - { "fap", 0, SF_ENDIAN_LITTLE | SF_FORMAT_PAF }, - { "gsm", 0, SF_FORMAT_RAW }, - { "nist", 0, SF_FORMAT_NIST }, - { "ircam", 0, SF_FORMAT_IRCAM }, - { "sf", 0, SF_FORMAT_IRCAM }, - { "voc", 0, SF_FORMAT_VOC }, - { "w64", 0, SF_FORMAT_W64 }, - { "raw", 0, SF_FORMAT_RAW }, - { "mat4", 0, SF_FORMAT_MAT4 }, - { "mat5", 0, SF_FORMAT_MAT5 }, - { "mat", 0, SF_FORMAT_MAT4 }, - { "pvf", 0, SF_FORMAT_PVF }, - { "sds", 0, SF_FORMAT_SDS }, - { "sd2", 0, SF_FORMAT_SD2 }, - { "vox", 0, SF_FORMAT_RAW }, - { "xi", 0, SF_FORMAT_XI } -} ; /* format_map */ - -static int -guess_output_file_type (char *str, int format) -{ char buffer [16], *cptr ; - int k ; - - format &= SF_FORMAT_SUBMASK ; - - if ((cptr = strrchr (str, '.')) == NULL) - return 0 ; - - strncpy (buffer, cptr + 1, 15) ; - buffer [15] = 0 ; - - for (k = 0 ; buffer [k] ; k++) - buffer [k] = tolower ((buffer [k])) ; - - if (strcmp (buffer, "gsm") == 0) - return SF_FORMAT_RAW | SF_FORMAT_GSM610 ; - - if (strcmp (buffer, "vox") == 0) - return SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM ; - - for (k = 0 ; k < (int) (sizeof (format_map) / sizeof (format_map [0])) ; k++) - { if (format_map [k].len > 0 && strncmp (buffer, format_map [k].ext, format_map [k].len) == 0) - return format_map [k].format | format ; - else if (strcmp (buffer, format_map [k].ext) == 0) - return format_map [k].format | format ; - } ; - - return 0 ; -} /* guess_output_file_type */ - - -static void -print_usage (char *progname) -{ SF_FORMAT_INFO info ; - - int k ; - - printf ("\nUsage : %s [encoding] \n", progname) ; - puts ("\n" - " where [encoding] may be one of the following:\n\n" - " -pcms8 : force the output to signed 8 bit pcm\n" - " -pcmu8 : force the output to unsigned 8 bit pcm\n" - " -pcm16 : force the output to 16 bit pcm\n" - " -pcm24 : force the output to 24 bit pcm\n" - " -pcm32 : force the output to 32 bit pcm\n" - " -float32 : force the output to 32 bit floating point" - ) ; - puts ( - " -ulaw : force the output ULAW\n" - " -alaw : force the output ALAW\n" - " -ima-adpcm : force the output to IMA ADPCM (WAV only)\n" - " -ms-adpcm : force the output to MS ADPCM (WAV only)\n" - " -gsm610 : force the GSM6.10 (WAV only)\n" - " -dwvw12 : force the output to 12 bit DWVW (AIFF only)\n" - " -dwvw16 : force the output to 16 bit DWVW (AIFF only)\n" - " -dwvw24 : force the output to 24 bit DWVW (AIFF only)\n" - ) ; - - puts ( - " The format of the output file is determined by the file extension of the\n" - " output file name. The following extensions are currently understood:\n" - ) ; - - for (k = 0 ; k < (int) (sizeof (format_map) / sizeof (format_map [0])) ; k++) - { info.format = format_map [k].format ; - sf_command (NULL, SFC_GET_FORMAT_INFO, &info, sizeof (info)) ; - printf (" %-10s : %s\n", format_map [k].ext, info.name) ; - } ; - - puts ("") ; -} /* print_usage */ - -int -main (int argc, char * argv []) -{ char *progname, *infilename, *outfilename ; - SNDFILE *infile = NULL, *outfile = NULL ; - SF_INFO sfinfo ; - int k, outfilemajor, outfileminor = 0, infileminor ; - - progname = strrchr (argv [0], '/') ; - progname = progname ? progname + 1 : argv [0] ; - - if (argc < 3 || argc > 5) - { print_usage (progname) ; - return 1 ; - } ; - - infilename = argv [argc-2] ; - outfilename = argv [argc-1] ; - - if (strcmp (infilename, outfilename) == 0) - { printf ("Error : Input and output filenames are the same.\n\n") ; - print_usage (progname) ; - return 1 ; - } ; - - if (infilename [0] == '-') - { printf ("Error : Input filename (%s) looks like an option.\n\n", infilename) ; - print_usage (progname) ; - return 1 ; - } ; - - if (outfilename [0] == '-') - { printf ("Error : Output filename (%s) looks like an option.\n\n", outfilename) ; - print_usage (progname) ; - return 1 ; - } ; - - for (k = 1 ; k < argc - 2 ; k++) - { if (! strcmp (argv [k], "-pcms8")) - { outfileminor = SF_FORMAT_PCM_S8 ; - continue ; - } ; - if (! strcmp (argv [k], "-pcmu8")) - { outfileminor = SF_FORMAT_PCM_U8 ; - continue ; - } ; - if (! strcmp (argv [k], "-pcm16")) - { outfileminor = SF_FORMAT_PCM_16 ; - continue ; - } ; - if (! strcmp (argv [k], "-pcm24")) - { outfileminor = SF_FORMAT_PCM_24 ; - continue ; - } ; - if (! strcmp (argv [k], "-pcm32")) - { outfileminor = SF_FORMAT_PCM_32 ; - continue ; - } ; - if (! strcmp (argv [k], "-float32")) - { outfileminor = SF_FORMAT_FLOAT ; - continue ; - } ; - if (! strcmp (argv [k], "-ulaw")) - { outfileminor = SF_FORMAT_ULAW ; - continue ; - } ; - if (! strcmp (argv [k], "-alaw")) - { outfileminor = SF_FORMAT_ALAW ; - continue ; - } ; - if (! strcmp (argv [k], "-ima-adpcm")) - { outfileminor = SF_FORMAT_IMA_ADPCM ; - continue ; - } ; - if (! strcmp (argv [k], "-ms-adpcm")) - { outfileminor = SF_FORMAT_MS_ADPCM ; - continue ; - } ; - if (! strcmp (argv [k], "-gsm610")) - { outfileminor = SF_FORMAT_GSM610 ; - continue ; - } ; - if (! strcmp (argv [k], "-dwvw12")) - { outfileminor = SF_FORMAT_DWVW_12 ; - continue ; - } ; - if (! strcmp (argv [k], "-dwvw16")) - { outfileminor = SF_FORMAT_DWVW_16 ; - continue ; - } ; - if (! strcmp (argv [k], "-dwvw24")) - { outfileminor = SF_FORMAT_DWVW_24 ; - continue ; - } ; - - printf ("Error : Not able to decode argunment '%s'.\n", argv [k]) ; - exit (1) ; - } ; - - if ((infile = sf_open (infilename, SFM_READ, &sfinfo)) == NULL) - { printf ("Not able to open input file %s.\n", infilename) ; - puts (sf_strerror (NULL)) ; - return 1 ; - } ; - - infileminor = sfinfo.format & SF_FORMAT_SUBMASK ; - - if ((sfinfo.format = guess_output_file_type (outfilename, sfinfo.format)) == 0) - { printf ("Error : Not able to determine output file type for %s.\n", outfilename) ; - return 1 ; - } ; - - outfilemajor = sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_ENDMASK) ; - - if (outfileminor == 0) - outfileminor = sfinfo.format & SF_FORMAT_SUBMASK ; - - if (outfileminor != 0) - sfinfo.format = outfilemajor | outfileminor ; - else - sfinfo.format = outfilemajor | (sfinfo.format & SF_FORMAT_SUBMASK) ; - - if ((sfinfo.format & SF_FORMAT_TYPEMASK) == SF_FORMAT_XI) - switch (sfinfo.format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_PCM_16 : - sfinfo.format = outfilemajor | SF_FORMAT_DPCM_16 ; - break ; - - case SF_FORMAT_PCM_S8 : - case SF_FORMAT_PCM_U8 : - sfinfo.format = outfilemajor | SF_FORMAT_DPCM_8 ; - break ; - } ; - - if (sf_format_check (&sfinfo) == 0) - { printf ("Error : output file format is invalid (0x%08X).\n", sfinfo.format) ; - return 1 ; - } ; - - /* Open the output file. */ - if ((outfile = sf_open (outfilename, SFM_WRITE, &sfinfo)) == NULL) - { printf ("Not able to open output file %s : %s\n", outfilename, sf_strerror (NULL)) ; - return 1 ; - } ; - - /* Copy the metadata */ - copy_metadata (outfile, infile) ; - - if ((outfileminor == SF_FORMAT_DOUBLE) || (outfileminor == SF_FORMAT_FLOAT) || - (infileminor == SF_FORMAT_DOUBLE) || (infileminor == SF_FORMAT_FLOAT)) - copy_data_fp (outfile, infile, sfinfo.channels) ; - else - copy_data_int (outfile, infile, sfinfo.channels) ; - - sf_close (infile) ; - sf_close (outfile) ; - - return 0 ; -} /* main */ - -static void -copy_metadata (SNDFILE *outfile, SNDFILE *infile) -{ SF_INSTRUMENT inst ; - const char *str ; - int k, err = 0 ; - - for (k = SF_STR_FIRST ; k <= SF_STR_LAST ; k++) - { str = sf_get_string (infile, k) ; - if (str != NULL) - err = sf_set_string (outfile, k, str) ; - } ; - - memset (&inst, 0, sizeof (inst)) ; - if (sf_command (infile, SFC_GET_INSTRUMENT, &inst, sizeof (inst)) == SF_TRUE) - sf_command (outfile, SFC_SET_INSTRUMENT, &inst, sizeof (inst)) ; - -} /* copy_metadata */ - -static void -copy_data_fp (SNDFILE *outfile, SNDFILE *infile, int channels) -{ static double data [BUFFER_LEN], max ; - int frames, readcount, k ; - - frames = BUFFER_LEN / channels ; - readcount = frames ; - - sf_command (infile, SFC_CALC_SIGNAL_MAX, &max, sizeof (max)) ; - - if (max < 1.0) - { while (readcount > 0) - { readcount = sf_readf_double (infile, data, frames) ; - sf_writef_double (outfile, data, readcount) ; - } ; - } - else - { sf_command (infile, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - while (readcount > 0) - { readcount = sf_readf_double (infile, data, frames) ; - for (k = 0 ; k < readcount * channels ; k++) - data [k] /= max ; - sf_writef_double (outfile, data, readcount) ; - } ; - } ; - - return ; -} /* copy_data_fp */ - -static void -copy_data_int (SNDFILE *outfile, SNDFILE *infile, int channels) -{ static int data [BUFFER_LEN] ; - int frames, readcount ; - - frames = BUFFER_LEN / channels ; - readcount = frames ; - - while (readcount > 0) - { readcount = sf_readf_int (infile, data, frames) ; - sf_writef_int (outfile, data, readcount) ; - } ; - - return ; -} /* copy_data_int */ - -/* -** Do not edit or modify anything in this comment block. -** The arch-tag line is a file identity tag for the GNU Arch -** revision control system. -** -** arch-tag: 259682b3-2887-48a6-b5bb-3cde00521ba3 -*/ diff --git a/libs/libsndfile/examples/sndfile-info.c b/libs/libsndfile/examples/sndfile-info.c deleted file mode 100644 index 44e2ec174f..0000000000 --- a/libs/libsndfile/examples/sndfile-info.c +++ /dev/null @@ -1,354 +0,0 @@ -/* -** Copyright (C) 1999-2006 Erik de Castro Lopo -** -** 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. -*/ - -#include -#include -#include -#include -#include - -#include - -#define BUFFER_LEN (1 << 16) - -#if (defined (WIN32) || defined (_WIN32)) -#define snprintf _snprintf -#endif - -static void print_version (void) ; -static void print_usage (const char *progname) ; - -static void info_dump (const char *filename) ; -static void instrument_dump (const char *filename) ; -static void broadcast_dump (const char *filename) ; - -int -main (int argc, char *argv []) -{ int k ; - - print_version () ; - - if (argc < 2 || strcmp (argv [1], "--help") == 0 || strcmp (argv [1], "-h") == 0) - { char *progname ; - - progname = strrchr (argv [0], '/') ; - progname = progname ? progname + 1 : argv [0] ; - - print_usage (progname) ; - return 1 ; - } ; - - if (strcmp (argv [1], "-i") == 0) - { instrument_dump (argv [2]) ; - return 0 ; - } ; - - if (strcmp (argv [1], "-b") == 0) - { broadcast_dump (argv [2]) ; - return 0 ; - } ; - - for (k = 1 ; k < argc ; k++) - info_dump (argv [k]) ; - - return 0 ; -} /* main */ - -/*============================================================================== -** Print version and usage. -*/ - -static double data [BUFFER_LEN] ; - -static void -print_version (void) -{ char buffer [256] ; - - sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ; - printf ("\nVersion : %s\n\n", buffer) ; -} /* print_version */ - - -static void -print_usage (const char *progname) -{ printf ("Usage :\n %s ...\n", progname) ; - printf (" Prints out information about one or more sound files.\n\n") ; - printf (" %s -i \n", progname) ; - printf (" Prints out the instrument data for the given file.\n\n") ; - printf (" %s -b \n", progname) ; - printf (" Prints out the broadcast WAV info for the given file.\n\n") ; -#if (defined (_WIN32) || defined (WIN32)) - printf ("This is a Unix style command line application which\n" - "should be run in a MSDOS box or Command Shell window.\n\n") ; - printf ("Sleeping for 5 seconds before exiting.\n\n") ; - fflush (stdout) ; - - /* This is the officially blessed by microsoft way but I can't get - ** it to link. - ** Sleep (15) ; - ** Instead, use this: - */ - _sleep (5 * 1000) ; -#endif -} /* print_usage */ - -/*============================================================================== -** Dumping of sndfile info. -*/ - -static double data [BUFFER_LEN] ; - -static double -get_signal_max (SNDFILE *file) -{ double max, temp ; - int readcount, k, save_state ; - - save_state = sf_command (file, SFC_GET_NORM_DOUBLE, NULL, 0) ; - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - max = 0.0 ; - while ((readcount = sf_read_double (file, data, BUFFER_LEN))) - { for (k = 0 ; k < readcount ; k++) - { temp = fabs (data [k]) ; - if (temp > max) - max = temp ; - } ; - } ; - - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, save_state) ; - - return max ; -} /* get_signal_max */ - -static double -calc_decibels (SF_INFO * sfinfo, double max) -{ double decibels ; - - switch (sfinfo->format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_S8 : - decibels = max / 0x80 ; - break ; - - case SF_FORMAT_PCM_16 : - decibels = max / 0x8000 ; - break ; - - case SF_FORMAT_PCM_24 : - decibels = max / 0x800000 ; - break ; - - case SF_FORMAT_PCM_32 : - decibels = max / 0x80000000 ; - break ; - - case SF_FORMAT_FLOAT : - case SF_FORMAT_DOUBLE : - decibels = max / 1.0 ; - break ; - - default : - decibels = max / 0x8000 ; - break ; - } ; - - return 20.0 * log10 (decibels) ; -} /* calc_decibels */ - -static const char * -generate_duration_str (SF_INFO *sfinfo) -{ static char str [128] ; - - int seconds ; - - memset (str, 0, sizeof (str)) ; - - if (sfinfo->samplerate < 1) - return NULL ; - - if (sfinfo->frames / sfinfo->samplerate > 0x7FFFFFFF) - return "unknown" ; - - seconds = sfinfo->frames / sfinfo->samplerate ; - - snprintf (str, sizeof (str) - 1, "%02d:", seconds / 60 / 60) ; - - seconds = seconds % (60 * 60) ; - snprintf (str + strlen (str), sizeof (str) - strlen (str) - 1, "%02d:", seconds / 60) ; - - seconds = seconds % 60 ; - snprintf (str + strlen (str), sizeof (str) - strlen (str) - 1, "%02d.", seconds) ; - - seconds = ((1000 * sfinfo->frames) / sfinfo->samplerate) % 1000 ; - snprintf (str + strlen (str), sizeof (str) - strlen (str) - 1, "%03d", seconds) ; - - return str ; -} /* generate_duration_str */ - -static void -info_dump (const char *filename) -{ static char strbuffer [BUFFER_LEN] ; - SNDFILE *file ; - SF_INFO sfinfo ; - double signal_max, decibels ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) - { printf ("Error : Not able to open input file %s.\n", filename) ; - fflush (stdout) ; - memset (data, 0, sizeof (data)) ; - sf_command (file, SFC_GET_LOG_INFO, strbuffer, BUFFER_LEN) ; - puts (strbuffer) ; - puts (sf_strerror (NULL)) ; - return ; - } ; - - printf ("========================================\n") ; - sf_command (file, SFC_GET_LOG_INFO, strbuffer, BUFFER_LEN) ; - puts (strbuffer) ; - printf ("----------------------------------------\n") ; - - if (file == NULL) - { printf ("Error : Not able to open input file %s.\n", filename) ; - fflush (stdout) ; - memset (data, 0, sizeof (data)) ; - puts (sf_strerror (NULL)) ; - } - else - { printf ("Sample Rate : %d\n", sfinfo.samplerate) ; - if (sfinfo.frames > 0x7FFFFFFF) - printf ("Frames : unknown\n") ; - else - printf ("Frames : %ld\n", (long) sfinfo.frames) ; - printf ("Channels : %d\n", sfinfo.channels) ; - printf ("Format : 0x%08X\n", sfinfo.format) ; - printf ("Sections : %d\n", sfinfo.sections) ; - printf ("Seekable : %s\n", (sfinfo.seekable ? "TRUE" : "FALSE")) ; - printf ("Duration : %s\n", generate_duration_str (&sfinfo)) ; - - /* Do not use sf_signal_max because it doesn work for non-seekable files . */ - signal_max = get_signal_max (file) ; - decibels = calc_decibels (&sfinfo, signal_max) ; - printf ("Signal Max : %g (%4.2f dB)\n\n", signal_max, decibels) ; - } ; - - sf_close (file) ; - -} /* info_dump */ - -/*============================================================================== -** Dumping of SF_INSTRUMENT data. -*/ - -static const char * -str_of_type (int mode) -{ switch (mode) - { case SF_LOOP_NONE : return "none" ; - case SF_LOOP_FORWARD : return "fwd " ; - case SF_LOOP_BACKWARD : return "back" ; - case SF_LOOP_ALTERNATING : return "alt " ; - default : break ; - } ; - - return "????" ; -} /* str_of_mode */ - -static void -instrument_dump (const char *filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - SF_INSTRUMENT inst ; - int got_inst, k ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) - { printf ("Error : Not able to open input file %s.\n", filename) ; - fflush (stdout) ; - memset (data, 0, sizeof (data)) ; - puts (sf_strerror (NULL)) ; - return ; - } ; - - got_inst = sf_command (file, SFC_GET_INSTRUMENT, &inst, sizeof (inst)) ; - sf_close (file) ; - - if (got_inst == SF_FALSE) - { printf ("Error : File '%s' does not contain instrument data.\n\n", filename) ; - return ; - } ; - - printf ("Instrument : %s\n\n", filename) ; - printf (" Gain : %d\n", inst.gain) ; - printf (" Base note : %d\n", inst.basenote) ; - printf (" Velocity : %d - %d\n", (int) inst.velocity_lo, (int) inst.velocity_hi) ; - printf (" Key : %d - %d\n", (int) inst.key_lo, (int) inst.key_hi) ; - printf (" Loop points : %d\n", inst.loop_count) ; - - for (k = 0 ; k < inst.loop_count ; k++) - printf (" %-2d Mode : %s Start : %6d End : %6d Count : %6d\n", k, str_of_type (inst.loops [k].mode), inst.loops [k].start, inst.loops [k].end, inst.loops [k].count) ; - - putchar ('\n') ; -} /* instrument_dump */ - -static void -broadcast_dump (const char *filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - SF_BROADCAST_INFO bext ; - int got_bext ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) - { printf ("Error : Not able to open input file %s.\n", filename) ; - fflush (stdout) ; - memset (data, 0, sizeof (data)) ; - puts (sf_strerror (NULL)) ; - return ; - } ; - - memset (&bext, 0, sizeof (SF_BROADCAST_INFO)) ; - - got_bext = sf_command (file, SFC_GET_BROADCAST_INFO, &bext, sizeof (bext)) ; - sf_close (file) ; - - if (got_bext == SF_FALSE) - { printf ("Error : File '%s' does not contain broadcast information.\n\n", filename) ; - return ; - } ; - - printf ("Description : %.*s\n", (int) sizeof (bext.description), bext.description) ; - printf ("Originator : %.*s\n", (int) sizeof (bext.originator), bext.originator) ; - printf ("Origination ref : %.*s\n", (int) sizeof (bext.originator_reference), bext.originator_reference) ; - printf ("Origination date : %.*s\n", (int) sizeof (bext.origination_date), bext.origination_date) ; - printf ("Origination time : %.*s\n", (int) sizeof (bext.origination_time), bext.origination_time) ; - printf ("BWF version : %d\n", bext.version) ; - printf ("UMID : %.*s\n", (int) sizeof (bext.umid), bext.umid) ; - printf ("Coding history : %.*s\n", bext.coding_history_size, bext.coding_history) ; - -} /* broadcast_dump */ - -/* -** Do not edit or modify anything in this comment block. -** The arch-tag line is a file identity tag for the GNU Arch -** revision control system. -** -** arch-tag: f59a05db-a182-41de-aedd-d717ce2bb099 -*/ diff --git a/libs/libsndfile/examples/sndfile-play-beos.cpp b/libs/libsndfile/examples/sndfile-play-beos.cpp deleted file mode 100644 index 56f7415119..0000000000 --- a/libs/libsndfile/examples/sndfile-play-beos.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* -** Copyright (C) 2001 Marcus Overhagen -** -** 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. -*/ - -#include - -#include -#include -#include - -#include - -#define BUFFER_LEN 1024 - -/*------------------------------------------------------------------------------ -** BeOS functions for playing a sound. -*/ - -#if defined (__BEOS__) - -struct shared_data -{ - BSoundPlayer *player; - SNDFILE *sndfile; - SF_INFO sfinfo; - sem_id finished; -}; - -static void -buffer_callback(void *theCookie, void *buf, size_t size, const media_raw_audio_format &format) -{ - shared_data *data = (shared_data *)theCookie; - short *buffer = (short *)buf; - int count = size / sizeof(short); - int m, readcount; - - if (!data->player->HasData()) - return; - - readcount = sf_read_short(data->sndfile, buffer, count); - if (readcount == 0) - { data->player->SetHasData(false); - release_sem(data->finished); - } - if (readcount < count) - { for (m = readcount ; m < count ; m++) - buffer [m] = 0 ; - } - if (data->sfinfo.pcmbitwidth < 16) - { for (m = 0 ; m < count ; m++) - buffer [m] *= 256 ; - } -} - -static void -beos_play (int argc, char *argv []) -{ - shared_data data; - status_t status; - int k; - - /* BSoundPlayer requires a BApplication object */ - BApplication app("application/x-vnd.MarcusOverhagen-sfplay"); - - for (k = 1 ; k < argc ; k++) - { printf ("Playing %s\n", argv [k]) ; - if (! (data.sndfile = sf_open_read (argv [k], &data.sfinfo))) - { sf_perror (NULL) ; - continue ; - } ; - - if (data.sfinfo.channels < 1 || data.sfinfo.channels > 2) - { printf ("Error : channels = %d.\n", data.sfinfo.channels) ; - sf_close (data.sndfile) ; - continue ; - } ; - - data.finished = create_sem(0,"finished"); - - media_raw_audio_format format = - { data.sfinfo.samplerate, - data.sfinfo.channels, - media_raw_audio_format::B_AUDIO_SHORT, - B_HOST_IS_LENDIAN ? B_MEDIA_LITTLE_ENDIAN : B_MEDIA_BIG_ENDIAN, - BUFFER_LEN * sizeof(short) - }; - - BSoundPlayer player(&format,"player",buffer_callback,NULL,&data); - data.player = &player; - - if ((status = player.InitCheck()) != B_OK) - { - printf ("Error : BSoundPlayer init failed, %s.\n", strerror(status)) ; - delete_sem(data.finished); - sf_close (data.sndfile) ; - continue ; - } - - player.SetVolume(1.0); - player.Start(); - player.SetHasData(true); - acquire_sem(data.finished); - player.Stop(); - delete_sem(data.finished); - - sf_close (data.sndfile) ; - - } ; - -} /* beos_play */ - -#endif - -/*============================================================================== -** Main function. -*/ - -int -main (int argc, char *argv []) -{ - if (argc < 2) - { printf ("Usage : %s \n\n", argv [0]) ; - return 1 ; - } ; - - beos_play (argc, argv) ; - - return 0 ; -} /* main */ - - -/* -** Do not edit or modify anything in this comment block. -** The arch-tag line is a file identity tag for the GNU Arch -** revision control system. -** -** arch-tag: 5407a79d-88de-41c7-8d8e-9acf2cf13cc1 -*/ - diff --git a/libs/libsndfile/examples/sndfile-play.c b/libs/libsndfile/examples/sndfile-play.c deleted file mode 100644 index 7969693a44..0000000000 --- a/libs/libsndfile/examples/sndfile-play.c +++ /dev/null @@ -1,960 +0,0 @@ -/* -** Copyright (C) 1999-2005 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if HAVE_ALSA_ASOUNDLIB_H - #define ALSA_PCM_NEW_HW_PARAMS_API - #define ALSA_PCM_NEW_SW_PARAMS_API - #include - #include -#endif - -#if defined (__linux__) - #include - #include - #include - -#elif (defined (__MACH__) && defined (__APPLE__)) - #include - #include - -#elif (defined (sun) && defined (unix)) - #include - #include - #include - -#elif (OS_IS_WIN32 == 1) - #include - #include - -#endif - -#include - -#define SIGNED_SIZEOF(x) ((int) sizeof (x)) -#define BUFFER_LEN (2048) - -/*------------------------------------------------------------------------------ -** Linux/OSS functions for playing a sound. -*/ - -#if HAVE_ALSA_ASOUNDLIB_H - -static snd_pcm_t * alsa_open (int channels, unsigned srate, int realtime) ; -static int alsa_write_float (snd_pcm_t *alsa_dev, float *data, int frames, int channels) ; - -static void -alsa_play (int argc, char *argv []) -{ static float buffer [BUFFER_LEN] ; - SNDFILE *sndfile ; - SF_INFO sfinfo ; - snd_pcm_t * alsa_dev ; - int k, readcount, subformat ; - - for (k = 1 ; k < argc ; k++) - { memset (&sfinfo, 0, sizeof (sfinfo)) ; - - printf ("Playing %s\n", argv [k]) ; - if (! (sndfile = sf_open (argv [k], SFM_READ, &sfinfo))) - { puts (sf_strerror (NULL)) ; - continue ; - } ; - - if (sfinfo.channels < 1 || sfinfo.channels > 2) - { printf ("Error : channels = %d.\n", sfinfo.channels) ; - continue ; - } ; - - if ((alsa_dev = alsa_open (sfinfo.channels, (unsigned) sfinfo.samplerate, SF_FALSE)) == NULL) - continue ; - - subformat = sfinfo.format & SF_FORMAT_SUBMASK ; - - if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) - { double scale ; - int m ; - - sf_command (sndfile, SFC_CALC_SIGNAL_MAX, &scale, sizeof (scale)) ; - if (scale < 1e-10) - scale = 1.0 ; - else - scale = 32700.0 / scale ; - - while ((readcount = sf_read_float (sndfile, buffer, BUFFER_LEN))) - { for (m = 0 ; m < readcount ; m++) - buffer [m] *= scale ; - alsa_write_float (alsa_dev, buffer, BUFFER_LEN / sfinfo.channels, sfinfo.channels) ; - } ; - } - else - { while ((readcount = sf_read_float (sndfile, buffer, BUFFER_LEN))) - alsa_write_float (alsa_dev, buffer, BUFFER_LEN / sfinfo.channels, sfinfo.channels) ; - } ; - - snd_pcm_drain (alsa_dev) ; - snd_pcm_close (alsa_dev) ; - - sf_close (sndfile) ; - } ; - - return ; -} /* alsa_play */ - -static snd_pcm_t * -alsa_open (int channels, unsigned samplerate, int realtime) -{ const char * device = "plughw:0" ; - snd_pcm_t *alsa_dev = NULL ; - snd_pcm_hw_params_t *hw_params ; - snd_pcm_uframes_t buffer_size, xfer_align, start_threshold ; - snd_pcm_uframes_t alsa_period_size, alsa_buffer_frames ; - snd_pcm_sw_params_t *sw_params ; - - int err ; - - if (realtime) - { alsa_period_size = 256 ; - alsa_buffer_frames = 3 * alsa_period_size ; - } - else - { alsa_period_size = 1024 ; - alsa_buffer_frames = 4 * alsa_period_size ; - } ; - - if ((err = snd_pcm_open (&alsa_dev, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) - { fprintf (stderr, "cannot open audio device \"%s\" (%s)\n", device, snd_strerror (err)) ; - goto catch_error ; - } ; - - snd_pcm_nonblock (alsa_dev, 0) ; - - if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) - { fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params_any (alsa_dev, hw_params)) < 0) - { fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params_set_access (alsa_dev, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) - { fprintf (stderr, "cannot set access type (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params_set_format (alsa_dev, hw_params, SND_PCM_FORMAT_FLOAT)) < 0) - { fprintf (stderr, "cannot set sample format (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params_set_rate_near (alsa_dev, hw_params, &samplerate, 0)) < 0) - { fprintf (stderr, "cannot set sample rate (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params_set_channels (alsa_dev, hw_params, channels)) < 0) - { fprintf (stderr, "cannot set channel count (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params_set_buffer_size_near (alsa_dev, hw_params, &alsa_buffer_frames)) < 0) - { fprintf (stderr, "cannot set buffer size (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params_set_period_size_near (alsa_dev, hw_params, &alsa_period_size, 0)) < 0) - { fprintf (stderr, "cannot set period size (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params (alsa_dev, hw_params)) < 0) - { fprintf (stderr, "cannot set parameters (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - /* extra check: if we have only one period, this code won't work */ - snd_pcm_hw_params_get_period_size (hw_params, &alsa_period_size, 0) ; - snd_pcm_hw_params_get_buffer_size (hw_params, &buffer_size) ; - if (alsa_period_size == buffer_size) - { fprintf (stderr, "Can't use period equal to buffer size (%lu == %lu)", alsa_period_size, buffer_size) ; - goto catch_error ; - } ; - - snd_pcm_hw_params_free (hw_params) ; - - if ((err = snd_pcm_sw_params_malloc (&sw_params)) != 0) - { fprintf (stderr, "%s: snd_pcm_sw_params_malloc: %s", __func__, snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_sw_params_current (alsa_dev, sw_params)) != 0) - { fprintf (stderr, "%s: snd_pcm_sw_params_current: %s", __func__, snd_strerror (err)) ; - goto catch_error ; - } ; - - /* note: set start threshold to delay start until the ring buffer is full */ - snd_pcm_sw_params_current (alsa_dev, sw_params) ; - if ((err = snd_pcm_sw_params_get_xfer_align (sw_params, &xfer_align)) < 0) - { fprintf (stderr, "cannot get xfer align (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - /* round up to closest transfer boundary */ - start_threshold = (buffer_size / xfer_align) * xfer_align ; - if (start_threshold < 1) - start_threshold = 1 ; - if ((err = snd_pcm_sw_params_set_start_threshold (alsa_dev, sw_params, start_threshold)) < 0) - { fprintf (stderr, "cannot set start threshold (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_sw_params (alsa_dev, sw_params)) != 0) - { fprintf (stderr, "%s: snd_pcm_sw_params: %s", __func__, snd_strerror (err)) ; - goto catch_error ; - } ; - - snd_pcm_sw_params_free (sw_params) ; - - snd_pcm_reset (alsa_dev) ; - -catch_error : - - if (err < 0 && alsa_dev != NULL) - { snd_pcm_close (alsa_dev) ; - return NULL ; - } ; - - return alsa_dev ; -} /* alsa_open */ - -static int -alsa_write_float (snd_pcm_t *alsa_dev, float *data, int frames, int channels) -{ static int epipe_count = 0 ; - - snd_pcm_status_t *status ; - int total = 0 ; - int retval ; - - if (epipe_count > 0) - epipe_count -- ; - - while (total < frames) - { retval = snd_pcm_writei (alsa_dev, data + total * channels, frames - total) ; - - if (retval >= 0) - { total += retval ; - if (total == frames) - return total ; - - continue ; - } ; - - switch (retval) - { case -EAGAIN : - puts ("alsa_write_float: EAGAIN") ; - continue ; - break ; - - case -EPIPE : - if (epipe_count > 0) - { printf ("alsa_write_float: EPIPE %d\n", epipe_count) ; - if (epipe_count > 140) - return retval ; - } ; - epipe_count += 100 ; - - if (0) - { snd_pcm_status_alloca (&status) ; - if ((retval = snd_pcm_status (alsa_dev, status)) < 0) - fprintf (stderr, "alsa_out: xrun. can't determine length\n") ; - else if (snd_pcm_status_get_state (status) == SND_PCM_STATE_XRUN) - { struct timeval now, diff, tstamp ; - - gettimeofday (&now, 0) ; - snd_pcm_status_get_trigger_tstamp (status, &tstamp) ; - timersub (&now, &tstamp, &diff) ; - - fprintf (stderr, "alsa_write_float xrun: of at least %.3f msecs. resetting stream\n", - diff.tv_sec * 1000 + diff.tv_usec / 1000.0) ; - } - else - fprintf (stderr, "alsa_write_float: xrun. can't determine length\n") ; - } ; - - snd_pcm_prepare (alsa_dev) ; - break ; - - case -EBADFD : - fprintf (stderr, "alsa_write_float: Bad PCM state.n") ; - return 0 ; - break ; - - case -ESTRPIPE : - fprintf (stderr, "alsa_write_float: Suspend event.n") ; - return 0 ; - break ; - - case -EIO : - puts ("alsa_write_float: EIO") ; - return 0 ; - - default : - fprintf (stderr, "alsa_write_float: retval = %d\n", retval) ; - return 0 ; - break ; - } ; /* switch */ - } ; /* while */ - - return total ; -} /* alsa_write_float */ - -#endif /* HAVE_ALSA_ASOUNDLIB_H */ - -/*------------------------------------------------------------------------------ -** Linux/OSS functions for playing a sound. -*/ - -#if defined (__linux__) - -static int linux_open_dsp_device (int channels, int srate) ; - -static void -linux_play (int argc, char *argv []) -{ static short buffer [BUFFER_LEN] ; - SNDFILE *sndfile ; - SF_INFO sfinfo ; - int k, audio_device, readcount, subformat ; - - for (k = 1 ; k < argc ; k++) - { memset (&sfinfo, 0, sizeof (sfinfo)) ; - - printf ("Playing %s\n", argv [k]) ; - if (! (sndfile = sf_open (argv [k], SFM_READ, &sfinfo))) - { puts (sf_strerror (NULL)) ; - continue ; - } ; - - if (sfinfo.channels < 1 || sfinfo.channels > 2) - { printf ("Error : channels = %d.\n", sfinfo.channels) ; - continue ; - } ; - - audio_device = linux_open_dsp_device (sfinfo.channels, sfinfo.samplerate) ; - - subformat = sfinfo.format & SF_FORMAT_SUBMASK ; - - if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) - { static float float_buffer [BUFFER_LEN] ; - double scale ; - int m ; - - sf_command (sndfile, SFC_CALC_SIGNAL_MAX, &scale, sizeof (scale)) ; - if (scale < 1e-10) - scale = 1.0 ; - else - scale = 32700.0 / scale ; - - while ((readcount = sf_read_float (sndfile, float_buffer, BUFFER_LEN))) - { for (m = 0 ; m < readcount ; m++) - buffer [m] = scale * float_buffer [m] ; - write (audio_device, buffer, readcount * sizeof (short)) ; - } ; - } - else - { while ((readcount = sf_read_short (sndfile, buffer, BUFFER_LEN))) - write (audio_device, buffer, readcount * sizeof (short)) ; - } ; - - if (ioctl (audio_device, SNDCTL_DSP_POST, 0) == -1) - perror ("ioctl (SNDCTL_DSP_POST) ") ; - - if (ioctl (audio_device, SNDCTL_DSP_SYNC, 0) == -1) - perror ("ioctl (SNDCTL_DSP_SYNC) ") ; - - close (audio_device) ; - - sf_close (sndfile) ; - } ; - - return ; -} /* linux_play */ - -static int -linux_open_dsp_device (int channels, int srate) -{ int fd, stereo, fmt ; - - if ((fd = open ("/dev/dsp", O_WRONLY, 0)) == -1 && - (fd = open ("/dev/sound/dsp", O_WRONLY, 0)) == -1) - { perror ("linux_open_dsp_device : open ") ; - exit (1) ; - } ; - - stereo = 0 ; - if (ioctl (fd, SNDCTL_DSP_STEREO, &stereo) == -1) - { /* Fatal error */ - perror ("linux_open_dsp_device : stereo ") ; - exit (1) ; - } ; - - if (ioctl (fd, SNDCTL_DSP_RESET, 0)) - { perror ("linux_open_dsp_device : reset ") ; - exit (1) ; - } ; - - fmt = CPU_IS_BIG_ENDIAN ? AFMT_S16_BE : AFMT_S16_LE ; - if (ioctl (fd, SOUND_PCM_SETFMT, &fmt) != 0) - { perror ("linux_open_dsp_device : set format ") ; - exit (1) ; - } ; - - if (ioctl (fd, SOUND_PCM_WRITE_CHANNELS, &channels) != 0) - { perror ("linux_open_dsp_device : channels ") ; - exit (1) ; - } ; - - if (ioctl (fd, SOUND_PCM_WRITE_RATE, &srate) != 0) - { perror ("linux_open_dsp_device : sample rate ") ; - exit (1) ; - } ; - - if (ioctl (fd, SNDCTL_DSP_SYNC, 0) != 0) - { perror ("linux_open_dsp_device : sync ") ; - exit (1) ; - } ; - - return fd ; -} /* linux_open_dsp_device */ - -#endif /* __linux__ */ - -/*------------------------------------------------------------------------------ -** Mac OS X functions for playing a sound. -*/ - -#if (defined (__MACH__) && defined (__APPLE__)) /* MacOSX */ - -typedef struct -{ AudioStreamBasicDescription format ; - - UInt32 buf_size ; - AudioDeviceID device ; - - SNDFILE *sndfile ; - SF_INFO sfinfo ; - - int fake_stereo ; - int done_playing ; -} MacOSXAudioData ; - -#include - -static OSStatus -macosx_audio_out_callback (AudioDeviceID device, const AudioTimeStamp* current_time, - const AudioBufferList* data_in, const AudioTimeStamp* time_in, - AudioBufferList* data_out, const AudioTimeStamp* time_out, - void* client_data) -{ MacOSXAudioData *audio_data ; - int size, sample_count, read_count, k ; - float *buffer ; - - /* Prevent compiler warnings. */ - device = device ; - current_time = current_time ; - data_in = data_in ; - time_in = time_in ; - time_out = time_out ; - - audio_data = (MacOSXAudioData*) client_data ; - - size = data_out->mBuffers [0].mDataByteSize ; - sample_count = size / sizeof (float) ; - - buffer = (float*) data_out->mBuffers [0].mData ; - - if (audio_data->fake_stereo != 0) - { read_count = sf_read_float (audio_data->sndfile, buffer, sample_count / 2) ; - - for (k = read_count - 1 ; k >= 0 ; k--) - { buffer [2 * k ] = buffer [k] ; - buffer [2 * k + 1] = buffer [k] ; - } ; - read_count *= 2 ; - } - else - read_count = sf_read_float (audio_data->sndfile, buffer, sample_count) ; - - /* Fill the remainder with zeroes. */ - if (read_count < sample_count) - { if (audio_data->fake_stereo == 0) - memset (&(buffer [read_count]), 0, (sample_count - read_count) * sizeof (float)) ; - /* Tell the main application to terminate. */ - audio_data->done_playing = SF_TRUE ; - } ; - - return noErr ; -} /* macosx_audio_out_callback */ - -static void -macosx_play (int argc, char *argv []) -{ MacOSXAudioData audio_data ; - OSStatus err ; - UInt32 count, buffer_size ; - int k ; - - audio_data.fake_stereo = 0 ; - audio_data.device = kAudioDeviceUnknown ; - - /* get the default output device for the HAL */ - count = sizeof (AudioDeviceID) ; - if ((err = AudioHardwareGetProperty (kAudioHardwarePropertyDefaultOutputDevice, - &count, (void *) &(audio_data.device))) != noErr) - { printf ("AudioHardwareGetProperty (kAudioDevicePropertyDefaultOutputDevice) failed.\n") ; - return ; - } ; - - /* get the buffersize that the default device uses for IO */ - count = sizeof (UInt32) ; - if ((err = AudioDeviceGetProperty (audio_data.device, 0, false, kAudioDevicePropertyBufferSize, - &count, &buffer_size)) != noErr) - { printf ("AudioDeviceGetProperty (kAudioDevicePropertyBufferSize) failed.\n") ; - return ; - } ; - - /* get a description of the data format used by the default device */ - count = sizeof (AudioStreamBasicDescription) ; - if ((err = AudioDeviceGetProperty (audio_data.device, 0, false, kAudioDevicePropertyStreamFormat, - &count, &(audio_data.format))) != noErr) - { printf ("AudioDeviceGetProperty (kAudioDevicePropertyStreamFormat) failed.\n") ; - return ; - } ; - - /* Base setup completed. Now play files. */ - for (k = 1 ; k < argc ; k++) - { printf ("Playing %s\n", argv [k]) ; - if (! (audio_data.sndfile = sf_open (argv [k], SFM_READ, &(audio_data.sfinfo)))) - { puts (sf_strerror (NULL)) ; - continue ; - } ; - - if (audio_data.sfinfo.channels < 1 || audio_data.sfinfo.channels > 2) - { printf ("Error : channels = %d.\n", audio_data.sfinfo.channels) ; - continue ; - } ; - - audio_data.format.mSampleRate = audio_data.sfinfo.samplerate ; - - if (audio_data.sfinfo.channels == 1) - { audio_data.format.mChannelsPerFrame = 2 ; - audio_data.fake_stereo = 1 ; - } - else - audio_data.format.mChannelsPerFrame = audio_data.sfinfo.channels ; - - if ((err = AudioDeviceSetProperty (audio_data.device, NULL, 0, false, kAudioDevicePropertyStreamFormat, - sizeof (AudioStreamBasicDescription), &(audio_data.format))) != noErr) - { printf ("AudioDeviceSetProperty (kAudioDevicePropertyStreamFormat) failed.\n") ; - return ; - } ; - - /* we want linear pcm */ - if (audio_data.format.mFormatID != kAudioFormatLinearPCM) - return ; - - /* Fire off the device. */ - if ((err = AudioDeviceAddIOProc (audio_data.device, macosx_audio_out_callback, - (void *) &audio_data)) != noErr) - { printf ("AudioDeviceAddIOProc failed.\n") ; - return ; - } ; - - err = AudioDeviceStart (audio_data.device, macosx_audio_out_callback) ; - if (err != noErr) - return ; - - audio_data.done_playing = SF_FALSE ; - - while (audio_data.done_playing == SF_FALSE) - usleep (10 * 1000) ; /* 10 000 milliseconds. */ - - if ((err = AudioDeviceStop (audio_data.device, macosx_audio_out_callback)) != noErr) - { printf ("AudioDeviceStop failed.\n") ; - return ; - } ; - - err = AudioDeviceRemoveIOProc (audio_data.device, macosx_audio_out_callback) ; - if (err != noErr) - { printf ("AudioDeviceRemoveIOProc failed.\n") ; - return ; - } ; - - sf_close (audio_data.sndfile) ; - } ; - - return ; -} /* macosx_play */ - -#endif /* MacOSX */ - - -/*------------------------------------------------------------------------------ -** Win32 functions for playing a sound. -** -** This API sucks. Its needlessly complicated and is *WAY* too loose with -** passing pointers arounf in integers and and using char* pointers to -** point to data instead of short*. It plain sucks! -*/ - -#if (OS_IS_WIN32 == 1) - -#define WIN32_BUFFER_LEN (1<<15) - -typedef struct -{ HWAVEOUT hwave ; - WAVEHDR whdr [2] ; - - CRITICAL_SECTION mutex ; /* to control access to BuffersInUSe */ - HANDLE Event ; /* signal that a buffer is free */ - - short buffer [WIN32_BUFFER_LEN / sizeof (short)] ; - int current, bufferlen ; - int BuffersInUse ; - - SNDFILE *sndfile ; - SF_INFO sfinfo ; - - sf_count_t remaining ; -} Win32_Audio_Data ; - - -static void -win32_play_data (Win32_Audio_Data *audio_data) -{ int thisread, readcount ; - - /* fill a buffer if there is more data and we can read it sucessfully */ - readcount = (audio_data->remaining > audio_data->bufferlen) ? audio_data->bufferlen : (int) audio_data->remaining ; - - thisread = (int) sf_read_short (audio_data->sndfile, (short *) (audio_data->whdr [audio_data->current].lpData), readcount) ; - - audio_data->remaining -= thisread ; - - if (thisread > 0) - { /* Fix buffer length if this is only a partial block. */ - if (thisread < audio_data->bufferlen) - audio_data->whdr [audio_data->current].dwBufferLength = thisread * sizeof (short) ; - - /* Queue the WAVEHDR */ - waveOutWrite (audio_data->hwave, (LPWAVEHDR) &(audio_data->whdr [audio_data->current]), sizeof (WAVEHDR)) ; - - /* count another buffer in use */ - EnterCriticalSection (&audio_data->mutex) ; - audio_data->BuffersInUse ++ ; - LeaveCriticalSection (&audio_data->mutex) ; - - /* use the other buffer next time */ - audio_data->current = (audio_data->current + 1) % 2 ; - } ; - - return ; -} /* win32_play_data */ - -static void CALLBACK -win32_audio_out_callback (HWAVEOUT hwave, UINT msg, DWORD data, DWORD param1, DWORD param2) -{ Win32_Audio_Data *audio_data ; - - /* Prevent compiler warnings. */ - hwave = hwave ; - param1 = param2 ; - - if (data == 0) - return ; - - /* - ** I consider this technique of passing a pointer via an integer as - ** fundamentally broken but thats the way microsoft has defined the - ** interface. - */ - audio_data = (Win32_Audio_Data*) data ; - - /* let main loop know a buffer is free */ - if (msg == MM_WOM_DONE) - { EnterCriticalSection (&audio_data->mutex) ; - audio_data->BuffersInUse -- ; - LeaveCriticalSection (&audio_data->mutex) ; - SetEvent (audio_data->Event) ; - } ; - - return ; -} /* win32_audio_out_callback */ - -/* This is needed for earlier versions of the M$ development tools. */ -#ifndef DWORD_PTR -#define DWORD_PTR DWORD -#endif - -static void -win32_play (int argc, char *argv []) -{ Win32_Audio_Data audio_data ; - - WAVEFORMATEX wf ; - int k, error ; - - audio_data.sndfile = NULL ; - audio_data.hwave = 0 ; - - for (k = 1 ; k < argc ; k++) - { printf ("Playing %s\n", argv [k]) ; - - if (! (audio_data.sndfile = sf_open (argv [k], SFM_READ, &(audio_data.sfinfo)))) - { puts (sf_strerror (NULL)) ; - continue ; - } ; - - audio_data.remaining = audio_data.sfinfo.frames * audio_data.sfinfo.channels ; - audio_data.current = 0 ; - - InitializeCriticalSection (&audio_data.mutex) ; - audio_data.Event = CreateEvent (0, FALSE, FALSE, 0) ; - - wf.nChannels = audio_data.sfinfo.channels ; - wf.wFormatTag = WAVE_FORMAT_PCM ; - wf.cbSize = 0 ; - wf.wBitsPerSample = 16 ; - - wf.nSamplesPerSec = audio_data.sfinfo.samplerate ; - - wf.nBlockAlign = audio_data.sfinfo.channels * sizeof (short) ; - - wf.nAvgBytesPerSec = wf.nBlockAlign * wf.nSamplesPerSec ; - - error = waveOutOpen (&(audio_data.hwave), WAVE_MAPPER, &wf, (DWORD_PTR) win32_audio_out_callback, - (DWORD_PTR) &audio_data, CALLBACK_FUNCTION) ; - if (error) - { puts ("waveOutOpen failed.") ; - audio_data.hwave = 0 ; - continue ; - } ; - - audio_data.whdr [0].lpData = (char*) audio_data.buffer ; - audio_data.whdr [1].lpData = ((char*) audio_data.buffer) + sizeof (audio_data.buffer) / 2 ; - - audio_data.whdr [0].dwBufferLength = sizeof (audio_data.buffer) / 2 ; - audio_data.whdr [1].dwBufferLength = sizeof (audio_data.buffer) / 2 ; - - audio_data.whdr [0].dwFlags = 0 ; - audio_data.whdr [1].dwFlags = 0 ; - - /* length of each audio buffer in samples */ - audio_data.bufferlen = sizeof (audio_data.buffer) / 2 / sizeof (short) ; - - /* Prepare the WAVEHDRs */ - if ((error = waveOutPrepareHeader (audio_data.hwave, &(audio_data.whdr [0]), sizeof (WAVEHDR)))) - { printf ("waveOutPrepareHeader [0] failed : %08X\n", error) ; - waveOutClose (audio_data.hwave) ; - continue ; - } ; - - if ((error = waveOutPrepareHeader (audio_data.hwave, &(audio_data.whdr [1]), sizeof (WAVEHDR)))) - { printf ("waveOutPrepareHeader [1] failed : %08X\n", error) ; - waveOutUnprepareHeader (audio_data.hwave, &(audio_data.whdr [0]), sizeof (WAVEHDR)) ; - waveOutClose (audio_data.hwave) ; - continue ; - } ; - - /* Fill up both buffers with audio data */ - audio_data.BuffersInUse = 0 ; - win32_play_data (&audio_data) ; - win32_play_data (&audio_data) ; - - /* loop until both buffers are released */ - while (audio_data.BuffersInUse > 0) - { - /* wait for buffer to be released */ - WaitForSingleObject (audio_data.Event, INFINITE) ; - - /* refill the buffer if there is more data to play */ - win32_play_data (&audio_data) ; - } ; - - waveOutUnprepareHeader (audio_data.hwave, &(audio_data.whdr [0]), sizeof (WAVEHDR)) ; - waveOutUnprepareHeader (audio_data.hwave, &(audio_data.whdr [1]), sizeof (WAVEHDR)) ; - - waveOutClose (audio_data.hwave) ; - audio_data.hwave = 0 ; - - DeleteCriticalSection (&audio_data.mutex) ; - - sf_close (audio_data.sndfile) ; - } ; - -} /* win32_play */ - -#endif /* Win32 */ - -/*------------------------------------------------------------------------------ -** Solaris. -*/ - -#if (defined (sun) && defined (unix)) /* ie Solaris */ - -static void -solaris_play (int argc, char *argv []) -{ static short buffer [BUFFER_LEN] ; - audio_info_t audio_info ; - SNDFILE *sndfile ; - SF_INFO sfinfo ; - unsigned long delay_time ; - long k, start_count, output_count, write_count, read_count ; - int audio_fd, error, done ; - - for (k = 1 ; k < argc ; k++) - { printf ("Playing %s\n", argv [k]) ; - if (! (sndfile = sf_open (argv [k], SFM_READ, &sfinfo))) - { puts (sf_strerror (NULL)) ; - continue ; - } ; - - if (sfinfo.channels < 1 || sfinfo.channels > 2) - { printf ("Error : channels = %d.\n", sfinfo.channels) ; - continue ; - } ; - - /* open the audio device - write only, non-blocking */ - if ((audio_fd = open ("/dev/audio", O_WRONLY | O_NONBLOCK)) < 0) - { perror ("open (/dev/audio) failed") ; - return ; - } ; - - /* Retrive standard values. */ - AUDIO_INITINFO (&audio_info) ; - - audio_info.play.sample_rate = sfinfo.samplerate ; - audio_info.play.channels = sfinfo.channels ; - audio_info.play.precision = 16 ; - audio_info.play.encoding = AUDIO_ENCODING_LINEAR ; - audio_info.play.gain = AUDIO_MAX_GAIN ; - audio_info.play.balance = AUDIO_MID_BALANCE ; - - if ((error = ioctl (audio_fd, AUDIO_SETINFO, &audio_info))) - { perror ("ioctl (AUDIO_SETINFO) failed") ; - return ; - } ; - - /* Delay time equal to 1/4 of a buffer in microseconds. */ - delay_time = (BUFFER_LEN * 1000000) / (audio_info.play.sample_rate * 4) ; - - done = 0 ; - while (! done) - { read_count = sf_read_short (sndfile, buffer, BUFFER_LEN) ; - if (read_count < BUFFER_LEN) - { memset (&(buffer [read_count]), 0, (BUFFER_LEN - read_count) * sizeof (short)) ; - /* Tell the main application to terminate. */ - done = SF_TRUE ; - } ; - - start_count = 0 ; - output_count = BUFFER_LEN * sizeof (short) ; - - while (output_count > 0) - { /* write as much data as possible */ - write_count = write (audio_fd, &(buffer [start_count]), output_count) ; - if (write_count > 0) - { output_count -= write_count ; - start_count += write_count ; - } - else - { /* Give the audio output time to catch up. */ - usleep (delay_time) ; - } ; - } ; /* while (outpur_count > 0) */ - } ; /* while (! done) */ - - close (audio_fd) ; - } ; - - return ; -} /* solaris_play */ - -#endif /* Solaris */ - -/*============================================================================== -** Main function. -*/ - -int -main (int argc, char *argv []) -{ - if (argc < 2) - { - printf ("\nUsage : %s \n\n", argv [0]) ; -#if (OS_IS_WIN32 == 1) - printf ("This is a Unix style command line application which\n" - "should be run in a MSDOS box or Command Shell window.\n\n") ; - printf ("Sleeping for 5 seconds before exiting.\n\n") ; - - /* This is the officially blessed by microsoft way but I can't get - ** it to link. - ** Sleep (15) ; - ** Instead, use this: - */ - _sleep (5 * 1000) ; -#endif - return 1 ; - } ; - -#if defined (__linux__) - #if HAVE_ALSA_ASOUNDLIB_H - if (access ("/proc/asound/cards", R_OK) == 0) - alsa_play (argc, argv) ; - else - #endif - linux_play (argc, argv) ; -#elif (defined (__MACH__) && defined (__APPLE__)) - macosx_play (argc, argv) ; -#elif (defined (sun) && defined (unix)) - solaris_play (argc, argv) ; -#elif (OS_IS_WIN32 == 1) - win32_play (argc, argv) ; -#elif defined (__BEOS__) - printf ("This program cannot be compiled on BeOS.\n") ; - printf ("Instead, compile the file sfplay_beos.cpp.\n") ; - return 1 ; -#else - puts ("*** Playing sound not yet supported on this platform.") ; - puts ("*** Please feel free to submit a patch.") ; - return 1 ; -#endif - - return 0 ; -} /* main */ -/* -** Do not edit or modify anything in this comment block. -** The arch-tag line is a file identity tag for the GNU Arch -** revision control system. -** -** arch-tag: 8fc4110d-6cec-4e03-91df-0f384cabedac -*/ diff --git a/libs/libsndfile/examples/sndfile-to-text.c b/libs/libsndfile/examples/sndfile-to-text.c deleted file mode 100644 index 466bb860b5..0000000000 --- a/libs/libsndfile/examples/sndfile-to-text.c +++ /dev/null @@ -1,128 +0,0 @@ -/* -** Copyright (C) 2008-2012 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#include - -#include - -#define BLOCK_SIZE 512 - -static void -print_usage (char *progname) -{ printf ("\nUsage : %s \n", progname) ; - puts ("\n" - " Where the output file will contain a line for each frame\n" - " and a column for each channel.\n" - ) ; - -} /* print_usage */ - -static void -convert_to_text (SNDFILE * infile, FILE * outfile, int channels) -{ float buf [channels * BLOCK_SIZE] ; - int k, m, readcount ; - - while ((readcount = sf_readf_float (infile, buf, BLOCK_SIZE)) > 0) - { for (k = 0 ; k < readcount ; k++) - { for (m = 0 ; m < channels ; m++) - fprintf (outfile, " % 12.10f", buf [k * channels + m]) ; - fprintf (outfile, "\n") ; - } ; - } ; - - return ; -} /* convert_to_text */ - -int -main (int argc, char * argv []) -{ char *progname, *infilename, *outfilename ; - SNDFILE *infile = NULL ; - FILE *outfile = NULL ; - SF_INFO sfinfo ; - - progname = strrchr (argv [0], '/') ; - progname = progname ? progname + 1 : argv [0] ; - - if (argc != 3) - { print_usage (progname) ; - return 1 ; - } ; - - infilename = argv [1] ; - outfilename = argv [2] ; - - if (strcmp (infilename, outfilename) == 0) - { printf ("Error : Input and output filenames are the same.\n\n") ; - print_usage (progname) ; - return 1 ; - } ; - - if (infilename [0] == '-') - { printf ("Error : Input filename (%s) looks like an option.\n\n", infilename) ; - print_usage (progname) ; - return 1 ; - } ; - - if (outfilename [0] == '-') - { printf ("Error : Output filename (%s) looks like an option.\n\n", outfilename) ; - print_usage (progname) ; - return 1 ; - } ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - if ((infile = sf_open (infilename, SFM_READ, &sfinfo)) == NULL) - { printf ("Not able to open input file %s.\n", infilename) ; - puts (sf_strerror (NULL)) ; - return 1 ; - } ; - - /* Open the output file. */ - if ((outfile = fopen (outfilename, "w")) == NULL) - { printf ("Not able to open output file %s : %s\n", outfilename, sf_strerror (NULL)) ; - return 1 ; - } ; - - fprintf (outfile, "# Converted from file %s.\n", infilename) ; - fprintf (outfile, "# Channels %d, Sample rate %d\n", sfinfo.channels, sfinfo.samplerate) ; - - convert_to_text (infile, outfile, sfinfo.channels) ; - - sf_close (infile) ; - fclose (outfile) ; - - return 0 ; -} /* main */ - diff --git a/libs/libsndfile/examples/sndfilehandle.cc b/libs/libsndfile/examples/sndfilehandle.cc deleted file mode 100644 index c9a1931aea..0000000000 --- a/libs/libsndfile/examples/sndfilehandle.cc +++ /dev/null @@ -1,84 +0,0 @@ -/* -** Copyright (C) 2007-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include -#include - -#include - -#define BUFFER_LEN 1024 - -static void -create_file (const char * fname, int format) -{ static short buffer [BUFFER_LEN] ; - - SndfileHandle file ; - int channels = 2 ; - int srate = 48000 ; - - printf ("Creating file named '%s'\n", fname) ; - - file = SndfileHandle (fname, SFM_WRITE, format, channels, srate) ; - - memset (buffer, 0, sizeof (buffer)) ; - - file.write (buffer, BUFFER_LEN) ; - - puts ("") ; - /* - ** The SndfileHandle object will automatically close the file and - ** release all allocated memory when the object goes out of scope. - ** This is the Resource Acquisition Is Initailization idom. - ** See : http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization - */ -} /* create_file */ - -static void -read_file (const char * fname) -{ static short buffer [BUFFER_LEN] ; - - SndfileHandle file ; - - file = SndfileHandle (fname) ; - - printf ("Opened file '%s'\n", fname) ; - printf (" Sample rate : %d\n", file.samplerate ()) ; - printf (" Channels : %d\n", file.channels ()) ; - - file.read (buffer, BUFFER_LEN) ; - - puts ("") ; - - /* RAII takes care of destroying SndfileHandle object. */ -} /* read_file */ - -int -main (void) -{ const char * fname = "test.wav" ; - - puts ("\nSimple example showing usage of the C++ SndfileHandle object.\n") ; - - create_file (fname, SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - - read_file (fname) ; - - puts ("Done.\n") ; - return 0 ; -} /* main */ - - diff --git a/libs/libsndfile/libsndfile.spec.in b/libs/libsndfile/libsndfile.spec.in deleted file mode 100644 index d4427289a2..0000000000 --- a/libs/libsndfile/libsndfile.spec.in +++ /dev/null @@ -1,69 +0,0 @@ - -%define name @PACKAGE@ -%define version @VERSION@ -%define release 1 - -Summary: A library to handle various audio file formats. -Name: %{name} -Version: %{version} -Release: %{release} -Copyright: LGPL -Group: Libraries/Sound -Source: http://www.mega-nerd.com/libsndfile/libsndfile-%{version}.tar.gz -Url: http://www.mega-nerd.com/libsndfile/ -BuildRoot: /var/tmp/%{name}-%{version} - -%description -libsndfile is a C library for reading and writing sound files such as -AIFF, AU and WAV files through one standard interface. It can currently -read/write 8, 16, 24 and 32-bit PCM files as well as 32-bit floating -point WAV files and a number of compressed formats. - -%package devel -Summary: Libraries, includes, etc to develop libsndfile applications -Group: Libraries - -%description devel -Libraries, include files, etc you can use to develop libsndfile applications. - -%prep -%setup - -%build -%configure -make - -%install -if [ -d $RPM_BUILD_ROOT ]; then rm -rf $RPM_BUILD_ROOT; fi -mkdir -p $RPM_BUILD_ROOT -make DESTDIR=$RPM_BUILD_ROOT install -%clean -if [ -d $RPM_BUILD_ROOT ]; then rm -rf $RPM_BUILD_ROOT; fi - -%files -%defattr(-,root,root) -%doc AUTHORS COPYING ChangeLog INSTALL NEWS README TODO doc -%{_libdir}/libsndfile.so.* -%{_bindir}/* -%{_mandir}/man1/* -%{_datadir}/octave/site/m/* -%{_defaultdocdir}/libsndfile1-dev/html/* - -%files devel -%defattr(-,root,root) -%{_libdir}/libsndfile.a -%{_libdir}/libsndfile.la -%{_libdir}/libsndfile.so -%{_includedir}/sndfile.h -%{_libdir}/pkgconfig/sndfile.pc - -%changelog -* Sun May 15 2005 Erik de Castro Lopo -- Add html files to the files section. -* Tue Sep 16 2003 Erik de Castro Lopo -- Apply corrections from Andrew Schultz. -* Mon Oct 21 2002 Erik de Castro Lopo -- Force installation of sndfile.pc file. -* Thu Jul 6 2000 Josh Green -- Created libsndfile.spec.in - diff --git a/libs/libsndfile/make_lite.py b/libs/libsndfile/make_lite.py deleted file mode 100644 index eee69fc82d..0000000000 --- a/libs/libsndfile/make_lite.py +++ /dev/null @@ -1,491 +0,0 @@ -#!/usr/bin/python - -import commands, os, re, string, sys, time - -def count_enclosed_functions (source): - func_count = 0 - open_brace = 0 - close_brace = 0 - for ch in source: - if ch == '{': - open_brace += 1 - elif ch == '}': - close_brace += 1 - if open_brace == close_brace: - func_count += 1 - if open_brace < close_brace: - print "count_enclosed_functions : open_brace < close_brace" - return -1 - return func_count - -def find_function_prototype (source, proto_name): - proto_re = "(^[a-zA-Z_ \t]+\s+%s[^a-zA-Z0-9_]\s*\([^\)]+\)\s+;\n)" % (proto_name) - proto_result = re.search (proto_re, source, re.MULTILINE | re.DOTALL) - if not proto_result: - return None - proto_text = proto_result.groups ()[0] - return proto_text - -def find_function_definition (source, func_name): - func_re = "(\n[a-zA-Z_ \t]+\n%s[^a-zA-Z0-9_].* /\* %s \*/\n)" % (func_name, func_name) - func_result = re.search (func_re, source, re.MULTILINE | re.DOTALL) - if not func_result: - sys.exit (1) - return None - func_text = func_result.groups ()[0] - - # Now to check that we only have one enclosing function. - func_count = count_enclosed_functions (func_text) - if func_count != 1: - return None - return func_text - -def find_include (source, inc_name): - inc_re = "(^#include\s+[\<\"]%s[\"\>]\s*)" % inc_name - inc_result = re.search (inc_re, source, re.MULTILINE | re.DOTALL) - if not inc_result: - return None - inc_text = inc_result.groups ()[0] - return inc_text - -def find_assign_statement (source, var_name): - var_re = "(^\s+%s\s*=[^;]+;)" % var_name - var_result = re.search (var_re, source, re.MULTILINE | re.DOTALL) - if not var_result: - return None - assign_text = var_result.groups ()[0] - return assign_text - -#-------------------------------------------------------------------------------- - -def remove_include (source, inc_name): - inc_text = find_include (source, inc_name) - if not inc_text: - print "remove_include : include '%s' not found. Exiting." % inc_name - sys.exit (1) - - source = string.replace (source, inc_text, "") - return source - -def remove_assign (source, assign_name): - assign_text = find_assign (source, inc_name) - if not inc_text: - print "remove_include : include '%s' not found. Exiting." % inc_name - sys.exit (1) - - source = string.replace (source, inc_text, "") - return source - -def remove_prototype (source, proto_name): - proto_text = find_function_prototype (source, proto_name) - if not proto_text: - print "remove_prototype : prototype '%s' not found. Exiting." % proto_name - sys.exit (1) - - source = string.replace (source, proto_text, "") - return source - -def remove_function (source, func_name): - func_text = find_function_definition (source, func_name) - if not func_text: - print "remove_function : function '%s' not found. Exiting." % func_name - sys.exit (1) - - source = string.replace (source, func_text, "/* Function %s() removed here. */\n" % func_name) - return source - -def remove_all_assignments (source, var): - count = 0 - while 1: - assign_text = find_assign_statement (source, var) - if not assign_text: - if count != 0: - break - print "remove_all_assignments : variable '%s' not found. Exiting." % var - sys.exit (1) - - source = string.replace (source, assign_text, "") - count += 1 - return source - - - -#---------------------------------------------------------------- - -def remove_funcs_and_protos_from_file (filename, func_list): - source_code = open (filename, 'r').read () - - for func in func_list: - source_code = remove_prototype (source_code, func) ; - source_code = remove_function (source_code, func) ; - open (filename, 'w').write (source_code) - -def remove_funcs_from_file (filename, func_list): - source_code = open (filename, 'r').read () - - for func in func_list: - source_code = remove_function (source_code, func) ; - open (filename, 'w').write (source_code) - -def remove_protos_from_file (filename, func_list): - source_code = open (filename, 'r').read () - - for func in func_list: - source_code = remove_prototype (source_code, func) ; - open (filename, 'w').write (source_code) - -def remove_includes_from_file (filename, inc_list): - source_code = open (filename, 'r').read () - - for inc in inc_list: - source_code = remove_include (source_code, inc) ; - open (filename, 'w').write (source_code) - -def remove_all_assignments_from_file (filename, var_list): - source_code = open (filename, 'r').read () - - for var in var_list: - source_code = remove_all_assignments (source_code, var) ; - open (filename, 'w').write (source_code) - -def remove_comment_start_end (filename, start_comment, end_comment): - source_code = open (filename, 'r').read () - - while 1: - start_index = string.find (source_code, start_comment) - end_index = string.find (source_code, end_comment) - if start_index < 0 or end_index < start_index: - break - end_index += len (end_comment) - source_code = source_code [:start_index-1] + source_code [end_index:] ; - - open (filename, 'w').write (source_code) - -def remove_strings_from_file (filename, str_list): - file_text = open (filename, 'r').read () - for current_str in str_list: - file_text = string.replace (file_text, current_str, '') - open (filename, 'w').write (file_text) - -def string_replace_in_file (filename, from_str, to_str): - file_text = open (filename, 'r').read () - file_text = string.replace (file_text, from_str, to_str) - open (filename, 'w').write (file_text) - -def remove_regex_from_file (filename, regex_list): - file_text = open (filename, 'r').read () - for regex in regex_list: - file_text = re.sub (regex, '', file_text, re.MULTILINE | re.DOTALL) - open (filename, 'w').write (file_text) - -#========================================================================== - -def find_configure_version (filename): - # AM_INIT_AUTOMAKE(libsndfile,0.0.21pre6) - file = open (filename) - while 1: - line = file.readline () - if re.search ("AC_INIT", line): - x = re.sub ("[^\(]+\(", "", line) - x = re.sub ("\).*\n", "", x) - x = string.split (x, ",") - package = x [0] - version = x [1] - break - file.close () - # version = re.escape (version) - return package, version - -def fix_configure_ac_file (filename): - data = open (filename, 'r').read () - data = string.replace (data, "AM_INIT_AUTOMAKE(libsndfile,", "AM_INIT_AUTOMAKE(libsndfile_lite,", 1) - - file = open (filename, 'w') - file.write (data) - file.close () - - -def make_dist_file (package, version): - print "Making dist file." - tar_gz_file = "%s-%s.tar.gz" % (package, version) - if os.path.exists (tar_gz_file): - return - if os.system ("make dist"): - sys.exit (1) - return - -def delete_files (file_list): - for file_name in file_list: - os.remove (file_name) - -#======================================================================= - -source_dir = os.getcwd () - -conf_package, conf_version = find_configure_version ('configure.ac') - -package_version = "%s-%s" % (conf_package, conf_version) -lite_version = "%s_lite-%s" % (conf_package, conf_version) - -os.system ("rm -rf %s%s.tar.gz" % (source_dir, package_version)) - -os.system ("make dist") - -make_dist_file (conf_package, conf_version) - -os.chdir ("/tmp") - -print "Uncompressing .tar.gz file." -os.system ("rm -rf %s" % package_version) -if os.system ("tar zxf %s/%s.tar.gz" % (source_dir, package_version)): - sys.exit (1) - - -print "Renaming to libsndfile_lite." -os.system ("rm -rf %s" % lite_version) -os.rename (package_version, lite_version) - -print "Changing into libsndfile_lite directory." -os.chdir (lite_version) - -print "Removing un-neeed directories." -delete_dirs = [ 'src/G72x' ] - -for dir_name in delete_dirs: - os.system ("rm -rf %s" % dir_name) - -print "Removing un-needed files." -delete_files ([ 'src/ircam.c', 'src/nist.c', - 'src/ima_adpcm.c', 'src/ms_adpcm.c', 'src/au_g72x.c', - 'src/mat4.c', 'src/mat5.c', 'src/dwvw.c', 'src/paf.c', - 'src/ogg.c', 'src/pvf.c', 'src/xi.c', 'src/htk.c', - 'src/sd2.c', 'src/rx2.c', 'src/txw.c', 'src/wve.c', - 'src/dwd.c', 'src/svx.c', 'src/voc.c', 'src/vox_adpcm.c', - 'src/sds.c' - ]) - - -print "Hacking 'configure.ac' and 'src/Makefile.am'." -remove_strings_from_file ('configure.ac', [ 'src/G72x/Makefile' ]) -remove_strings_from_file ('src/Makefile.am', [ 'G72x/libg72x.la', 'G72x', - 'ircam.c', 'nist.c', 'ima_adpcm.c', 'ms_adpcm.c', 'au_g72x.c', 'mat4.c', - 'mat5.c', 'dwvw.c', 'paf.c', 'ogg.c', 'pvf.c', 'xi.c', 'htk.c', - 'sd2.c', 'rx2.c', 'txw.c', 'wve.c', 'dwd.c', 'svx.c', 'voc.c', - 'vox_adpcm.c', 'sds.c' - ]) - -#---------------------------------------------------------------------------- - -print "Hacking header files." - -remove_protos_from_file ('src/common.h', [ 'xi_open', 'sd2_open', 'ogg_open', - 'dwvw_init', 'paf_open', 'svx_open', 'nist_open', 'rx2_open', 'mat4_open', - 'voc_open', 'txw_open', 'dwd_open', 'htk_open', 'wve_open', 'mat5_open', - 'pvf_open', 'ircam_open', 'sds_open', - 'float32_init', 'double64_init', 'aiff_ima_init', 'vox_adpcm_init', - 'wav_w64_ima_init', 'wav_w64_msadpcm_init' - ]) - -remove_protos_from_file ('src/au.h', - [ 'au_g72x_reader_init', 'au_g72x_writer_init' ]) - -remove_protos_from_file ('src/wav_w64.h', [ 'msadpcm_write_adapt_coeffs' ]) - -#---------------------------------------------------------------------------- - -print "Hacking case statements." - -remove_comment_start_end ('src/sndfile.c', '/* Lite remove start */' , '/* Lite remove end */') -remove_comment_start_end ('src/aiff.c', '/* Lite remove start */' , '/* Lite remove end */') -remove_comment_start_end ('src/au.c', '/* Lite remove start */' , '/* Lite remove end */') -remove_comment_start_end ('src/raw.c', '/* Lite remove start */' , '/* Lite remove end */') -remove_comment_start_end ('src/w64.c', '/* Lite remove start */' , '/* Lite remove end */') -remove_comment_start_end ('src/wav.c', '/* Lite remove start */' , '/* Lite remove end */') -remove_comment_start_end ('src/double64.c', '/* Lite remove start */' , '/* Lite remove end */') -remove_comment_start_end ('src/float32.c', '/* Lite remove start */' , '/* Lite remove end */') - - -#---------------------------------------------------------------------------- - -print "Hacking src/pcm.c." -remove_funcs_from_file ('src/pcm.c', [ - 'f2sc_array', 'f2sc_clip_array', 'f2uc_array', 'f2uc_clip_array', - 'f2bes_array', 'f2bes_clip_array', 'f2les_array', 'f2les_clip_array', - 'f2let_array', 'f2let_clip_array', 'f2bet_array', 'f2bet_clip_array', - 'f2bei_array', 'f2bei_clip_array', 'f2lei_array', 'f2lei_clip_array', - 'd2sc_array', 'd2sc_clip_array', 'd2uc_array', 'd2uc_clip_array', - 'd2bes_array', 'd2bes_clip_array', 'd2les_array', 'd2les_clip_array', - 'd2let_array', 'd2let_clip_array', 'd2bet_array', 'd2bet_clip_array', - 'd2bei_array', 'd2bei_clip_array', 'd2lei_array', 'd2lei_clip_array', - ]) - -remove_funcs_and_protos_from_file ('src/pcm.c', [ - 'pcm_read_sc2f', 'pcm_read_uc2f', 'pcm_read_les2f', 'pcm_read_bes2f', - 'pcm_read_let2f', 'pcm_read_bet2f', 'pcm_read_lei2f', 'pcm_read_bei2f', - 'pcm_read_sc2d', 'pcm_read_uc2d', 'pcm_read_les2d', 'pcm_read_bes2d', - 'pcm_read_let2d', 'pcm_read_bet2d', 'pcm_read_lei2d', 'pcm_read_bei2d', - 'pcm_write_f2sc', 'pcm_write_f2uc', 'pcm_write_f2bes', 'pcm_write_f2les', - 'pcm_write_f2bet', 'pcm_write_f2let', 'pcm_write_f2bei', 'pcm_write_f2lei', - 'pcm_write_d2sc', 'pcm_write_d2uc', 'pcm_write_d2bes', 'pcm_write_d2les', - 'pcm_write_d2bet', 'pcm_write_d2let', 'pcm_write_d2bei', 'pcm_write_d2lei', - - 'sc2f_array', 'uc2f_array', 'bes2f_array', 'les2f_array', - 'bet2f_array', 'let2f_array', 'bei2f_array', 'lei2f_array', - 'sc2d_array', 'uc2d_array', 'bes2d_array', 'les2d_array', - 'bet2d_array', 'let2d_array', 'bei2d_array', 'lei2d_array' - ]) - -remove_includes_from_file ('src/pcm.c', [ 'float_cast.h' ]) -remove_all_assignments_from_file ('src/pcm.c', [ - 'psf-\>write_float', 'psf\-\>write_double', - 'psf-\>read_float', 'psf\-\>read_double' ]) - -#---------------------------------------------------------------------------- -print "Hacking src/ulaw.c." -remove_funcs_and_protos_from_file ('src/ulaw.c', [ - 'ulaw_read_ulaw2f', 'ulaw_read_ulaw2d', - 'ulaw_write_f2ulaw', 'ulaw_write_d2ulaw', - 'ulaw2f_array', 'ulaw2d_array', 'f2ulaw_array', 'd2ulaw_array' - ]) - -remove_includes_from_file ('src/ulaw.c', [ 'float_cast.h' ]) -remove_all_assignments_from_file ('src/ulaw.c', [ - 'psf-\>write_float', 'psf\-\>write_double', - 'psf-\>read_float', 'psf\-\>read_double' ]) - -#---------------------------------------------------------------------------- - -print "Hacking src/alaw.c." -remove_funcs_and_protos_from_file ('src/alaw.c', [ - 'alaw_read_alaw2f', 'alaw_read_alaw2d', - 'alaw_write_f2alaw', 'alaw_write_d2alaw', - 'alaw2f_array', 'alaw2d_array', 'f2alaw_array', 'd2alaw_array' - ]) - -remove_includes_from_file ('src/alaw.c', [ 'float_cast.h' ]) -remove_all_assignments_from_file ('src/alaw.c', [ - 'psf-\>write_float', 'psf\-\>write_double', - 'psf-\>read_float', 'psf\-\>read_double' ]) - -#---------------------------------------------------------------------------- - -print "Hacking src/gsm610.c." -remove_funcs_and_protos_from_file ('src/gsm610.c', [ - 'gsm610_read_f', 'gsm610_read_d', 'gsm610_write_f', 'gsm610_write_d' - ]) - -remove_includes_from_file ('src/gsm610.c', [ 'float_cast.h' ]) -remove_all_assignments_from_file ('src/gsm610.c', [ - 'psf-\>write_float', 'psf\-\>write_double', - 'psf-\>read_float', 'psf\-\>read_double' ]) - -#---------------------------------------------------------------------------- - -print "Hacking src/float32.c." - -# string_replace_in_file ('src/float32.c', '"float_cast.h"', '') -remove_funcs_from_file ('src/float32.c', [ 'float32_init' ]) - -remove_funcs_and_protos_from_file ('src/float32.c', [ - 'host_read_f2s', 'host_read_f2i', 'host_read_f', 'host_read_f2d', - 'host_write_s2f', 'host_write_i2f', 'host_write_f', 'host_write_d2f', - 'f2s_array', 'f2i_array', 'f2d_array', 's2f_array', 'i2f_array', 'd2f_array', - 'float32_peak_update', - 'replace_read_f2s', 'replace_read_f2i', 'replace_read_f', 'replace_read_f2d', - 'replace_write_s2f', 'replace_write_i2f', 'replace_write_f', 'replace_write_d2f', - 'bf2f_array', 'f2bf_array', - 'float32_get_capability', - ]) - -#---------------------------------------------------------------------------- - -print "Hacking src/double64.c." -remove_funcs_from_file ('src/double64.c', [ 'double64_init' ]) - -remove_funcs_and_protos_from_file ('src/double64.c', [ - 'host_read_d2s', 'host_read_d2i', 'host_read_d2f', 'host_read_d', - 'host_write_s2d', 'host_write_i2d', 'host_write_f2d', 'host_write_d', - 'd2s_array', 'd2i_array', 'd2f_array', - 's2d_array', 'i2d_array', 'f2d_array', - 'double64_peak_update', 'double64_get_capability', - 'replace_read_d2s', 'replace_read_d2i', 'replace_read_d2f', 'replace_read_d', - 'replace_write_s2d', 'replace_write_i2d', 'replace_write_f2d', 'replace_write_d', - 'd2bd_read', 'bd2d_write' - ]) - -#---------------------------------------------------------------------------- - -print "Hacking test programs." -delete_files ([ 'tests/dwvw_test.c', 'tests/floating_point_test.c', - 'tests/dft_cmp.c', 'tests/peak_chunk_test.c', - 'tests/scale_clip_test.tpl', 'tests/scale_clip_test.def' - ]) - -remove_comment_start_end ('tests/write_read_test.def', '/* Lite remove start */', '/* Lite remove end */') -remove_comment_start_end ('tests/write_read_test.tpl', '/* Lite remove start */', '/* Lite remove end */') - -remove_comment_start_end ('tests/Makefile.am', '# Lite remove start', '# Lite remove end') - -remove_strings_from_file ('tests/Makefile.am', [ - 'scale_clip_test.tpl', 'scale_clip_test.def', - '\n\t./dwvw_test', - '\n\t./floating_point_test', '\n\t./scale_clip_test', - '\n\t./peak_chunk_test aiff', '\n\t./peak_chunk_test wav', - '\n\t./command_test norm', '\n\t./command_test peak', - '\n\t./lossy_comp_test wav_ima', '\n\t./lossy_comp_test wav_msadpcm', - '\n\t./lossy_comp_test au_g721', '\n\t./lossy_comp_test au_g723', - '\n\t./lossy_comp_test vox_adpcm', - '\n\t./lossy_comp_test w64_ima', '\n\t./lossy_comp_test w64_msadpcm', - 'peak_chunk_test', 'dwvw_test', 'floating_point_test', 'scale_clip_test', - - 'paf-tests', 'svx-tests', 'nist-tests', 'ircam-tests', 'voc-tests', - 'mat4-tests', 'mat5-tests', 'pvf-tests', 'xi-tests', 'htk-tests', - 'sds-tests' - ]) - -remove_comment_start_end ('tests/pcm_test.c', '/* Lite remove start */', '/* Lite remove end */') -remove_funcs_and_protos_from_file ('tests/pcm_test.c', [ - 'pcm_test_float', 'pcm_test_double' - ]) - -remove_comment_start_end ('tests/lossy_comp_test.c', '/* Lite remove start */', '/* Lite remove end */') -remove_funcs_and_protos_from_file ('tests/lossy_comp_test.c', [ - 'lcomp_test_float', 'lcomp_test_double', 'sdlcomp_test_float', 'sdlcomp_test_double', - 'smoothed_diff_float', 'smoothed_diff_double' - ]) - -remove_comment_start_end ('tests/multi_file_test.c', '/* Lite remove start */', '/* Lite remove end */') - -remove_strings_from_file ('tests/stdio_test.c', [ - '"paf",', '"svx",', '"nist",', '"ircam",', '"voc",', '"mat4",', '"mat5",', '"pvf",' - ]) - -remove_comment_start_end ('tests/pipe_test.c', '/* Lite remove start */', '/* Lite remove end */') - -#---------------------------------------------------------------------------- - -print "Fixing configure.ac file." -fix_configure_ac_file ('configure.ac') - -print "Building and testing source." - # Try --disable-shared --disable-gcc-opt -if os.system ("./reconfigure.mk && ./configure --disable-shared --disable-gcc-opt && make check"): - os.system ('PS1="FIX > " bash --norc') - sys.exit (1) - -print "Making distcheck" -if os.system ("make distcheck"): - os.system ('PS1="FIX > " bash --norc') - sys.exit (1) - -print "Copying tarball" -if os.system ("cp %s.tar.gz %s" % (lite_version, source_dir)): - print "??? %s.tar.gz ???" % lite_version - os.system ('PS1="FIX > " bash --norc') - sys.exit (1) - -os.chdir (source_dir) - -os.system ("rm -rf /tmp/%s" % lite_version) - -print "Done." diff --git a/libs/libsndfile/man/Makefile.am b/libs/libsndfile/man/Makefile.am deleted file mode 100644 index 3f5d9efdc4..0000000000 --- a/libs/libsndfile/man/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ -## Process this file with automake to produce Makefile.in - -man_MANS = sndfile-info.1 sndfile-play.1 sndfile-convert.1 sndfile-cmp.1 \ - sndfile-metadata-get.1 sndfile-metadata-set.1 sndfile-concat.1 \ - sndfile-interleave.1 sndfile-deinterleave.1 - -EXTRA_DIST = sndfile-info.1 sndfile-play.1 sndfile-convert.1 sndfile-cmp.1 \ - sndfile-metadata-get.1 sndfile-concat.1 sndfile-interleave.1 - -# Same manpage for both programs. -sndfile-metadata-set.1 : sndfile-metadata-get.1 - $(LN_S) $(srcdir)/sndfile-metadata-get.1 $@ - -sndfile-deinterleave.1 : sndfile-interleave.1 - $(LN_S) $(srcdir)/sndfile-interleave.1 $@ diff --git a/libs/libsndfile/man/sndfile-cmp.1 b/libs/libsndfile/man/sndfile-cmp.1 deleted file mode 100644 index 30870bdfc3..0000000000 --- a/libs/libsndfile/man/sndfile-cmp.1 +++ /dev/null @@ -1,16 +0,0 @@ -.TH SNDFILE-CMP 1 "October 5, 2009" -.SH NAME -sndfile-cmp \- compares two audio files -.SH SYNOPSIS -.B sndfile-cmp -.RI "file1 file2" -.SH DESCRIPTION -sndfile-cmp compares the audio data of two sound files. In particular most -differences in the audio file header, particularly metadata like string info, -are completely ignored. - -sndfile-cmp does its work using libsndfile -(http://www.mega-nerd.com/libsndfile/). -.SH AUTHOR -This manual page was written by Erik de Castro Lopo . - diff --git a/libs/libsndfile/man/sndfile-concat.1 b/libs/libsndfile/man/sndfile-concat.1 deleted file mode 100644 index 1d95765f6c..0000000000 --- a/libs/libsndfile/man/sndfile-concat.1 +++ /dev/null @@ -1,16 +0,0 @@ -.TH SNDFILE-CONCAT 1 "December 9, 2009" -.SH NAME -sndfile-concat \- concatenates two or more audio files -.SH SYNOPSIS -.B sndfile-concat -.RI "infile1 infile2 .... outfile" -.SH DESCRIPTION -sndfile-concat generates a new output file by concatenating two or more input -files. The format of the output file is the same as the format of the input -file. - -sndfile-concat does its work using libsndfile -(http://www.mega-nerd.com/libsndfile/). -.SH AUTHOR -This manual page was written by Erik de Castro Lopo . - diff --git a/libs/libsndfile/man/sndfile-convert.1 b/libs/libsndfile/man/sndfile-convert.1 deleted file mode 100644 index 583c9562c9..0000000000 --- a/libs/libsndfile/man/sndfile-convert.1 +++ /dev/null @@ -1,22 +0,0 @@ -.TH SNDFILE-CONVERT 1 "October 09, 2002" -.SH NAME -sndfile-convert \- convert a sound files from one format to another -.SH SYNOPSIS -.B sndfile-convert -.RI "[encoding] input_file output_file" -.LP -.B sndfile-convert -.RI --help -.SH DESCRIPTION -sndfile-convert converts sound files from one format to another using -libsndfile (http://www.mega-nerd.com/libsndfile/) to read and write -the data. -.LP -The format of the output file is determined by the filename extension -of the output file. -.LP -The optional encoding parameter allows setting of the data encoding for -the output file. Run "sndfile\-convert \-\-help" for more information. -.SH AUTHOR -This manual page was written by Erik de Castro Lopo . - diff --git a/libs/libsndfile/man/sndfile-info.1 b/libs/libsndfile/man/sndfile-info.1 deleted file mode 100644 index b66875852d..0000000000 --- a/libs/libsndfile/man/sndfile-info.1 +++ /dev/null @@ -1,16 +0,0 @@ -.TH SNDFILE-INFO 1 "July 28, 2002" -.SH NAME -sndfile-info \- display information about a sound file -.SH SYNOPSIS -.B sndfile-info -.RI file -.SH DESCRIPTION -sndfile-info will display basic information about a sound file such as -its format, its sample rate, and the number of channels. This information -is obtained using libsndfile (http://www.mega-nerd.com/libsndfile/). -.SH AUTHOR -This manual page was originally written by Joshua Haberman -, for the Debian GNU/Linux system (but may be used by -others). Further additions have been made by Erik de Castro Lopo -. - diff --git a/libs/libsndfile/man/sndfile-interleave.1 b/libs/libsndfile/man/sndfile-interleave.1 deleted file mode 100644 index 26ca345205..0000000000 --- a/libs/libsndfile/man/sndfile-interleave.1 +++ /dev/null @@ -1,23 +0,0 @@ -.TH SNDFILE-INTERLEAVE 1 "December 14, 2009" -.SH NAME -sndfile-interleave \- convert multiple single channel files into a multi-channel file -.br -sndfile-deinterleave \- split a multi-channel into multiple single channel files -.SH SYNOPSIS -.B sndfile-interleave -.RI " ... -o " -.br -.B sndfile-deinterleave -.RI "filename" - -.SH DESCRIPTION -sndfile-interleave and sndfile-deinterleave use libsndfile -(http://www.mega-nerd.com/libsndfile/) to convert back and forth between multiple -single channel files and a single multi-channel sound file. - -Run "sndfile\-interleave \-\-help" or "sndfile\-deinterleave \-\-help" for -more information - -.SH AUTHOR -This manual page was written by Erik de Castro Lopo . - diff --git a/libs/libsndfile/man/sndfile-metadata-get.1 b/libs/libsndfile/man/sndfile-metadata-get.1 deleted file mode 100644 index b97560ea39..0000000000 --- a/libs/libsndfile/man/sndfile-metadata-get.1 +++ /dev/null @@ -1,26 +0,0 @@ -.TH SNDFILE-METADATA-GET 1 "October 6, 2009" -.SH NAME -sndfile-metadata-get \- retrieve metadata from a sound file -.br -sndfile-metadata-set \- set metadata in a sound file -.SH SYNOPSIS -.B sndfile-metadata-get -.RI "[options] file" -.br -.B sndfile-metadata-set -.RI "[options] file" -.br -.B sndfile-metadata-set -.RI "[options] input-file output-file" - -.SH DESCRIPTION -sndfile-metadata-get and sndfile-metadata-set use libsndfile -(http://www.mega-nerd.com/libsndfile/) to retrieve metadata from or set metadata -in a sound file. - -Run "sndfile\-metadata\-get \-\-help" or "sndfile\-metadata\-set \-\-help" for -more information - -.SH AUTHOR -This manual page was written by Erik de Castro Lopo . - diff --git a/libs/libsndfile/man/sndfile-play.1 b/libs/libsndfile/man/sndfile-play.1 deleted file mode 100644 index 0196461c19..0000000000 --- a/libs/libsndfile/man/sndfile-play.1 +++ /dev/null @@ -1,36 +0,0 @@ -.de EX -.ne 5 -.if n .sp 1 -.if t .sp .5 -.nf -.in +.5i -.. -.de EE -.fi -.in -.5i -.if n .sp 1 -.if t .sp .5 -.. -.TH SNDFILE-PLAY 1 "July 28, 2002" -.SH NAME -sndfile-play \- play a sound file -.SH SYNOPSIS -.B sndfile-play -.RI file -.SH DESCRIPTION -sndfile-play plays the specified sound file using : -.EX -ALSA on Linux -/dev/dsp on systems supporting OSS (including Linux) -/dev/audio on Sun Solaris -CoreAudio on Apple MacOSX -waveOut on Microsoft Win32 -.EE -sndfile-play uses libsndfile (http://www.mega-nerd.com/libsndfile/) -to read the file. -.SH AUTHOR -This manual page was originally written by Joshua Haberman -, for the Debian GNU/Linux system (but may be used by -others). Further additions have been made by Erik de Castro Lopo -. - diff --git a/libs/libsndfile/programs/Makefile.am b/libs/libsndfile/programs/Makefile.am deleted file mode 100644 index 81495539b3..0000000000 --- a/libs/libsndfile/programs/Makefile.am +++ /dev/null @@ -1,47 +0,0 @@ -## Process this file with automake to produce Makefile.in - -bin_PROGRAMS = sndfile-info sndfile-play sndfile-convert sndfile-cmp \ - sndfile-metadata-set sndfile-metadata-get sndfile-interleave \ - sndfile-deinterleave sndfile-concat sndfile-salvage - -OS_SPECIFIC_CFLAGS = @OS_SPECIFIC_CFLAGS@ -OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@ - -AM_CPPFLAGS = -I$(top_srcdir)/src $(OS_SPECIFIC_CFLAGS) - -CLEANFILES = *~ sndfile-*.exe - -# This is the BeOS version of sndfile-play. It needs to be compiled with the C++ -# compiler. -EXTRA_DIST = sndfile-play-beos.cpp test-sndfile-metadata-set.py - -sndfile_info_SOURCES = sndfile-info.c common.c common.h -sndfile_info_LDADD = $(top_builddir)/src/libsndfile.la - -sndfile_play_SOURCES = sndfile-play.c common.c common.h -sndfile_play_LDADD = $(top_builddir)/src/libsndfile.la $(OS_SPECIFIC_LINKS) $(ALSA_LIBS) $(SNDIO_LIBS) - -sndfile_convert_SOURCES = sndfile-convert.c common.c common.h -sndfile_convert_LDADD = $(top_builddir)/src/libsndfile.la - -sndfile_cmp_SOURCES = sndfile-cmp.c common.c common.h -sndfile_cmp_LDADD = $(top_builddir)/src/libsndfile.la - -sndfile_metadata_set_SOURCES = sndfile-metadata-set.c common.c common.h -sndfile_metadata_set_LDADD = $(top_builddir)/src/libsndfile.la - -sndfile_metadata_get_SOURCES = sndfile-metadata-get.c common.c common.h -sndfile_metadata_get_LDADD = $(top_builddir)/src/libsndfile.la - -sndfile_interleave_SOURCES = sndfile-interleave.c common.c common.h -sndfile_interleave_LDADD = $(top_builddir)/src/libsndfile.la - -sndfile_deinterleave_SOURCES = sndfile-deinterleave.c common.c common.h -sndfile_deinterleave_LDADD = $(top_builddir)/src/libsndfile.la - -sndfile_concat_SOURCES = sndfile-concat.c common.c common.h -sndfile_concat_LDADD = $(top_builddir)/src/libsndfile.la - -sndfile_salvage_SOURCES = sndfile-salvage.c common.c common.h -sndfile_salvage_LDADD = $(top_builddir)/src/libsndfile.la - diff --git a/libs/libsndfile/programs/common.c b/libs/libsndfile/programs/common.c deleted file mode 100644 index 2811536f3f..0000000000 --- a/libs/libsndfile/programs/common.c +++ /dev/null @@ -1,466 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** Copyright (C) 2008 George Blood Audio -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#include -#include - -#include - -#include "common.h" - -#define BUFFER_LEN 4096 - -#define MIN(x, y) ((x) < (y) ? (x) : (y)) - -void -sfe_copy_data_fp (SNDFILE *outfile, SNDFILE *infile, int channels, int normalize) -{ static double data [BUFFER_LEN], max ; - int frames, readcount, k ; - - frames = BUFFER_LEN / channels ; - readcount = frames ; - - sf_command (infile, SFC_CALC_SIGNAL_MAX, &max, sizeof (max)) ; - - if (!normalize && max < 1.0) - { while (readcount > 0) - { readcount = sf_readf_double (infile, data, frames) ; - sf_writef_double (outfile, data, readcount) ; - } ; - } - else - { sf_command (infile, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - while (readcount > 0) - { readcount = sf_readf_double (infile, data, frames) ; - for (k = 0 ; k < readcount * channels ; k++) - data [k] /= max ; - sf_writef_double (outfile, data, readcount) ; - } ; - } ; - - return ; -} /* sfe_copy_data_fp */ - -void -sfe_copy_data_int (SNDFILE *outfile, SNDFILE *infile, int channels) -{ static int data [BUFFER_LEN] ; - int frames, readcount ; - - frames = BUFFER_LEN / channels ; - readcount = frames ; - - while (readcount > 0) - { readcount = sf_readf_int (infile, data, frames) ; - sf_writef_int (outfile, data, readcount) ; - } ; - - return ; -} /* sfe_copy_data_int */ - -/*============================================================================== -*/ - -static int -merge_broadcast_info (SNDFILE * infile, SNDFILE * outfile, int format, const METADATA_INFO * info) -{ SF_BROADCAST_INFO_2K binfo ; - int infileminor ; - - memset (&binfo, 0, sizeof (binfo)) ; - - if ((SF_FORMAT_TYPEMASK & format) != SF_FORMAT_WAV) - { printf ("Error : This is not a WAV file and hence broadcast info cannot be added to it.\n\n") ; - return 1 ; - } ; - - infileminor = SF_FORMAT_SUBMASK & format ; - - switch (infileminor) - { case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - break ; - - default : - printf ( - "Warning : The EBU Technical Recommendation R68-2000 states that the only\n" - " allowed encodings are Linear PCM and MPEG3. This file is not in\n" - " the right format.\n\n" - ) ; - break ; - } ; - - if (sf_command (infile, SFC_GET_BROADCAST_INFO, &binfo, sizeof (binfo)) == 0) - { if (infile == outfile) - { printf ( - "Error : Attempting in-place broadcast info update, but file does not\n" - " have a 'bext' chunk to modify. The solution is to specify both\n" - " input and output files on the command line.\n\n" - ) ; - return 1 ; - } ; - } ; - -#define REPLACE_IF_NEW(x) \ - if (info->x != NULL) \ - { memset (binfo.x, 0, sizeof (binfo.x)) ; \ - memcpy (binfo.x, info->x, MIN (strlen (info->x), sizeof (binfo.x))) ; \ - } ; - - REPLACE_IF_NEW (description) ; - REPLACE_IF_NEW (originator) ; - REPLACE_IF_NEW (originator_reference) ; - REPLACE_IF_NEW (origination_date) ; - REPLACE_IF_NEW (origination_time) ; - REPLACE_IF_NEW (umid) ; - - /* Special case for Time Ref. */ - if (info->time_ref != NULL) - { uint64_t ts = atoll (info->time_ref) ; - - binfo.time_reference_high = (ts >> 32) ; - binfo.time_reference_low = (ts & 0xffffffff) ; - } ; - - /* Special case for coding_history because we may want to append. */ - if (info->coding_history != NULL) - { if (info->coding_hist_append) - { int slen = strlen (binfo.coding_history) ; - - while (slen > 1 && isspace (binfo.coding_history [slen - 1])) - slen -- ; - - memcpy (binfo.coding_history + slen, info->coding_history, sizeof (binfo.coding_history) - slen) ; - } - else - { size_t slen = MIN (strlen (info->coding_history), sizeof (binfo.coding_history)) ; - - memset (binfo.coding_history, 0, sizeof (binfo.coding_history)) ; - memcpy (binfo.coding_history, info->coding_history, slen) ; - binfo.coding_history_size = slen ; - } ; - } ; - - if (sf_command (outfile, SFC_SET_BROADCAST_INFO, &binfo, sizeof (binfo)) == 0) - { printf ("Error : Setting of broadcast info chunks failed.\n\n") ; - return 1 ; - } ; - - return 0 ; -} /* merge_broadcast_info*/ - -static void -update_strings (SNDFILE * outfile, const METADATA_INFO * info) -{ - if (info->title != NULL) - sf_set_string (outfile, SF_STR_TITLE, info->title) ; - - if (info->copyright != NULL) - sf_set_string (outfile, SF_STR_COPYRIGHT, info->copyright) ; - - if (info->artist != NULL) - sf_set_string (outfile, SF_STR_ARTIST, info->artist) ; - - if (info->comment != NULL) - sf_set_string (outfile, SF_STR_COMMENT, info->comment) ; - - if (info->date != NULL) - sf_set_string (outfile, SF_STR_DATE, info->date) ; - - if (info->album != NULL) - sf_set_string (outfile, SF_STR_ALBUM, info->album) ; - - if (info->license != NULL) - sf_set_string (outfile, SF_STR_LICENSE, info->license) ; - -} /* update_strings */ - - - -void -sfe_apply_metadata_changes (const char * filenames [2], const METADATA_INFO * info) -{ SNDFILE *infile = NULL, *outfile = NULL ; - SF_INFO sfinfo ; - METADATA_INFO tmpinfo ; - int error_code = 0 ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - memset (&tmpinfo, 0, sizeof (tmpinfo)) ; - - if (filenames [1] == NULL) - infile = outfile = sf_open (filenames [0], SFM_RDWR, &sfinfo) ; - else - { infile = sf_open (filenames [0], SFM_READ, &sfinfo) ; - - /* Output must be WAV. */ - sfinfo.format = SF_FORMAT_WAV | (SF_FORMAT_SUBMASK & sfinfo.format) ; - outfile = sf_open (filenames [1], SFM_WRITE, &sfinfo) ; - } ; - - if (infile == NULL) - { printf ("Error : Not able to open input file '%s' : %s\n", filenames [0], sf_strerror (infile)) ; - error_code = 1 ; - goto cleanup_exit ; - } ; - - if (outfile == NULL) - { printf ("Error : Not able to open output file '%s' : %s\n", filenames [1], sf_strerror (outfile)) ; - error_code = 1 ; - goto cleanup_exit ; - } ; - - if (info->has_bext_fields && merge_broadcast_info (infile, outfile, sfinfo.format, info)) - { error_code = 1 ; - goto cleanup_exit ; - } ; - - if (infile != outfile) - { int infileminor = SF_FORMAT_SUBMASK & sfinfo.format ; - - /* If the input file is not the same as the output file, copy the data. */ - if ((infileminor == SF_FORMAT_DOUBLE) || (infileminor == SF_FORMAT_FLOAT)) - sfe_copy_data_fp (outfile, infile, sfinfo.channels, SF_FALSE) ; - else - sfe_copy_data_int (outfile, infile, sfinfo.channels) ; - } ; - - update_strings (outfile, info) ; - -cleanup_exit : - - if (outfile != NULL && outfile != infile) - sf_close (outfile) ; - - if (infile != NULL) - sf_close (infile) ; - - if (error_code) - exit (error_code) ; - - return ; -} /* sfe_apply_metadata_changes */ - -/*============================================================================== -*/ - -typedef struct -{ const char *ext ; - int len ; - int format ; -} OUTPUT_FORMAT_MAP ; - -static OUTPUT_FORMAT_MAP format_map [] = -{ - { "aif", 3, SF_FORMAT_AIFF }, - { "wav", 0, SF_FORMAT_WAV }, - { "au", 0, SF_FORMAT_AU }, - { "caf", 0, SF_FORMAT_CAF }, - { "flac", 0, SF_FORMAT_FLAC }, - { "snd", 0, SF_FORMAT_AU }, - { "svx", 0, SF_FORMAT_SVX }, - { "paf", 0, SF_ENDIAN_BIG | SF_FORMAT_PAF }, - { "fap", 0, SF_ENDIAN_LITTLE | SF_FORMAT_PAF }, - { "gsm", 0, SF_FORMAT_RAW }, - { "nist", 0, SF_FORMAT_NIST }, - { "htk", 0, SF_FORMAT_HTK }, - { "ircam", 0, SF_FORMAT_IRCAM }, - { "sf", 0, SF_FORMAT_IRCAM }, - { "voc", 0, SF_FORMAT_VOC }, - { "w64", 0, SF_FORMAT_W64 }, - { "raw", 0, SF_FORMAT_RAW }, - { "mat4", 0, SF_FORMAT_MAT4 }, - { "mat5", 0, SF_FORMAT_MAT5 }, - { "mat", 0, SF_FORMAT_MAT4 }, - { "pvf", 0, SF_FORMAT_PVF }, - { "sds", 0, SF_FORMAT_SDS }, - { "sd2", 0, SF_FORMAT_SD2 }, - { "vox", 0, SF_FORMAT_RAW }, - { "xi", 0, SF_FORMAT_XI }, - { "wve", 0, SF_FORMAT_WVE }, - { "oga", 0, SF_FORMAT_OGG }, - { "ogg", 0, SF_FORMAT_OGG }, - { "mpc", 0, SF_FORMAT_MPC2K }, - { "rf64", 0, SF_FORMAT_RF64 }, -} ; /* format_map */ - -int -sfe_file_type_of_ext (const char *str, int format) -{ char buffer [16], *cptr ; - int k ; - - format &= SF_FORMAT_SUBMASK ; - - if ((cptr = strrchr (str, '.')) == NULL) - return 0 ; - - strncpy (buffer, cptr + 1, 15) ; - buffer [15] = 0 ; - - for (k = 0 ; buffer [k] ; k++) - buffer [k] = tolower ((buffer [k])) ; - - if (strcmp (buffer, "gsm") == 0) - return SF_FORMAT_RAW | SF_FORMAT_GSM610 ; - - if (strcmp (buffer, "vox") == 0) - return SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM ; - - for (k = 0 ; k < (int) (sizeof (format_map) / sizeof (format_map [0])) ; k++) - { if (format_map [k].len > 0 && strncmp (buffer, format_map [k].ext, format_map [k].len) == 0) - return format_map [k].format | format ; - else if (strcmp (buffer, format_map [k].ext) == 0) - return format_map [k].format | format ; - } ; - - /* Default if all the above fails. */ - return (SF_FORMAT_WAV | SF_FORMAT_PCM_24) ; -} /* sfe_file_type_of_ext */ - -void -sfe_dump_format_map (void) -{ SF_FORMAT_INFO info ; - int k ; - - for (k = 0 ; k < ARRAY_LEN (format_map) ; k++) - { info.format = format_map [k].format ; - sf_command (NULL, SFC_GET_FORMAT_INFO, &info, sizeof (info)) ; - printf (" %-10s : %s\n", format_map [k].ext, info.name == NULL ? "????" : info.name) ; - } ; - -} /* sfe_dump_format_map */ - -const char * -program_name (const char * argv0) -{ const char * tmp ; - - tmp = strrchr (argv0, '/') ; - argv0 = tmp ? tmp + 1 : argv0 ; - - tmp = strrchr (argv0, '/') ; - argv0 = tmp ? tmp + 1 : argv0 ; - - /* Remove leading libtool name mangling. */ - if (strstr (argv0, "lt-") == argv0) - return argv0 + 3 ; - - return argv0 ; -} /* program_name */ - -const char * -sfe_endian_name (int format) -{ - switch (format & SF_FORMAT_ENDMASK) - { case SF_ENDIAN_FILE : return "file" ; - case SF_ENDIAN_LITTLE : return "little" ; - case SF_ENDIAN_BIG : return "big" ; - case SF_ENDIAN_CPU : return "cpu" ; - default : break ; - } ; - - return "unknown" ; -} /* sfe_endian_name */ - -const char * -sfe_container_name (int format) -{ - switch (format & SF_FORMAT_TYPEMASK) - { case SF_FORMAT_WAV : return "WAV" ; - case SF_FORMAT_AIFF : return "AIFF" ; - case SF_FORMAT_AU : return "AU" ; - case SF_FORMAT_RAW : return "RAW" ; - case SF_FORMAT_PAF : return "PAF" ; - case SF_FORMAT_SVX : return "SVX" ; - case SF_FORMAT_NIST : return "NIST" ; - case SF_FORMAT_VOC : return "VOC" ; - case SF_FORMAT_IRCAM : return "IRCAM" ; - case SF_FORMAT_W64 : return "W64" ; - case SF_FORMAT_MAT4 : return "MAT4" ; - case SF_FORMAT_MAT5 : return "MAT5" ; - case SF_FORMAT_PVF : return "PVF" ; - case SF_FORMAT_XI : return "XI" ; - case SF_FORMAT_HTK : return "HTK" ; - case SF_FORMAT_SDS : return "SDS" ; - case SF_FORMAT_AVR : return "AVR" ; - case SF_FORMAT_WAVEX : return "WAVEX" ; - case SF_FORMAT_SD2 : return "SD2" ; - case SF_FORMAT_FLAC : return "FLAC" ; - case SF_FORMAT_CAF : return "CAF" ; - case SF_FORMAT_WVE : return "WVE" ; - case SF_FORMAT_OGG : return "OGG" ; - case SF_FORMAT_MPC2K : return "MPC2K" ; - case SF_FORMAT_RF64 : return "RF64" ; - default : break ; - } ; - - return "unknown" ; -} /* sfe_container_name */ - -const char * -sfe_codec_name (int format) -{ - switch (format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_PCM_S8 : return "signed 8 bit PCM" ; - case SF_FORMAT_PCM_16 : return "16 bit PCM" ; - case SF_FORMAT_PCM_24 : return "24 bit PCM" ; - case SF_FORMAT_PCM_32 : return "32 bit PCM" ; - case SF_FORMAT_PCM_U8 : return "unsigned 8 bit PCM" ; - case SF_FORMAT_FLOAT : return "32 bit float" ; - case SF_FORMAT_DOUBLE : return "64 bit double" ; - case SF_FORMAT_ULAW : return "u-law" ; - case SF_FORMAT_ALAW : return "a-law" ; - case SF_FORMAT_IMA_ADPCM : return "IMA ADPCM" ; - case SF_FORMAT_MS_ADPCM : return "MS ADPCM" ; - case SF_FORMAT_GSM610 : return "gsm610" ; - case SF_FORMAT_VOX_ADPCM : return "Vox ADPCM" ; - case SF_FORMAT_G721_32 : return "g721 32kbps" ; - case SF_FORMAT_G723_24 : return "g723 24kbps" ; - case SF_FORMAT_G723_40 : return "g723 40kbps" ; - case SF_FORMAT_DWVW_12 : return "12 bit DWVW" ; - case SF_FORMAT_DWVW_16 : return "16 bit DWVW" ; - case SF_FORMAT_DWVW_24 : return "14 bit DWVW" ; - case SF_FORMAT_DWVW_N : return "DWVW" ; - case SF_FORMAT_DPCM_8 : return "8 bit DPCM" ; - case SF_FORMAT_DPCM_16 : return "16 bit DPCM" ; - case SF_FORMAT_VORBIS : return "Vorbis" ; - case SF_FORMAT_ALAC_16 : return "16 bit ALAC" ; - case SF_FORMAT_ALAC_20 : return "20 bit ALAC" ; - case SF_FORMAT_ALAC_24 : return "24 bit ALAC" ; - case SF_FORMAT_ALAC_32 : return "32 bit ALAC" ; - default : break ; - } ; - return "unknown" ; -} /* sfe_codec_name */ - diff --git a/libs/libsndfile/programs/common.h b/libs/libsndfile/programs/common.h deleted file mode 100644 index eda2d7d743..0000000000 --- a/libs/libsndfile/programs/common.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - - -#define ARRAY_LEN(x) ((int) (sizeof (x) / sizeof (x [0]))) -#define MAX(a, b) ((a) > (b) ? (a) : (b)) - -typedef struct -{ const char * title ; - const char * copyright ; - const char * artist ; - const char * comment ; - const char * date ; - const char * album ; - const char * license ; - - - /* Stuff to go in the 'bext' chunk of WAV files. */ - int has_bext_fields ; - int coding_hist_append ; - - const char * description ; - const char * originator ; - const char * originator_reference ; - const char * origination_date ; - const char * origination_time ; - const char * umid ; - const char * coding_history ; - const char * time_ref ; -} METADATA_INFO ; - -typedef SF_BROADCAST_INFO_VAR (2048) SF_BROADCAST_INFO_2K ; - -void sfe_apply_metadata_changes (const char * filenames [2], const METADATA_INFO * info) ; - -void sfe_copy_data_fp (SNDFILE *outfile, SNDFILE *infile, int channels, int normalize) ; - -void sfe_copy_data_int (SNDFILE *outfile, SNDFILE *infile, int channels) ; - -int sfe_file_type_of_ext (const char *filename, int format) ; - -void sfe_dump_format_map (void) ; - -const char * program_name (const char * argv0) ; - -const char * sfe_endian_name (int format) ; -const char * sfe_container_name (int format) ; -const char * sfe_codec_name (int format) ; - diff --git a/libs/libsndfile/programs/sndfile-cmp.c b/libs/libsndfile/programs/sndfile-cmp.c deleted file mode 100644 index 121d25a629..0000000000 --- a/libs/libsndfile/programs/sndfile-cmp.c +++ /dev/null @@ -1,165 +0,0 @@ -/* -** Copyright (C) 2008-2012 Erik de Castro Lopo -** Copyright (C) 2008 Conrad Parker -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include - -#include "common.h" - -/* Length of comparison data buffers in units of items */ -#define BUFLEN 65536 - -static const char * progname = NULL ; -static char * filename1 = NULL, * filename2 = NULL ; - -static int -comparison_error (const char * what, sf_count_t frame_offset) -{ char buffer [128] = "" ; - - if (frame_offset >= 0) - snprintf (buffer, sizeof (buffer), " (at frame offset %" PRId64 ")", frame_offset) ; - - printf ("%s: %s of files %s and %s differ%s.\n", progname, what, filename1, filename2, buffer) ; - return 1 ; -} /* comparison_error */ - -static int -compare (void) -{ - double buf1 [BUFLEN], buf2 [BUFLEN] ; - SF_INFO sfinfo1, sfinfo2 ; - SNDFILE * sf1 = NULL, * sf2 = NULL ; - sf_count_t items, i, nread1, nread2, offset = 0 ; - int retval = 0 ; - - memset (&sfinfo1, 0, sizeof (SF_INFO)) ; - sf1 = sf_open (filename1, SFM_READ, &sfinfo1) ; - if (sf1 == NULL) - { printf ("Error opening %s.\n", filename1) ; - retval = 1 ; - goto out ; - } ; - - memset (&sfinfo2, 0, sizeof (SF_INFO)) ; - sf2 = sf_open (filename2, SFM_READ, &sfinfo2) ; - if (sf2 == NULL) - { printf ("Error opening %s.\n", filename2) ; - retval = 1 ; - goto out ; - } ; - - if (sfinfo1.samplerate != sfinfo2.samplerate) - { retval = comparison_error ("Samplerates", -1) ; - goto out ; - } ; - - if (sfinfo1.channels != sfinfo2.channels) - { retval = comparison_error ("Number of channels", -1) ; - goto out ; - } ; - - /* Calculate the framecount that will fit in our data buffers */ - items = BUFLEN / sfinfo1.channels ; - - while ((nread1 = sf_readf_double (sf1, buf1, items)) > 0) - { nread2 = sf_readf_double (sf2, buf2, nread1) ; - if (nread2 != nread1) - { retval = comparison_error ("PCM data lengths", -1) ; - goto out ; - } ; - for (i = 0 ; i < nread1 * sfinfo1.channels ; i++) - { if (buf1 [i] != buf2 [i]) - { retval = comparison_error ("PCM data", offset + i / sfinfo1.channels) ; - goto out ; - } ; - } ; - offset += nread1 ; - } ; - - if ((nread2 = sf_readf_double (sf2, buf2, items)) != 0) - { retval = comparison_error ("PCM data lengths", -1) ; - goto out ; - } ; - -out : - sf_close (sf1) ; - sf_close (sf2) ; - - return retval ; -} /* compare */ - -static void -print_version (void) -{ char buffer [256] ; - - sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ; - printf ("\nVersion : %s\n\n", buffer) ; -} /* print_version */ - -static void -usage_exit (void) -{ - print_version () ; - - printf ("Usage : %s \n", progname) ; - printf (" Compare the PCM data of two sound files.\n\n") ; - exit (0) ; -} /* usage_exit */ - -int -main (int argc, char *argv []) -{ - progname = program_name (argv [0]) ; - - if (argc != 3) - { usage_exit () ; - return 1 ; - } ; - - filename1 = argv [argc - 2] ; - filename2 = argv [argc - 1] ; - - if (strcmp (filename1, filename2) == 0) - { printf ("Error : Input filenames are the same.\n\n") ; - usage_exit () ; - return 1 ; - } ; - - return compare () ; -} /* main */ diff --git a/libs/libsndfile/programs/sndfile-concat.c b/libs/libsndfile/programs/sndfile-concat.c deleted file mode 100644 index ef5312b693..0000000000 --- a/libs/libsndfile/programs/sndfile-concat.c +++ /dev/null @@ -1,169 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#include - -#include - -#include "common.h" - -#define BUFFER_LEN (1 << 16) - - -static void concat_data_fp (SNDFILE *wfile, SNDFILE *rofile, int channels) ; -static void concat_data_int (SNDFILE *wfile, SNDFILE *rofile, int channels) ; - -static void -usage_exit (const char *progname) -{ - printf ("\nUsage : %s ... \n\n", progname) ; - puts ( - " Create a new output file containing the concatenated\n" - " audio data from froms ....\n" - "\n" - " The joined file will be encoded in the same format as the data\n" - " in infile1, with all the data in subsequent files automatically\n" - " converted to the correct encoding.\n" - "\n" - " The only restriction is that the two files must have the same\n" - " number of channels.\n" - ) ; - - exit (0) ; -} /* usage_exit */ - -int -main (int argc, char *argv []) -{ const char *progname, *outfilename ; - SNDFILE *outfile, **infiles ; - SF_INFO sfinfo_out, sfinfo_in ; - void (*func) (SNDFILE*, SNDFILE*, int) ; - int k ; - - progname = program_name (argv [0]) ; - - if (argc < 4) - usage_exit (progname) ; - - argv ++ ; - argc -- ; - - argc -- ; - outfilename = argv [argc] ; - - if ((infiles = calloc (argc, sizeof (SNDFILE*))) == NULL) - { printf ("\nError : Malloc failed.\n\n") ; - exit (1) ; - } ; - - memset (&sfinfo_in, 0, sizeof (sfinfo_in)) ; - - if ((infiles [0] = sf_open (argv [0], SFM_READ, &sfinfo_in)) == NULL) - { printf ("\nError : failed to open file '%s'.\n\n", argv [0]) ; - exit (1) ; - } ; - - sfinfo_out = sfinfo_in ; - - for (k = 1 ; k < argc ; k++) - { if ((infiles [k] = sf_open (argv [k], SFM_READ, &sfinfo_in)) == NULL) - { printf ("\nError : failed to open file '%s'.\n\n", argv [k]) ; - exit (1) ; - } ; - - if (sfinfo_in.channels != sfinfo_out.channels) - { printf ("\nError : File '%s' has %d channels (should have %d).\n\n", argv [k], sfinfo_in.channels, sfinfo_out.channels) ; - exit (1) ; - } ; - } ; - - if ((outfile = sf_open (outfilename, SFM_WRITE, &sfinfo_out)) == NULL) - { printf ("\nError : Not able to open input file %s.\n", outfilename) ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - if ((sfinfo_out.format & SF_FORMAT_SUBMASK) == SF_FORMAT_DOUBLE || - (sfinfo_out.format & SF_FORMAT_SUBMASK) == SF_FORMAT_FLOAT) - func = concat_data_fp ; - else - func = concat_data_int ; - - for (k = 0 ; k < argc ; k++) - { func (outfile, infiles [k], sfinfo_out.channels) ; - sf_close (infiles [k]) ; - } ; - - sf_close (outfile) ; - - return 0 ; -} /* main */ - -static void -concat_data_fp (SNDFILE *wfile, SNDFILE *rofile, int channels) -{ static double data [BUFFER_LEN] ; - int frames, readcount ; - - frames = BUFFER_LEN / channels ; - readcount = frames ; - - sf_seek (wfile, 0, SEEK_END) ; - - while (readcount > 0) - { readcount = sf_readf_double (rofile, data, frames) ; - sf_writef_double (wfile, data, readcount) ; - } ; - - return ; -} /* concat_data_fp */ - -static void -concat_data_int (SNDFILE *wfile, SNDFILE *rofile, int channels) -{ static int data [BUFFER_LEN] ; - int frames, readcount ; - - frames = BUFFER_LEN / channels ; - readcount = frames ; - - sf_seek (wfile, 0, SEEK_END) ; - - while (readcount > 0) - { readcount = sf_readf_int (rofile, data, frames) ; - sf_writef_int (wfile, data, readcount) ; - } ; - - return ; -} /* concat_data_int */ - diff --git a/libs/libsndfile/programs/sndfile-convert.c b/libs/libsndfile/programs/sndfile-convert.c deleted file mode 100644 index c22cc9b16a..0000000000 --- a/libs/libsndfile/programs/sndfile-convert.c +++ /dev/null @@ -1,377 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#include - -#include - -#include "common.h" - - -typedef struct -{ char *infilename, *outfilename ; - SF_INFO infileinfo, outfileinfo ; -} OptionData ; - -static void copy_metadata (SNDFILE *outfile, SNDFILE *infile, int channels) ; - -static void -usage_exit (const char *progname) -{ - printf ("\nUsage : %s [options] [encoding] \n", progname) ; - puts ("\n" - " where [option] may be:\n\n" - " -override-sample-rate=X : force sample rate of input to X\n" - " -endian=little : force output file to little endian data\n" - " -endian=big : force output file to big endian data\n" - " -endian=cpu : force output file same endian-ness as the CPU\n" - " -normalize : normalize the data in the output file\n" - ) ; - - puts ( - " where [encoding] may be one of the following:\n\n" - " -pcms8 : force the output to signed 8 bit pcm\n" - " -pcmu8 : force the output to unsigned 8 bit pcm\n" - " -pcm16 : force the output to 16 bit pcm\n" - " -pcm24 : force the output to 24 bit pcm\n" - " -pcm32 : force the output to 32 bit pcm\n" - " -float32 : force the output to 32 bit floating point" - ) ; - puts ( - " -ulaw : force the output ULAW\n" - " -alaw : force the output ALAW\n" - " -alac16 : force the output 16 bit ALAC (CAF only)\n" - " -alac20 : force the output 20 bit ALAC (CAF only)\n" - " -alac24 : force the output 24 bit ALAC (CAF only)\n" - " -alac32 : force the output 32 bit ALAC (CAF only)\n" - " -ima-adpcm : force the output to IMA ADPCM (WAV only)\n" - " -ms-adpcm : force the output to MS ADPCM (WAV only)\n" - " -gsm610 : force the GSM6.10 (WAV only)\n" - " -dwvw12 : force the output to 12 bit DWVW (AIFF only)\n" - " -dwvw16 : force the output to 16 bit DWVW (AIFF only)\n" - " -dwvw24 : force the output to 24 bit DWVW (AIFF only)\n" - " -vorbis : force the output to Vorbis (OGG only)\n" - ) ; - - puts ( - " If no encoding is specified, the program will try to use the encoding\n" - " of the input file in the output file. This will not always work as\n" - " most container formats (eg WAV, AIFF etc) only support a small subset\n" - " of codec formats (eg 16 bit PCM, a-law, Vorbis etc).\n" - ) ; - - puts ( - " The format of the output file is determined by the file extension of the\n" - " output file name. The following extensions are currently understood:\n" - ) ; - - sfe_dump_format_map () ; - - puts ("") ; - exit (0) ; -} /* usage_exit */ - -static void -report_format_error_exit (const char * argv0, SF_INFO * sfinfo) -{ int old_format = sfinfo->format ; - int endian = sfinfo->format & SF_FORMAT_ENDMASK ; - - sfinfo->format = old_format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (endian && sf_format_check (sfinfo)) - { printf ("Error : output file format does not support %s endian-ness.\n", sfe_endian_name (endian)) ; - exit (1) ; - } ; - - printf ("\n" - "Error : output file format is invalid.\n" - "The '%s' container does not support '%s' codec data.\n" - "Run '%s --help' for clues.\n\n", - sfe_container_name (sfinfo->format), sfe_codec_name (sfinfo->format), program_name (argv0)) ; - exit (1) ; -} /* report_format_error_exit */ - -int -main (int argc, char * argv []) -{ const char *progname, *infilename, *outfilename ; - SNDFILE *infile = NULL, *outfile = NULL ; - SF_INFO sfinfo ; - int k, outfilemajor, outfileminor = 0, infileminor ; - int override_sample_rate = 0 ; /* assume no sample rate override. */ - int endian = SF_ENDIAN_FILE, normalize = SF_FALSE ; - - progname = program_name (argv [0]) ; - - if (argc < 3 || argc > 5) - { usage_exit (progname) ; - return 1 ; - } ; - - infilename = argv [argc-2] ; - outfilename = argv [argc-1] ; - - if (strcmp (infilename, outfilename) == 0) - { printf ("Error : Input and output filenames are the same.\n\n") ; - usage_exit (progname) ; - return 1 ; - } ; - - if (strlen (infilename) > 1 && infilename [0] == '-') - { printf ("Error : Input filename (%s) looks like an option.\n\n", infilename) ; - usage_exit (progname) ; - return 1 ; - } ; - - if (outfilename [0] == '-') - { printf ("Error : Output filename (%s) looks like an option.\n\n", outfilename) ; - usage_exit (progname) ; - return 1 ; - } ; - - for (k = 1 ; k < argc - 2 ; k++) - { if (! strcmp (argv [k], "-pcms8")) - { outfileminor = SF_FORMAT_PCM_S8 ; - continue ; - } ; - if (! strcmp (argv [k], "-pcmu8")) - { outfileminor = SF_FORMAT_PCM_U8 ; - continue ; - } ; - if (! strcmp (argv [k], "-pcm16")) - { outfileminor = SF_FORMAT_PCM_16 ; - continue ; - } ; - if (! strcmp (argv [k], "-pcm24")) - { outfileminor = SF_FORMAT_PCM_24 ; - continue ; - } ; - if (! strcmp (argv [k], "-pcm32")) - { outfileminor = SF_FORMAT_PCM_32 ; - continue ; - } ; - if (! strcmp (argv [k], "-float32")) - { outfileminor = SF_FORMAT_FLOAT ; - continue ; - } ; - if (! strcmp (argv [k], "-ulaw")) - { outfileminor = SF_FORMAT_ULAW ; - continue ; - } ; - if (! strcmp (argv [k], "-alaw")) - { outfileminor = SF_FORMAT_ALAW ; - continue ; - } ; - if (! strcmp (argv [k], "-alac16")) - { outfileminor = SF_FORMAT_ALAC_16 ; - continue ; - } ; - if (! strcmp (argv [k], "-alac20")) - { outfileminor = SF_FORMAT_ALAC_20 ; - continue ; - } ; - if (! strcmp (argv [k], "-alac24")) - { outfileminor = SF_FORMAT_ALAC_24 ; - continue ; - } ; - if (! strcmp (argv [k], "-alac32")) - { outfileminor = SF_FORMAT_ALAC_32 ; - continue ; - } ; - if (! strcmp (argv [k], "-ima-adpcm")) - { outfileminor = SF_FORMAT_IMA_ADPCM ; - continue ; - } ; - if (! strcmp (argv [k], "-ms-adpcm")) - { outfileminor = SF_FORMAT_MS_ADPCM ; - continue ; - } ; - if (! strcmp (argv [k], "-gsm610")) - { outfileminor = SF_FORMAT_GSM610 ; - continue ; - } ; - if (! strcmp (argv [k], "-dwvw12")) - { outfileminor = SF_FORMAT_DWVW_12 ; - continue ; - } ; - if (! strcmp (argv [k], "-dwvw16")) - { outfileminor = SF_FORMAT_DWVW_16 ; - continue ; - } ; - if (! strcmp (argv [k], "-dwvw24")) - { outfileminor = SF_FORMAT_DWVW_24 ; - continue ; - } ; - if (! strcmp (argv [k], "-vorbis")) - { outfileminor = SF_FORMAT_VORBIS ; - continue ; - } ; - - if (strstr (argv [k], "-override-sample-rate=") == argv [k]) - { const char *ptr ; - - ptr = argv [k] + strlen ("-override-sample-rate=") ; - override_sample_rate = atoi (ptr) ; - continue ; - } ; - - if (! strcmp (argv [k], "-endian=little")) - { endian = SF_ENDIAN_LITTLE ; - continue ; - } ; - - if (! strcmp (argv [k], "-endian=big")) - { endian = SF_ENDIAN_BIG ; - continue ; - } ; - - if (! strcmp (argv [k], "-endian=cpu")) - { endian = SF_ENDIAN_CPU ; - continue ; - } ; - - if (! strcmp (argv [k], "-endian=file")) - { endian = SF_ENDIAN_FILE ; - continue ; - } ; - - if (! strcmp (argv [k], "-normalize")) - { normalize = SF_TRUE ; - continue ; - } ; - - printf ("Error : Not able to decode argunment '%s'.\n", argv [k]) ; - exit (1) ; - } ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - if ((infile = sf_open (infilename, SFM_READ, &sfinfo)) == NULL) - { printf ("Not able to open input file %s.\n", infilename) ; - puts (sf_strerror (NULL)) ; - return 1 ; - } ; - - /* Update sample rate if forced to something else. */ - if (override_sample_rate) - sfinfo.samplerate = override_sample_rate ; - - infileminor = sfinfo.format & SF_FORMAT_SUBMASK ; - - if ((sfinfo.format = sfe_file_type_of_ext (outfilename, sfinfo.format)) == 0) - { printf ("Error : Not able to determine output file type for %s.\n", outfilename) ; - return 1 ; - } ; - - outfilemajor = sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_ENDMASK) ; - - if (outfileminor == 0) - outfileminor = sfinfo.format & SF_FORMAT_SUBMASK ; - - if (outfileminor != 0) - sfinfo.format = outfilemajor | outfileminor ; - else - sfinfo.format = outfilemajor | (sfinfo.format & SF_FORMAT_SUBMASK) ; - - sfinfo.format |= endian ; - - if ((sfinfo.format & SF_FORMAT_TYPEMASK) == SF_FORMAT_XI) - switch (sfinfo.format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_PCM_16 : - sfinfo.format = outfilemajor | SF_FORMAT_DPCM_16 ; - break ; - - case SF_FORMAT_PCM_S8 : - case SF_FORMAT_PCM_U8 : - sfinfo.format = outfilemajor | SF_FORMAT_DPCM_8 ; - break ; - } ; - - if (sf_format_check (&sfinfo) == 0) - report_format_error_exit (argv [0], &sfinfo) ; - - /* Open the output file. */ - if ((outfile = sf_open (outfilename, SFM_WRITE, &sfinfo)) == NULL) - { printf ("Not able to open output file %s : %s\n", outfilename, sf_strerror (NULL)) ; - return 1 ; - } ; - - /* Copy the metadata */ - copy_metadata (outfile, infile, sfinfo.channels) ; - - if (normalize - || (outfileminor == SF_FORMAT_DOUBLE) || (outfileminor == SF_FORMAT_FLOAT) - || (infileminor == SF_FORMAT_DOUBLE) || (infileminor == SF_FORMAT_FLOAT) - || (infileminor == SF_FORMAT_VORBIS) || (outfileminor == SF_FORMAT_VORBIS)) - sfe_copy_data_fp (outfile, infile, sfinfo.channels, normalize) ; - else - sfe_copy_data_int (outfile, infile, sfinfo.channels) ; - - sf_close (infile) ; - sf_close (outfile) ; - - return 0 ; -} /* main */ - -static void -copy_metadata (SNDFILE *outfile, SNDFILE *infile, int channels) -{ SF_INSTRUMENT inst ; - SF_BROADCAST_INFO_2K binfo ; - const char *str ; - int k, chanmap [256] ; - - for (k = SF_STR_FIRST ; k <= SF_STR_LAST ; k++) - { str = sf_get_string (infile, k) ; - if (str != NULL) - sf_set_string (outfile, k, str) ; - } ; - - memset (&inst, 0, sizeof (inst)) ; - memset (&binfo, 0, sizeof (binfo)) ; - - if (channels < ARRAY_LEN (chanmap)) - { size_t size = channels * sizeof (chanmap [0]) ; - - if (sf_command (infile, SFC_GET_CHANNEL_MAP_INFO, chanmap, size) == SF_TRUE) - sf_command (outfile, SFC_SET_CHANNEL_MAP_INFO, chanmap, size) ; - } ; - - if (sf_command (infile, SFC_GET_INSTRUMENT, &inst, sizeof (inst)) == SF_TRUE) - sf_command (outfile, SFC_SET_INSTRUMENT, &inst, sizeof (inst)) ; - - if (sf_command (infile, SFC_GET_BROADCAST_INFO, &binfo, sizeof (binfo)) == SF_TRUE) - sf_command (outfile, SFC_SET_BROADCAST_INFO, &binfo, sizeof (binfo)) ; - -} /* copy_metadata */ - diff --git a/libs/libsndfile/programs/sndfile-deinterleave.c b/libs/libsndfile/programs/sndfile-deinterleave.c deleted file mode 100644 index df80b04222..0000000000 --- a/libs/libsndfile/programs/sndfile-deinterleave.c +++ /dev/null @@ -1,194 +0,0 @@ -/* -** Copyright (C) 2009-2011 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#include - -#include "common.h" - -#define BUFFER_LEN 4096 -#define MAX_CHANNELS 16 - - -typedef struct -{ SNDFILE * infile ; - SNDFILE * outfile [MAX_CHANNELS] ; - - union - { double d [MAX_CHANNELS * BUFFER_LEN] ; - int i [MAX_CHANNELS * BUFFER_LEN] ; - } din ; - - union - { double d [BUFFER_LEN] ; - int i [BUFFER_LEN] ; - } dout ; - - int channels ; -} STATE ; - -static void usage_exit (void) ; - -static void deinterleave_int (STATE * state) ; -static void deinterleave_double (STATE * state) ; - -int -main (int argc, char **argv) -{ STATE state ; - SF_INFO sfinfo ; - char pathname [512], ext [32], *cptr ; - int ch, double_split ; - - if (argc != 2) - { if (argc != 1) - puts ("\nError : need a single input file.\n") ; - usage_exit () ; - } ; - - memset (&state, 0, sizeof (state)) ; - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - if ((state.infile = sf_open (argv [1], SFM_READ, &sfinfo)) == NULL) - { printf ("\nError : Not able to open input file '%s'\n%s\n", argv [1], sf_strerror (NULL)) ; - exit (1) ; - } ; - - if (sfinfo.channels < 2) - { printf ("\nError : Input file '%s' only has one channel.\n", argv [1]) ; - exit (1) ; - } ; - - state.channels = sfinfo.channels ; - sfinfo.channels = 1 ; - - snprintf (pathname, sizeof (pathname), "%s", argv [1]) ; - if ((cptr = strrchr (pathname, '.')) == NULL) - ext [0] = 0 ; - else - { snprintf (ext, sizeof (ext), "%s", cptr) ; - cptr [0] = 0 ; - } ; - - printf ("Input file : %s\n", pathname) ; - puts ("Output files :") ; - - for (ch = 0 ; ch < state.channels ; ch++) - { char filename [520] ; - - snprintf (filename, sizeof (filename), "%s_%02d%s", pathname, ch, ext) ; - - if ((state.outfile [ch] = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) - { printf ("Not able to open output file '%s'\n%s\n", filename, sf_strerror (NULL)) ; - exit (1) ; - } ; - - printf (" %s\n", filename) ; - } ; - - switch (sfinfo.format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_FLOAT : - case SF_FORMAT_DOUBLE : - case SF_FORMAT_VORBIS : - double_split = 1 ; - break ; - - default : - double_split = 0 ; - break ; - } ; - - if (double_split) - deinterleave_double (&state) ; - else - deinterleave_int (&state) ; - - sf_close (state.infile) ; - for (ch = 0 ; ch < MAX_CHANNELS ; ch++) - if (state.outfile [ch] != NULL) - sf_close (state.outfile [ch]) ; - - return 0 ; -} /* main */ - -/*------------------------------------------------------------------------------ -*/ - -static void -usage_exit (void) -{ puts ("\nUsage : sndfile-deinterleave \n") ; - puts ( - "Split a mutli-channel file into a set of mono files.\n" - "\n" - "If the input file is named 'a.wav', the output files will be named\n" - "a_00.wav, a_01.wav and so on.\n" - ) ; - printf ("Using %s.\n\n", sf_version_string ()) ; - exit (0) ; -} /* usage_exit */ - -static void -deinterleave_int (STATE * state) -{ int read_len ; - int ch, k ; - - do - { read_len = sf_readf_int (state->infile, state->din.i, BUFFER_LEN) ; - - for (ch = 0 ; ch < state->channels ; ch ++) - { for (k = 0 ; k < read_len ; k++) - state->dout.i [k] = state->din.i [k * state->channels + ch] ; - sf_write_int (state->outfile [ch], state->dout.i, read_len) ; - } ; - } - while (read_len > 0) ; - -} /* deinterleave_int */ - -static void -deinterleave_double (STATE * state) -{ int read_len ; - int ch, k ; - - do - { read_len = sf_readf_double (state->infile, state->din.d, BUFFER_LEN) ; - - for (ch = 0 ; ch < state->channels ; ch ++) - { for (k = 0 ; k < read_len ; k++) - state->dout.d [k] = state->din.d [k * state->channels + ch] ; - sf_write_double (state->outfile [ch], state->dout.d, read_len) ; - } ; - } - while (read_len > 0) ; - -} /* deinterleave_double */ diff --git a/libs/libsndfile/programs/sndfile-info.c b/libs/libsndfile/programs/sndfile-info.c deleted file mode 100644 index 06982fd2c2..0000000000 --- a/libs/libsndfile/programs/sndfile-info.c +++ /dev/null @@ -1,529 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#include -#include -#include - -#include - -#include "common.h" - -#define BUFFER_LEN (1 << 16) - -#if (defined (WIN32) || defined (_WIN32)) -#include -#endif - -static void print_version (void) ; -static void usage_exit (const char *progname) ; - -static void info_dump (const char *filename) ; -static int instrument_dump (const char *filename) ; -static int broadcast_dump (const char *filename) ; -static int chanmap_dump (const char *filename) ; -static int cart_dump (const char *filename) ; -static void total_dump (void) ; - -static double total_seconds = 0.0 ; - -int -main (int argc, char *argv []) -{ int k ; - - print_version () ; - - if (argc < 2 || strcmp (argv [1], "--help") == 0 || strcmp (argv [1], "-h") == 0) - { usage_exit (program_name (argv [0])) ; - return 1 ; - } ; - - if (strcmp (argv [1], "--instrument") == 0) - { int error = 0 ; - - for (k = 2 ; k < argc ; k++) - error += instrument_dump (argv [k]) ; - return error ; - } ; - - if (strcmp (argv [1], "--broadcast") == 0) - { int error = 0 ; - - for (k = 2 ; k < argc ; k++) - error += broadcast_dump (argv [k]) ; - return error ; - } ; - - if (strcmp (argv [1], "--channel-map") == 0) - { int error = 0 ; - - for (k = 2 ; k < argc ; k++) - error += chanmap_dump (argv [k]) ; - return error ; - } ; - - if (strcmp (argv [1], "--cart") == 0) - { int error = 0 ; - - for (k = 2 ; k < argc ; k++) - error += cart_dump (argv [k]) ; - return error ; - } ; - - for (k = 1 ; k < argc ; k++) - info_dump (argv [k]) ; - - if (argc > 2) - total_dump () ; - - return 0 ; -} /* main */ - -/*============================================================================== -** Print version and usage. -*/ - -static double data [BUFFER_LEN] ; - -static void -print_version (void) -{ char buffer [256] ; - - sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ; - printf ("\nVersion : %s\n\n", buffer) ; -} /* print_version */ - - -static void -usage_exit (const char *progname) -{ printf ("Usage :\n %s ...\n", progname) ; - printf (" Prints out information about one or more sound files.\n\n") ; - printf (" %s --instrument \n", progname) ; - printf (" Prints out the instrument data for the given file.\n\n") ; - printf (" %s --broadcast \n", progname) ; - printf (" Prints out the broadcast WAV info for the given file.\n\n") ; - printf (" %s --channel-map \n", progname) ; - printf (" Prints out the channel map for the given file.\n\n") ; - printf (" %s --cart \n", progname) ; - printf (" Prints out the cart chunk WAV info for the given file.\n\n") ; -#if (defined (_WIN32) || defined (WIN32)) - printf ("This is a Unix style command line application which\n" - "should be run in a MSDOS box or Command Shell window.\n\n") ; - printf ("Sleeping for 5 seconds before exiting.\n\n") ; - fflush (stdout) ; - - /* This is the officially blessed by microsoft way but I can't get - ** it to link. - ** Sleep (15) ; - ** Instead, use this: - */ - Sleep (5 * 1000) ; -#endif - exit (0) ; -} /* usage_exit */ - -/*============================================================================== -** Dumping of sndfile info. -*/ - -static double data [BUFFER_LEN] ; - -static double -calc_decibels (SF_INFO * sfinfo, double max) -{ double decibels ; - - switch (sfinfo->format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_S8 : - decibels = max / 0x80 ; - break ; - - case SF_FORMAT_PCM_16 : - decibels = max / 0x8000 ; - break ; - - case SF_FORMAT_PCM_24 : - decibels = max / 0x800000 ; - break ; - - case SF_FORMAT_PCM_32 : - decibels = max / 0x80000000 ; - break ; - - case SF_FORMAT_FLOAT : - case SF_FORMAT_DOUBLE : - decibels = max / 1.0 ; - break ; - - default : - decibels = max / 0x8000 ; - break ; - } ; - - return 20.0 * log10 (decibels) ; -} /* calc_decibels */ - -static const char * -format_duration_str (double seconds) -{ static char str [128] ; - int hrs, min ; - double sec ; - - memset (str, 0, sizeof (str)) ; - - hrs = (int) (seconds / 3600.0) ; - min = (int) ((seconds - (hrs * 3600.0)) / 60.0) ; - sec = seconds - (hrs * 3600.0) - (min * 60.0) ; - - snprintf (str, sizeof (str) - 1, "%02d:%02d:%06.3f", hrs, min, sec) ; - - return str ; -} /* format_duration_str */ - -static const char * -generate_duration_str (SF_INFO *sfinfo) -{ - double seconds ; - - if (sfinfo->samplerate < 1) - return NULL ; - - if (sfinfo->frames / sfinfo->samplerate > 0x7FFFFFFF) - return "unknown" ; - - seconds = (1.0 * sfinfo->frames) / sfinfo->samplerate ; - - /* Accumulate the total of all known file durations */ - total_seconds += seconds ; - - return format_duration_str (seconds) ; -} /* generate_duration_str */ - -static void -info_dump (const char *filename) -{ static char strbuffer [BUFFER_LEN] ; - SNDFILE *file ; - SF_INFO sfinfo ; - double signal_max, decibels ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) - { printf ("Error : Not able to open input file %s.\n", filename) ; - fflush (stdout) ; - memset (data, 0, sizeof (data)) ; - sf_command (file, SFC_GET_LOG_INFO, strbuffer, BUFFER_LEN) ; - puts (strbuffer) ; - puts (sf_strerror (NULL)) ; - return ; - } ; - - printf ("========================================\n") ; - sf_command (file, SFC_GET_LOG_INFO, strbuffer, BUFFER_LEN) ; - puts (strbuffer) ; - printf ("----------------------------------------\n") ; - - printf ("Sample Rate : %d\n", sfinfo.samplerate) ; - - if (sfinfo.frames == SF_COUNT_MAX) - printf ("Frames : unknown\n") ; - else - printf ("Frames : %" PRId64 "\n", sfinfo.frames) ; - - printf ("Channels : %d\n", sfinfo.channels) ; - printf ("Format : 0x%08X\n", sfinfo.format) ; - printf ("Sections : %d\n", sfinfo.sections) ; - printf ("Seekable : %s\n", (sfinfo.seekable ? "TRUE" : "FALSE")) ; - printf ("Duration : %s\n", generate_duration_str (&sfinfo)) ; - - if (sfinfo.frames < 100 * 1024 * 1024) - { /* Do not use sf_signal_max because it doesn't work for non-seekable files . */ - sf_command (file, SFC_CALC_SIGNAL_MAX, &signal_max, sizeof (signal_max)) ; - decibels = calc_decibels (&sfinfo, signal_max) ; - printf ("Signal Max : %g (%4.2f dB)\n", signal_max, decibels) ; - } ; - putchar ('\n') ; - - sf_close (file) ; - -} /* info_dump */ - -/*============================================================================== -** Dumping of SF_INSTRUMENT data. -*/ - -static const char * -str_of_type (int mode) -{ switch (mode) - { case SF_LOOP_NONE : return "none" ; - case SF_LOOP_FORWARD : return "fwd " ; - case SF_LOOP_BACKWARD : return "back" ; - case SF_LOOP_ALTERNATING : return "alt " ; - default : break ; - } ; - - return "????" ; -} /* str_of_mode */ - -static int -instrument_dump (const char *filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - SF_INSTRUMENT inst ; - int got_inst, k ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) - { printf ("Error : Not able to open input file %s.\n", filename) ; - fflush (stdout) ; - memset (data, 0, sizeof (data)) ; - puts (sf_strerror (NULL)) ; - return 1 ; - } ; - - got_inst = sf_command (file, SFC_GET_INSTRUMENT, &inst, sizeof (inst)) ; - sf_close (file) ; - - if (got_inst == SF_FALSE) - { printf ("Error : File '%s' does not contain instrument data.\n\n", filename) ; - return 1 ; - } ; - - printf ("Instrument : %s\n\n", filename) ; - printf (" Gain : %d\n", inst.gain) ; - printf (" Base note : %d\n", inst.basenote) ; - printf (" Velocity : %d - %d\n", (int) inst.velocity_lo, (int) inst.velocity_hi) ; - printf (" Key : %d - %d\n", (int) inst.key_lo, (int) inst.key_hi) ; - printf (" Loop points : %d\n", inst.loop_count) ; - - for (k = 0 ; k < inst.loop_count ; k++) - printf (" %-2d Mode : %s Start : %6d End : %6d Count : %6d\n", k, str_of_type (inst.loops [k].mode), inst.loops [k].start, inst.loops [k].end, inst.loops [k].count) ; - - putchar ('\n') ; - return 0 ; -} /* instrument_dump */ - -static int -broadcast_dump (const char *filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - SF_BROADCAST_INFO_2K bext ; - double time_ref_sec ; - int got_bext ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) - { printf ("Error : Not able to open input file %s.\n", filename) ; - fflush (stdout) ; - memset (data, 0, sizeof (data)) ; - puts (sf_strerror (NULL)) ; - return 1 ; - } ; - - memset (&bext, 0, sizeof (SF_BROADCAST_INFO_2K)) ; - - got_bext = sf_command (file, SFC_GET_BROADCAST_INFO, &bext, sizeof (bext)) ; - sf_close (file) ; - - if (got_bext == SF_FALSE) - { printf ("Error : File '%s' does not contain broadcast information.\n\n", filename) ; - return 1 ; - } ; - - /* - ** From : http://www.ebu.ch/en/technical/publications/userguides/bwf_user_guide.php - ** - ** Time Reference: - ** This field is a count from midnight in samples to the first sample - ** of the audio sequence. - */ - - time_ref_sec = ((pow (2.0, 32) * bext.time_reference_high) + (1.0 * bext.time_reference_low)) / sfinfo.samplerate ; - - printf ("Description : %.*s\n", (int) sizeof (bext.description), bext.description) ; - printf ("Originator : %.*s\n", (int) sizeof (bext.originator), bext.originator) ; - printf ("Origination ref : %.*s\n", (int) sizeof (bext.originator_reference), bext.originator_reference) ; - printf ("Origination date : %.*s\n", (int) sizeof (bext.origination_date), bext.origination_date) ; - printf ("Origination time : %.*s\n", (int) sizeof (bext.origination_time), bext.origination_time) ; - - if (bext.time_reference_high == 0 && bext.time_reference_low == 0) - printf ("Time ref : 0\n") ; - else - printf ("Time ref : 0x%x%08x (%.6f seconds)\n", bext.time_reference_high, bext.time_reference_low, time_ref_sec) ; - - printf ("BWF version : %d\n", bext.version) ; - printf ("UMID : %.*s\n", (int) sizeof (bext.umid), bext.umid) ; - printf ("Coding history : %.*s\n", bext.coding_history_size, bext.coding_history) ; - - return 0 ; -} /* broadcast_dump */ - -static int -chanmap_dump (const char *filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int * channel_map ; - int got_chanmap, k ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) - { printf ("Error : Not able to open input file %s.\n", filename) ; - fflush (stdout) ; - memset (data, 0, sizeof (data)) ; - puts (sf_strerror (NULL)) ; - return 1 ; - } ; - - if ((channel_map = calloc (sfinfo.channels, sizeof (int))) == NULL) - { printf ("Error : malloc failed.\n\n") ; - return 1 ; - } ; - - got_chanmap = sf_command (file, SFC_GET_CHANNEL_MAP_INFO, channel_map, sfinfo.channels * sizeof (int)) ; - sf_close (file) ; - - if (got_chanmap == SF_FALSE) - { printf ("Error : File '%s' does not contain channel map information.\n\n", filename) ; - free (channel_map) ; - return 1 ; - } ; - - printf ("File : %s\n\n", filename) ; - - puts (" Chan Position") ; - for (k = 0 ; k < sfinfo.channels ; k ++) - { const char * name ; - -#define CASE_NAME(x) case x : name = #x ; break ; - switch (channel_map [k]) - { CASE_NAME (SF_CHANNEL_MAP_INVALID) ; - CASE_NAME (SF_CHANNEL_MAP_MONO) ; - CASE_NAME (SF_CHANNEL_MAP_LEFT) ; - CASE_NAME (SF_CHANNEL_MAP_RIGHT) ; - CASE_NAME (SF_CHANNEL_MAP_CENTER) ; - CASE_NAME (SF_CHANNEL_MAP_FRONT_LEFT) ; - CASE_NAME (SF_CHANNEL_MAP_FRONT_RIGHT) ; - CASE_NAME (SF_CHANNEL_MAP_FRONT_CENTER) ; - CASE_NAME (SF_CHANNEL_MAP_REAR_CENTER) ; - CASE_NAME (SF_CHANNEL_MAP_REAR_LEFT) ; - CASE_NAME (SF_CHANNEL_MAP_REAR_RIGHT) ; - CASE_NAME (SF_CHANNEL_MAP_LFE) ; - CASE_NAME (SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER) ; - CASE_NAME (SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER) ; - CASE_NAME (SF_CHANNEL_MAP_SIDE_LEFT) ; - CASE_NAME (SF_CHANNEL_MAP_SIDE_RIGHT) ; - CASE_NAME (SF_CHANNEL_MAP_TOP_CENTER) ; - CASE_NAME (SF_CHANNEL_MAP_TOP_FRONT_LEFT) ; - CASE_NAME (SF_CHANNEL_MAP_TOP_FRONT_RIGHT) ; - CASE_NAME (SF_CHANNEL_MAP_TOP_FRONT_CENTER) ; - CASE_NAME (SF_CHANNEL_MAP_TOP_REAR_LEFT) ; - CASE_NAME (SF_CHANNEL_MAP_TOP_REAR_RIGHT) ; - CASE_NAME (SF_CHANNEL_MAP_TOP_REAR_CENTER) ; - CASE_NAME (SF_CHANNEL_MAP_MAX) ; - default : name = "default" ; - break ; - } ; - - printf (" %3d %s\n", k, name) ; - } ; - - putchar ('\n') ; - free (channel_map) ; - - return 0 ; -} /* chanmap_dump */ - -static int -cart_dump (const char *filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - SF_CART_INFO_VAR (1024) cart ; - int got_cart, k ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - memset (&cart, 0, sizeof (cart)) ; - - if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) - { printf ("Error : Not able to open input file %s.\n", filename) ; - fflush (stdout) ; - memset (data, 0, sizeof (data)) ; - puts (sf_strerror (NULL)) ; - return 1 ; - } ; - - got_cart = sf_command (file, SFC_GET_CART_INFO, &cart, sizeof (cart)) ; - sf_close (file) ; - - if (got_cart == SF_FALSE) - { printf ("Error : File '%s' does not contain cart information.\n\n", filename) ; - return 1 ; - } ; - - printf ("Version : %.*s\n", (int) sizeof (cart.version), cart.version) ; - printf ("Title : %.*s\n", (int) sizeof (cart.title), cart.title) ; - printf ("Artist : %.*s\n", (int) sizeof (cart.artist), cart.artist) ; - printf ("Cut id : %.*s\n", (int) sizeof (cart.cut_id), cart.cut_id) ; - printf ("Category : %.*s\n", (int) sizeof (cart.category), cart.category) ; - printf ("Classification : %.*s\n", (int) sizeof (cart.classification), cart.classification) ; - printf ("Out cue : %.*s\n", (int) sizeof (cart.out_cue), cart.out_cue) ; - printf ("Start date : %.*s\n", (int) sizeof (cart.start_date), cart.start_date) ; - printf ("Start time : %.*s\n", (int) sizeof (cart.start_time), cart.start_time) ; - printf ("End date : %.*s\n", (int) sizeof (cart.end_date), cart.end_date) ; - printf ("End time : %.*s\n", (int) sizeof (cart.end_time), cart.end_time) ; - printf ("App id : %.*s\n", (int) sizeof (cart.producer_app_id), cart.producer_app_id) ; - printf ("App version : %.*s\n", (int) sizeof (cart.producer_app_version), cart.producer_app_version) ; - printf ("User defined : %.*s\n", (int) sizeof (cart.user_def), cart.user_def) ; - printf ("Level ref. : %d\n", cart.level_reference) ; - printf ("Post timers :\n") ; - - for (k = 0 ; k < ARRAY_LEN (cart.post_timers) ; k++) - if (cart.post_timers [k].usage [0]) - printf (" %d %.*s %d\n", k, (int) sizeof (cart.post_timers [k].usage), cart.post_timers [k].usage, cart.post_timers [k].value) ; - - printf ("Reserved : %.*s\n", (int) sizeof (cart.reserved), cart.reserved) ; - printf ("Url : %.*s\n", (int) sizeof (cart.url), cart.url) ; - printf ("Tag text : %.*s\n", cart.tag_text_size, cart.tag_text) ; - - return 0 ; -} /* cart_dump */ - -static void -total_dump (void) -{ printf ("========================================\n") ; - printf ("Total Duration : %s\n", format_duration_str (total_seconds)) ; -} /* total_dump */ diff --git a/libs/libsndfile/programs/sndfile-interleave.c b/libs/libsndfile/programs/sndfile-interleave.c deleted file mode 100644 index 24d6b9d874..0000000000 --- a/libs/libsndfile/programs/sndfile-interleave.c +++ /dev/null @@ -1,202 +0,0 @@ -/* -** Copyright (C) 2009-2011 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#include - -#include "common.h" - -#define BUFFER_LEN 4096 -#define MAX_INPUTS 16 - - -typedef struct -{ SNDFILE * infile [MAX_INPUTS] ; - SNDFILE * outfile ; - - union - { double d [BUFFER_LEN] ; - int i [BUFFER_LEN] ; - } din ; - - union - - { double d [MAX_INPUTS * BUFFER_LEN] ; - int i [MAX_INPUTS * BUFFER_LEN] ; - } dout ; - - int channels ; -} STATE ; - - -static void usage_exit (void) ; -static void interleave_int (STATE * state) ; -static void interleave_double (STATE * state) ; - - -int -main (int argc, char **argv) -{ STATE state ; - SF_INFO sfinfo ; - int k, double_merge = 0 ; - - if (argc < 5) - { if (argc > 1) - puts ("\nError : need at least 2 input files.") ; - usage_exit () ; - } ; - - if (strcmp (argv [argc - 2], "-o") != 0) - { puts ("\nError : second last command line parameter should be '-o'.\n") ; - usage_exit () ; - } ; - - if (argc - 3 > MAX_INPUTS) - { printf ("\nError : Cannot handle more than %d input channels.\n\n", MAX_INPUTS) ; - exit (1) ; - } ; - - memset (&state, 0, sizeof (state)) ; - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - for (k = 1 ; k < argc - 2 ; k++) - { - if ((state.infile [k - 1] = sf_open (argv [k], SFM_READ, &sfinfo)) == NULL) - { printf ("\nError : Not able to open input file '%s'\n%s\n", argv [k], sf_strerror (NULL)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\bError : Input file '%s' should be mono (has %d channels).\n", argv [k], sfinfo.channels) ; - exit (1) ; - } ; - - switch (sfinfo.format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_FLOAT : - case SF_FORMAT_DOUBLE : - case SF_FORMAT_VORBIS : - double_merge = 1 ; - break ; - - default : - break ; - } ; - - state.channels ++ ; - } ; - - sfinfo.channels = state.channels ; - sfinfo.format = sfe_file_type_of_ext (argv [argc - 1], sfinfo.format) ; - - if ((state.outfile = sf_open (argv [argc - 1], SFM_WRITE, &sfinfo)) == NULL) - { printf ("Not able to open output file '%s'\n%s\n", argv [argc - 1], sf_strerror (NULL)) ; - exit (1) ; - } ; - - if (double_merge) - interleave_double (&state) ; - else - interleave_int (&state) ; - - for (k = 0 ; k < MAX_INPUTS ; k++) - if (state.infile [k] != NULL) - sf_close (state.infile [k]) ; - sf_close (state.outfile) ; - - return 0 ; -} /* main */ - -/*------------------------------------------------------------------------------ -*/ - - -static void -usage_exit (void) -{ puts ("\nUsage : sndfile-interleave ... -o \n") ; - puts ("Merge two or more mono files into a single multi-channel file.\n") ; - printf ("Using %s.\n\n", sf_version_string ()) ; - exit (0) ; -} /* usage_exit */ - - -static void -interleave_int (STATE * state) -{ int max_read_len, read_len ; - int ch, k ; - - do - { max_read_len = 0 ; - - for (ch = 0 ; ch < state->channels ; ch ++) - { read_len = sf_read_int (state->infile [ch], state->din.i, BUFFER_LEN) ; - if (read_len < BUFFER_LEN) - memset (state->din.i + read_len, 0, sizeof (state->din.i [0]) * (BUFFER_LEN - read_len)) ; - - for (k = 0 ; k < read_len ; k++) - state->dout.i [k * state->channels + ch] = state->din.i [k] ; - - max_read_len = MAX (max_read_len, read_len) ; - } ; - - sf_writef_int (state->outfile, state->dout.i, max_read_len) ; - } - while (max_read_len > 0) ; - -} /* interleave_int */ - - -static void -interleave_double (STATE * state) -{ int max_read_len, read_len ; - int ch, k ; - - do - { max_read_len = 0 ; - - for (ch = 0 ; ch < state->channels ; ch ++) - { read_len = sf_read_double (state->infile [ch], state->din.d, BUFFER_LEN) ; - if (read_len < BUFFER_LEN) - memset (state->din.d + read_len, 0, sizeof (state->din.d [0]) * (BUFFER_LEN - read_len)) ; - - for (k = 0 ; k < read_len ; k++) - state->dout.d [k * state->channels + ch] = state->din.d [k] ; - - max_read_len = MAX (max_read_len, read_len) ; - } ; - - sf_writef_double (state->outfile, state->dout.d, max_read_len) ; - } - while (max_read_len > 0) ; - -} /* interleave_double */ diff --git a/libs/libsndfile/programs/sndfile-jackplay.c b/libs/libsndfile/programs/sndfile-jackplay.c deleted file mode 100644 index 87b722de2f..0000000000 --- a/libs/libsndfile/programs/sndfile-jackplay.c +++ /dev/null @@ -1,277 +0,0 @@ -/* -** Copyright (c) 2007-2009 Erik de Castro Lopo -** Copyright (C) 2007 Jonatan Liljedahl -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#if HAVE_JACK - -#include -#include - -#include -#include - -#include - -#define RB_SIZE (1 << 16) - -typedef struct _thread_info -{ pthread_t thread_id ; - SNDFILE *sndfile ; - jack_nframes_t pos ; - jack_client_t *client ; - unsigned int channels ; - volatile int can_process ; - volatile int read_done ; - volatile int play_done ; -} thread_info_t ; - -pthread_mutex_t disk_thread_lock = PTHREAD_MUTEX_INITIALIZER ; -pthread_cond_t data_ready = PTHREAD_COND_INITIALIZER ; - -static jack_ringbuffer_t *ringbuf ; -static jack_port_t **output_port ; -static jack_default_audio_sample_t ** outs ; -const size_t sample_size = sizeof (jack_default_audio_sample_t) ; - -static int -process (jack_nframes_t nframes, void * arg) -{ - thread_info_t *info = (thread_info_t *) arg ; - jack_default_audio_sample_t buf [info->channels] ; - unsigned i, n ; - - if (! info->can_process) - return 0 ; - - for (n = 0 ; n < info->channels ; n++) - outs [n] = jack_port_get_buffer (output_port [n], nframes) ; - - for (i = 0 ; i < nframes ; i++) - { size_t read_cnt ; - - /* Read one frame of audio. */ - read_cnt = jack_ringbuffer_read (ringbuf, (void*) buf, sample_size*info->channels) ; - if (read_cnt == 0 && info->read_done) - { /* File is done, so stop the main loop. */ - info->play_done = 1 ; - return 0 ; - } ; - - /* Update play-position counter. */ - info->pos += read_cnt / (sample_size*info->channels) ; - - /* Output each channel of the frame. */ - for (n = 0 ; n < info->channels ; n++) - outs [n][i] = buf [n] ; - } ; - - /* Wake up the disk thread to read more data. */ - if (pthread_mutex_trylock (&disk_thread_lock) == 0) - { pthread_cond_signal (&data_ready) ; - pthread_mutex_unlock (&disk_thread_lock) ; - } ; - - return 0 ; -} /* process */ - -static void * -disk_thread (void *arg) -{ thread_info_t *info = (thread_info_t *) arg ; - sf_count_t buf_avail, read_frames ; - jack_ringbuffer_data_t vec [2] ; - size_t bytes_per_frame = sample_size*info->channels ; - - pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL) ; - pthread_mutex_lock (&disk_thread_lock) ; - - while (1) - { jack_ringbuffer_get_write_vector (ringbuf, vec) ; - - read_frames = 0 ; - - if (vec [0].len) - { /* Fill the first part of the ringbuffer. */ - buf_avail = vec [0].len / bytes_per_frame ; - read_frames = sf_readf_float (info->sndfile, (float *) vec [0].buf, buf_avail) ; - if (vec [1].len) - { /* Fill the second part of the ringbuffer? */ - buf_avail = vec [1].len / bytes_per_frame ; - read_frames += sf_readf_float (info->sndfile, (float *) vec [1].buf, buf_avail) ; - } ; - } ; - - if (read_frames == 0) - break ; /* end of file? */ - - jack_ringbuffer_write_advance (ringbuf, read_frames * bytes_per_frame) ; - - /* Tell process that we've filled the ringbuffer. */ - info->can_process = 1 ; - - /* Wait for the process thread to wake us up. */ - pthread_cond_wait (&data_ready, &disk_thread_lock) ; - } ; - - /* Tell that we're done reading the file. */ - info->read_done = 1 ; - pthread_mutex_unlock (&disk_thread_lock) ; - - return 0 ; -} /* disk_thread */ - -static void -jack_shutdown (void *arg) -{ (void) arg ; - exit (1) ; -} /* jack_shutdown */ - -static void -print_time (jack_nframes_t pos, int jack_sr) -{ float sec = pos / (1.0 * jack_sr) ; - int min = sec / 60.0 ; - fprintf (stderr, "%02d:%05.2f", min, fmod (sec, 60.0)) ; -} /* print_time */ - -int -main (int narg, char * args []) -{ - SNDFILE *sndfile ; - SF_INFO sndfileinfo ; - jack_client_t *client ; - thread_info_t info ; - int i, jack_sr ; - - if (narg < 2) - { fprintf (stderr, "no soundfile given\n") ; - return 1 ; - } ; - - // create jack client - if ((client = jack_client_new ("jackplay")) == 0) - { - fprintf (stderr, "Jack server not running?\n") ; - return 1 ; - } ; - - jack_sr = jack_get_sample_rate (client) ; - - /* Open the soundfile. */ - sndfileinfo.format = 0 ; - sndfile = sf_open (args [1], SFM_READ, &sndfileinfo) ; - if (sndfile == NULL) - { fprintf (stderr, "Could not open soundfile '%s'\n", args [1]) ; - return 1 ; - } ; - - fprintf (stderr, "Channels : %d\nSample rate : %d Hz\nDuration : ", sndfileinfo.channels, sndfileinfo.samplerate) ; - - print_time (sndfileinfo.frames, sndfileinfo.samplerate) ; - fprintf (stderr, "\n") ; - - if (sndfileinfo.samplerate != jack_sr) - fprintf (stderr, "Warning: samplerate of soundfile (%d Hz) does not match jack server (%d Hz).\n", sndfileinfo.samplerate, jack_sr) ; - - /* Init the thread info struct. */ - memset (&info, 0, sizeof (info)) ; - info.can_process = 0 ; - info.read_done = 0 ; - info.play_done = 0 ; - info.sndfile = sndfile ; - info.channels = sndfileinfo.channels ; - info.client = client ; - info.pos = 0 ; - - /* Set up callbacks. */ - jack_set_process_callback (client, process, &info) ; - jack_on_shutdown (client, jack_shutdown, 0) ; - - /* Allocate output ports. */ - output_port = calloc (sndfileinfo.channels, sizeof (jack_port_t *)) ; - outs = calloc (sndfileinfo.channels, sizeof (jack_default_audio_sample_t *)) ; - for (i = 0 ; i < sndfileinfo.channels ; i++) - { char name [16] ; - - snprintf (name, sizeof (name), "out_%d", i + 1) ; - output_port [i] = jack_port_register (client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0) ; - } ; - - /* Allocate and clear ringbuffer. */ - ringbuf = jack_ringbuffer_create (sizeof (jack_default_audio_sample_t) * RB_SIZE) ; - memset (ringbuf->buf, 0, ringbuf->size) ; - - /* Activate client. */ - if (jack_activate (client)) - { fprintf (stderr, "Cannot activate client.\n") ; - return 1 ; - } ; - - /* Auto connect all channels. */ - for (i = 0 ; i < sndfileinfo.channels ; i++) - { char name [64] ; - - snprintf (name, sizeof (name), "alsa_pcm:playback_%d", i + 1) ; - - if (jack_connect (client, jack_port_name (output_port [i]), name)) - fprintf (stderr, "Cannot connect output port %d (%s).\n", i, name) ; - } ; - - /* Start the disk thread. */ - pthread_create (&info.thread_id, NULL, disk_thread, &info) ; - - /* Sit in a loop, displaying the current play position. */ - while (! info.play_done) - { fprintf (stderr, "\r-> ") ; - print_time (info.pos, jack_sr) ; - fflush (stdout) ; - usleep (50000) ; - } ; - - /* Clean up. */ - jack_client_close (client) ; - jack_ringbuffer_free (ringbuf) ; - sf_close (sndfile) ; - free (outs) ; - free (output_port) ; - - puts ("") ; - - return 0 ; -} /* main */ - -#else - -int -main (void) -{ - puts ( - "Sorry this program was compiled without libjack (which probably\n" - "only exists on Linux and Mac OSX) and hence doesn't work." - ) ; - - return 0 ; -} /* main */ - -#endif diff --git a/libs/libsndfile/programs/sndfile-metadata-get.c b/libs/libsndfile/programs/sndfile-metadata-get.c deleted file mode 100644 index b4aa9b60f0..0000000000 --- a/libs/libsndfile/programs/sndfile-metadata-get.c +++ /dev/null @@ -1,176 +0,0 @@ -/* -** Copyright (C) 2008-2012 Erik de Castro Lopo -** Copyright (C) 2008-2010 George Blood Audio -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include - -#include -#include -#include -#include -#include - -#include - -#include "common.h" - -#define BUFFER_LEN (1 << 16) - -static void usage_exit (const char *progname, int exit_code) ; -static void process_args (SNDFILE * file, const SF_BROADCAST_INFO_2K * binfo, int argc, char * argv []) ; - -int -main (int argc, char *argv []) -{ SNDFILE *file ; - SF_INFO sfinfo ; - SF_BROADCAST_INFO_2K binfo ; - const char *progname ; - const char * filename = NULL ; - int start ; - - /* Store the program name. */ - progname = program_name (argv [0]) ; - - /* Check if we've been asked for help. */ - if (argc <= 2 || strcmp (argv [1], "--help") == 0 || strcmp (argv [1], "-h") == 0) - usage_exit (progname, 0) ; - - if (argv [argc - 1][0] != '-') - { filename = argv [argc - 1] ; - start = 1 ; - } - else if (argv [1][0] != '-') - { filename = argv [1] ; - start = 2 ; - } - else - { printf ("Error : Either the first or the last command line parameter should be a filename.\n\n") ; - exit (1) ; - } ; - - /* Get the time in case we need it later. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) - { printf ("Error : Open of file '%s' failed : %s\n\n", filename, sf_strerror (file)) ; - exit (1) ; - } ; - - memset (&binfo, 0, sizeof (binfo)) ; - if (sf_command (file, SFC_GET_BROADCAST_INFO, &binfo, sizeof (binfo)) == 0) - memset (&binfo, 0, sizeof (binfo)) ; - - process_args (file, &binfo, argc - 2, argv + start) ; - - sf_close (file) ; - return 0 ; -} /* main */ - -/*============================================================================== -** Print version and usage. -*/ - -static void -usage_exit (const char *progname, int exit_code) -{ printf ("\nUsage :\n %s [options] \n\nOptions:\n", progname) ; - - puts ( - " --bext-description Print the 'bext' description.\n" - " --bext-originator Print the 'bext; originator info.\n" - " --bext-orig-ref Print the 'bext' origination reference.\n" - " --bext-umid Print the 'bext' UMID.\n" - " --bext-orig-date Print the 'bext' origination date.\n" - " --bext-orig-time Print the 'bext' origination time.\n" - " --bext-coding-hist Print the 'bext' coding history.\n" - ) ; - - puts ( - " --str-title Print the title metadata.\n" - " --str-copyright Print the copyright metadata.\n" - " --str-artist Print the artist metadata.\n" - " --str-comment Print the comment metadata.\n" - " --str-date Print the creation date metadata.\n" - " --str-album Print the album metadata.\n" - " --str-license Print the license metadata.\n" - ) ; - - printf ("Using %s.\n\n", sf_version_string ()) ; - exit (exit_code) ; -} /* usage_exit */ - -static void -process_args (SNDFILE * file, const SF_BROADCAST_INFO_2K * binfo, int argc, char * argv []) -{ const char * str ; - int k, do_all = 0 ; - -#define HANDLE_BEXT_ARG(cmd, name, field) \ - if (do_all || strcmp (argv [k], cmd) == 0) \ - { printf ("%-20s : %.*s\n", name, (int) sizeof (binfo->field), binfo->field) ; \ - if (! do_all) \ - continue ; \ - } ; - -#define HANDLE_STR_ARG(cmd, name, id) \ - if (do_all || strcmp (argv [k], cmd) == 0) \ - { str = sf_get_string (file, id) ; \ - printf ("%-20s : %s\n", name, str ? str : "") ; \ - if (! do_all) continue ; \ - } ; - - for (k = 0 ; k < argc ; k++) - { if (do_all || strcmp (argv [k], "--all") == 0) - do_all = 1 ; - - HANDLE_BEXT_ARG ("--bext-description", "Description", description) ; - HANDLE_BEXT_ARG ("--bext-originator", "Originator", originator) ; - HANDLE_BEXT_ARG ("--bext-orig-ref", "Origination ref", originator_reference) ; - HANDLE_BEXT_ARG ("--bext-umid", "UMID", umid) ; - HANDLE_BEXT_ARG ("--bext-orig-date", "Origination date", origination_date) ; - HANDLE_BEXT_ARG ("--bext-orig-time", "Origination time", origination_time) ; - HANDLE_BEXT_ARG ("--bext-coding-hist", "Coding history", coding_history) ; - - HANDLE_STR_ARG ("--str-title", "Name", SF_STR_TITLE) ; - HANDLE_STR_ARG ("--str-copyright", "Copyright", SF_STR_COPYRIGHT) ; - HANDLE_STR_ARG ("--str-artist", "Artist", SF_STR_ARTIST) ; - HANDLE_STR_ARG ("--str-comment", "Comment", SF_STR_COMMENT) ; - HANDLE_STR_ARG ("--str-date", "Create date", SF_STR_DATE) ; - HANDLE_STR_ARG ("--str-album", "Album", SF_STR_ALBUM) ; - HANDLE_STR_ARG ("--str-license", "License", SF_STR_LICENSE) ; - - if (! do_all) - { printf ("Error : Don't know what to do with command line arg '%s'.\n\n", argv [k]) ; - exit (1) ; - } ; - break ; - } ; - - return ; -} /* process_args */ diff --git a/libs/libsndfile/programs/sndfile-metadata-set.c b/libs/libsndfile/programs/sndfile-metadata-set.c deleted file mode 100644 index b1d021a888..0000000000 --- a/libs/libsndfile/programs/sndfile-metadata-set.c +++ /dev/null @@ -1,284 +0,0 @@ -/* -** Copyright (C) 2008-2012 Erik de Castro Lopo -** Copyright (C) 2008-2010 George Blood Audio -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include - -#include -#include -#include -#include -#include - -#include - -#include "common.h" - -#define BUFFER_LEN (1 << 16) - - -static void usage_exit (const char *progname, int exit_code) ; -static void missing_param (const char * option) ; -static void read_localtime (struct tm * timedata) ; -static int has_bext_fields_set (const METADATA_INFO * info) ; - -int -main (int argc, char *argv []) -{ METADATA_INFO info ; - struct tm timedata ; - const char *progname ; - const char * filenames [2] = { NULL, NULL } ; - int k ; - - /* Store the program name. */ - progname = program_name (argv [0]) ; - - /* Check if we've been asked for help. */ - if (argc < 3 || strcmp (argv [1], "--help") == 0 || strcmp (argv [1], "-h") == 0) - usage_exit (progname, 0) ; - - /* Clear set all fields of the struct to zero bytes. */ - memset (&info, 0, sizeof (info)) ; - - /* Get the time in case we need it later. */ - read_localtime (&timedata) ; - - for (k = 1 ; k < argc ; k++) - { char tmp [20] ; - - if (argv [k][0] != '-') - { if (filenames [0] == NULL) - filenames [0] = argv [k] ; - else if (filenames [1] == NULL) - filenames [1] = argv [k] ; - else - { printf ("Error : Already have two file names on the command line and then found '%s'.\n\n", argv [k]) ; - usage_exit (progname, 1) ; - } ; - continue ; - } ; - -#define HANDLE_BEXT_ARG(cmd, field) \ - if (strcmp (argv [k], cmd) == 0) \ - { k ++ ; \ - if (k == argc) missing_param (argv [k - 1]) ; \ - info.field = argv [k] ; \ - continue ; \ - } ; - - HANDLE_BEXT_ARG ("--bext-description", description) ; - HANDLE_BEXT_ARG ("--bext-originator", originator) ; - HANDLE_BEXT_ARG ("--bext-orig-ref", originator_reference) ; - HANDLE_BEXT_ARG ("--bext-umid", umid) ; - HANDLE_BEXT_ARG ("--bext-orig-date", origination_date) ; - HANDLE_BEXT_ARG ("--bext-orig-time", origination_time) ; - HANDLE_BEXT_ARG ("--bext-coding-hist", coding_history) ; - HANDLE_BEXT_ARG ("--bext-time-ref", time_ref) ; - -#define HANDLE_STR_ARG(cmd, field) \ - if (strcmp (argv [k], cmd) == 0) \ - { k ++ ; \ - if (k == argc) missing_param (argv [k - 1]) ; \ - info.field = argv [k] ; \ - continue ; \ - } ; - - HANDLE_STR_ARG ("--str-comment", comment) ; - HANDLE_STR_ARG ("--str-title", title) ; - HANDLE_STR_ARG ("--str-copyright", copyright) ; - HANDLE_STR_ARG ("--str-artist", artist) ; - HANDLE_STR_ARG ("--str-date", date) ; - HANDLE_STR_ARG ("--str-album", album) ; - HANDLE_STR_ARG ("--str-license", license) ; - - /* Following options do not take an argument. */ - if (strcmp (argv [k], "--bext-auto-time-date") == 0) - { snprintf (tmp, sizeof (tmp), "%02d:%02d:%02d", timedata.tm_hour, timedata.tm_min, timedata.tm_sec) ; - info.origination_time = strdup (tmp) ; - - snprintf (tmp, sizeof (tmp), "%04d-%02d-%02d", timedata.tm_year + 1900, timedata.tm_mon + 1, timedata.tm_mday) ; - info.origination_date = strdup (tmp) ; - continue ; - } ; - - if (strcmp (argv [k], "--bext-auto-time") == 0) - { snprintf (tmp, sizeof (tmp), "%02d:%02d:%02d", timedata.tm_hour, timedata.tm_min, timedata.tm_sec) ; - info.origination_time = strdup (tmp) ; - continue ; - } ; - - if (strcmp (argv [k], "--bext-auto-date") == 0) - { snprintf (tmp, sizeof (tmp), "%04d-%02d-%02d", timedata.tm_year + 1900, timedata.tm_mon + 1, timedata.tm_mday) ; - info.origination_date = strdup (tmp) ; - continue ; - } ; - - if (strcmp (argv [k], "--str-auto-date") == 0) - { snprintf (tmp, sizeof (tmp), "%04d-%02d-%02d", timedata.tm_year + 1900, timedata.tm_mon + 1, timedata.tm_mday) ; - - info.date = strdup (tmp) ; - continue ; - } ; - - printf ("Error : Don't know what to do with command line arg '%s'.\n\n", argv [k]) ; - usage_exit (progname, 1) ; - } ; - - /* Find out if any of the 'bext' fields are set. */ - info.has_bext_fields = has_bext_fields_set (&info) ; - - if (filenames [0] == NULL) - { printf ("Error : No input file specificed.\n\n") ; - exit (1) ; - } ; - - if (filenames [1] != NULL && strcmp (filenames [0], filenames [1]) == 0) - { printf ("Error : Input and output files are the same.\n\n") ; - exit (1) ; - } ; - - if (info.coding_history != NULL && filenames [1] == NULL) - { printf ("\n" - "Error : Trying to update coding history of an existing file which unfortunately\n" - " is not supported. Instead, create a new file using :\n" - "\n" - " %s --bext-coding-hist \"Coding history\" old_file.wav new_file.wav\n" - "\n", - progname) ; - exit (1) ; - } ; - - sfe_apply_metadata_changes (filenames, &info) ; - - return 0 ; -} /* main */ - -/*============================================================================== -** Print version and usage. -*/ - -static void -usage_exit (const char *progname, int exit_code) -{ printf ("\nUsage :\n\n" - " %s [options] \n" - " %s [options] \n" - "\n", - progname, progname) ; - - puts ( - "Where an option is made up of a pair of a field to set (one of\n" - "the 'bext' or metadata fields below) and a string. Fields are\n" - "as follows :\n" - ) ; - - puts ( - " --bext-description Set the 'bext' description.\n" - " --bext-originator Set the 'bext' originator.\n" - " --bext-orig-ref Set the 'bext' originator reference.\n" - " --bext-umid Set the 'bext' UMID.\n" - " --bext-orig-date Set the 'bext' origination date.\n" - " --bext-orig-time Set the 'bext' origination time.\n" - " --bext-coding-hist Set the 'bext' coding history.\n" - " --bext-time-raf Set the 'bext' Time ref.\n" - "\n" - " --str-comment Set the metadata comment.\n" - " --str-title Set the metadata title.\n" - " --str-copyright Set the metadata copyright.\n" - " --str-artist Set the metadata artist.\n" - " --str-date Set the metadata date.\n" - " --str-album Set the metadata album.\n" - " --str-license Set the metadata license.\n" - ) ; - - puts ( - "There are also the following arguments which do not take a\n" - "parameter :\n\n" - " --bext-auto-time-date Set the 'bext' time and date to current time/date.\n" - " --bext-auto-time Set the 'bext' time to current time.\n" - " --bext-auto-date Set the 'bext' date to current date.\n" - " --str-auto-date Set the metadata date to current date.\n" - ) ; - - puts ( - "Most of the above operations can be done in-place on an existing\n" - "file. If any operation cannot be performed, the application will\n" - "exit with an appropriate error message.\n" - ) ; - - printf ("Using %s.\n\n", sf_version_string ()) ; - exit (exit_code) ; -} /* usage_exit */ - -static void -missing_param (const char * option) -{ - printf ("Error : Option '%s' needs a parameter but doesn't seem to have one.\n\n", option) ; - exit (1) ; -} /* missing_param */ - -/*============================================================================== -*/ - -static int -has_bext_fields_set (const METADATA_INFO * info) -{ - if (info->description || info->originator || info->originator_reference) - return 1 ; - - if (info->origination_date || info->origination_time || info->umid || info->coding_history || info->time_ref) - return 1 ; - - return 0 ; -} /* has_bext_fields_set */ - -static void -read_localtime (struct tm * timedata) -{ time_t current ; - - time (¤t) ; - memset (timedata, 0, sizeof (struct tm)) ; - -#if defined (HAVE_LOCALTIME_R) - /* If the re-entrant version is available, use it. */ - localtime_r (¤t, timedata) ; -#elif defined (HAVE_LOCALTIME) - { - struct tm *tmptr ; - /* Otherwise use the standard one and copy the data to local storage. */ - if ((tmptr = localtime (¤t)) != NULL) - memcpy (timedata, tmptr, sizeof (struct tm)) ; - } -#endif - - return ; -} /* read_localtime */ - diff --git a/libs/libsndfile/programs/sndfile-play-beos.cpp b/libs/libsndfile/programs/sndfile-play-beos.cpp deleted file mode 100644 index fb3fde4cdc..0000000000 --- a/libs/libsndfile/programs/sndfile-play-beos.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* -** Copyright (C) 2001 Marcus Overhagen -** -** 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. -*/ - -#include - -#include -#include -#include - -#include - -#define BUFFER_LEN 1024 - -/*------------------------------------------------------------------------------ -** BeOS functions for playing a sound. -*/ - -#if defined (__BEOS__) - -struct shared_data -{ - BSoundPlayer *player; - SNDFILE *sndfile; - SF_INFO sfinfo; - sem_id finished; -}; - -static void -buffer_callback(void *theCookie, void *buf, size_t size, const media_raw_audio_format &format) -{ - shared_data *data = (shared_data *)theCookie; - short *buffer = (short *)buf; - int count = size / sizeof(short); - int m, readcount; - - if (!data->player->HasData()) - return; - - readcount = sf_read_short(data->sndfile, buffer, count); - if (readcount == 0) - { data->player->SetHasData(false); - release_sem(data->finished); - } - if (readcount < count) - { for (m = readcount ; m < count ; m++) - buffer [m] = 0 ; - } - if (data->sfinfo.pcmbitwidth < 16) - { for (m = 0 ; m < count ; m++) - buffer [m] *= 256 ; - } -} - -static void -beos_play (int argc, char *argv []) -{ - shared_data data; - status_t status; - int k; - - /* BSoundPlayer requires a BApplication object */ - BApplication app("application/x-vnd.MarcusOverhagen-sfplay"); - - for (k = 1 ; k < argc ; k++) - { printf ("Playing %s\n", argv [k]) ; - if (! (data.sndfile = sf_open_read (argv [k], &data.sfinfo))) - { sf_perror (NULL) ; - continue ; - } ; - - if (data.sfinfo.channels < 1 || data.sfinfo.channels > 2) - { printf ("Error : channels = %d.\n", data.sfinfo.channels) ; - sf_close (data.sndfile) ; - continue ; - } ; - - data.finished = create_sem(0,"finished"); - - media_raw_audio_format format = - { data.sfinfo.samplerate, - data.sfinfo.channels, - media_raw_audio_format::B_AUDIO_SHORT, - B_HOST_IS_LENDIAN ? B_MEDIA_LITTLE_ENDIAN : B_MEDIA_BIG_ENDIAN, - BUFFER_LEN * sizeof(short) - }; - - BSoundPlayer player(&format,"player",buffer_callback,NULL,&data); - data.player = &player; - - if ((status = player.InitCheck()) != B_OK) - { - printf ("Error : BSoundPlayer init failed, %s.\n", strerror(status)) ; - delete_sem(data.finished); - sf_close (data.sndfile) ; - continue ; - } - - player.SetVolume(1.0); - player.Start(); - player.SetHasData(true); - acquire_sem(data.finished); - player.Stop(); - delete_sem(data.finished); - - sf_close (data.sndfile) ; - - } ; - -} /* beos_play */ - -#endif - -/*============================================================================== -** Main function. -*/ - -int -main (int argc, char *argv []) -{ - if (argc < 2) - { printf ("Usage : %s \n\n", argv [0]) ; - return 1 ; - } ; - - beos_play (argc, argv) ; - - return 0 ; -} /* main */ - diff --git a/libs/libsndfile/programs/sndfile-play.c b/libs/libsndfile/programs/sndfile-play.c deleted file mode 100644 index f779f11a86..0000000000 --- a/libs/libsndfile/programs/sndfile-play.c +++ /dev/null @@ -1,1211 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "common.h" - -#if HAVE_ALSA_ASOUNDLIB_H - #define ALSA_PCM_NEW_HW_PARAMS_API - #define ALSA_PCM_NEW_SW_PARAMS_API - #include - #include -#endif - -#if defined (__ANDROID__) - -#elif defined (__linux__) || defined (__FreeBSD_kernel__) || defined (__FreeBSD__) - #include - #include - #include - -#elif (defined (__MACH__) && defined (__APPLE__)) - #include - #include - - #if (OSX_DARWIN_VERSION > 11) - /* Includes go here. */ - #elif (OSX_DARWIN_VERSION == 11) - #include - #elif (OSX_DARWIN_VERSION > 0 && OSX_DARWIN_VERSION <= 10) - #include - #include - #endif - -#elif defined (HAVE_SNDIO_H) - #include - -#elif (defined (sun) && defined (unix)) - #include - #include - #include - -#elif (OS_IS_WIN32 == 1) - #include - #include - -#endif - -#define SIGNED_SIZEOF(x) ((int) sizeof (x)) -#define BUFFER_LEN (2048) - -/*------------------------------------------------------------------------------ -** Linux/OSS functions for playing a sound. -*/ - -#if HAVE_ALSA_ASOUNDLIB_H - -static snd_pcm_t * alsa_open (int channels, unsigned srate, int realtime) ; -static int alsa_write_float (snd_pcm_t *alsa_dev, float *data, int frames, int channels) ; - -static void -alsa_play (int argc, char *argv []) -{ static float buffer [BUFFER_LEN] ; - SNDFILE *sndfile ; - SF_INFO sfinfo ; - snd_pcm_t * alsa_dev ; - int k, readcount, subformat ; - - for (k = 1 ; k < argc ; k++) - { memset (&sfinfo, 0, sizeof (sfinfo)) ; - - printf ("Playing %s\n", argv [k]) ; - if (! (sndfile = sf_open (argv [k], SFM_READ, &sfinfo))) - { puts (sf_strerror (NULL)) ; - continue ; - } ; - - if (sfinfo.channels < 1 || sfinfo.channels > 2) - { printf ("Error : channels = %d.\n", sfinfo.channels) ; - continue ; - } ; - - if ((alsa_dev = alsa_open (sfinfo.channels, (unsigned) sfinfo.samplerate, SF_FALSE)) == NULL) - continue ; - - subformat = sfinfo.format & SF_FORMAT_SUBMASK ; - - if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) - { double scale ; - int m ; - - sf_command (sndfile, SFC_CALC_SIGNAL_MAX, &scale, sizeof (scale)) ; - if (scale < 1e-10) - scale = 1.0 ; - else - scale = 32700.0 / scale ; - - while ((readcount = sf_read_float (sndfile, buffer, BUFFER_LEN))) - { for (m = 0 ; m < readcount ; m++) - buffer [m] *= scale ; - alsa_write_float (alsa_dev, buffer, BUFFER_LEN / sfinfo.channels, sfinfo.channels) ; - } ; - } - else - { while ((readcount = sf_read_float (sndfile, buffer, BUFFER_LEN))) - alsa_write_float (alsa_dev, buffer, BUFFER_LEN / sfinfo.channels, sfinfo.channels) ; - } ; - - snd_pcm_drain (alsa_dev) ; - snd_pcm_close (alsa_dev) ; - - sf_close (sndfile) ; - } ; - - return ; -} /* alsa_play */ - -static snd_pcm_t * -alsa_open (int channels, unsigned samplerate, int realtime) -{ const char * device = "default" ; - snd_pcm_t *alsa_dev = NULL ; - snd_pcm_hw_params_t *hw_params ; - snd_pcm_uframes_t buffer_size ; - snd_pcm_uframes_t alsa_period_size, alsa_buffer_frames ; - snd_pcm_sw_params_t *sw_params ; - - int err ; - - if (realtime) - { alsa_period_size = 256 ; - alsa_buffer_frames = 3 * alsa_period_size ; - } - else - { alsa_period_size = 1024 ; - alsa_buffer_frames = 4 * alsa_period_size ; - } ; - - if ((err = snd_pcm_open (&alsa_dev, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) - { fprintf (stderr, "cannot open audio device \"%s\" (%s)\n", device, snd_strerror (err)) ; - goto catch_error ; - } ; - - snd_pcm_nonblock (alsa_dev, 0) ; - - if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) - { fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params_any (alsa_dev, hw_params)) < 0) - { fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params_set_access (alsa_dev, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) - { fprintf (stderr, "cannot set access type (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params_set_format (alsa_dev, hw_params, SND_PCM_FORMAT_FLOAT)) < 0) - { fprintf (stderr, "cannot set sample format (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params_set_rate_near (alsa_dev, hw_params, &samplerate, 0)) < 0) - { fprintf (stderr, "cannot set sample rate (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params_set_channels (alsa_dev, hw_params, channels)) < 0) - { fprintf (stderr, "cannot set channel count (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params_set_buffer_size_near (alsa_dev, hw_params, &alsa_buffer_frames)) < 0) - { fprintf (stderr, "cannot set buffer size (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params_set_period_size_near (alsa_dev, hw_params, &alsa_period_size, 0)) < 0) - { fprintf (stderr, "cannot set period size (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_hw_params (alsa_dev, hw_params)) < 0) - { fprintf (stderr, "cannot set parameters (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - /* extra check: if we have only one period, this code won't work */ - snd_pcm_hw_params_get_period_size (hw_params, &alsa_period_size, 0) ; - snd_pcm_hw_params_get_buffer_size (hw_params, &buffer_size) ; - if (alsa_period_size == buffer_size) - { fprintf (stderr, "Can't use period equal to buffer size (%lu == %lu)", alsa_period_size, buffer_size) ; - goto catch_error ; - } ; - - snd_pcm_hw_params_free (hw_params) ; - - if ((err = snd_pcm_sw_params_malloc (&sw_params)) != 0) - { fprintf (stderr, "%s: snd_pcm_sw_params_malloc: %s", __func__, snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_sw_params_current (alsa_dev, sw_params)) != 0) - { fprintf (stderr, "%s: snd_pcm_sw_params_current: %s", __func__, snd_strerror (err)) ; - goto catch_error ; - } ; - - /* note: set start threshold to delay start until the ring buffer is full */ - snd_pcm_sw_params_current (alsa_dev, sw_params) ; - - if ((err = snd_pcm_sw_params_set_start_threshold (alsa_dev, sw_params, buffer_size)) < 0) - { fprintf (stderr, "cannot set start threshold (%s)\n", snd_strerror (err)) ; - goto catch_error ; - } ; - - if ((err = snd_pcm_sw_params (alsa_dev, sw_params)) != 0) - { fprintf (stderr, "%s: snd_pcm_sw_params: %s", __func__, snd_strerror (err)) ; - goto catch_error ; - } ; - - snd_pcm_sw_params_free (sw_params) ; - - snd_pcm_reset (alsa_dev) ; - -catch_error : - - if (err < 0 && alsa_dev != NULL) - { snd_pcm_close (alsa_dev) ; - return NULL ; - } ; - - return alsa_dev ; -} /* alsa_open */ - -static int -alsa_write_float (snd_pcm_t *alsa_dev, float *data, int frames, int channels) -{ static int epipe_count = 0 ; - - int total = 0 ; - int retval ; - - if (epipe_count > 0) - epipe_count -- ; - - while (total < frames) - { retval = snd_pcm_writei (alsa_dev, data + total * channels, frames - total) ; - - if (retval >= 0) - { total += retval ; - if (total == frames) - return total ; - - continue ; - } ; - - switch (retval) - { case -EAGAIN : - puts ("alsa_write_float: EAGAIN") ; - continue ; - break ; - - case -EPIPE : - if (epipe_count > 0) - { printf ("alsa_write_float: EPIPE %d\n", epipe_count) ; - if (epipe_count > 140) - return retval ; - } ; - epipe_count += 100 ; - -#if 0 - if (0) - { snd_pcm_status_t *status ; - - snd_pcm_status_alloca (&status) ; - if ((retval = snd_pcm_status (alsa_dev, status)) < 0) - fprintf (stderr, "alsa_out: xrun. can't determine length\n") ; - else if (snd_pcm_status_get_state (status) == SND_PCM_STATE_XRUN) - { struct timeval now, diff, tstamp ; - - gettimeofday (&now, 0) ; - snd_pcm_status_get_trigger_tstamp (status, &tstamp) ; - timersub (&now, &tstamp, &diff) ; - - fprintf (stderr, "alsa_write_float xrun: of at least %.3f msecs. resetting stream\n", - diff.tv_sec * 1000 + diff.tv_usec / 1000.0) ; - } - else - fprintf (stderr, "alsa_write_float: xrun. can't determine length\n") ; - } ; -#endif - - snd_pcm_prepare (alsa_dev) ; - break ; - - case -EBADFD : - fprintf (stderr, "alsa_write_float: Bad PCM state.n") ; - return 0 ; - break ; - - case -ESTRPIPE : - fprintf (stderr, "alsa_write_float: Suspend event.n") ; - return 0 ; - break ; - - case -EIO : - puts ("alsa_write_float: EIO") ; - return 0 ; - - default : - fprintf (stderr, "alsa_write_float: retval = %d\n", retval) ; - return 0 ; - break ; - } ; /* switch */ - } ; /* while */ - - return total ; -} /* alsa_write_float */ - -#endif /* HAVE_ALSA_ASOUNDLIB_H */ - -/*------------------------------------------------------------------------------ -** Linux/OSS functions for playing a sound. -*/ - -#if !defined (__ANDROID__) && (defined (__linux__) || defined (__FreeBSD_kernel__) || defined (__FreeBSD__)) - -static int opensoundsys_open_device (int channels, int srate) ; - -static int -opensoundsys_play (int argc, char *argv []) -{ static short buffer [BUFFER_LEN] ; - SNDFILE *sndfile ; - SF_INFO sfinfo ; - int k, audio_device, readcount, writecount, subformat ; - - for (k = 1 ; k < argc ; k++) - { memset (&sfinfo, 0, sizeof (sfinfo)) ; - - printf ("Playing %s\n", argv [k]) ; - if (! (sndfile = sf_open (argv [k], SFM_READ, &sfinfo))) - { puts (sf_strerror (NULL)) ; - continue ; - } ; - - if (sfinfo.channels < 1 || sfinfo.channels > 2) - { printf ("Error : channels = %d.\n", sfinfo.channels) ; - continue ; - } ; - - audio_device = opensoundsys_open_device (sfinfo.channels, sfinfo.samplerate) ; - - subformat = sfinfo.format & SF_FORMAT_SUBMASK ; - - if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) - { static float float_buffer [BUFFER_LEN] ; - double scale ; - int m ; - - sf_command (sndfile, SFC_CALC_SIGNAL_MAX, &scale, sizeof (scale)) ; - if (scale < 1e-10) - scale = 1.0 ; - else - scale = 32700.0 / scale ; - - while ((readcount = sf_read_float (sndfile, float_buffer, BUFFER_LEN))) - { for (m = 0 ; m < readcount ; m++) - buffer [m] = scale * float_buffer [m] ; - writecount = write (audio_device, buffer, readcount * sizeof (short)) ; - } ; - } - else - { while ((readcount = sf_read_short (sndfile, buffer, BUFFER_LEN))) - writecount = write (audio_device, buffer, readcount * sizeof (short)) ; - } ; - - if (ioctl (audio_device, SNDCTL_DSP_POST, 0) == -1) - perror ("ioctl (SNDCTL_DSP_POST) ") ; - - if (ioctl (audio_device, SNDCTL_DSP_SYNC, 0) == -1) - perror ("ioctl (SNDCTL_DSP_SYNC) ") ; - - close (audio_device) ; - - sf_close (sndfile) ; - } ; - - return writecount ; -} /* opensoundsys_play */ - -static int -opensoundsys_open_device (int channels, int srate) -{ int fd, stereo, fmt ; - - if ((fd = open ("/dev/dsp", O_WRONLY, 0)) == -1 && - (fd = open ("/dev/sound/dsp", O_WRONLY, 0)) == -1) - { perror ("opensoundsys_open_device : open ") ; - exit (1) ; - } ; - - stereo = 0 ; - if (ioctl (fd, SNDCTL_DSP_STEREO, &stereo) == -1) - { /* Fatal error */ - perror ("opensoundsys_open_device : stereo ") ; - exit (1) ; - } ; - - if (ioctl (fd, SNDCTL_DSP_RESET, 0)) - { perror ("opensoundsys_open_device : reset ") ; - exit (1) ; - } ; - - fmt = CPU_IS_BIG_ENDIAN ? AFMT_S16_BE : AFMT_S16_LE ; - if (ioctl (fd, SNDCTL_DSP_SETFMT, &fmt) != 0) - { perror ("opensoundsys_open_device : set format ") ; - exit (1) ; - } ; - - if (ioctl (fd, SNDCTL_DSP_CHANNELS, &channels) != 0) - { perror ("opensoundsys_open_device : channels ") ; - exit (1) ; - } ; - - if (ioctl (fd, SNDCTL_DSP_SPEED, &srate) != 0) - { perror ("opensoundsys_open_device : sample rate ") ; - exit (1) ; - } ; - - if (ioctl (fd, SNDCTL_DSP_SYNC, 0) != 0) - { perror ("opensoundsys_open_device : sync ") ; - exit (1) ; - } ; - - return fd ; -} /* opensoundsys_open_device */ - -#endif /* __linux__ */ - -/*------------------------------------------------------------------------------ -** Mac OS X functions for playing a sound. -*/ - -#if (OSX_DARWIN_VERSION > 11) -/* MacOSX 10.8 use a new Audio API. Someone needs to write some code for it. */ -#endif /* OSX_DARWIN_VERSION > 11 */ - -#if (OSX_DARWIN_VERSION == 11) -/* MacOSX 10.7 use AudioQueue API */ - -#define kBytesPerAudioBuffer (1024 * 8) -#define kNumberOfAudioBuffers 4 - -typedef struct -{ AudioStreamBasicDescription format ; - - AudioQueueRef queue ; - AudioQueueBufferRef queueBuffer [kNumberOfAudioBuffers] ; - - UInt32 buf_size ; - - SNDFILE *sndfile ; - SF_INFO sfinfo ; - - int done_playing ; -} MacOSXAudioData ; - - -static void -macosx_fill_buffer (MacOSXAudioData *audio_data, AudioQueueBufferRef audio_buffer) -{ int size, sample_count, read_count ; - short *buffer ; - - size = audio_buffer->mAudioDataBytesCapacity ; - sample_count = size / sizeof (short) ; - - buffer = (short*) audio_buffer->mAudioData ; - - read_count = sf_read_short (audio_data->sndfile, buffer, sample_count) ; - - if (read_count > 0) - { audio_buffer->mAudioDataByteSize = read_count * sizeof (short) ; - AudioQueueEnqueueBuffer (audio_data->queue, audio_buffer, 0, NULL) ; - } - else - AudioQueueStop (audio_data->queue, false) ; - -} /* macosx_fill_buffer */ - - -static void -macosx_audio_out_callback (void *user_data, AudioQueueRef audio_queue, AudioQueueBufferRef audio_buffer) -{ MacOSXAudioData *audio_data = (MacOSXAudioData *) user_data ; - - if (audio_data->queue == audio_queue) - macosx_fill_buffer (audio_data, audio_buffer) ; - -} /* macosx_audio_out_callback */ - - -static void -macosx_audio_out_property_callback (void *user_data, AudioQueueRef audio_queue, AudioQueuePropertyID prop) -{ MacOSXAudioData *audio_data = (MacOSXAudioData *) user_data ; - - if (prop == kAudioQueueProperty_IsRunning) - { UInt32 is_running = 0 ; - UInt32 is_running_size = sizeof (is_running) ; - - AudioQueueGetProperty (audio_queue, kAudioQueueProperty_IsRunning, &is_running, &is_running_size) ; - - if (!is_running) - { audio_data->done_playing = SF_TRUE ; - CFRunLoopStop (CFRunLoopGetCurrent ()) ; - } ; - } ; -} /* macosx_audio_out_property_callback */ - - - -static void -macosx_play (int argc, char *argv []) -{ MacOSXAudioData audio_data ; - OSStatus err ; - int i ; - int k ; - - memset (&audio_data, 0x55, sizeof (audio_data)) ; - - for (k = 1 ; k < argc ; k++) - { memset (&(audio_data.sfinfo), 0, sizeof (audio_data.sfinfo)) ; - - printf ("Playing %s\n", argv [k]) ; - if (! (audio_data.sndfile = sf_open (argv [k], SFM_READ, &(audio_data.sfinfo)))) - { puts (sf_strerror (NULL)) ; - continue ; - } ; - - if (audio_data.sfinfo.channels < 1 || audio_data.sfinfo.channels > 2) - { printf ("Error : channels = %d.\n", audio_data.sfinfo.channels) ; - continue ; - } ; - - /* fill ASBD */ - audio_data.format.mSampleRate = audio_data.sfinfo.samplerate ; - audio_data.format.mChannelsPerFrame = audio_data.sfinfo.channels ; - audio_data.format.mFormatID = kAudioFormatLinearPCM ; - audio_data.format.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked ; - audio_data.format.mBytesPerPacket = audio_data.format.mChannelsPerFrame * 2 ; - audio_data.format.mFramesPerPacket = 1 ; - audio_data.format.mBytesPerFrame = audio_data.format.mBytesPerPacket ; - audio_data.format.mBitsPerChannel = 16 ; - audio_data.format.mReserved = 0 ; - - /* create the queue */ - if ((err = AudioQueueNewOutput (&(audio_data.format), macosx_audio_out_callback, &audio_data, - CFRunLoopGetCurrent (), kCFRunLoopCommonModes, 0, &(audio_data.queue))) != noErr) - { printf ("AudioQueueNewOutput failed\n") ; - return ; - } ; - - /* add property listener */ - if ((err = AudioQueueAddPropertyListener (audio_data.queue, kAudioQueueProperty_IsRunning, macosx_audio_out_property_callback, &audio_data)) != noErr) - { printf ("AudioQueueAddPropertyListener failed\n") ; - return ; - } ; - - /* create the buffers */ - for (i = 0 ; i < kNumberOfAudioBuffers ; i++) - { if ((err = AudioQueueAllocateBuffer (audio_data.queue, kBytesPerAudioBuffer, &audio_data.queueBuffer [i])) != noErr) - { printf ("AudioQueueAllocateBuffer failed\n") ; - return ; - } ; - - macosx_fill_buffer (&audio_data, audio_data.queueBuffer [i]) ; - } ; - - audio_data.done_playing = SF_FALSE ; - - /* start queue */ - if ((err = AudioQueueStart (audio_data.queue, NULL)) != noErr) - { printf ("AudioQueueStart failed\n") ; - return ; - } ; - - while (audio_data.done_playing == SF_FALSE) - CFRunLoopRun () ; - - /* free the buffers */ - for (i = 0 ; i < kNumberOfAudioBuffers ; i++) - { if ((err = AudioQueueFreeBuffer (audio_data.queue, audio_data.queueBuffer [i])) != noErr) - { printf ("AudioQueueFreeBuffer failed\n") ; - return ; - } ; - } ; - - /* free the queue */ - if ((err = AudioQueueDispose (audio_data.queue, true)) != noErr) - { printf ("AudioQueueDispose failed\n") ; - return ; - } ; - - sf_close (audio_data.sndfile) ; - } ; - - return ; -} /* macosx_play, AudioQueue implementation */ - -#endif /* OSX_DARWIN_VERSION == 11 */ - -#if (OSX_DARWIN_VERSION > 0 && OSX_DARWIN_VERSION <= 10) -/* MacOSX 10.6 or earlier, use Carbon and AudioHardware API */ - -typedef struct -{ AudioStreamBasicDescription format ; - - UInt32 buf_size ; - AudioDeviceID device ; - - SNDFILE *sndfile ; - SF_INFO sfinfo ; - - int fake_stereo ; - int done_playing ; -} MacOSXAudioData ; - -#include - -static OSStatus -macosx_audio_out_callback (AudioDeviceID device, const AudioTimeStamp* current_time, - const AudioBufferList* data_in, const AudioTimeStamp* time_in, - AudioBufferList* data_out, const AudioTimeStamp* time_out, - void* client_data) -{ MacOSXAudioData *audio_data ; - int size, sample_count, read_count, k ; - float *buffer ; - - /* Prevent compiler warnings. */ - device = device ; - current_time = current_time ; - data_in = data_in ; - time_in = time_in ; - time_out = time_out ; - - audio_data = (MacOSXAudioData*) client_data ; - - size = data_out->mBuffers [0].mDataByteSize ; - sample_count = size / sizeof (float) ; - - buffer = (float*) data_out->mBuffers [0].mData ; - - if (audio_data->fake_stereo != 0) - { read_count = sf_read_float (audio_data->sndfile, buffer, sample_count / 2) ; - - for (k = read_count - 1 ; k >= 0 ; k--) - { buffer [2 * k ] = buffer [k] ; - buffer [2 * k + 1] = buffer [k] ; - } ; - read_count *= 2 ; - } - else - read_count = sf_read_float (audio_data->sndfile, buffer, sample_count) ; - - /* Fill the remainder with zeroes. */ - if (read_count < sample_count) - { if (audio_data->fake_stereo == 0) - memset (&(buffer [read_count]), 0, (sample_count - read_count) * sizeof (float)) ; - /* Tell the main application to terminate. */ - audio_data->done_playing = SF_TRUE ; - } ; - - return noErr ; -} /* macosx_audio_out_callback */ - -static void -macosx_play (int argc, char *argv []) -{ MacOSXAudioData audio_data ; - OSStatus err ; - UInt32 count, buffer_size ; - int k ; - - audio_data.fake_stereo = 0 ; - audio_data.device = kAudioDeviceUnknown ; - - /* get the default output device for the HAL */ - count = sizeof (AudioDeviceID) ; - if ((err = AudioHardwareGetProperty (kAudioHardwarePropertyDefaultOutputDevice, - &count, (void *) &(audio_data.device))) != noErr) - { printf ("AudioHardwareGetProperty (kAudioDevicePropertyDefaultOutputDevice) failed.\n") ; - return ; - } ; - - /* get the buffersize that the default device uses for IO */ - count = sizeof (UInt32) ; - if ((err = AudioDeviceGetProperty (audio_data.device, 0, false, kAudioDevicePropertyBufferSize, - &count, &buffer_size)) != noErr) - { printf ("AudioDeviceGetProperty (kAudioDevicePropertyBufferSize) failed.\n") ; - return ; - } ; - - /* get a description of the data format used by the default device */ - count = sizeof (AudioStreamBasicDescription) ; - if ((err = AudioDeviceGetProperty (audio_data.device, 0, false, kAudioDevicePropertyStreamFormat, - &count, &(audio_data.format))) != noErr) - { printf ("AudioDeviceGetProperty (kAudioDevicePropertyStreamFormat) failed.\n") ; - return ; - } ; - - /* Base setup completed. Now play files. */ - for (k = 1 ; k < argc ; k++) - { memset (&(audio_data.sfinfo), 0, sizeof (audio_data.sfinfo)) ; - - printf ("Playing %s\n", argv [k]) ; - if (! (audio_data.sndfile = sf_open (argv [k], SFM_READ, &(audio_data.sfinfo)))) - { puts (sf_strerror (NULL)) ; - continue ; - } ; - - if (audio_data.sfinfo.channels < 1 || audio_data.sfinfo.channels > 2) - { printf ("Error : channels = %d.\n", audio_data.sfinfo.channels) ; - continue ; - } ; - - audio_data.format.mSampleRate = audio_data.sfinfo.samplerate ; - - if (audio_data.sfinfo.channels == 1) - { audio_data.format.mChannelsPerFrame = 2 ; - audio_data.fake_stereo = 1 ; - } - else - audio_data.format.mChannelsPerFrame = audio_data.sfinfo.channels ; - - if ((err = AudioDeviceSetProperty (audio_data.device, NULL, 0, false, kAudioDevicePropertyStreamFormat, - sizeof (AudioStreamBasicDescription), &(audio_data.format))) != noErr) - { printf ("AudioDeviceSetProperty (kAudioDevicePropertyStreamFormat) failed.\n") ; - return ; - } ; - - /* we want linear pcm */ - if (audio_data.format.mFormatID != kAudioFormatLinearPCM) - return ; - - /* Fire off the device. */ - if ((err = AudioDeviceAddIOProc (audio_data.device, macosx_audio_out_callback, - (void *) &audio_data)) != noErr) - { printf ("AudioDeviceAddIOProc failed.\n") ; - return ; - } ; - - err = AudioDeviceStart (audio_data.device, macosx_audio_out_callback) ; - if (err != noErr) - return ; - - audio_data.done_playing = SF_FALSE ; - - while (audio_data.done_playing == SF_FALSE) - usleep (10 * 1000) ; /* 10 000 milliseconds. */ - - if ((err = AudioDeviceStop (audio_data.device, macosx_audio_out_callback)) != noErr) - { printf ("AudioDeviceStop failed.\n") ; - return ; - } ; - - err = AudioDeviceRemoveIOProc (audio_data.device, macosx_audio_out_callback) ; - if (err != noErr) - { printf ("AudioDeviceRemoveIOProc failed.\n") ; - return ; - } ; - - sf_close (audio_data.sndfile) ; - } ; - - return ; -} /* macosx_play, AudioHardware implementation */ - -#endif /* OSX_DARWIN_VERSION > 0 && OSX_DARWIN_VERSION <= 10 */ - -/*------------------------------------------------------------------------------ -** Win32 functions for playing a sound. -** -** This API sucks. Its needlessly complicated and is *WAY* too loose with -** passing pointers arounf in integers and and using char* pointers to -** point to data instead of short*. It plain sucks! -*/ - -#if (OS_IS_WIN32 == 1) - -#define WIN32_BUFFER_LEN (1 << 15) - -typedef struct -{ HWAVEOUT hwave ; - WAVEHDR whdr [2] ; - - CRITICAL_SECTION mutex ; /* to control access to BuffersInUSe */ - HANDLE Event ; /* signal that a buffer is free */ - - short buffer [WIN32_BUFFER_LEN / sizeof (short)] ; - int current, bufferlen ; - int BuffersInUse ; - - SNDFILE *sndfile ; - SF_INFO sfinfo ; - - sf_count_t remaining ; -} Win32_Audio_Data ; - - -static void -win32_play_data (Win32_Audio_Data *audio_data) -{ int thisread, readcount ; - - /* fill a buffer if there is more data and we can read it sucessfully */ - readcount = (audio_data->remaining > audio_data->bufferlen) ? audio_data->bufferlen : (int) audio_data->remaining ; - - thisread = (int) sf_read_short (audio_data->sndfile, (short *) (audio_data->whdr [audio_data->current].lpData), readcount) ; - - audio_data->remaining -= thisread ; - - if (thisread > 0) - { /* Fix buffer length if this is only a partial block. */ - if (thisread < audio_data->bufferlen) - audio_data->whdr [audio_data->current].dwBufferLength = thisread * sizeof (short) ; - - /* Queue the WAVEHDR */ - waveOutWrite (audio_data->hwave, (LPWAVEHDR) &(audio_data->whdr [audio_data->current]), sizeof (WAVEHDR)) ; - - /* count another buffer in use */ - EnterCriticalSection (&audio_data->mutex) ; - audio_data->BuffersInUse ++ ; - LeaveCriticalSection (&audio_data->mutex) ; - - /* use the other buffer next time */ - audio_data->current = (audio_data->current + 1) % 2 ; - } ; - - return ; -} /* win32_play_data */ - -static void CALLBACK -win32_audio_out_callback (HWAVEOUT hwave, UINT msg, DWORD_PTR data, DWORD param1, DWORD param2) -{ Win32_Audio_Data *audio_data ; - - /* Prevent compiler warnings. */ - (void) hwave ; - (void) param1 ; - (void) param2 ; - - if (data == 0) - return ; - - /* - ** I consider this technique of passing a pointer via an integer as - ** fundamentally broken but thats the way microsoft has defined the - ** interface. - */ - audio_data = (Win32_Audio_Data*) data ; - - /* let main loop know a buffer is free */ - if (msg == MM_WOM_DONE) - { EnterCriticalSection (&audio_data->mutex) ; - audio_data->BuffersInUse -- ; - LeaveCriticalSection (&audio_data->mutex) ; - SetEvent (audio_data->Event) ; - } ; - - return ; -} /* win32_audio_out_callback */ - -static void -win32_play (int argc, char *argv []) -{ Win32_Audio_Data audio_data ; - - WAVEFORMATEX wf ; - int k, error ; - - audio_data.sndfile = NULL ; - audio_data.hwave = 0 ; - - for (k = 1 ; k < argc ; k++) - { printf ("Playing %s\n", argv [k]) ; - - if (! (audio_data.sndfile = sf_open (argv [k], SFM_READ, &(audio_data.sfinfo)))) - { puts (sf_strerror (NULL)) ; - continue ; - } ; - - audio_data.remaining = audio_data.sfinfo.frames * audio_data.sfinfo.channels ; - audio_data.current = 0 ; - - InitializeCriticalSection (&audio_data.mutex) ; - audio_data.Event = CreateEvent (0, FALSE, FALSE, 0) ; - - wf.nChannels = audio_data.sfinfo.channels ; - wf.wFormatTag = WAVE_FORMAT_PCM ; - wf.cbSize = 0 ; - wf.wBitsPerSample = 16 ; - - wf.nSamplesPerSec = audio_data.sfinfo.samplerate ; - - wf.nBlockAlign = audio_data.sfinfo.channels * sizeof (short) ; - - wf.nAvgBytesPerSec = wf.nBlockAlign * wf.nSamplesPerSec ; - - error = waveOutOpen (&(audio_data.hwave), WAVE_MAPPER, &wf, (DWORD_PTR) win32_audio_out_callback, - (DWORD_PTR) &audio_data, CALLBACK_FUNCTION) ; - if (error) - { puts ("waveOutOpen failed.") ; - audio_data.hwave = 0 ; - continue ; - } ; - - audio_data.whdr [0].lpData = (char*) audio_data.buffer ; - audio_data.whdr [1].lpData = ((char*) audio_data.buffer) + sizeof (audio_data.buffer) / 2 ; - - audio_data.whdr [0].dwBufferLength = sizeof (audio_data.buffer) / 2 ; - audio_data.whdr [1].dwBufferLength = sizeof (audio_data.buffer) / 2 ; - - audio_data.whdr [0].dwFlags = 0 ; - audio_data.whdr [1].dwFlags = 0 ; - - /* length of each audio buffer in samples */ - audio_data.bufferlen = sizeof (audio_data.buffer) / 2 / sizeof (short) ; - - /* Prepare the WAVEHDRs */ - if ((error = waveOutPrepareHeader (audio_data.hwave, &(audio_data.whdr [0]), sizeof (WAVEHDR)))) - { printf ("waveOutPrepareHeader [0] failed : %08X\n", error) ; - waveOutClose (audio_data.hwave) ; - continue ; - } ; - - if ((error = waveOutPrepareHeader (audio_data.hwave, &(audio_data.whdr [1]), sizeof (WAVEHDR)))) - { printf ("waveOutPrepareHeader [1] failed : %08X\n", error) ; - waveOutUnprepareHeader (audio_data.hwave, &(audio_data.whdr [0]), sizeof (WAVEHDR)) ; - waveOutClose (audio_data.hwave) ; - continue ; - } ; - - /* Fill up both buffers with audio data */ - audio_data.BuffersInUse = 0 ; - win32_play_data (&audio_data) ; - win32_play_data (&audio_data) ; - - /* loop until both buffers are released */ - while (audio_data.BuffersInUse > 0) - { - /* wait for buffer to be released */ - WaitForSingleObject (audio_data.Event, INFINITE) ; - - /* refill the buffer if there is more data to play */ - win32_play_data (&audio_data) ; - } ; - - waveOutUnprepareHeader (audio_data.hwave, &(audio_data.whdr [0]), sizeof (WAVEHDR)) ; - waveOutUnprepareHeader (audio_data.hwave, &(audio_data.whdr [1]), sizeof (WAVEHDR)) ; - - waveOutClose (audio_data.hwave) ; - audio_data.hwave = 0 ; - - DeleteCriticalSection (&audio_data.mutex) ; - - sf_close (audio_data.sndfile) ; - } ; - -} /* win32_play */ - -#endif /* Win32 */ - -/*------------------------------------------------------------------------------ -** OpenBDS's sndio. -*/ - -#if defined (HAVE_SNDIO_H) - -static void -sndio_play (int argc, char *argv []) -{ struct sio_hdl *hdl ; - struct sio_par par ; - short buffer [BUFFER_LEN] ; - SNDFILE *sndfile ; - SF_INFO sfinfo ; - int k, readcount ; - - for (k = 1 ; k < argc ; k++) - { printf ("Playing %s\n", argv [k]) ; - if (! (sndfile = sf_open (argv [k], SFM_READ, &sfinfo))) - { puts (sf_strerror (NULL)) ; - continue ; - } ; - - if (sfinfo.channels < 1 || sfinfo.channels > 2) - { printf ("Error : channels = %d.\n", sfinfo.channels) ; - continue ; - } ; - - if ((hdl = sio_open (NULL, SIO_PLAY, 0)) == NULL) - { fprintf (stderr, "open sndio device failed") ; - return ; - } ; - - sio_initpar (&par) ; - par.rate = sfinfo.samplerate ; - par.pchan = sfinfo.channels ; - par.bits = 16 ; - par.sig = 1 ; - par.le = SIO_LE_NATIVE ; - - if (! sio_setpar (hdl, &par) || ! sio_getpar (hdl, &par)) - { fprintf (stderr, "set sndio params failed") ; - return ; - } ; - - if (! sio_start (hdl)) - { fprintf (stderr, "sndio start failed") ; - return ; - } ; - - while ((readcount = sf_read_short (sndfile, buffer, BUFFER_LEN))) - sio_write (hdl, buffer, readcount * sizeof (short)) ; - - sio_close (hdl) ; - } ; - - return ; -} /* sndio_play */ - -#endif /* sndio */ - -/*------------------------------------------------------------------------------ -** Solaris. -*/ - -#if (defined (sun) && defined (unix)) /* ie Solaris */ - -static void -solaris_play (int argc, char *argv []) -{ static short buffer [BUFFER_LEN] ; - audio_info_t audio_info ; - SNDFILE *sndfile ; - SF_INFO sfinfo ; - unsigned long delay_time ; - long k, start_count, output_count, write_count, read_count ; - int audio_fd, error, done ; - - for (k = 1 ; k < argc ; k++) - { printf ("Playing %s\n", argv [k]) ; - if (! (sndfile = sf_open (argv [k], SFM_READ, &sfinfo))) - { puts (sf_strerror (NULL)) ; - continue ; - } ; - - if (sfinfo.channels < 1 || sfinfo.channels > 2) - { printf ("Error : channels = %d.\n", sfinfo.channels) ; - continue ; - } ; - - /* open the audio device - write only, non-blocking */ - if ((audio_fd = open ("/dev/audio", O_WRONLY | O_NONBLOCK)) < 0) - { perror ("open (/dev/audio) failed") ; - return ; - } ; - - /* Retrive standard values. */ - AUDIO_INITINFO (&audio_info) ; - - audio_info.play.sample_rate = sfinfo.samplerate ; - audio_info.play.channels = sfinfo.channels ; - audio_info.play.precision = 16 ; - audio_info.play.encoding = AUDIO_ENCODING_LINEAR ; - audio_info.play.gain = AUDIO_MAX_GAIN ; - audio_info.play.balance = AUDIO_MID_BALANCE ; - - if ((error = ioctl (audio_fd, AUDIO_SETINFO, &audio_info))) - { perror ("ioctl (AUDIO_SETINFO) failed") ; - return ; - } ; - - /* Delay time equal to 1/4 of a buffer in microseconds. */ - delay_time = (BUFFER_LEN * 1000000) / (audio_info.play.sample_rate * 4) ; - - done = 0 ; - while (! done) - { read_count = sf_read_short (sndfile, buffer, BUFFER_LEN) ; - if (read_count < BUFFER_LEN) - { memset (&(buffer [read_count]), 0, (BUFFER_LEN - read_count) * sizeof (short)) ; - /* Tell the main application to terminate. */ - done = SF_TRUE ; - } ; - - start_count = 0 ; - output_count = BUFFER_LEN * sizeof (short) ; - - while (output_count > 0) - { /* write as much data as possible */ - write_count = write (audio_fd, &(buffer [start_count]), output_count) ; - if (write_count > 0) - { output_count -= write_count ; - start_count += write_count ; - } - else - { /* Give the audio output time to catch up. */ - usleep (delay_time) ; - } ; - } ; /* while (outpur_count > 0) */ - } ; /* while (! done) */ - - close (audio_fd) ; - } ; - - return ; -} /* solaris_play */ - -#endif /* Solaris */ - -/*============================================================================== -** Main function. -*/ - -int -main (int argc, char *argv []) -{ - if (argc < 2) - { - printf ("\nUsage : %s \n\n", program_name (argv [0])) ; - printf (" Using %s.\n\n", sf_version_string ()) ; -#if (OS_IS_WIN32 == 1) - printf ("This is a Unix style command line application which\n" - "should be run in a MSDOS box or Command Shell window.\n\n") ; - printf ("Sleeping for 5 seconds before exiting.\n\n") ; - - Sleep (5 * 1000) ; -#endif - return 1 ; - } ; - -#if defined (__ANDROID__) - puts ("*** Playing sound not yet supported on Android.") ; - puts ("*** Please feel free to submit a patch.") ; - return 1 ; -#elif defined (__linux__) - #if HAVE_ALSA_ASOUNDLIB_H - if (access ("/proc/asound/cards", R_OK) == 0) - alsa_play (argc, argv) ; - else - #endif - opensoundsys_play (argc, argv) ; -#elif defined (__FreeBSD_kernel__) || defined (__FreeBSD__) - opensoundsys_play (argc, argv) ; -#elif (defined (__MACH__) && defined (__APPLE__) && OSX_DARWIN_VERSION <= 11) - macosx_play (argc, argv) ; -#elif defined HAVE_SNDIO_H - sndio_play (argc, argv) ; -#elif (defined (sun) && defined (unix)) - solaris_play (argc, argv) ; -#elif (OS_IS_WIN32 == 1) - win32_play (argc, argv) ; -#elif (defined (__MACH__) && defined (__APPLE__) && OSX_DARWIN_VERSION > 11) - printf ("OS X 10.8 and later have a new Audio API.\n") ; - printf ("Someone needs to write code to use that API.\n") ; - return 1 ; -#elif defined (__BEOS__) - printf ("This program cannot be compiled on BeOS.\n") ; - printf ("Instead, compile the file sfplay_beos.cpp.\n") ; - return 1 ; -#else - puts ("*** Playing sound not yet supported on this platform.") ; - puts ("*** Please feel free to submit a patch.") ; - return 1 ; -#endif - - return 0 ; -} /* main */ - diff --git a/libs/libsndfile/programs/sndfile-salvage.c b/libs/libsndfile/programs/sndfile-salvage.c deleted file mode 100644 index db55e60edd..0000000000 --- a/libs/libsndfile/programs/sndfile-salvage.c +++ /dev/null @@ -1,277 +0,0 @@ -/* -** Copyright (C) 2010-2012 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "common.h" - -#define BUFFER_LEN (1 << 16) - -#define NOT(x) (! (x)) - - -static void usage_exit (const char *progname) ; -static void salvage_file (const char * broken_wav, const char * fixed_w64) ; - -int -main (int argc, char *argv []) -{ - if (argc != 3) - usage_exit (program_name (argv [0])) ; - - salvage_file (argv [1], argv [2]) ; - - return 0 ; -} /* main */ - -/*============================================================================== -*/ - -static void lseek_or_die (int fd, off_t offset, int whence) ; -static sf_count_t get_file_length (int fd, const char * name) ; -static sf_count_t find_data_offset (int fd, int format) ; -static void copy_data (int fd, SNDFILE * sndfile, int readsize) ; - - -static void -usage_exit (const char *progname) -{ printf ("Usage :\n\n %s \n\n", progname) ; - puts ("Salvages the audio data from WAV files which are more than 4G in length.\n") ; - printf ("Using %s.\n\n", sf_version_string ()) ; - exit (0) ; -} /* usage_exit */ - -static void -salvage_file (const char * broken_wav, const char * fixed_w64) -{ SNDFILE * sndfile ; - SF_INFO sfinfo ; - sf_count_t broken_len, data_offset ; - int fd, read_size ; - - if (strcmp (broken_wav, fixed_w64) == 0) - { printf ("Error : Input and output files must be different.\n\n") ; - exit (1) ; - } ; - - if ((fd = open (broken_wav, O_RDONLY)) < 0) - { printf ("Error : Not able to open file '%s' : %s\n", broken_wav, strerror (errno)) ; - exit (1) ; - } ; - - broken_len = get_file_length (fd, broken_wav) ; - if (broken_len <= 0xffffffff) - printf ("File is not greater than 4Gig but salvaging anyway.\n") ; - - /* Grab the format info from the broken file. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - if ((sndfile = sf_open (broken_wav, SFM_READ, &sfinfo)) == NULL) - { printf ("sf_open ('%s') failed : %s\n", broken_wav, sf_strerror (NULL)) ; - exit (1) ; - } ; - sf_close (sndfile) ; - - data_offset = find_data_offset (fd, sfinfo.format & SF_FORMAT_TYPEMASK) ; - - printf ("Offset to audio data : %" PRId64 "\n", data_offset) ; - - switch (sfinfo.format & SF_FORMAT_TYPEMASK) - { case SF_FORMAT_WAV : - case SF_FORMAT_WAVEX : - sfinfo.format = SF_FORMAT_W64 | (sfinfo.format & SF_FORMAT_SUBMASK) ; - break ; - - default : - printf ("Don't currently support this file type.\n") ; - exit (1) ; - } ; - - switch (sfinfo.format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_S8 : - read_size = 1 ; - break ; - - case SF_FORMAT_PCM_16 : - read_size = 2 ; - break ; - - case SF_FORMAT_PCM_24 : - read_size = 3 ; - break ; - - case SF_FORMAT_PCM_32 : - case SF_FORMAT_FLOAT : - read_size = 4 ; - break ; - - case SF_FORMAT_DOUBLE : - read_size = 8 ; - break ; - - default : - printf ("Sorry, don't currently support this file encoding type.\n") ; - exit (1) ; - } ; - - read_size *= sfinfo.channels ; - - if ((sndfile = sf_open (fixed_w64, SFM_WRITE, &sfinfo)) == NULL) - { printf ("sf_open ('%s') failed : %s\n", broken_wav, sf_strerror (NULL)) ; - exit (1) ; - } ; - - lseek_or_die (fd, data_offset, SEEK_SET) ; - - copy_data (fd, sndfile, read_size) ; - - sf_close (sndfile) ; - - puts ("Done!") ; -} /* salvage_file */ - -/*------------------------------------------------------------------------------ -*/ - -static void -lseek_or_die (int fd, off_t offset, int whence) -{ - if (lseek (fd, offset, whence) < 0) - { printf ("lseek failed : %s\n", strerror (errno)) ; - exit (1) ; - } ; - - return ; -} /* lseek_or_die */ - - -static sf_count_t -get_file_length (int fd, const char * name) -{ struct stat sbuf ; - - if (sizeof (sbuf.st_size) != 8) - { puts ("Error : sizeof (sbuf.st_size) != 8. Was program compiled with\n" - " 64 bit file offsets?\n") ; - exit (1) ; - } ; - - if (fstat (fd, &sbuf) != 0) - { printf ("Error : fstat ('%s') failed : %s\n", name, strerror (errno)) ; - exit (1) ; - } ; - - return sbuf.st_size ; -} /* get_file_length */ - -static sf_count_t -find_data_offset (int fd, int format) -{ char buffer [8192], *cptr ; - const char * target = "XXXX" ; - sf_count_t offset = -1, extra ; - int rlen, slen ; - - switch (format) - { case SF_FORMAT_WAV : - case SF_FORMAT_WAVEX : - target = "data" ; - extra = 8 ; - break ; - - case SF_FORMAT_AIFF : - target = "SSND" ; - extra = 16 ; - break ; - - default : - puts ("Error : Sorry, don't handle this input file format.\n") ; - exit (1) ; - } ; - - slen = strlen (target) ; - - lseek_or_die (fd, 0, SEEK_SET) ; - - printf ("Searching for '%s' maker.\n", target) ; - - if ((rlen = read (fd, buffer, sizeof (buffer))) < 0) - { printf ("Error : failed read : %s\n", strerror (errno)) ; - exit (1) ; - } ; - - cptr = memchr (buffer, target [0], rlen - slen) ; - if (cptr && memcmp (cptr, target, slen) == 0) - offset = cptr - buffer ; - else - { printf ("Error : Could not find data offset.\n") ; - exit (1) ; - } ; - - return offset + extra ; -} /* find_data_offset */ - -static void -copy_data (int fd, SNDFILE * sndfile, int readsize) -{ static char * buffer ; - sf_count_t readlen, count ; - int bufferlen, done = 0 ; - - bufferlen = readsize * 1024 ; - buffer = malloc (bufferlen) ; - - while (NOT (done) && (readlen = read (fd, buffer, bufferlen)) >= 0) - { if (readlen < bufferlen) - { readlen -= readlen % readsize ; - done = 1 ; - } ; - - if ((count = sf_write_raw (sndfile, buffer, readlen)) != readlen) - { printf ("Error : sf_write_raw returned %" PRId64 " : %s\n", count, sf_strerror (sndfile)) ; - return ; - } ; - } ; - - free (buffer) ; - - return ; -} /* copy_data */ - diff --git a/libs/libsndfile/programs/test-sndfile-metadata-set.py b/libs/libsndfile/programs/test-sndfile-metadata-set.py deleted file mode 100644 index a21a36b3d1..0000000000 --- a/libs/libsndfile/programs/test-sndfile-metadata-set.py +++ /dev/null @@ -1,188 +0,0 @@ -#!/usr/bin/python - -# Copyright (C) 2008-2011 Erik de Castro Lopo -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# * Neither the author nor the names of any contributors may be used -# to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# Simple test script for the sndfile-metadata-set program. - -import commands, os, sys -import time, datetime - -def print_test_name (name): - print " %-30s :" % name, - -def assert_info (filename, arg, value): - cmd = "./sndfile-metadata-get %s %s" % (arg, filename) - status, output = commands.getstatusoutput (cmd) - if status: - print "\n\nError : command '%s' should not have failed." % cmd - sys.exit (1) - if output.find (value) < 0: - print "\n\nError : not able to find '%s'." % value - print output - sys.exit (1) - return - - -def check_executable (name): - if not (os.path.isfile (name)): - print "\n\nError : Can't find executable '%s'. Have you run make?" % name - sys.exit (1) - -def test_empty_fail (): - print_test_name ("Empty fail test") - cmd = "./sndfile-metadata-set --bext-description Alpha sine.wav" - status, output = commands.getstatusoutput (cmd) - if not status: - print "\n\nError : command '%s' should have failed." % cmd - sys.exit (1) - print "ok" - -def test_copy (): - print_test_name ("Copy test") - cmd = "./sndfile-metadata-set --bext-description \"First Try\" sine.wav output.wav" - status, output = commands.getstatusoutput (cmd) - if status: - print "\n\nError : command '%s' should not have failed." % cmd - sys.exit (1) - assert_info ("output.wav", "--bext-description", "First Try") - print "ok" - -def test_update (tests): - print_test_name ("Update test") - for arg, value in tests: - cmd = "./sndfile-metadata-set %s \"%s\" output.wav" % (arg, value) - status, output = commands.getstatusoutput (cmd) - if status: - print "\n\nError : command '%s' should not have failed." % cmd - sys.exit (1) - assert_info ("output.wav", arg, value) - print "ok" - -def test_post_mod (tests): - print_test_name ("Post mod test") - for arg, value in tests: - assert_info ("output.wav", arg, value) - print "ok" - -def test_auto_date (): - print_test_name ("Auto date test") - cmd = "./sndfile-metadata-set --bext-auto-time-date sine.wav date-time.wav" - status, output = commands.getstatusoutput (cmd) - if status: - print "\n\nError : command '%s' should not have failed." % cmd - sys.exit (1) - target = datetime.date.today ().__str__ () - assert_info ("date-time.wav", "--bext-orig-date", target) - print "ok" - - -#------------------------------------------------------------------------------- - -def test_coding_history (): - print_test_name ("Coding history test") - cmd = "./sndfile-metadata-set --bext-coding-hist \"alpha beta\" output.wav" - status, output = commands.getstatusoutput (cmd) - if status: - print "\n\nError : command '%s' should not have failed." % cmd - sys.exit (1) - cmd = "./sndfile-metadata-get --bext-coding-hist output.wav" - status, output = commands.getstatusoutput (cmd) - if status: - print "\n\nError : command '%s' should not have failed." % cmd - sys.exit (1) - print "ok" - -#------------------------------------------------------------------------------- - -def test_rewrite (): - print_test_name ("Rewrite test") - cmd = "./sndfile-metadata-set --bext-originator \"Really, really long string\" output.wav" - status, output = commands.getstatusoutput (cmd) - if status: - print "\n\nError : command '%s' should not have failed." % cmd - sys.exit (1) - cmd = "./sndfile-metadata-set --bext-originator \"Short\" output.wav" - status, output = commands.getstatusoutput (cmd) - if status: - print "\n\nError : command '%s' should not have failed." % cmd - sys.exit (1) - cmd = "./sndfile-metadata-get --bext-originator output.wav" - status, output = commands.getstatusoutput (cmd) - if status: - print "\n\nError : command '%s' should not have failed." % cmd - sys.exit (1) - if output.find ("really long") > 0: - print "\n\nError : output '%s' should not contain 'really long'." % output - sys.exit (1) - print "ok" - -#=============================================================================== - -test_dir = "programs" - -if os.path.isdir (test_dir): - os.chdir (test_dir) - -for f in [ "sndfile-metadata-set", "sndfile-metadata-get", "../examples/make_sine" ]: - check_executable (f) - -os.system ("../examples/make_sine") -if not os.path.isfile ("sine.wav"): - print "\n\nError : Can't file file 'sine.wav'." - sys.exit (1) - -print "" - -test_empty_fail () -test_copy () - -tests = [ - ("--bext-description", "Alpha"), ("--bext-originator", "Beta"), ("--bext-orig-ref", "Charlie"), - ("--bext-umid", "Delta"), ("--bext-orig-date", "2001-10-01"), ("--bext-orig-time", "01:02:03"), - ("--str-title", "Echo"), ("--str-artist", "Fox trot") - ] - -test_auto_date () -test_update (tests) -test_post_mod (tests) - -test_update ([ ("--str-artist", "Fox") ]) - -# This never worked. -# test_coding_history () - -test_rewrite () - - -print "" - -sys.exit (0) - diff --git a/libs/libsndfile/reconfigure.mk b/libs/libsndfile/reconfigure.mk deleted file mode 100644 index 5ec5943ea8..0000000000 --- a/libs/libsndfile/reconfigure.mk +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/make -f - -# The auto tools MUST be run in the following order: -# -# 1. aclocal -# 2. libtoolize (if you use libtool) -# 3. autoconf -# 4. autoheader (if you use autoheader) -# 5. automake (if you use automake) -# -# The following makefile runs these in the correct order according to their -# dependancies. It also makes up for Mac OSX's fucked-upped-ness. - -ACLOCAL = aclocal - -ifneq ($(shell uname -s), Darwin) - LIBTOOLIZE = libtoolize -else - # Fuck Apple! Why the hell did they rename libtoolize???? - LIBTOOLIZE = glibtoolize - # Fink sucks as well, but this seems necessary. - ACLOCAL_INC = -I /sw/share/aclocal -endif - -genfiles : config.status - (cd src && make genfiles) - (cd tests && make genfiles) - -config.status: configure src/config.h.in Makefile.in src/Makefile.in tests/Makefile.in - ./configure --enable-gcc-werror - -configure: ltmain.sh - autoconf - -Makefile.in: Makefile.am - automake --copy --add-missing - -src/Makefile.in: src/Makefile.am - automake --copy --add-missing - -tests/Makefile.in: tests/Makefile.am - automake --copy --add-missing - -src/config.h.in: configure - autoheader - -libtool ltmain.sh: aclocal.m4 - $(LIBTOOLIZE) --copy --force - -# Need to re-run aclocal whenever acinclude.m4 is modified. -aclocal.m4: acinclude.m4 - $(ACLOCAL) $(ACLOCAL_INC) - -clean: - rm -f libtool ltmain.sh aclocal.m4 Makefile.in src/config.h.in config.cache config.status - find . -name .deps -type d -exec rm -rf {} \; - - -# Do not edit or modify anything in this comment block. -# The arch-tag line is a file identity tag for the GNU Arch -# revision control system. -# -# arch-tag: 2b02bfd0-d5ed-489b-a554-2bf36903cca9 diff --git a/libs/libsndfile/regtest/Makefile.am b/libs/libsndfile/regtest/Makefile.am deleted file mode 100644 index a87d0c4f83..0000000000 --- a/libs/libsndfile/regtest/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -## Process this file with automake to produce Makefile.in - -bin_PROGRAMS = sndfile-regtest - -noinst_HEADERS = regtest.h - -AM_CPPFLAGS = -I$(top_srcdir)/src $(SQLITE3_CFLAGS) $(OS_SPECIFIC_CFLAGS) - -sndfile_regtest_SOURCES = sndfile-regtest.c database.c checksum.c -sndfile_regtest_LDADD = $(top_builddir)/src/libsndfile.la $(SQLITE3_LIBS) - -CLEANFILES = *~ *.exe diff --git a/libs/libsndfile/regtest/Readme.txt b/libs/libsndfile/regtest/Readme.txt deleted file mode 100644 index bc038d6429..0000000000 --- a/libs/libsndfile/regtest/Readme.txt +++ /dev/null @@ -1,108 +0,0 @@ -sndfile-regtest -=============== - -The 'sndfile-regtest' program is a regression test-suite for libsndile. - -This program is intended to allow anyone who has an interest in the -reliability and correctness of libsndfile to do their own regression -testing. From the point of view of the libsndfile developers, this -program now allows for distributed regression testing of libsndfile -which will make libsndfile better. - - -How Does it Work ----------------- -Anyone who wishes to take part in the distributed regression testing of -libsndfile can download the regression test program and install it. - -Once installed the user can start collecting files and adding them to -their own personal database. Then, as new versions of libsndfile come -out, the user should test the new library version against their database -of files (instructions below). - -Any files which were successfully added to the database in the past but -now fail the check with the new library version represent a regression. -The user should then contact the libsndfile developers so that a copy -of the test file can be made available to the developers. - - -Requirements ------------- -The regression test program uses sqlite3 as the database engine. On -Debian, the required packages are : - - sqlite3 - libsqlite3-0 - libsqlite3-dev - -but similar packages should be available on any other Linux style -system. - -The regression test currently only compiles under Unix-like systems. -At some time in the future the regression test will distributed along -with the libsndfile source code distribution. - - -Organization of Files ---------------------- -The regession test program keeps its database file in the directory it -is run from. In addition, the database only contains information about -the files, not the files themselves. - -This means that database file should probably be kept in the same -directory (or a directory above) the test files. - - -Setting it Up for the First Time --------------------------------- -The sndfile-regtest program should be on your PATH. You can then cd into -the directory where you intend to keep you test files and -run the command: - - sndfile-regtest --create-db - -which creates a file named '.sndfile-regtest.db' in the current directory. - -Files can then be added to the database using the command: - - sndfile-regtest --add-file file1.wav - -The --add-file option allows more than one file to be added at a time -using: - - sndfile-regtest --add-file file1.wav file2.aif ..... - - -Checking Files --------------- -One or more files that have already been added to the database can be -checked using: - - sndfile-regtest --check-file file1.wav file2.aif ..... - -It is also possible to check all files in the database using: - - sndfile-regtest --check-all - - -Running a Regression Test -------------------------- -Once you have a collection of files and a database it is possible to test -new versions of libsndfile before you install them. If for instance you -have just compiled a new version of libsndfile in the directory -/usr/src/libsndfile-X.Y.Z, then you can use an existing sndfile-regtest -binary with the new libsndfile using something like: - - LD_PRELOAD=/usr/src/libsndfile-X.Y.Z/src/.libs/libsndfile.so.X.Y.Z \ - sndfile-regtest --check-all - - -Reporting Regressions ---------------------- -Any user who finds a file which was added to the regression database with -an earlier version of libsndfile and then fails the check with a later -version of the library should contact the author (erikd at mega dash nerd -dot com). If possible place the file on a web server and email the author -a link to it. - - diff --git a/libs/libsndfile/regtest/checksum.c b/libs/libsndfile/regtest/checksum.c deleted file mode 100644 index 7f433a41c8..0000000000 --- a/libs/libsndfile/regtest/checksum.c +++ /dev/null @@ -1,117 +0,0 @@ -/* -** Copyright (C) 2005-2011 Erik de Castro Lopo -** -** 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. -*/ - -/* -** A simple checksum for short, int and float data. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include - -#include "regtest.h" - -#define BIG_PRIME 999983 - -#define ARRAY_LEN(x) ((int) (sizeof (x)) / (sizeof ((x) [0]))) - -static int short_checksum (SNDFILE * file, int start) ; -static int int_checksum (SNDFILE * file, int start) ; -static int float_checksum (SNDFILE * file, int start) ; - -int -calc_checksum (SNDFILE * file, const SF_INFO * info) -{ int start ; - - /* Seed the checksum with data from the SF_INFO struct. */ - start = info->samplerate ; - start = start * BIG_PRIME + info->channels ; - start = start * BIG_PRIME + info->format ; - - switch (info->format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_FLOAT : - case SF_FORMAT_DOUBLE : - return float_checksum (file, start) ; - - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - return int_checksum (file, start) ; - - default : - return short_checksum (file, start) ; - } ; - - return 0 ; -} /* calc_checksum */ - -/*------------------------------------------------------------------------------ -*/ - -static union -{ short s [1 << 16] ; - int i [1 << 15] ; - float f [1 << 15] ; -} data ; - -static int -short_checksum (SNDFILE * file, int start) -{ int k, count ; - - do - { count = (int) sf_read_short (file, data.s, ARRAY_LEN (data.s)) ; - for (k = 0 ; k < count ; k++) - start = start * BIG_PRIME + data.s [k] ; - } - while (count > 0) ; - - return start ; -} /* short_checksum */ - -static int -int_checksum (SNDFILE * file, int start) -{ int k, count ; - - do - { count = (int) sf_read_int (file, data.i, ARRAY_LEN (data.i)) ; - for (k = 0 ; k < count ; k++) - start = start * BIG_PRIME + data.i [k] ; - } - while (count > 0) ; - - return start ; -} /* int_checksum */ - -static int -float_checksum (SNDFILE * file, int start) -{ int k, count ; - - do - { count = (int) sf_read_float (file, data.f, ARRAY_LEN (data.f)) ; - for (k = 0 ; k < count ; k++) - start = start * BIG_PRIME + lrintf (0x7FFFFFFF * data.f [k]) ; - } - while (count > 0) ; - - return start ; -} /* float_checksum */ - diff --git a/libs/libsndfile/regtest/database.c b/libs/libsndfile/regtest/database.c deleted file mode 100644 index f800a2c873..0000000000 --- a/libs/libsndfile/regtest/database.c +++ /dev/null @@ -1,495 +0,0 @@ -/* -** Copyright (C) 2005-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "config.h" - -#include -#include -#include -#include -#include -#include - -#include - -#include "regtest.h" - -#if HAVE_SQLITE3 - -#include - -typedef struct -{ sqlite3 *sql ; - - int count ; - int ekey_max ; - - /* Filename and pathname for file. */ - char filename [256] ; - char pathname [512] ; - - /* Storage for createding SQL commands. Must be larger than logbuf below. */ - char cmdbuf [1 << 15] ; - - /* Storage for log buffer retrieved from SNDFILE* .*/ - char logbuf [1 << 14] ; - -} REGTEST_DB ; - -/* In checksum.c */ -int calc_checksum (SNDFILE * file, const SF_INFO * info) ; - -static void get_filename_pathname (REGTEST_DB * db, const char *filepath) ; -static void single_quote_replace (char * buf) ; - -static int get_ekey_from_filename (REGTEST_DB * db, const char *filepath) ; -static int get_filename_pathname_by_ekey (REGTEST_DB * db, int ekey) ; -static int check_file_by_ekey (REGTEST_DB * db, int ekey) ; - -static int count_callback (REGTEST_DB * db, int argc, char **argv, char **colname) ; -static int ekey_max_callback (REGTEST_DB * db, int argc, char **argv, char **colname) ; -static int callback (void *unused, int argc, char **argv, char **colname) ; - -REG_DB * -db_open (const char * db_name) -{ REGTEST_DB * db ; - int err ; - - if ((db = malloc (sizeof (REGTEST_DB))) == NULL) - { perror ("malloc") ; - exit (1) ; - } ; - - if ((err = sqlite3_open (db_name, &(db->sql))) != 0) - { printf ("Can't open database: %s\n", sqlite3_errmsg (db->sql)) ; - sqlite3_close (db->sql) ; - free (db) ; - exit (1) ; - } ; - - return (REG_DB *) db ; -} /* db_open */ - -int -db_create (const char * db_name) -{ REGTEST_DB * db ; - const char *cmd ; - char * errmsg = NULL ; - int err ; - - db = (REGTEST_DB *) db_open (db_name) ; - - cmd = "create table sndfile (ekey INTEGER PRIMARY KEY," - "fname VARCHAR(1)," - "fpath VARCHAR(1)," - "srate INTEGER," - "frames VARCHAR(1)," - "channels INTEGER," - "format VARCHAR(1)," - "checksum VARCHAR(1)," - "logbuf VARCHAR(1)" - ");" ; - - err = sqlite3_exec (db->sql, cmd, callback, 0, &errmsg) ; - if (err != SQLITE_OK) - printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ; - - sqlite3_close (db->sql) ; - free (db) ; - - return 0 ; -} /* db_create */ - -int -db_close (REG_DB * db_handle) -{ REGTEST_DB * db ; - - db = (REGTEST_DB *) db_handle ; - - sqlite3_close (db->sql) ; - free (db) ; - - return 0 ; -} /* db_close */ - -/*============================================================================== -*/ - -int -db_file_exists (REG_DB * db_handle, const char * filename) -{ REGTEST_DB * db ; - const char * cptr ; - char * errmsg ; - int err ; - - db = (REGTEST_DB *) db_handle ; - - if ((cptr = strrchr (filename, '/')) != NULL) - filename = cptr + 1 ; - - snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select fname from sndfile where fname='%s'", filename) ; - - db->count = 0 ; - err = sqlite3_exec (db->sql, db->cmdbuf, (sqlite3_callback) count_callback, db, &errmsg) ; - if (err == 0 && db->count == 1) - return 1 ; - - return 0 ; -} /* db_file_exists */ - -int -db_add_file (REG_DB * db_handle, const char * filepath) -{ REGTEST_DB * db ; - SNDFILE * sndfile ; - SF_INFO info ; - char * errmsg ; - int err, checksum ; - - db = (REGTEST_DB *) db_handle ; - - get_filename_pathname (db, filepath) ; - - if (db_file_exists (db_handle, filepath)) - { printf (" %s : already in database\n", db->filename) ; - return 0 ; - } ; - - memset (&info, 0, sizeof (info)) ; - sndfile = sf_open (db->pathname, SFM_READ, &info) ; - sf_command (sndfile, SFC_GET_LOG_INFO, db->logbuf, sizeof (db->logbuf)) ; - checksum = (sndfile == NULL) ? 0 : calc_checksum (sndfile, &info) ; - sf_close (sndfile) ; - - if (sndfile == NULL) - { printf (" %s : could not open : %s\n", db->filename, sf_strerror (NULL)) ; - puts (db->logbuf) ; - return 1 ; - } ; - - single_quote_replace (db->logbuf) ; - - snprintf (db->cmdbuf, sizeof (db->cmdbuf), "insert into sndfile " - "(fname, fpath, srate, frames, channels, format, checksum, logbuf) values" - "('%s','%s',%d,'%ld', %d, '0x%08x', '0x%08x', '%s');", - db->filename, db->pathname, info.samplerate, (long) info.frames, info.channels, info.format, checksum, db->logbuf) ; - - if (strlen (db->cmdbuf) >= sizeof (db->cmdbuf) - 1) - { printf ("strlen (db->cmdbuf) too long.\n") ; - exit (1) ; - } ; - - err = sqlite3_exec (db->sql, db->cmdbuf, callback, 0, &errmsg) ; - if (err != SQLITE_OK) - { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ; - puts (db->cmdbuf) ; - } ; - - return 0 ; -} /* db_add_file */ - -int -db_check_file (REG_DB * db_handle, const char * filepath) -{ REGTEST_DB * db ; - int ekey ; - - if (db_file_exists (db_handle, filepath) == 0) - { printf ("\nFile not in database.\n\n") ; - exit (0) ; - } ; - - db = (REGTEST_DB *) db_handle ; - - ekey = get_ekey_from_filename (db, filepath) ; - - return check_file_by_ekey (db, ekey) ; -} /* db_check_file */ - -/*============================================================================== -*/ - -int -db_check_all (REG_DB * db_handle) -{ REGTEST_DB * db ; - char * errmsg ; - int err, ekey ; - - db = (REGTEST_DB *) db_handle ; - - db->ekey_max = 0 ; - - snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select ekey from sndfile") ; - - err = sqlite3_exec (db->sql, db->cmdbuf, (sqlite3_callback) ekey_max_callback, db, &errmsg) ; - if (err != SQLITE_OK) - { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ; - puts (db->cmdbuf) ; - } ; - - for (ekey = 1 ; ekey <= db->ekey_max ; ekey++) - if (get_filename_pathname_by_ekey (db, ekey) != 0) - check_file_by_ekey (db, ekey) ; - - return 0 ; -} /* db_check_all */ - - -int -db_list_all (REG_DB * db_handle) -{ - printf ("%s : %p\n", __func__, db_handle) ; - return 0 ; -} /* db_list_all */ - -int -db_del_entry (REG_DB * db_handle, const char * entry) -{ - printf ("%s : %p %s\n", __func__, db_handle, entry) ; - return 0 ; -} /* db_del_entry */ - -/*============================================================================== -*/ - -static int -get_ekey_from_filename (REGTEST_DB * db, const char *filepath) -{ char * errmsg, **result ; - int err, ekey = 0, rows, cols ; - - get_filename_pathname (db, filepath) ; - - snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select ekey from sndfile where fname='%s'", db->filename) ; - - err = sqlite3_get_table (db->sql, db->cmdbuf, &result, &rows, &cols, &errmsg) ; - if (err != SQLITE_OK) - { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ; - puts (db->cmdbuf) ; - } ; - - if (cols != 1 || rows != 1) - { printf ("Bad juju!! rows = %d cols = %d\n", rows, cols) ; - exit (1) ; - } ; - - ekey = strtol (result [1], NULL, 10) ; - - sqlite3_free_table (result) ; - - return ekey ; -} /* get_ekey_from_filename */ - -static int -get_filename_pathname_by_ekey (REGTEST_DB * db, int ekey) -{ char *errmsg, **result ; - int err, rows, cols ; - - snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select fname,fpath from sndfile where ekey='%d'", ekey) ; - - err = sqlite3_get_table (db->sql, db->cmdbuf, &result, &rows, &cols, &errmsg) ; - if (err != SQLITE_OK) - { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ; - puts (db->cmdbuf) ; - return 0 ; - } ; - - if (cols != 2 || rows != 1) - { printf ("\nError (%s %d) : rows = %d cols = %d\n", __func__, __LINE__, rows, cols) ; - exit (1) ; - } ; - - snprintf (db->filename, sizeof (db->filename), "%s", result [2]) ; - snprintf (db->pathname, sizeof (db->pathname), "%s", result [3]) ; - - sqlite3_free_table (result) ; - - return 1 ; -} /* get_filename_pathname_by_ekey */ - -static int -check_file_by_ekey (REGTEST_DB * db, int ekey) -{ SNDFILE * sndfile ; - SF_INFO info ; - char * errmsg, **result ; - int err, k, rows, cols, checksum ; - - printf (" %s : ", db->filename) ; - fflush (stdout) ; - - memset (&info, 0, sizeof (info)) ; - sndfile = sf_open (db->pathname, SFM_READ, &info) ; - sf_command (sndfile, SFC_GET_LOG_INFO, db->logbuf, sizeof (db->logbuf)) ; - checksum = (sndfile == NULL) ? 0 : calc_checksum (sndfile, &info) ; - sf_close (sndfile) ; - - if (sndfile == NULL) - { printf ("\n\nError : Could not open '%s' : %s\n", db->pathname, sf_strerror (NULL)) ; - puts (db->logbuf) ; - exit (1) ; - } ; - - single_quote_replace (db->logbuf) ; - - snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select fname,srate,frames,channels,format," - "checksum,logbuf from sndfile where ekey='%d'", ekey) ; - - err = sqlite3_get_table (db->sql, db->cmdbuf, &result, &rows, &cols, &errmsg) ; - if (err != SQLITE_OK) - { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ; - puts (db->cmdbuf) ; - } ; - - for (k = 0 ; k < cols ; k++) - { if (strcmp (result [k], "fname") == 0) - { if (strcmp (result [k + cols], db->filename) == 0) - continue ; - printf ("\n\nError : fname doesn't match : %s != %s\n", result [k + cols], db->filename) ; - } ; - - if (strcmp (result [k], "srate") == 0) - { if (strtol (result [k + cols], NULL, 10) == info.samplerate) - continue ; - printf ("\n\nError : srate doesn't match : %s == %d\n", result [k + cols], info.samplerate) ; - } ; - - if (strcmp (result [k], "frames") == 0) - { if (strtoll (result [k + cols], NULL, 10) == info.frames) - continue ; - printf ("\n\nError : frames doesn't match : %s == %ld\n", result [k + cols], (long) info.frames) ; - } ; - - if (strcmp (result [k], "channels") == 0) - { if (strtol (result [k + cols], NULL, 10) == info.channels) - continue ; - printf ("\n\nError : channels doesn't match : %s == %d\n", result [k + cols], info.channels) ; - } ; - - if (strcmp (result [k], "format") == 0) - { if (strtol (result [k + cols], NULL, 16) == info.format) - continue ; - printf ("\n\nError : format doesn't match : %s == 0x%08x\n", result [k + cols], info.format) ; - } ; - - if (strcmp (result [k], "checksum") == 0) - { int db_val = (int) strtoll (result [k + cols], NULL, 16) ; - - if (db_val == checksum) - continue ; - printf ("\n\nError : checksum doesn't match : 0x%08x == 0x%08x\n", db_val, checksum) ; - } ; - - if (strcmp (result [k], "logbuf") == 0) - continue ; - - printf ("\nHere is the old logubuffer :\n\n%s\n\nand the new :\n\n%s\n\n", result [2 * cols - 1], db->logbuf) ; - exit (1) ; - } ; - - sqlite3_free_table (result) ; - - puts ("ok") ; - - return 0 ; -} /* check_file_by_ekey */ - -/*============================================================================== -*/ - -static void -get_filename_pathname (REGTEST_DB * db, const char *filepath) -{ const char * cptr ; - int slen ; - - if (filepath [0] != '/') - { memset (db->pathname, 0, sizeof (db->pathname)) ; - if (getcwd (db->pathname, sizeof (db->pathname)) == NULL) - { perror ("\ngetcwd failed") ; - exit (1) ; - } ; - - slen = strlen (db->pathname) ; - db->pathname [slen ++] = '/' ; - snprintf (db->pathname + slen, sizeof (db->pathname) - slen, "%s", filepath) ; - } - else - snprintf (db->pathname, sizeof (db->pathname), "%s", filepath) ; - - if ((cptr = strrchr (db->pathname, '/')) == NULL) - { printf ("\nError : bad pathname %s\n", filepath) ; - exit (1) ; - } ; - - snprintf (db->filename, sizeof (db->filename), "%s", cptr + 1) ; -} /* get filename_pathname */ - -static void -single_quote_replace (char * buf) -{ while ((buf = strchr (buf, '\'')) != 0) - buf [0] = '"' ; -} /* single_quote_replace */ - -static int -count_callback (REGTEST_DB * db, int argc, char **argv, char **colname) -{ db->count ++ ; - - (void) argc ; - (void) argv ; - (void) colname ; - return 0 ; -} /* count_callback */ - -static int -ekey_max_callback (REGTEST_DB * db, int argc, char **argv, char **unused) -{ int ekey ; - - (void) argc ; - (void) unused ; - - ekey = strtol (argv [0], NULL, 10) ; - if (ekey > db->ekey_max) - db->ekey_max = ekey ; - - return 0 ; -} /* ekey_max_callback */ - -static int -callback (void *unused, int argc, char **argv, char **colname) -{ int k ; - - (void) unused ; - - for (k = 0 ; k < argc ; k++) - printf ("%s = %s\n", colname [k], argv [k] ? argv [k] : "NULL") ; - - printf ("\n") ; - - return 0 ; -} /* callback */ - -#else - -int dummy (void) ; - -int -dummy (void) -{ /* - ** Empty dummy fnction so tha compiler doesn't winge about an - ** empty file. - */ - return 0 ; -} /* dummy */ - -#endif diff --git a/libs/libsndfile/regtest/regtest.h b/libs/libsndfile/regtest/regtest.h deleted file mode 100644 index 567d97be28..0000000000 --- a/libs/libsndfile/regtest/regtest.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -** Copyright (C) 2005-2011 Erik de Castro Lopo -** -** 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. -*/ - -typedef struct REG_DB_tag REG_DB ; - -/* In database.c */ -REG_DB * db_open (const char * db_name) ; - -int db_create (const char * dbname) ; - -int db_close (REG_DB * db_handle) ; - -int db_file_exists (REG_DB * db_handle, const char * filename) ; -int db_add_file (REG_DB * db_handle, const char * filename) ; -int db_check_file (REG_DB * db_handle, const char * filename) ; - -int db_list_all (REG_DB * db_handle) ; -int db_check_all (REG_DB * db_handle) ; -int db_del_entry (REG_DB * db_handle, const char * entry) ; - -/* In checksum.c */ -int calc_checksum (SNDFILE * file, const SF_INFO * info) ; - diff --git a/libs/libsndfile/regtest/sndfile-regtest.c b/libs/libsndfile/regtest/sndfile-regtest.c deleted file mode 100644 index a28caa2d84..0000000000 --- a/libs/libsndfile/regtest/sndfile-regtest.c +++ /dev/null @@ -1,121 +0,0 @@ -/* -** Copyright (C) 2005-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "config.h" - -#include -#include -#include - -#include - -#if HAVE_SQLITE3 - -#include "regtest.h" - -enum -{ OPT_ADD_FILE = 0x0100, - OPT_CREATE_DB = 0x0200, - OPT_DEL_ENTRY = 0x0400, - OPT_LIST_ALL = 0x0800, - OPT_TEST_ALL = 0x1000, - OPT_VERBOSE = 0x2000 -} ; - -static void print_libsndfile_version (void) ; - -int -main (int argc, char * argv []) -{ const char *db_name = "./.sndfile-regtest.db" ; - REG_DB *reg_db ; - int k, retval ; - - if (argc < 2) - { printf ("\nUsage message goes here.\n\n") ; - exit (0) ; - } ; - - if (argc == 2 && strcmp (argv [1], "--create-db") == 0) - return db_create (db_name) ; - - reg_db = db_open (db_name) ; - - if (argc == 2) - { if (strcmp (argv [1], "--list-all") == 0) - return db_list_all (reg_db) ; - - if (strcmp (argv [1], "--check-all") == 0) - { print_libsndfile_version () ; - retval = db_check_all (reg_db) ; - puts ("\nDone.\n") ; - return retval ; - } ; - } ; - - if (argc == 3 && strcmp (argv [1], "--del-entry") == 0) - { db_del_entry (reg_db, argv [2]) ; - db_close (reg_db) ; - return 0 ; - } ; - - if (strcmp (argv [1], "--check-file") == 0) - { print_libsndfile_version () ; - - for (k = 2 ; k < argc ; k++) - db_check_file (reg_db, argv [k]) ; - db_close (reg_db) ; - return 0 ; - } ; - - if (strcmp (argv [1], "--add-file") == 0) - { print_libsndfile_version () ; - - for (k = 2 ; k < argc ; k++) - db_add_file (reg_db, argv [k]) ; - db_close (reg_db) ; - return 0 ; - } ; - - printf ("\nError : unhandled command line args :") ; - for (k = 1 ; k < argc ; k++) - printf (" %s", argv [k]) ; - puts ("\n") ; - - return 1 ; -} /* main */ - -static void -print_libsndfile_version (void) -{ char version [64] ; - - sf_command (NULL, SFC_GET_LIB_VERSION, version, sizeof (version)) ; - printf ("\nsndfile-regtest : using %s\n\n", version) ; -} /* print_lib_version */ - -#else - -int -main (void) -{ - puts ("\nThis program was not compiled with libsqlite3 and hence doesn't work.\n") ; - - return 0 ; -} /* main */ - -#endif - diff --git a/libs/libsndfile/sndfile.pc.in b/libs/libsndfile/sndfile.pc.in deleted file mode 100644 index 28269c19eb..0000000000 --- a/libs/libsndfile/sndfile.pc.in +++ /dev/null @@ -1,12 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: sndfile -Description: A library for reading and writing audio files -Requires: -Version: @VERSION@ -Libs: -L${libdir} -lsndfile -Libs.private: @EXTERNAL_LIBS@ -Cflags: -I${includedir} diff --git a/libs/libsndfile/src/ALAC/ALACAudioTypes.h b/libs/libsndfile/src/ALAC/ALACAudioTypes.h deleted file mode 100644 index 4d120fa5e4..0000000000 --- a/libs/libsndfile/src/ALAC/ALACAudioTypes.h +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: ALACAudioTypes.h -*/ - -#ifndef ALACAUDIOTYPES_H -#define ALACAUDIOTYPES_H - -/* Force these Mac OS specific things to zero. */ -#define PRAGMA_STRUCT_ALIGN 0 -#define PRAGMA_STRUCT_PACKPUSH 0 -#define PRAGMA_STRUCT_PACK 0 -#define PRAGMA_ONCE 0 -#define PRAGMA_MARK 0 - - -#if PRAGMA_ONCE -#pragma once -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -#include "sfendian.h" - -#if CPU_IS_BIG_ENDIAN == 1 -#define TARGET_RT_BIG_ENDIAN 1 -#else -#define TARGET_RT_BIG_ENDIAN 0 -#endif - -#define kChannelAtomSize 12 - -enum -{ - kALAC_UnimplementedError = -4, - kALAC_FileNotFoundError = -43, - kALAC_ParamError = -50, - kALAC_MemFullError = -108, - fALAC_FrameLengthError = -666, -}; - -enum -{ - kALACFormatAppleLossless = MAKE_MARKER ('a', 'l', 'a', 'c'), - kALACFormatLinearPCM = MAKE_MARKER ('l', 'p', 'c', 'm') -}; - -enum -{ - kALACMaxChannels = 8, - kALACMaxEscapeHeaderBytes = 8, - kALACMaxSearches = 16, - kALACMaxCoefs = 16, - kALACDefaultFramesPerPacket = 4096 -}; - -typedef uint32_t ALACChannelLayoutTag; - -enum -{ - kALACFormatFlagIsFloat = (1 << 0), // 0x1 - kALACFormatFlagIsBigEndian = (1 << 1), // 0x2 - kALACFormatFlagIsSignedInteger = (1 << 2), // 0x4 - kALACFormatFlagIsPacked = (1 << 3), // 0x8 - kALACFormatFlagIsAlignedHigh = (1 << 4), // 0x10 -}; - -enum -{ -#if TARGET_RT_BIG_ENDIAN - kALACFormatFlagsNativeEndian = kALACFormatFlagIsBigEndian -#else - kALACFormatFlagsNativeEndian = 0 -#endif -}; - -// this is required to be an IEEE 64bit float -typedef double alac_float64_t; - -// These are the Channel Layout Tags used in the Channel Layout Info portion of the ALAC magic cookie -enum -{ - kALACChannelLayoutTag_Mono = (100<<16) | 1, // C - kALACChannelLayoutTag_Stereo = (101<<16) | 2, // L R - kALACChannelLayoutTag_MPEG_3_0_B = (113<<16) | 3, // C L R - kALACChannelLayoutTag_MPEG_4_0_B = (116<<16) | 4, // C L R Cs - kALACChannelLayoutTag_MPEG_5_0_D = (120<<16) | 5, // C L R Ls Rs - kALACChannelLayoutTag_MPEG_5_1_D = (124<<16) | 6, // C L R Ls Rs LFE - kALACChannelLayoutTag_AAC_6_1 = (142<<16) | 7, // C L R Ls Rs Cs LFE - kALACChannelLayoutTag_MPEG_7_1_B = (127<<16) | 8 // C Lc Rc L R Ls Rs LFE (doc: IS-13818-7 MPEG2-AAC) -}; - -// ALAC currently only utilizes these channels layouts. There is a one for one correspondance between a -// given number of channels and one of these layout tags -static const ALACChannelLayoutTag ALACChannelLayoutTags[kALACMaxChannels] = -{ - kALACChannelLayoutTag_Mono, // C - kALACChannelLayoutTag_Stereo, // L R - kALACChannelLayoutTag_MPEG_3_0_B, // C L R - kALACChannelLayoutTag_MPEG_4_0_B, // C L R Cs - kALACChannelLayoutTag_MPEG_5_0_D, // C L R Ls Rs - kALACChannelLayoutTag_MPEG_5_1_D, // C L R Ls Rs LFE - kALACChannelLayoutTag_AAC_6_1, // C L R Ls Rs Cs LFE - kALACChannelLayoutTag_MPEG_7_1_B // C Lc Rc L R Ls Rs LFE (doc: IS-13818-7 MPEG2-AAC) -}; - -// AudioChannelLayout from CoreAudioTypes.h. We never need the AudioChannelDescription so we remove it -struct ALACAudioChannelLayout -{ - ALACChannelLayoutTag mChannelLayoutTag; - uint32_t mChannelBitmap; - uint32_t mNumberChannelDescriptions; -}; -typedef struct ALACAudioChannelLayout ALACAudioChannelLayout; - -struct AudioFormatDescription -{ - alac_float64_t mSampleRate; - uint32_t mFormatID; - uint32_t mFormatFlags; - uint32_t mBytesPerPacket; - uint32_t mFramesPerPacket; - uint32_t mBytesPerFrame; - uint32_t mChannelsPerFrame; - uint32_t mBitsPerChannel; - uint32_t mReserved; -}; -typedef struct AudioFormatDescription AudioFormatDescription; - -/* Lossless Definitions */ - -enum -{ - kALACCodecFormat = MAKE_MARKER ('a', 'l', 'a', 'c'), - kALACVersion = 0, - kALACCompatibleVersion = kALACVersion, - kALACDefaultFrameSize = 4096 -}; - -// note: this struct is wrapped in an 'alac' atom in the sample description extension area -// note: in QT movies, it will be further wrapped in a 'wave' atom surrounded by 'frma' and 'term' atoms -typedef struct ALACSpecificConfig -{ - uint32_t frameLength; - uint8_t compatibleVersion; - uint8_t bitDepth; // max 32 - uint8_t pb; // 0 <= pb <= 255 - uint8_t mb; - uint8_t kb; - uint8_t numChannels; - uint16_t maxRun; - uint32_t maxFrameBytes; - uint32_t avgBitRate; - uint32_t sampleRate; - -} ALACSpecificConfig; - - -// The AudioChannelLayout atom type is not exposed yet so define it here -enum -{ - AudioChannelLayoutAID = MAKE_MARKER ('c', 'h', 'a', 'n') -}; - -#if PRAGMA_STRUCT_ALIGN - #pragma options align=reset -#elif PRAGMA_STRUCT_PACKPUSH - #pragma pack(pop) -#elif PRAGMA_STRUCT_PACK - #pragma pack() -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* ALACAUDIOTYPES_H */ diff --git a/libs/libsndfile/src/ALAC/ALACBitUtilities.c b/libs/libsndfile/src/ALAC/ALACBitUtilities.c deleted file mode 100644 index f385daff0c..0000000000 --- a/libs/libsndfile/src/ALAC/ALACBitUtilities.c +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/*============================================================================= - File: ALACBitUtilities.c - - $NoKeywords: $ -=============================================================================*/ - -#include -#include "ALACBitUtilities.h" - -#define PRAGMA_MARK 0 - -// BitBufferInit -// -void BitBufferInit( BitBuffer * bits, uint8_t * buffer, uint32_t byteSize ) -{ - bits->cur = buffer; - bits->end = bits->cur + byteSize; - bits->bitIndex = 0; - bits->byteSize = byteSize; -} - -// BitBufferRead -// -uint32_t BitBufferRead( BitBuffer * bits, uint8_t numBits ) -{ - uint32_t returnBits; - - //Assert( numBits <= 16 ); - - returnBits = ((uint32_t)bits->cur[0] << 16) | ((uint32_t)bits->cur[1] << 8) | ((uint32_t)bits->cur[2]); - returnBits = returnBits << bits->bitIndex; - returnBits &= 0x00FFFFFF; - - bits->bitIndex += numBits; - - returnBits = returnBits >> (24 - numBits); - - bits->cur += (bits->bitIndex >> 3); - bits->bitIndex &= 7; - - //Assert( bits->cur <= bits->end ); - - return returnBits; -} - -// BitBufferReadSmall -// -// Reads up to 8 bits -uint8_t BitBufferReadSmall( BitBuffer * bits, uint8_t numBits ) -{ - uint16_t returnBits; - - //Assert( numBits <= 8 ); - - returnBits = (bits->cur[0] << 8) | bits->cur[1]; - returnBits = returnBits << bits->bitIndex; - - bits->bitIndex += numBits; - - returnBits = returnBits >> (16 - numBits); - - bits->cur += (bits->bitIndex >> 3); - bits->bitIndex &= 7; - - //Assert( bits->cur <= bits->end ); - - return (uint8_t)returnBits; -} - -// BitBufferReadOne -// -// Reads one byte -uint8_t BitBufferReadOne( BitBuffer * bits ) -{ - uint8_t returnBits; - - returnBits = (bits->cur[0] >> (7 - bits->bitIndex)) & 1; - - bits->bitIndex++; - - bits->cur += (bits->bitIndex >> 3); - bits->bitIndex &= 7; - - //Assert( bits->cur <= bits->end ); - - return returnBits; -} - -// BitBufferPeek -// -uint32_t BitBufferPeek( BitBuffer * bits, uint8_t numBits ) -{ - return ((((((uint32_t) bits->cur[0] << 16) | ((uint32_t) bits->cur[1] << 8) | - ((uint32_t) bits->cur[2])) << bits->bitIndex) & 0x00FFFFFF) >> (24 - numBits)); -} - -// BitBufferPeekOne -// -uint32_t BitBufferPeekOne( BitBuffer * bits ) -{ - return ((bits->cur[0] >> (7 - bits->bitIndex)) & 1); -} - -// BitBufferUnpackBERSize -// -uint32_t BitBufferUnpackBERSize( BitBuffer * bits ) -{ - uint32_t size; - uint8_t tmp; - - for ( size = 0, tmp = 0x80u; tmp &= 0x80u; size = (size << 7u) | (tmp & 0x7fu) ) - tmp = (uint8_t) BitBufferReadSmall( bits, 8 ); - - return size; -} - -// BitBufferGetPosition -// -uint32_t BitBufferGetPosition( BitBuffer * bits ) -{ - uint8_t * begin; - - begin = bits->end - bits->byteSize; - - return ((uint32_t)(bits->cur - begin) * 8) + bits->bitIndex; -} - -// BitBufferByteAlign -// -void BitBufferByteAlign( BitBuffer * bits, int32_t addZeros ) -{ - // align bit buffer to next byte boundary, writing zeros if requested - if ( bits->bitIndex == 0 ) - return; - - if ( addZeros ) - BitBufferWrite( bits, 0, 8 - bits->bitIndex ); - else - BitBufferAdvance( bits, 8 - bits->bitIndex ); -} - -// BitBufferAdvance -// -void BitBufferAdvance( BitBuffer * bits, uint32_t numBits ) -{ - if ( numBits ) - { - bits->bitIndex += numBits; - bits->cur += (bits->bitIndex >> 3); - bits->bitIndex &= 7; - } -} - -// BitBufferRewind -// -void BitBufferRewind( BitBuffer * bits, uint32_t numBits ) -{ - uint32_t numBytes; - - if ( numBits == 0 ) - return; - - if ( bits->bitIndex >= numBits ) - { - bits->bitIndex -= numBits; - return; - } - - numBits -= bits->bitIndex; - bits->bitIndex = 0; - - numBytes = numBits / 8; - numBits = numBits % 8; - - bits->cur -= numBytes; - - if ( numBits > 0 ) - { - bits->bitIndex = 8 - numBits; - bits->cur--; - } - - if ( bits->cur < (bits->end - bits->byteSize) ) - { - //DebugCMsg("BitBufferRewind: Rewound too far."); - - bits->cur = (bits->end - bits->byteSize); - bits->bitIndex = 0; - } -} - -// BitBufferWrite -// -void BitBufferWrite( BitBuffer * bits, uint32_t bitValues, uint32_t numBits ) -{ - uint32_t invBitIndex; - - RequireAction( bits != NULL, return; ); - RequireActionSilent( numBits > 0, return; ); - - invBitIndex = 8 - bits->bitIndex; - - while ( numBits > 0 ) - { - uint32_t tmp; - uint8_t shift; - uint8_t mask; - uint32_t curNum; - - curNum = MIN( invBitIndex, numBits ); - - tmp = bitValues >> (numBits - curNum); - - shift = (uint8_t)(invBitIndex - curNum); - mask = 0xffu >> (8 - curNum); // must be done in two steps to avoid compiler sequencing ambiguity - mask <<= shift; - - bits->cur[0] = (bits->cur[0] & ~mask) | (((uint8_t) tmp << shift) & mask); - numBits -= curNum; - - // increment to next byte if need be - invBitIndex -= curNum; - if ( invBitIndex == 0 ) - { - invBitIndex = 8; - bits->cur++; - } - } - - bits->bitIndex = 8 - invBitIndex; -} - -void BitBufferReset( BitBuffer * bits ) -//void BitBufferInit( BitBuffer * bits, uint8_t * buffer, uint32_t byteSize ) -{ - bits->cur = bits->end - bits->byteSize; - bits->bitIndex = 0; -} - -#if PRAGMA_MARK -#pragma mark - -#endif diff --git a/libs/libsndfile/src/ALAC/ALACBitUtilities.h b/libs/libsndfile/src/ALAC/ALACBitUtilities.h deleted file mode 100644 index 5d3a4c1433..0000000000 --- a/libs/libsndfile/src/ALAC/ALACBitUtilities.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/*============================================================================= - File: ALACBitUtilities.h - - $NoKeywords: $ -=============================================================================*/ - -#ifndef __ALACBITUTILITIES_H -#define __ALACBITUTILITIES_H - -#include - -#ifndef MIN -#define MIN(x, y) ( (x)<(y) ?(x) :(y) ) -#endif //MIN -#ifndef MAX -#define MAX(x, y) ( (x)>(y) ?(x): (y) ) -#endif //MAX - -#define RequireAction(condition, action) if (!(condition)) { action } -#define RequireActionSilent(condition, action) if (!(condition)) { action } -#define RequireNoErr(condition, action) if ((condition)) { action } - -enum -{ - ALAC_noErr = 0 -}; - - -typedef enum -{ - - ID_SCE = 0, /* Single Channel Element */ - ID_CPE = 1, /* Channel Pair Element */ - ID_CCE = 2, /* Coupling Channel Element */ - ID_LFE = 3, /* LFE Channel Element */ - ID_DSE = 4, /* not yet supported */ - ID_PCE = 5, - ID_FIL = 6, - ID_END = 7 -} ELEMENT_TYPE; - -// types -typedef struct BitBuffer -{ - uint8_t * cur; - uint8_t * end; - uint32_t bitIndex; - uint32_t byteSize; - -} BitBuffer; - -/* - BitBuffer routines - - these routines take a fixed size buffer and read/write to it - - bounds checking must be done by the client -*/ -void BitBufferInit( BitBuffer * bits, uint8_t * buffer, uint32_t byteSize ); -uint32_t BitBufferRead( BitBuffer * bits, uint8_t numBits ); // note: cannot read more than 16 bits at a time -uint8_t BitBufferReadSmall( BitBuffer * bits, uint8_t numBits ); -uint8_t BitBufferReadOne( BitBuffer * bits ); -uint32_t BitBufferPeek( BitBuffer * bits, uint8_t numBits ); // note: cannot read more than 16 bits at a time -uint32_t BitBufferPeekOne( BitBuffer * bits ); -uint32_t BitBufferUnpackBERSize( BitBuffer * bits ); -uint32_t BitBufferGetPosition( BitBuffer * bits ); -void BitBufferByteAlign( BitBuffer * bits, int32_t addZeros ); -void BitBufferAdvance( BitBuffer * bits, uint32_t numBits ); -void BitBufferRewind( BitBuffer * bits, uint32_t numBits ); -void BitBufferWrite( BitBuffer * bits, uint32_t value, uint32_t numBits ); -void BitBufferReset( BitBuffer * bits); - -#endif /* __BITUTILITIES_H */ diff --git a/libs/libsndfile/src/ALAC/ALACDecoder.h b/libs/libsndfile/src/ALAC/ALACDecoder.h deleted file mode 100644 index baebd4fac4..0000000000 --- a/libs/libsndfile/src/ALAC/ALACDecoder.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: ALACDecoder.h -*/ - -#ifndef _ALACDECODER_H -#define _ALACDECODER_H - -#include - -#include "ALACAudioTypes.h" - -struct BitBuffer; - -class ALACDecoder -{ - public: - ALACDecoder(); - ~ALACDecoder(); - - int32_t Init( void * inMagicCookie, uint32_t inMagicCookieSize ); - int32_t Decode( struct BitBuffer * bits, uint8_t * sampleBuffer, uint32_t numSamples, uint32_t numChannels, uint32_t * outNumSamples ); - - public: - // decoding parameters (public for use in the analyzer) - ALACSpecificConfig mConfig; - - protected: - int32_t FillElement( struct BitBuffer * bits ); - int32_t DataStreamElement( struct BitBuffer * bits ); - - uint16_t mActiveElements; - - // decoding buffers - int32_t * mMixBufferU; - int32_t * mMixBufferV; - int32_t * mPredictor; - uint16_t * mShiftBuffer; // note: this points to mPredictor's memory but different - // variable for clarity and type difference -}; - -#endif /* _ALACDECODER_H */ diff --git a/libs/libsndfile/src/ALAC/ALACEncoder.h b/libs/libsndfile/src/ALAC/ALACEncoder.h deleted file mode 100644 index 75a0a43721..0000000000 --- a/libs/libsndfile/src/ALAC/ALACEncoder.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: ALACEncoder.h -*/ - -#pragma once - -#include - -#include "ALACAudioTypes.h" - - -struct BitBuffer; - -class ALACEncoder -{ - public: - ALACEncoder(); - virtual ~ALACEncoder(); - - virtual int32_t Encode(AudioFormatDescription theInputFormat, AudioFormatDescription theOutputFormat, - unsigned char * theReadBuffer, unsigned char * theWriteBuffer, int32_t * ioNumBytes); - virtual int32_t Finish( ); - - void SetFastMode( bool fast ) { mFastMode = fast; }; - - // this must be called *before* InitializeEncoder() - void SetFrameSize( uint32_t frameSize ) { mFrameSize = frameSize; }; - - void GetConfig( ALACSpecificConfig & config ); - uint32_t GetMagicCookieSize(uint32_t inNumChannels); - void GetMagicCookie( void * config, uint32_t * ioSize ); - - virtual int32_t InitializeEncoder(AudioFormatDescription theOutputFormat); - - protected: - virtual void GetSourceFormat( const AudioFormatDescription * source, AudioFormatDescription * output ); - - int32_t EncodeStereo( struct BitBuffer * bitstream, void * input, uint32_t stride, uint32_t channelIndex, uint32_t numSamples ); - int32_t EncodeStereoFast( struct BitBuffer * bitstream, void * input, uint32_t stride, uint32_t channelIndex, uint32_t numSamples ); - int32_t EncodeStereoEscape( struct BitBuffer * bitstream, void * input, uint32_t stride, uint32_t numSamples ); - int32_t EncodeMono( struct BitBuffer * bitstream, void * input, uint32_t stride, uint32_t channelIndex, uint32_t numSamples ); - - - // ALAC encoder parameters - int16_t mBitDepth; - bool mFastMode; - - // encoding state - int16_t mLastMixRes[kALACMaxChannels]; - - // encoding buffers - int32_t * mMixBufferU; - int32_t * mMixBufferV; - int32_t * mPredictorU; - int32_t * mPredictorV; - uint16_t * mShiftBufferUV; - - uint8_t * mWorkBuffer; - - // per-channel coefficients buffers - int16_t mCoefsU[kALACMaxChannels][kALACMaxSearches][kALACMaxCoefs]; - int16_t mCoefsV[kALACMaxChannels][kALACMaxSearches][kALACMaxCoefs]; - - // encoding statistics - uint32_t mTotalBytesGenerated; - uint32_t mAvgBitRate; - uint32_t mMaxFrameBytes; - uint32_t mFrameSize; - uint32_t mMaxOutputBytes; - uint32_t mNumChannels; - uint32_t mOutputSampleRate; -}; diff --git a/libs/libsndfile/src/ALAC/EndianPortable.h b/libs/libsndfile/src/ALAC/EndianPortable.h deleted file mode 100644 index d0b132761f..0000000000 --- a/libs/libsndfile/src/ALAC/EndianPortable.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. -** Copyright (C) 2013 Erik de Castro Lopo - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -// -// EndianPortable.h -// -// Copyright 2011 Apple Inc. All rights reserved. -// - -#ifndef _EndianPortable_h -#define _EndianPortable_h - -#include - -#define Swap16NtoB(x) H2BE_16(x) -#define Swap16BtoN(x) BE2H_16(x) - -#define Swap32NtoB(x) H2BE_32(x) -#define Swap32BtoN(x) BE2H_32(x) - -#endif diff --git a/libs/libsndfile/src/ALAC/LICENSE b/libs/libsndfile/src/ALAC/LICENSE deleted file mode 100644 index 7d8595490d..0000000000 --- a/libs/libsndfile/src/ALAC/LICENSE +++ /dev/null @@ -1,170 +0,0 @@ -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the -copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other -entities that control, are controlled by, or are under common control -with that entity. For the purposes of this definition, "control" means -(i) the power, direct or indirect, to cause the direction or management -of such entity, whether by contract or otherwise, or (ii) ownership -of fifty percent (50%) or more of the outstanding shares, or (iii) -beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, -including but not limited to software source code, documentation source, -and configuration files. - -"Object" form shall mean any form resulting from mechanical -transformation or translation of a Source form, including but not -limited to compiled object code, generated documentation, and -conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object -form, made available under the License, as indicated by a copyright -notice that is included in or attached to the work (an example is -provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object -form, that is based on (or derived from) the Work and for which the -editorial revisions, annotations, elaborations, or other modifications -represent, as a whole, an original work of authorship. For the purposes -of this License, Derivative Works shall not include works that remain -separable from, or merely link (or bind by name) to the interfaces of, -the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original -version of the Work and any modifications or additions to that Work or -Derivative Works thereof, that is intentionally submitted to Licensor -for inclusion in the Work by the copyright owner or by an individual -or Legal Entity authorized to submit on behalf of the copyright owner. -For the purposes of this definition, "submitted" means any form of -electronic, verbal, or written communication sent to the Licensor -or its representatives, including but not limited to communication -on electronic mailing lists, source code control systems, and issue -tracking systems that are managed by, or on behalf of, the Licensor -for the purpose of discussing and improving the Work, but excluding -communication that is conspicuously marked or otherwise designated in -writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity -on behalf of whom a Contribution has been received by Licensor and -subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions -of this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -copyright license to reproduce, prepare Derivative Works of, publicly -display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except -as stated in this section) patent license to make, have made, use, -offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such -Contributor that are necessarily infringed by their Contribution(s) -alone or by combination of their Contribution(s) with the Work to which -such Contribution(s) was submitted. If You institute patent litigation -against any entity (including a cross-claim or counterclaim in a -lawsuit) alleging that the Work or a Contribution incorporated within -the Work constitutes direct or contributory patent infringement, then -any patent licenses granted to You under this License for that Work -shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the -Work or Derivative Works thereof in any medium, with or without -modifications, and in Source or Object form, provided that You meet the -following conditions: - -You must give any other recipients of the Work or Derivative Works a -copy of this License; and - -You must cause any modified files to carry prominent notices stating -that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You -distribute, all copyright, patent, trademark, and attribution notices -from the Source form of the Work, excluding those notices that do not -pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, -then any Derivative Works that You distribute must include a readable -copy of the attribution notices contained within such NOTICE file, -excluding those notices that do not pertain to any part of the -Derivative Works, in at least one of the following places: within a -NOTICE text file distributed as part of the Derivative Works; within -the Source form or documentation, if provided along with the Derivative -Works; or, within a display generated by the Derivative Works, if and -wherever such third-party notices normally appear. The contents of the -NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative -Works that You distribute, alongside or as an addendum to the NOTICE -text from the Work, provided that such additional attribution notices -cannot be construed as modifying the License. You may add Your own -copyright statement to Your modifications and may provide additional -or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as -a whole, provided Your use, reproduction, and distribution of the Work -otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, -any Contribution intentionally submitted for inclusion in the Work by -You to the Licensor shall be under the terms and conditions of this -License, without any additional terms or conditions. Notwithstanding -the above, nothing herein shall supersede or modify the terms of any -separate license agreement you may have executed with Licensor regarding -such Contributions. - -6. Trademarks. This License does not grant permission to use the trade -names, trademarks, service marks, or product names of the Licensor, -except as required for reasonable and customary use in describing the -origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed -to in writing, Licensor provides the Work (and each Contributor -provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied, including, without -limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, -MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your -exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, -whether in tort (including negligence), contract, or otherwise, unless -required by applicable law (such as deliberate and grossly negligent -acts) or agreed to in writing, shall any Contributor be liable to You -for damages, including any direct, indirect, special, incidental, or -consequential damages of any character arising as a result of this -License or out of the use or inability to use the Work (including but -not limited to damages for loss of goodwill, work stoppage, computer -failure or malfunction, or any and all other commercial damages or -losses), even if such Contributor has been advised of the possibility of -such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the -Work or Derivative Works thereof, You may choose to offer, and charge a -fee for, acceptance of support, warranty, indemnity, or other liability -obligations and/or rights consistent with this License. However, in -accepting such obligations, You may act only on Your own behalf and -on Your sole responsibility, not on behalf of any other Contributor, -and only if You agree to indemnify, defend, and hold each Contributor -harmless for any liability incurred by, or claims asserted against, such -Contributor by reason of your accepting any such warranty or additional -liability. diff --git a/libs/libsndfile/src/ALAC/ag_dec.c b/libs/libsndfile/src/ALAC/ag_dec.c deleted file mode 100644 index 81c18dc920..0000000000 --- a/libs/libsndfile/src/ALAC/ag_dec.c +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: ag_dec.c - - Contains: Adaptive Golomb decode routines. - - Copyright: (c) 2001-2011 Apple, Inc. -*/ - -#include "aglib.h" -#include "ALACBitUtilities.h" -#include "ALACAudioTypes.h" - -#include -#include -#include -#include - -#define CODE_TO_LONG_MAXBITS 32 -#define N_MAX_MEAN_CLAMP 0xffff -#define N_MEAN_CLAMP_VAL 0xffff -#define REPORT_VAL 40 - -#if __GNUC__ -#define ALWAYS_INLINE __attribute__((always_inline)) -#else -#define ALWAYS_INLINE -#endif - -/* And on the subject of the CodeWarrior x86 compiler and inlining, I reworked a lot of this - to help the compiler out. In many cases this required manual inlining or a macro. Sorry - if it is ugly but the performance gains are well worth it. - - WSK 5/19/04 -*/ - -void set_standard_ag_params(AGParamRecPtr params, uint32_t fullwidth, uint32_t sectorwidth) -{ - /* Use - fullwidth = sectorwidth = numOfSamples, for analog 1-dimensional type-short data, - but use - fullwidth = full image width, sectorwidth = sector (patch) width - for such as image (2-dim.) data. - */ - set_ag_params( params, MB0, PB0, KB0, fullwidth, sectorwidth, MAX_RUN_DEFAULT ); -} - -void set_ag_params(AGParamRecPtr params, uint32_t m, uint32_t p, uint32_t k, uint32_t f, uint32_t s, uint32_t maxrun) -{ - params->mb = params->mb0 = m; - params->pb = p; - params->kb = k; - params->wb = (1u<kb)-1; - params->qb = QB-params->pb; - params->fw = f; - params->sw = s; - params->maxrun = maxrun; -} - -#if PRAGMA_MARK -#pragma mark - -#endif - - -// note: implementing this with some kind of "count leading zeros" assembly is a big performance win -static inline int32_t lead( int32_t m ) -{ - long j; - unsigned long c = (1ul << 31); - - for(j=0; j < 32; j++) - { - if((c & m) != 0) - break; - c >>= 1; - } - return (j); -} - -#define arithmin(a, b) ((a) < (b) ? (a) : (b)) - -static inline int32_t ALWAYS_INLINE lg3a( int32_t x) -{ - int32_t result; - - x += 3; - result = lead(x); - - return 31 - result; -} - -static inline uint32_t ALWAYS_INLINE read32bit( uint8_t * buffer ) -{ - // embedded CPUs typically can't read unaligned 32-bit words so just read the bytes - uint32_t value; - - value = ((uint32_t)buffer[0] << 24) | ((uint32_t)buffer[1] << 16) | - ((uint32_t)buffer[2] << 8) | (uint32_t)buffer[3]; - return value; - -} - -#if PRAGMA_MARK -#pragma mark - -#endif - -#define get_next_fromlong(inlong, suff) ((inlong) >> (32 - (suff))) - - -static inline uint32_t ALWAYS_INLINE -getstreambits( uint8_t *in, int32_t bitoffset, int32_t numbits ) -{ - uint32_t load1, load2; - uint32_t byteoffset = bitoffset / 8; - uint32_t result; - - //Assert( numbits <= 32 ); - - load1 = read32bit( in + byteoffset ); - - if ( (numbits + (bitoffset & 0x7)) > 32) - { - int32_t load2shift; - - result = load1 << (bitoffset & 0x7); - load2 = (uint32_t) in[byteoffset+4]; - load2shift = (8-(numbits + (bitoffset & 0x7)-32)); - load2 >>= load2shift; - result >>= (32-numbits); - result |= load2; - } - else - { - result = load1 >> (32-numbits-(bitoffset & 7)); - } - - // a shift of >= "the number of bits in the type of the value being shifted" results in undefined - // behavior so don't try to shift by 32 - if ( numbits != (sizeof(result) * 8) ) - result &= ~(0xfffffffful << numbits); - - return result; -} - - -static inline int32_t dyn_get(unsigned char *in, uint32_t *bitPos, uint32_t m, uint32_t k) -{ - uint32_t tempbits = *bitPos; - uint32_t result; - uint32_t pre = 0, v; - uint32_t streamlong; - - streamlong = read32bit( in + (tempbits >> 3) ); - streamlong <<= (tempbits & 7); - - /* find the number of bits in the prefix */ - { - uint32_t notI = ~streamlong; - pre = lead( notI); - } - - if(pre >= MAX_PREFIX_16) - { - pre = MAX_PREFIX_16; - tempbits += pre; - streamlong <<= pre; - result = get_next_fromlong(streamlong,MAX_DATATYPE_BITS_16); - tempbits += MAX_DATATYPE_BITS_16; - - } - else - { - // all of the bits must fit within the long we have loaded - //Assert(pre+1+k <= 32); - - tempbits += pre; - tempbits += 1; - streamlong <<= pre+1; - v = get_next_fromlong(streamlong, k); - tempbits += k; - - result = pre*m + v-1; - - if(v<2) { - result -= (v-1); - tempbits -= 1; - } - } - - *bitPos = tempbits; - return result; -} - - -static inline int32_t dyn_get_32bit( uint8_t * in, uint32_t * bitPos, int32_t m, int32_t k, int32_t maxbits ) -{ - uint32_t tempbits = *bitPos; - uint32_t v; - uint32_t streamlong; - uint32_t result; - - streamlong = read32bit( in + (tempbits >> 3) ); - streamlong <<= (tempbits & 7); - - /* find the number of bits in the prefix */ - { - uint32_t notI = ~streamlong; - result = lead( notI); - } - - if(result >= MAX_PREFIX_32) - { - result = getstreambits(in, tempbits+MAX_PREFIX_32, maxbits); - tempbits += MAX_PREFIX_32 + maxbits; - } - else - { - /* all of the bits must fit within the long we have loaded*/ - //Assert(k<=14); - //Assert(result=2) - { - result += (v-1); - tempbits += 1; - } - } - } - - *bitPos = tempbits; - - return result; -} - -int32_t dyn_decomp( AGParamRecPtr params, BitBuffer * bitstream, int32_t * pc, int32_t numSamples, int32_t maxSize, uint32_t * outNumBits ) -{ - uint8_t *in; - int32_t *outPtr = pc; - uint32_t bitPos, startPos, maxPos; - uint32_t j, m, k, n, c, mz; - int32_t del, zmode; - uint32_t mb; - uint32_t pb_local = params->pb; - uint32_t kb_local = params->kb; - uint32_t wb_local = params->wb; - int32_t status; - - RequireAction( (bitstream != NULL) && (pc != NULL) && (outNumBits != NULL), return kALAC_ParamError; ); - *outNumBits = 0; - - in = bitstream->cur; - startPos = bitstream->bitIndex; - maxPos = bitstream->byteSize * 8; - bitPos = startPos; - - mb = params->mb0; - zmode = 0; - - c = 0; - status = ALAC_noErr; - - while (c < (uint32_t) numSamples) - { - // bail if we've run off the end of the buffer - RequireAction( bitPos < maxPos, status = kALAC_ParamError; goto Exit; ); - - m = (mb)>>QBSHIFT; - k = lg3a(m); - - k = arithmin(k, kb_local); - m = (1<> 1) * (multiplier); - } - - *outPtr++ = del; - - c++; - - mb = pb_local*(n+zmode) + mb - ((pb_local*mb)>>QBSHIFT); - - // update mean tracking - if (n > N_MAX_MEAN_CLAMP) - mb = N_MEAN_CLAMP_VAL; - - zmode = 0; - - if (((mb << MMULSHIFT) < QB) && (c < (uint32_t) numSamples)) - { - zmode = 1; - k = lead(mb) - BITOFF+((mb+MOFF)>>MDENSHIFT); - mz = ((1<= 65535) - zmode = 0; - - mb = 0; - } - } - -Exit: - *outNumBits = (bitPos - startPos); - BitBufferAdvance( bitstream, *outNumBits ); - RequireAction( bitstream->cur <= bitstream->end, status = kALAC_ParamError; ); - - return status; -} diff --git a/libs/libsndfile/src/ALAC/ag_enc.c b/libs/libsndfile/src/ALAC/ag_enc.c deleted file mode 100644 index 0916cc0852..0000000000 --- a/libs/libsndfile/src/ALAC/ag_enc.c +++ /dev/null @@ -1,360 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * Copyright (C) 2013 Erik de Castro Lopo - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: ag_enc.c - - Contains: Adaptive Golomb encode routines. - - Copyright: (c) 2001-2011 Apple, Inc. -*/ - -#include "aglib.h" -#include "ALACBitUtilities.h" -#include "EndianPortable.h" -#include "ALACAudioTypes.h" - -#include -#include -#include -#include - -#define CODE_TO_LONG_MAXBITS 32 -#define N_MAX_MEAN_CLAMP 0xffff -#define N_MEAN_CLAMP_VAL 0xffff -#define REPORT_VAL 40 - -#if __GNUC__ -#define ALWAYS_INLINE __attribute__((always_inline)) -#else -#define ALWAYS_INLINE -#endif - - -/* And on the subject of the CodeWarrior x86 compiler and inlining, I reworked a lot of this - to help the compiler out. In many cases this required manual inlining or a macro. Sorry - if it is ugly but the performance gains are well worth it. - - WSK 5/19/04 -*/ - -// note: implementing this with some kind of "count leading zeros" assembly is a big performance win -static inline int32_t lead( int32_t m ) -{ - long j; - unsigned long c = (1ul << 31); - - for(j=0; j < 32; j++) - { - if((c & m) != 0) - break; - c >>= 1; - } - return (j); -} - -#define arithmin(a, b) ((a) < (b) ? (a) : (b)) - -static inline int32_t ALWAYS_INLINE lg3a( int32_t x) -{ - int32_t result; - - x += 3; - result = lead(x); - - return 31 - result; -} - -static inline int32_t ALWAYS_INLINE abs_func( int32_t a ) -{ - // note: the CW PPC intrinsic __abs() turns into these instructions so no need to try and use it - int32_t isneg = a >> 31; - int32_t xorval = a ^ isneg; - int32_t result = xorval-isneg; - - return result; -} - -static inline uint32_t ALWAYS_INLINE read32bit( uint8_t * buffer ) -{ - // embedded CPUs typically can't read unaligned 32-bit words so just read the bytes - uint32_t value; - - value = ((uint32_t)buffer[0] << 24) | ((uint32_t)buffer[1] << 16) | - ((uint32_t)buffer[2] << 8) | (uint32_t)buffer[3]; - return value; -} - -#if PRAGMA_MARK -#pragma mark - -#endif - -static inline int32_t dyn_code(int32_t m, int32_t k, int32_t n, uint32_t *outNumBits) -{ - uint32_t divx, mod, de; - uint32_t numBits; - uint32_t value; - - //Assert( n >= 0 ); - - divx = n/m; - - if(divx >= MAX_PREFIX_16) - { - numBits = MAX_PREFIX_16 + MAX_DATATYPE_BITS_16; - value = (((1< MAX_PREFIX_16 + MAX_DATATYPE_BITS_16) - { - numBits = MAX_PREFIX_16 + MAX_DATATYPE_BITS_16; - value = (((1< 25) - goto codeasescape; - } - else - { -codeasescape: - numBits = MAX_PREFIX_32; - value = (((1<> 3); - - shift = 32 - (bitPos & 7) - numBits; - - mask = ~0u >> (32 - numBits); // mask must be created in two steps to avoid compiler sequencing ambiguity - mask <<= shift; - - value = (value << shift) & mask; - value |= curr & ~mask; - - psf_put_be32 (out, bitPos >> 3, value) ; -} - - -static inline void ALWAYS_INLINE dyn_jam_noDeref_large(unsigned char *out, uint32_t bitPos, uint32_t numBits, uint32_t value) -{ - uint32_t w; - uint32_t curr; - uint32_t mask; - int32_t shiftvalue = (32 - (bitPos&7) - numBits); - - //Assert(numBits <= 32); - - curr = psf_get_be32 (out, bitPos >> 3); - - if (shiftvalue < 0) - { - uint8_t tailbyte; - uint8_t *tailptr; - - w = value >> -shiftvalue; - mask = ~0u >> -shiftvalue; - w |= (curr & ~mask); - - tailptr = out + (bitPos>>3) + 4; - tailbyte = (value << ((8+shiftvalue))) & 0xff; - *tailptr = (uint8_t)tailbyte; - } - else - { - mask = ~0u >> (32 - numBits); - mask <<= shiftvalue; // mask must be created in two steps to avoid compiler sequencing ambiguity - - w = (value << shiftvalue) & mask; - w |= curr & ~mask; - } - - psf_put_be32 (out, bitPos >> 3, w) ; -} - - -int32_t dyn_comp( AGParamRecPtr params, int32_t * pc, BitBuffer * bitstream, int32_t numSamples, int32_t bitSize, uint32_t * outNumBits ) -{ - unsigned char * out; - uint32_t bitPos, startPos; - uint32_t m, k, n, c, mz, nz; - uint32_t numBits; - uint32_t value; - int32_t del, zmode; - uint32_t overflow, overflowbits; - int32_t status; - - // shadow the variables in params so there's not the dereferencing overhead - uint32_t mb, pb, kb, wb; - int32_t rowPos = 0; - int32_t rowSize = params->sw; - int32_t rowJump = (params->fw) - rowSize; - int32_t * inPtr = pc; - - *outNumBits = 0; - RequireAction( (bitSize >= 1) && (bitSize <= 32), return kALAC_ParamError; ); - - out = bitstream->cur; - startPos = bitstream->bitIndex; - bitPos = startPos; - - mb = params->mb = params->mb0; - pb = params->pb; - kb = params->kb; - wb = params->wb; - zmode = 0; - - c=0; - status = ALAC_noErr; - - while (c < (uint32_t) numSamples) - { - m = mb >> QBSHIFT; - k = lg3a(m); - if ( k > kb) - { - k = kb; - } - m = (1<> 31) & 1) - zmode; - //Assert( 32-lead(n) <= bitSize ); - - if ( dyn_code_32bit(bitSize, m, k, n, &numBits, &value, &overflow, &overflowbits) ) - { - dyn_jam_noDeref(out, bitPos, numBits, value); - bitPos += numBits; - dyn_jam_noDeref_large(out, bitPos, overflowbits, overflow); - bitPos += overflowbits; - } - else - { - dyn_jam_noDeref(out, bitPos, numBits, value); - bitPos += numBits; - } - - c++; - if ( rowPos >= rowSize) - { - rowPos = 0; - inPtr += rowJump; - } - - mb = pb * (n + zmode) + mb - ((pb *mb)>>QBSHIFT); - - // update mean tracking if it's overflowed - if (n > N_MAX_MEAN_CLAMP) - mb = N_MEAN_CLAMP_VAL; - - zmode = 0; - - RequireAction(c <= (uint32_t) numSamples, status = kALAC_ParamError; goto Exit; ); - - if (((mb << MMULSHIFT) < QB) && (c < (uint32_t) numSamples)) - { - zmode = 1; - nz = 0; - - while(c<(uint32_t) numSamples && *inPtr == 0) - { - /* Take care of wrap-around globals. */ - ++inPtr; - ++nz; - ++c; - if ( ++rowPos >= rowSize) - { - rowPos = 0; - inPtr += rowJump; - } - - if(nz >= 65535) - { - zmode = 0; - break; - } - } - - k = lead(mb) - BITOFF+((mb+MOFF)>>MDENSHIFT); - mz = ((1< - -#ifdef __cplusplus -extern "C" { -#endif - -#define QBSHIFT 9 -#define QB (1< - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: alac_codec.h -*/ - -#ifndef ALAC_CODEC_H -#define ALAC_CODEC_H - -#include - -#include "ALACAudioTypes.h" - -#define ALAC_FRAME_LENGTH 4096 - -struct BitBuffer; - -typedef struct alac_decoder_s -{ - // decoding parameters (public for use in the analyzer) - ALACSpecificConfig mConfig; - - uint16_t mActiveElements; - - // decoding buffers - int32_t mMixBufferU [ALAC_FRAME_LENGTH]; - int32_t mMixBufferV [ALAC_FRAME_LENGTH]; - union - { - int32_t mPredictor [ALAC_FRAME_LENGTH]; - uint16_t mShiftBuffer [ALAC_FRAME_LENGTH]; - } ; -} ALAC_DECODER ; - -typedef struct alac_encoder_s -{ - // ALAC encoder parameters - int16_t mBitDepth; - - // encoding state - int16_t mLastMixRes [kALACMaxChannels]; - - int32_t mFastMode; - - // encoding buffers - int32_t mMixBufferU [ALAC_FRAME_LENGTH] ; - int32_t mMixBufferV [ALAC_FRAME_LENGTH] ; - int32_t mPredictorU [ALAC_FRAME_LENGTH] ; - int32_t mPredictorV [ALAC_FRAME_LENGTH] ; - uint16_t mShiftBufferUV [2 * ALAC_FRAME_LENGTH] ; - uint8_t mWorkBuffer [4 * ALAC_FRAME_LENGTH]; - - // per-channel coefficients buffers - int16_t mCoefsU [kALACMaxChannels][kALACMaxSearches][kALACMaxCoefs]; - int16_t mCoefsV [kALACMaxChannels][kALACMaxSearches][kALACMaxCoefs]; - - // encoding statistics - uint32_t mTotalBytesGenerated; - uint32_t mAvgBitRate; - uint32_t mMaxFrameBytes; - uint32_t mFrameSize; - uint32_t mMaxOutputBytes; - uint32_t mNumChannels; - uint32_t mOutputSampleRate; -} ALAC_ENCODER ; - - -int32_t alac_decoder_init (ALAC_DECODER *p, void * inMagicCookie, uint32_t inMagicCookieSize) ; -int32_t alac_encoder_init (ALAC_ENCODER *p, uint32_t samplerate, uint32_t channels, uint32_t format_flags, uint32_t frameSize) ; - -int32_t alac_decode (ALAC_DECODER *, struct BitBuffer * bits, int32_t * sampleBuffer, - uint32_t numSamples, uint32_t numChannels, uint32_t * outNumSamples) ; - -int32_t alac_encode (ALAC_ENCODER *p, uint32_t numChannels, uint32_t numSamples, - int32_t * theReadBuffer, unsigned char * theWriteBuffer, - uint32_t * ioNumBytes) ; - -void alac_set_fastmode(ALAC_ENCODER * p, int32_t fast) ; - -uint32_t alac_get_magic_cookie_size(uint32_t inNumChannels) ; -void alac_get_magic_cookie(ALAC_ENCODER *p, void * config, uint32_t * ioSize) ; -void alac_get_source_format(ALAC_ENCODER *p, const AudioFormatDescription * source, AudioFormatDescription * output) ; - -#endif diff --git a/libs/libsndfile/src/ALAC/alac_decoder.c b/libs/libsndfile/src/ALAC/alac_decoder.c deleted file mode 100644 index 2681ef6275..0000000000 --- a/libs/libsndfile/src/ALAC/alac_decoder.c +++ /dev/null @@ -1,646 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * Copyright (C) 2012-2013 Erik de Castro Lopo - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: ALACDecoder.cpp -*/ - -#include -#include -#include - -#include "alac_codec.h" - -#include "dplib.h" -#include "aglib.h" -#include "matrixlib.h" - -#include "ALACBitUtilities.h" -#include "EndianPortable.h" - -typedef enum -{ false = 0, - true = 1 -} bool ; - -// constants/data -const uint32_t kMaxBitDepth = 32; // max allowed bit depth is 32 - - -// prototypes -static int32_t alac_fill_element (struct BitBuffer * bits) ; -static int32_t alac_data_stream_element (struct BitBuffer * bits) ; - -static void Zero32( int32_t * buffer, uint32_t numItems, uint32_t stride ); - - -/* - Init() - - initialize the decoder with the given configuration -*/ -int32_t -alac_decoder_init (ALAC_DECODER *p, void * inMagicCookie, uint32_t inMagicCookieSize) -{ - int32_t status = ALAC_noErr; - ALACSpecificConfig theConfig; - uint8_t * theActualCookie = (uint8_t *)inMagicCookie; - uint32_t theCookieBytesRemaining = inMagicCookieSize; - - // For historical reasons the decoder needs to be resilient to magic cookies vended by older encoders. - // As specified in the ALACMagicCookieDescription.txt document, there may be additional data encapsulating - // the ALACSpecificConfig. This would consist of format ('frma') and 'alac' atoms which precede the - // ALACSpecificConfig. - // See ALACMagicCookieDescription.txt for additional documentation concerning the 'magic cookie' - - // skip format ('frma') atom if present - if (theActualCookie[4] == 'f' && theActualCookie[5] == 'r' && theActualCookie[6] == 'm' && theActualCookie[7] == 'a') - { - theActualCookie += 12; - theCookieBytesRemaining -= 12; - } - - // skip 'alac' atom header if present - if (theActualCookie[4] == 'a' && theActualCookie[5] == 'l' && theActualCookie[6] == 'a' && theActualCookie[7] == 'c') - { - theActualCookie += 12; - theCookieBytesRemaining -= 12; - } - - // read the ALACSpecificConfig - if (theCookieBytesRemaining >= sizeof(ALACSpecificConfig)) - { - theConfig.frameLength = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, frameLength)) ; - - if (theConfig.frameLength > ALAC_FRAME_LENGTH) - return fALAC_FrameLengthError ; - - theConfig.compatibleVersion = theActualCookie [offsetof (ALACSpecificConfig, compatibleVersion)] ; - theConfig.bitDepth = theActualCookie [offsetof (ALACSpecificConfig, bitDepth)] ; - theConfig.pb = theActualCookie [offsetof (ALACSpecificConfig, pb)] ; - theConfig.mb = theActualCookie [offsetof (ALACSpecificConfig, mb)] ; - theConfig.kb = theActualCookie [offsetof (ALACSpecificConfig, kb)] ; - theConfig.numChannels = theActualCookie [offsetof (ALACSpecificConfig, numChannels)] ; - theConfig.maxRun = psf_get_be16 (theActualCookie, offsetof (ALACSpecificConfig, maxRun)) ; - theConfig.maxFrameBytes = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, maxFrameBytes)) ; - theConfig.avgBitRate = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, avgBitRate)) ; - theConfig.sampleRate = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, sampleRate)) ; - - p->mConfig = theConfig; - - RequireAction( p->mConfig.compatibleVersion <= kALACVersion, return kALAC_ParamError; ); - - RequireAction( (p->mMixBufferU != NULL) && (p->mMixBufferV != NULL) && (p->mPredictor != NULL), - status = kALAC_MemFullError; goto Exit; ); - } - else - { - status = kALAC_ParamError; - } - - // skip to Channel Layout Info - // theActualCookie += sizeof(ALACSpecificConfig); - - // Currently, the Channel Layout Info portion of the magic cookie (as defined in the - // ALACMagicCookieDescription.txt document) is unused by the decoder. - -Exit: - return status; -} - -/* - Decode() - - the decoded samples are interleaved into the output buffer in the order they arrive in - the bitstream -*/ -int32_t -alac_decode (ALAC_DECODER *p, struct BitBuffer * bits, int32_t * sampleBuffer, uint32_t numSamples, uint32_t numChannels, uint32_t * outNumSamples) -{ - BitBuffer shiftBits; - uint32_t bits1, bits2; - uint8_t tag; - uint8_t elementInstanceTag; - AGParamRec agParams; - uint32_t channelIndex; - int16_t coefsU[32]; // max possible size is 32 although NUMCOEPAIRS is the current limit - int16_t coefsV[32]; - uint8_t numU, numV; - uint8_t mixBits; - int8_t mixRes; - uint16_t unusedHeader; - uint8_t escapeFlag; - uint32_t chanBits; - uint8_t bytesShifted; - uint32_t shift; - uint8_t modeU, modeV; - uint32_t denShiftU, denShiftV; - uint16_t pbFactorU, pbFactorV; - uint16_t pb; - int32_t * out32; - uint8_t headerByte; - uint8_t partialFrame; - uint32_t extraBits; - int32_t val; - uint32_t i, j; - int32_t status; - - RequireAction( (bits != NULL) && (sampleBuffer != NULL) && (outNumSamples != NULL), return kALAC_ParamError; ); - RequireAction( numChannels > 0, return kALAC_ParamError; ); - - p->mActiveElements = 0; - channelIndex = 0; - - status = ALAC_noErr; - *outNumSamples = numSamples; - - while ( status == ALAC_noErr ) - { - // bail if we ran off the end of the buffer - RequireAction( bits->cur < bits->end, status = kALAC_ParamError; goto Exit; ); - - // copy global decode params for this element - pb = p->mConfig.pb; - - // read element tag - tag = BitBufferReadSmall( bits, 3 ); - switch ( tag ) - { - case ID_SCE: - case ID_LFE: - { - // mono/LFE channel - elementInstanceTag = BitBufferReadSmall( bits, 4 ); - p->mActiveElements |= (1u << elementInstanceTag); - - // read the 12 unused header bits - unusedHeader = (uint16_t) BitBufferRead( bits, 12 ); - RequireAction( unusedHeader == 0, status = kALAC_ParamError; goto Exit; ); - - // read the 1-bit "partial frame" flag, 2-bit "shift-off" flag & 1-bit "escape" flag - headerByte = (uint8_t) BitBufferRead( bits, 4 ); - - partialFrame = headerByte >> 3; - - bytesShifted = (headerByte >> 1) & 0x3u; - RequireAction( bytesShifted != 3, status = kALAC_ParamError; goto Exit; ); - - shift = bytesShifted * 8; - - escapeFlag = headerByte & 0x1; - - chanBits = p->mConfig.bitDepth - (bytesShifted * 8); - - // check for partial frame to override requested numSamples - if ( partialFrame != 0 ) - { - numSamples = BitBufferRead( bits, 16 ) << 16; - numSamples |= BitBufferRead( bits, 16 ); - } - - if ( escapeFlag == 0 ) - { - // compressed frame, read rest of parameters - mixBits = (uint8_t) BitBufferRead( bits, 8 ); - mixRes = (int8_t) BitBufferRead( bits, 8 ); - //Assert( (mixBits == 0) && (mixRes == 0) ); // no mixing for mono - - headerByte = (uint8_t) BitBufferRead( bits, 8 ); - modeU = headerByte >> 4; - denShiftU = headerByte & 0xfu; - - headerByte = (uint8_t) BitBufferRead( bits, 8 ); - pbFactorU = headerByte >> 5; - numU = headerByte & 0x1fu; - - for ( i = 0; i < numU; i++ ) - coefsU[i] = (int16_t) BitBufferRead( bits, 16 ); - - // if shift active, skip the the shift buffer but remember where it starts - if ( bytesShifted != 0 ) - { - shiftBits = *bits; - BitBufferAdvance( bits, (bytesShifted * 8) * numSamples ); - } - - // decompress - set_ag_params( &agParams, p->mConfig.mb, (pb * pbFactorU) / 4, p->mConfig.kb, numSamples, numSamples, p->mConfig.maxRun ); - status = dyn_decomp( &agParams, bits, p->mPredictor, numSamples, chanBits, &bits1 ); - RequireNoErr( status, goto Exit; ); - - if ( modeU == 0 ) - { - unpc_block( p->mPredictor, p->mMixBufferU, numSamples, &coefsU[0], numU, chanBits, denShiftU ); - } - else - { - // the special "numActive == 31" mode can be done in-place - unpc_block( p->mPredictor, p->mPredictor, numSamples, NULL, 31, chanBits, 0 ); - unpc_block( p->mPredictor, p->mMixBufferU, numSamples, &coefsU[0], numU, chanBits, denShiftU ); - } - } - else - { - //Assert( bytesShifted == 0 ); - - // uncompressed frame, copy data into the mix buffer to use common output code - shift = 32 - chanBits; - if ( chanBits <= 16 ) - { - for ( i = 0; i < numSamples; i++ ) - { - val = (int32_t) BitBufferRead( bits, (uint8_t) chanBits ); - val = (val << shift) >> shift; - p->mMixBufferU[i] = val; - } - } - else - { - // BitBufferRead() can't read more than 16 bits at a time so break up the reads - extraBits = chanBits - 16; - for ( i = 0; i < numSamples; i++ ) - { - val = (int32_t) BitBufferRead( bits, 16 ); - val = (val << 16) >> shift; - p->mMixBufferU[i] = val | BitBufferRead( bits, (uint8_t) extraBits ); - } - } - - mixBits = mixRes = 0; - bits1 = chanBits * numSamples; - bytesShifted = 0; - } - - // now read the shifted values into the shift buffer - if ( bytesShifted != 0 ) - { - shift = bytesShifted * 8; - //Assert( shift <= 16 ); - - for ( i = 0; i < numSamples; i++ ) - p->mShiftBuffer[i] = (uint16_t) BitBufferRead( &shiftBits, (uint8_t) shift ); - } - - // convert 32-bit integers into output buffer - switch ( p->mConfig.bitDepth ) - { - case 16: - out32 = sampleBuffer + channelIndex; - for ( i = 0, j = 0; i < numSamples; i++, j += numChannels ) - out32[j] = p->mMixBufferU[i] << 16; - break; - case 20: - out32 = sampleBuffer + channelIndex; - copyPredictorTo20( p->mMixBufferU, out32, numChannels, numSamples ); - break; - case 24: - out32 = sampleBuffer + channelIndex; - if ( bytesShifted != 0 ) - copyPredictorTo24Shift( p->mMixBufferU, p->mShiftBuffer, out32, numChannels, numSamples, bytesShifted ); - else - copyPredictorTo24( p->mMixBufferU, out32, numChannels, numSamples ); - break; - case 32: - out32 = sampleBuffer + channelIndex; - if ( bytesShifted != 0 ) - copyPredictorTo32Shift( p->mMixBufferU, p->mShiftBuffer, out32, numChannels, numSamples, bytesShifted ); - else - copyPredictorTo32( p->mMixBufferU, out32, numChannels, numSamples); - break; - } - - channelIndex += 1; - *outNumSamples = numSamples; - break; - } - - case ID_CPE: - { - // if decoding this pair would take us over the max channels limit, bail - if ( (channelIndex + 2) > numChannels ) - goto NoMoreChannels; - - // stereo channel pair - elementInstanceTag = BitBufferReadSmall( bits, 4 ); - p->mActiveElements |= (1u << elementInstanceTag); - - // read the 12 unused header bits - unusedHeader = (uint16_t) BitBufferRead( bits, 12 ); - RequireAction( unusedHeader == 0, status = kALAC_ParamError; goto Exit; ); - - // read the 1-bit "partial frame" flag, 2-bit "shift-off" flag & 1-bit "escape" flag - headerByte = (uint8_t) BitBufferRead( bits, 4 ); - - partialFrame = headerByte >> 3; - - bytesShifted = (headerByte >> 1) & 0x3u; - RequireAction( bytesShifted != 3, status = kALAC_ParamError; goto Exit; ); - - shift = bytesShifted * 8; - - escapeFlag = headerByte & 0x1; - - chanBits = p->mConfig.bitDepth - (bytesShifted * 8) + 1; - - // check for partial frame length to override requested numSamples - if ( partialFrame != 0 ) - { - numSamples = BitBufferRead( bits, 16 ) << 16; - numSamples |= BitBufferRead( bits, 16 ); - } - - if ( escapeFlag == 0 ) - { - // compressed frame, read rest of parameters - mixBits = (uint8_t) BitBufferRead( bits, 8 ); - mixRes = (int8_t) BitBufferRead( bits, 8 ); - - headerByte = (uint8_t) BitBufferRead( bits, 8 ); - modeU = headerByte >> 4; - denShiftU = headerByte & 0xfu; - - headerByte = (uint8_t) BitBufferRead( bits, 8 ); - pbFactorU = headerByte >> 5; - numU = headerByte & 0x1fu; - for ( i = 0; i < numU; i++ ) - coefsU[i] = (int16_t) BitBufferRead( bits, 16 ); - - headerByte = (uint8_t) BitBufferRead( bits, 8 ); - modeV = headerByte >> 4; - denShiftV = headerByte & 0xfu; - - headerByte = (uint8_t) BitBufferRead( bits, 8 ); - pbFactorV = headerByte >> 5; - numV = headerByte & 0x1fu; - for ( i = 0; i < numV; i++ ) - coefsV[i] = (int16_t) BitBufferRead( bits, 16 ); - - // if shift active, skip the interleaved shifted values but remember where they start - if ( bytesShifted != 0 ) - { - shiftBits = *bits; - BitBufferAdvance( bits, (bytesShifted * 8) * 2 * numSamples ); - } - - // decompress and run predictor for "left" channel - set_ag_params( &agParams, p->mConfig.mb, (pb * pbFactorU) / 4, p->mConfig.kb, numSamples, numSamples, p->mConfig.maxRun ); - status = dyn_decomp( &agParams, bits, p->mPredictor, numSamples, chanBits, &bits1 ); - RequireNoErr( status, goto Exit; ); - - if ( modeU == 0 ) - { - unpc_block( p->mPredictor, p->mMixBufferU, numSamples, &coefsU[0], numU, chanBits, denShiftU ); - } - else - { - // the special "numActive == 31" mode can be done in-place - unpc_block( p->mPredictor, p->mPredictor, numSamples, NULL, 31, chanBits, 0 ); - unpc_block( p->mPredictor, p->mMixBufferU, numSamples, &coefsU[0], numU, chanBits, denShiftU ); - } - - // decompress and run predictor for "right" channel - set_ag_params( &agParams, p->mConfig.mb, (pb * pbFactorV) / 4, p->mConfig.kb, numSamples, numSamples, p->mConfig.maxRun ); - status = dyn_decomp( &agParams, bits, p->mPredictor, numSamples, chanBits, &bits2 ); - RequireNoErr( status, goto Exit; ); - - if ( modeV == 0 ) - { - unpc_block( p->mPredictor, p->mMixBufferV, numSamples, &coefsV[0], numV, chanBits, denShiftV ); - } - else - { - // the special "numActive == 31" mode can be done in-place - unpc_block( p->mPredictor, p->mPredictor, numSamples, NULL, 31, chanBits, 0 ); - unpc_block( p->mPredictor, p->mMixBufferV, numSamples, &coefsV[0], numV, chanBits, denShiftV ); - } - } - else - { - //Assert( bytesShifted == 0 ); - - // uncompressed frame, copy data into the mix buffers to use common output code - chanBits = p->mConfig.bitDepth; - shift = 32 - chanBits; - if ( chanBits <= 16 ) - { - for ( i = 0; i < numSamples; i++ ) - { - val = (int32_t) BitBufferRead( bits, (uint8_t) chanBits ); - val = (val << shift) >> shift; - p->mMixBufferU[i] = val; - - val = (int32_t) BitBufferRead( bits, (uint8_t) chanBits ); - val = (val << shift) >> shift; - p->mMixBufferV[i] = val; - } - } - else - { - // BitBufferRead() can't read more than 16 bits at a time so break up the reads - extraBits = chanBits - 16; - for ( i = 0; i < numSamples; i++ ) - { - val = (int32_t) BitBufferRead( bits, 16 ); - val = (val << 16) >> shift; - p->mMixBufferU[i] = val | BitBufferRead( bits, (uint8_t)extraBits ); - - val = (int32_t) BitBufferRead( bits, 16 ); - val = (val << 16) >> shift; - p->mMixBufferV[i] = val | BitBufferRead( bits, (uint8_t)extraBits ); - } - } - - bits1 = chanBits * numSamples; - bits2 = chanBits * numSamples; - mixBits = mixRes = 0; - bytesShifted = 0; - } - - // now read the shifted values into the shift buffer - if ( bytesShifted != 0 ) - { - shift = bytesShifted * 8; - //Assert( shift <= 16 ); - - for ( i = 0; i < (numSamples * 2); i += 2 ) - { - p->mShiftBuffer[i + 0] = (uint16_t) BitBufferRead( &shiftBits, (uint8_t) shift ); - p->mShiftBuffer[i + 1] = (uint16_t) BitBufferRead( &shiftBits, (uint8_t) shift ); - } - } - - // un-mix the data and convert to output format - // - note that mixRes = 0 means just interleave so we use that path for uncompressed frames - switch ( p->mConfig.bitDepth ) - { - case 16: - out32 = sampleBuffer + channelIndex; - unmix16( p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples, mixBits, mixRes ); - break; - case 20: - out32 = sampleBuffer + channelIndex; - unmix20( p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples, mixBits, mixRes ); - break; - case 24: - out32 = sampleBuffer + channelIndex; - unmix24( p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples, - mixBits, mixRes, p->mShiftBuffer, bytesShifted ); - break; - case 32: - out32 = sampleBuffer + channelIndex; - unmix32( p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples, - mixBits, mixRes, p->mShiftBuffer, bytesShifted ); - break; - } - - channelIndex += 2; - *outNumSamples = numSamples; - break; - } - - case ID_CCE: - case ID_PCE: - { - // unsupported element, bail - //AssertNoErr( tag ); - status = kALAC_ParamError; - break; - } - - case ID_DSE: - { - // data stream element -- parse but ignore - status = alac_data_stream_element (bits) ; - break; - } - - case ID_FIL: - { - // fill element -- parse but ignore - status = alac_fill_element (bits) ; - break; - } - - case ID_END: - { - // frame end, all done so byte align the frame and check for overruns - BitBufferByteAlign( bits, false ); - //Assert( bits->cur == bits->end ); - goto Exit; - } - } - -#if 0 // ! DEBUG - // if we've decoded all of our channels, bail (but not in debug b/c we want to know if we're seeing bad bits) - // - this also protects us if the config does not match the bitstream or crap data bits follow the audio bits - if ( channelIndex >= numChannels ) - break; -#endif - } - -NoMoreChannels: - - // if we get here and haven't decoded all of the requested channels, fill the remaining channels with zeros - for ( ; channelIndex < numChannels; channelIndex++ ) - { - int32_t * fill32 = sampleBuffer + channelIndex; - Zero32( fill32, numSamples, numChannels ); - } - -Exit: - return status; -} - -#if PRAGMA_MARK -#pragma mark - -#endif - -/* - FillElement() - - they're just filler so we don't need 'em -*/ -static int32_t -alac_fill_element (struct BitBuffer * bits) -{ - int16_t count; - - // 4-bit count or (4-bit + 8-bit count) if 4-bit count == 15 - // - plus this weird -1 thing I still don't fully understand - count = BitBufferReadSmall( bits, 4 ); - if ( count == 15 ) - count += (int16_t) BitBufferReadSmall( bits, 8 ) - 1; - - BitBufferAdvance( bits, count * 8 ); - - RequireAction( bits->cur <= bits->end, return kALAC_ParamError; ); - - return ALAC_noErr; -} - -/* - DataStreamElement() - - we don't care about data stream elements so just skip them -*/ -static int32_t -alac_data_stream_element (struct BitBuffer * bits) -{ - int32_t data_byte_align_flag; - uint16_t count; - - // the tag associates this data stream element with a given audio element - - /* element_instance_tag = */ BitBufferReadSmall( bits, 4 ); - - data_byte_align_flag = BitBufferReadOne( bits ); - - // 8-bit count or (8-bit + 8-bit count) if 8-bit count == 255 - count = BitBufferReadSmall( bits, 8 ); - if ( count == 255 ) - count += BitBufferReadSmall( bits, 8 ); - - // the align flag means the bitstream should be byte-aligned before reading the following data bytes - if ( data_byte_align_flag ) - BitBufferByteAlign( bits, false ); - - // skip the data bytes - BitBufferAdvance( bits, count * 8 ); - - RequireAction( bits->cur <= bits->end, return kALAC_ParamError; ); - - return ALAC_noErr; -} - -/* - ZeroN() - - helper routines to clear out output channel buffers when decoding fewer channels than requested -*/ -static void Zero32( int32_t * buffer, uint32_t numItems, uint32_t stride ) -{ - uint32_t indx; - - if ( stride == 1 ) - { - memset( buffer, 0, numItems * sizeof(int32_t) ); - } - else - { - for ( indx = 0; indx < (numItems * stride); indx += stride ) - buffer[indx] = 0; - } -} diff --git a/libs/libsndfile/src/ALAC/alac_decoder.h b/libs/libsndfile/src/ALAC/alac_decoder.h deleted file mode 100644 index 78f3cb29ca..0000000000 --- a/libs/libsndfile/src/ALAC/alac_decoder.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: alac_decoder.h -*/ - -#ifndef ALAC_DECODER_H -#define ALAC_DECODER_H - -#include - -#include "ALACAudioTypes.h" - -typedef enum -{ - false = 0, - ALAC_TRUE = 1 -} bool ; - -struct BitBuffer; - -typedef struct alac_decoder -{ - // decoding parameters (public for use in the analyzer) - ALACSpecificConfig mConfig; - - uint16_t mActiveElements; - - // decoding buffers - int32_t * mMixBufferU; - int32_t * mMixBufferV; - int32_t * mPredictor; - uint16_t * mShiftBuffer; // note: this points to mPredictor's memory but different - // variable for clarity and type difference -} alac_decoder ; - -alac_decoder * alac_decoder_new (void) ; -void alac_decoder_delete (alac_decoder *) ; - -int32_t alac_init (alac_decoder *p, void * inMagicCookie, uint32_t inMagicCookieSize) ; -int32_t alac_decode (alac_decoder *, struct BitBuffer * bits, uint8_t * sampleBuffer, uint32_t numSamples, uint32_t numChannels, uint32_t * outNumSamples) ; - -#endif /* ALAC_DECODER_H */ diff --git a/libs/libsndfile/src/ALAC/alac_encoder.c b/libs/libsndfile/src/ALAC/alac_encoder.c deleted file mode 100644 index 02210ee51b..0000000000 --- a/libs/libsndfile/src/ALAC/alac_encoder.c +++ /dev/null @@ -1,1342 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * Copyright (C) 2012-2013 Erik de Castro Lopo - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: ALACEncoder.cpp -*/ - -// build stuff -#define VERBOSE_DEBUG 0 -#define DebugMsg printf - -// headers -#include -#include -#include - -#include "sfendian.h" - -#include "alac_codec.h" - -#include "aglib.h" -#include "dplib.h" -#include "matrixlib.h" - -#include "ALACBitUtilities.h" -#include "ALACAudioTypes.h" -#include "EndianPortable.h" - -typedef enum -{ - false = 0, - true = 1 -} bool ; - -static void GetConfig(ALAC_ENCODER *p, ALACSpecificConfig * config ); - -static int32_t EncodeStereo(ALAC_ENCODER *p, struct BitBuffer * bitstream, int32_t * input, uint32_t stride, uint32_t channelIndex, uint32_t numSamples ); -static int32_t EncodeStereoFast(ALAC_ENCODER *p, struct BitBuffer * bitstream, int32_t * input, uint32_t stride, uint32_t channelIndex, uint32_t numSamples ); -static int32_t EncodeStereoEscape(ALAC_ENCODER *p, struct BitBuffer * bitstream, int32_t * input, uint32_t stride, uint32_t numSamples ); -static int32_t EncodeMono(ALAC_ENCODER *p, struct BitBuffer * bitstream, int32_t * input, uint32_t stride, uint32_t channelIndex, uint32_t numSamples ); - - - -// Note: in C you can't typecast to a 2-dimensional array pointer but that's what we need when -// picking which coefs to use so we declare this typedef b/c we *can* typecast to this type -typedef int16_t (*SearchCoefs)[kALACMaxCoefs]; - -// defines/constants -const uint32_t kALACEncoderMagic = MAKE_MARKER ('d', 'p', 'g', 'e'); -const uint32_t kMaxSampleSize = 32; // max allowed bit width is 32 -const uint32_t kDefaultMixBits = 2; -const uint32_t kDefaultMixRes = 0; -const uint32_t kMaxRes = 4; -const uint32_t kDefaultNumUV = 8; -const uint32_t kMinUV = 4; -const uint32_t kMaxUV = 8; - -// static functions -#if VERBOSE_DEBUG -static void AddFiller( BitBuffer * bits, int32_t numBytes ); -#endif - - -/* - Map Format: 3-bit field per channel which is the same as the "element tag" that should be placed - at the beginning of the frame for that channel. Indicates whether SCE, CPE, or LFE. - Each particular field is accessed via the current channel indx. Note that the channel - indx increments by two for channel pairs. - - For example: - - C L R 3-channel input = (ID_CPE << 3) | (ID_SCE) - indx 0 value = (map & (0x7ul << (0 * 3))) >> (0 * 3) - indx 1 value = (map & (0x7ul << (1 * 3))) >> (1 * 3) - - C L R Ls Rs LFE 5.1-channel input = (ID_LFE << 15) | (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE) - indx 0 value = (map & (0x7ul << (0 * 3))) >> (0 * 3) - indx 1 value = (map & (0x7ul << (1 * 3))) >> (1 * 3) - indx 3 value = (map & (0x7ul << (3 * 3))) >> (3 * 3) - indx 5 value = (map & (0x7ul << (5 * 3))) >> (5 * 3) - indx 7 value = (map & (0x7ul << (7 * 3))) >> (7 * 3) -*/ -static const uint32_t sChannelMaps[kALACMaxChannels] = -{ - ID_SCE, - ID_CPE, - (ID_CPE << 3) | (ID_SCE), - (ID_SCE << 9) | (ID_CPE << 3) | (ID_SCE), - (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE), - (ID_SCE << 15) | (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE), - (ID_SCE << 18) | (ID_SCE << 15) | (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE), - (ID_SCE << 21) | (ID_CPE << 15) | (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE) -}; - -static const uint32_t sSupportediPodSampleRates[] = -{ - 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 -}; - - -#if PRAGMA_MARK -#pragma mark - -#endif - -void -alac_set_fastmode (ALAC_ENCODER * p, int32_t fast ) -{ - p->mFastMode = fast; -} - - -/* - HEADER SPECIFICATION - - For every segment we adopt the following header: - - 1 byte reserved (always 0) - 1 byte flags (see below) - [4 byte frame length] (optional, see below) - ---Next, the per-segment ALAC parameters--- - 1 byte mixBits (middle-side parameter) - 1 byte mixRes (middle-side parameter, interpreted as signed char) - - 1 byte shiftU (4 bits modeU, 4 bits denShiftU) - 1 byte filterU (3 bits pbFactorU, 5 bits numU) - (numU) shorts (signed DP coefficients for V channel) - ---Next, 2nd-channel ALAC parameters in case of stereo mode--- - 1 byte shiftV (4 bits modeV, 4 bits denShiftV) - 1 byte filterV (3 bits pbFactorV, 5 bits numV) - (numV) shorts (signed DP coefficients for V channel) - ---After this come the shift-off bytes for (>= 24)-bit data (n-byte shift) if indicated--- - ---Then comes the AG-compressor bitstream--- - - - FLAGS - ----- - - The presence of certain flag bits changes the header format such that the parameters might - not even be sent. The currently defined flags format is: - - 0000psse - - where 0 = reserved, must be 0 - p = 1-bit field "partial frame" flag indicating 32-bit frame length follows this byte - ss = 2-bit field indicating "number of shift-off bytes ignored by compression" - e = 1-bit field indicating "escape" - - The "partial frame" flag means that the following segment is not equal to the frame length specified - in the out-of-band decoder configuration. This allows the decoder to deal with end-of-file partial - segments without incurring the 32-bit overhead for each segment. - - The "shift-off" field indicates the number of bytes at the bottom of the word that were passed through - uncompressed. The reason for this is that the entropy inherent in the LS bytes of >= 24-bit words - quite often means that the frame would have to be "escaped" b/c the compressed size would be >= the - uncompressed size. However, by shifting the input values down and running the remaining bits through - the normal compression algorithm, a net win can be achieved. If this field is non-zero, it means that - the shifted-off bytes follow after the parameter section of the header and before the compressed - bitstream. Note that doing this also allows us to use matrixing on 32-bit inputs after one or more - bytes are shifted off the bottom which helps the eventual compression ratio. For stereo channels, - the shifted off bytes are interleaved. - - The "escape" flag means that this segment was not compressed b/c the compressed size would be - >= uncompressed size. In that case, the audio data was passed through uncompressed after the header. - The other header parameter bytes will not be sent. - - - PARAMETERS - ---------- - - If the segment is not a partial or escape segment, the total header size (in bytes) is given exactly by: - - 4 + (2 + 2 * numU) (mono mode) - 4 + (2 + 2 * numV) + (2 + 2 * numV) (stereo mode) - - where the ALAC filter-lengths numU, numV are bounded by a - constant (in the current source, numU, numV <= NUMCOEPAIRS), and - this forces an absolute upper bound on header size. - - Each segment-decode process loads up these bytes from the front of the - local stream, in the above order, then follows with the entropy-encoded - bits for the given segment. - - To generalize middle-side, there are various mixing modes including middle-side, each lossless, - as embodied in the mix() and unmix() functions. These functions exploit a generalized middle-side - transformation: - - u := [(rL + (m-r)R)/m]; - v := L - R; - - where [ ] denotes integer floor. The (lossless) inverse is - - L = u + v - [rV/m]; - R = L - v; - - In the segment header, m and r are encoded in mixBits and mixRes. - Classical "middle-side" is obtained with m = 2, r = 1, but now - we have more generalized mixes. - - NOTES - ----- - The relevance of the ALAC coefficients is explained in detail - in patent documents. -*/ - -/* - EncodeStereo() - - encode a channel pair -*/ -static int32_t -EncodeStereo(ALAC_ENCODER *p, struct BitBuffer * bitstream, int32_t * inputBuffer, uint32_t stride, uint32_t channelIndex, uint32_t numSamples ) -{ - BitBuffer workBits; - BitBuffer startBits = *bitstream; // squirrel away copy of current state in case we need to go back and do an escape packet - AGParamRec agParams; - uint32_t bits1, bits2; - uint32_t dilate; - int32_t mixBits, mixRes, maxRes; - uint32_t minBits, minBits1, minBits2; - uint32_t numU, numV; - uint32_t mode; - uint32_t pbFactor; - uint32_t chanBits; - uint8_t bytesShifted; - SearchCoefs coefsU; - SearchCoefs coefsV; - uint32_t indx; - uint8_t partialFrame; - uint32_t escapeBits; - bool doEscape; - int32_t status = ALAC_noErr; - int32_t bestRes; - uint32_t numUV, converge; - - // make sure we handle this bit-depth before we get going - RequireAction( (p->mBitDepth == 16) || (p->mBitDepth == 20) || (p->mBitDepth == 24) || (p->mBitDepth == 32), return kALAC_ParamError; ); - - // reload coefs pointers for this channel pair - // - note that, while you might think they should be re-initialized per block, retaining state across blocks - // actually results in better overall compression - // - strangely, re-using the same coefs for the different passes of the "mixRes" search loop instead of using - // different coefs for the different passes of "mixRes" results in even better compression - coefsU = (SearchCoefs) p->mCoefsU[channelIndex]; - coefsV = (SearchCoefs) p->mCoefsV[channelIndex]; - - // matrix encoding adds an extra bit but 32-bit inputs cannot be matrixed b/c 33 is too many - // so enable 16-bit "shift off" and encode in 17-bit mode - // - in addition, 24-bit mode really improves with one byte shifted off - if ( p->mBitDepth == 32 ) - bytesShifted = 2; - else if ( p->mBitDepth >= 24 ) - bytesShifted = 1; - else - bytesShifted = 0; - - chanBits = p->mBitDepth - (bytesShifted * 8) + 1; - - // flag whether or not this is a partial frame - partialFrame = (numSamples == p->mFrameSize) ? 0 : 1; - - // brute-force encode optimization loop - // - run over variations of the encoding params to find the best choice - mixBits = kDefaultMixBits; - maxRes = kMaxRes; - numU = numV = kDefaultNumUV; - mode = 0; - pbFactor = 4; - dilate = 8; - - minBits = minBits1 = minBits2 = 1ul << 31; - - bestRes = p->mLastMixRes[channelIndex]; - - for ( mixRes = 0; mixRes <= maxRes; mixRes++ ) - { - // mix the stereo inputs - switch ( p->mBitDepth ) - { - case 16: - mix16( inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples/dilate, mixBits, mixRes ); - break; - case 20: - mix20( inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples/dilate, mixBits, mixRes ); - break; - case 24: - // includes extraction of shifted-off bytes - mix24( inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples/dilate, - mixBits, mixRes, p->mShiftBufferUV, bytesShifted ); - break; - case 32: - // includes extraction of shifted-off bytes - mix32( inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples/dilate, - mixBits, mixRes, p->mShiftBufferUV, bytesShifted ); - break; - } - - BitBufferInit( &workBits, p->mWorkBuffer, p->mMaxOutputBytes ); - - // run the dynamic predictors - pc_block( p->mMixBufferU, p->mPredictorU, numSamples/dilate, coefsU[numU - 1], numU, chanBits, DENSHIFT_DEFAULT ); - pc_block( p->mMixBufferV, p->mPredictorV, numSamples/dilate, coefsV[numV - 1], numV, chanBits, DENSHIFT_DEFAULT ); - - // run the lossless compressor on each channel - set_ag_params( &agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples/dilate, numSamples/dilate, MAX_RUN_DEFAULT ); - status = dyn_comp( &agParams, p->mPredictorU, &workBits, numSamples/dilate, chanBits, &bits1 ); - RequireNoErr( status, goto Exit; ); - - set_ag_params( &agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples/dilate, numSamples/dilate, MAX_RUN_DEFAULT ); - status = dyn_comp( &agParams, p->mPredictorV, &workBits, numSamples/dilate, chanBits, &bits2 ); - RequireNoErr( status, goto Exit; ); - - // look for best match - if ( (bits1 + bits2) < minBits1 ) - { - minBits1 = bits1 + bits2; - bestRes = mixRes; - } - } - - p->mLastMixRes[channelIndex] = (int16_t)bestRes; - - // mix the stereo inputs with the current best mixRes - mixRes = p->mLastMixRes[channelIndex]; - switch ( p->mBitDepth ) - { - case 16: - mix16( inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, mixBits, mixRes ); - break; - case 20: - mix20( inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, mixBits, mixRes ); - break; - case 24: - // also extracts the shifted off bytes into the shift buffers - mix24( inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, - mixBits, mixRes, p->mShiftBufferUV, bytesShifted ); - break; - case 32: - // also extracts the shifted off bytes into the shift buffers - mix32( inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, - mixBits, mixRes, p->mShiftBufferUV, bytesShifted ); - break; - } - - // now it's time for the predictor coefficient search loop - numU = numV = kMinUV; - minBits1 = minBits2 = 1ul << 31; - - for ( numUV = kMinUV; numUV <= kMaxUV; numUV += 4 ) - { - BitBufferInit( &workBits, p->mWorkBuffer, p->mMaxOutputBytes ); - - dilate = 32; - - // run the predictor over the same data multiple times to help it converge - for ( converge = 0; converge < 8; converge++ ) - { - pc_block( p->mMixBufferU, p->mPredictorU, numSamples/dilate, coefsU[numUV-1], numUV, chanBits, DENSHIFT_DEFAULT ); - pc_block( p->mMixBufferV, p->mPredictorV, numSamples/dilate, coefsV[numUV-1], numUV, chanBits, DENSHIFT_DEFAULT ); - } - - dilate = 8; - - set_ag_params( &agParams, MB0, (pbFactor * PB0)/4, KB0, numSamples/dilate, numSamples/dilate, MAX_RUN_DEFAULT ); - status = dyn_comp( &agParams, p->mPredictorU, &workBits, numSamples/dilate, chanBits, &bits1 ); - - if ( (bits1 * dilate + 16 * numUV) < minBits1 ) - { - minBits1 = bits1 * dilate + 16 * numUV; - numU = numUV; - } - - set_ag_params( &agParams, MB0, (pbFactor * PB0)/4, KB0, numSamples/dilate, numSamples/dilate, MAX_RUN_DEFAULT ); - status = dyn_comp( &agParams, p->mPredictorV, &workBits, numSamples/dilate, chanBits, &bits2 ); - - if ( (bits2 * dilate + 16 * numUV) < minBits2 ) - { - minBits2 = bits2 * dilate + 16 * numUV; - numV = numUV; - } - } - - // test for escape hatch if best calculated compressed size turns out to be more than the input size - minBits = minBits1 + minBits2 + (8 /* mixRes/maxRes/etc. */ * 8) + ((partialFrame == true) ? 32 : 0); - if ( bytesShifted != 0 ) - minBits += (numSamples * (bytesShifted * 8) * 2); - - escapeBits = (numSamples * p->mBitDepth * 2) + ((partialFrame == true) ? 32 : 0) + (2 * 8); /* 2 common header bytes */ - - doEscape = (minBits >= escapeBits) ? true : false; - - if ( doEscape == false ) - { - // write bitstream header and coefs - BitBufferWrite( bitstream, 0, 12 ); - BitBufferWrite( bitstream, (partialFrame << 3) | (bytesShifted << 1), 4 ); - if ( partialFrame ) - BitBufferWrite( bitstream, numSamples, 32 ); - BitBufferWrite( bitstream, mixBits, 8 ); - BitBufferWrite( bitstream, mixRes, 8 ); - - //Assert( (mode < 16) && (DENSHIFT_DEFAULT < 16) ); - //Assert( (pbFactor < 8) && (numU < 32) ); - //Assert( (pbFactor < 8) && (numV < 32) ); - - BitBufferWrite( bitstream, (mode << 4) | DENSHIFT_DEFAULT, 8 ); - BitBufferWrite( bitstream, (pbFactor << 5) | numU, 8 ); - for ( indx = 0; indx < numU; indx++ ) - BitBufferWrite( bitstream, coefsU[numU - 1][indx], 16 ); - - BitBufferWrite( bitstream, (mode << 4) | DENSHIFT_DEFAULT, 8 ); - BitBufferWrite( bitstream, (pbFactor << 5) | numV, 8 ); - for ( indx = 0; indx < numV; indx++ ) - BitBufferWrite( bitstream, coefsV[numV - 1][indx], 16 ); - - // if shift active, write the interleaved shift buffers - if ( bytesShifted != 0 ) - { - uint32_t bitShift = bytesShifted * 8; - - //Assert( bitShift <= 16 ); - - for ( indx = 0; indx < (numSamples * 2); indx += 2 ) - { - uint32_t shiftedVal; - - shiftedVal = ((uint32_t) p->mShiftBufferUV[indx + 0] << bitShift) | (uint32_t) p->mShiftBufferUV[indx + 1]; - BitBufferWrite( bitstream, shiftedVal, bitShift * 2 ); - } - } - - // run the dynamic predictor and lossless compression for the "left" channel - // - note: to avoid allocating more buffers, we're mixing and matching between the available buffers instead - // of only using "U" buffers for the U-channel and "V" buffers for the V-channel - if ( mode == 0 ) - { - pc_block( p->mMixBufferU, p->mPredictorU, numSamples, coefsU[numU - 1], numU, chanBits, DENSHIFT_DEFAULT ); - } - else - { - pc_block( p->mMixBufferU, p->mPredictorV, numSamples, coefsU[numU - 1], numU, chanBits, DENSHIFT_DEFAULT ); - pc_block( p->mPredictorV, p->mPredictorU, numSamples, NULL, 31, chanBits, 0 ); - } - - set_ag_params( &agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples, numSamples, MAX_RUN_DEFAULT ); - status = dyn_comp( &agParams, p->mPredictorU, bitstream, numSamples, chanBits, &bits1 ); - RequireNoErr( status, goto Exit; ); - - // run the dynamic predictor and lossless compression for the "right" channel - if ( mode == 0 ) - { - pc_block( p->mMixBufferV, p->mPredictorV, numSamples, coefsV[numV - 1], numV, chanBits, DENSHIFT_DEFAULT ); - } - else - { - pc_block( p->mMixBufferV, p->mPredictorU, numSamples, coefsV[numV - 1], numV, chanBits, DENSHIFT_DEFAULT ); - pc_block( p->mPredictorU, p->mPredictorV, numSamples, NULL, 31, chanBits, 0 ); - } - - set_ag_params( &agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples, numSamples, MAX_RUN_DEFAULT ); - status = dyn_comp( &agParams, p->mPredictorV, bitstream, numSamples, chanBits, &bits2 ); - RequireNoErr( status, goto Exit; ); - - /* if we happened to create a compressed packet that was actually bigger than an escape packet would be, - chuck it and do an escape packet - */ - minBits = BitBufferGetPosition( bitstream ) - BitBufferGetPosition( &startBits ); - if ( minBits >= escapeBits ) - { - *bitstream = startBits; // reset bitstream state - doEscape = true; - printf( "compressed frame too big: %u vs. %u \n", minBits, escapeBits ); - } - } - - if ( doEscape == true ) - { - /* escape */ - status = EncodeStereoEscape(p, bitstream, inputBuffer, stride, numSamples ); - -#if VERBOSE_DEBUG - DebugMsg( "escape!: %u vs %u\n", minBits, escapeBits ); -#endif - } - -Exit: - return status; -} - -/* - EncodeStereoFast() - - encode a channel pair without the search loop for maximum possible speed -*/ -static int32_t -EncodeStereoFast(ALAC_ENCODER *p, struct BitBuffer * bitstream, int32_t * inputBuffer, uint32_t stride, uint32_t channelIndex, uint32_t numSamples ) -{ - BitBuffer startBits = *bitstream; // squirrel away current bit position in case we decide to use escape hatch - AGParamRec agParams; - uint32_t bits1, bits2; - int32_t mixBits, mixRes; - uint32_t minBits, minBits1, minBits2; - uint32_t numU, numV; - uint32_t mode; - uint32_t pbFactor; - uint32_t chanBits; - uint8_t bytesShifted; - SearchCoefs coefsU; - SearchCoefs coefsV; - uint32_t indx; - uint8_t partialFrame; - uint32_t escapeBits; - bool doEscape; - int32_t status; - - // make sure we handle this bit-depth before we get going - RequireAction( (p->mBitDepth == 16) || (p->mBitDepth == 20) || (p->mBitDepth == 24) || (p->mBitDepth == 32), return kALAC_ParamError; ); - - // reload coefs pointers for this channel pair - // - note that, while you might think they should be re-initialized per block, retaining state across blocks - // actually results in better overall compression - // - strangely, re-using the same coefs for the different passes of the "mixRes" search loop instead of using - // different coefs for the different passes of "mixRes" results in even better compression - coefsU = (SearchCoefs) p->mCoefsU[channelIndex]; - coefsV = (SearchCoefs) p->mCoefsV[channelIndex]; - - // matrix encoding adds an extra bit but 32-bit inputs cannot be matrixed b/c 33 is too many - // so enable 16-bit "shift off" and encode in 17-bit mode - // - in addition, 24-bit mode really improves with one byte shifted off - if ( p->mBitDepth == 32 ) - bytesShifted = 2; - else if ( p->mBitDepth >= 24 ) - bytesShifted = 1; - else - bytesShifted = 0; - - chanBits = p->mBitDepth - (bytesShifted * 8) + 1; - - // flag whether or not this is a partial frame - partialFrame = (numSamples == p->mFrameSize) ? 0 : 1; - - // set up default encoding parameters for "fast" mode - mixBits = kDefaultMixBits; - mixRes = kDefaultMixRes; - numU = numV = kDefaultNumUV; - mode = 0; - pbFactor = 4; - - minBits = minBits1 = minBits2 = 1ul << 31; - - // mix the stereo inputs with default mixBits/mixRes - switch ( p->mBitDepth ) - { - case 16: - mix16( inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, mixBits, mixRes ); - break; - case 20: - mix20( inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, mixBits, mixRes ); - break; - case 24: - // also extracts the shifted off bytes into the shift buffers - mix24( inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, - mixBits, mixRes, p->mShiftBufferUV, bytesShifted ); - break; - case 32: - // also extracts the shifted off bytes into the shift buffers - mix32( inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, - mixBits, mixRes, p->mShiftBufferUV, bytesShifted ); - break; - } - - /* speculatively write the bitstream assuming the compressed version will be smaller */ - - // write bitstream header and coefs - BitBufferWrite( bitstream, 0, 12 ); - BitBufferWrite( bitstream, (partialFrame << 3) | (bytesShifted << 1), 4 ); - if ( partialFrame ) - BitBufferWrite( bitstream, numSamples, 32 ); - BitBufferWrite( bitstream, mixBits, 8 ); - BitBufferWrite( bitstream, mixRes, 8 ); - - //Assert( (mode < 16) && (DENSHIFT_DEFAULT < 16) ); - //Assert( (pbFactor < 8) && (numU < 32) ); - //Assert( (pbFactor < 8) && (numV < 32) ); - - BitBufferWrite( bitstream, (mode << 4) | DENSHIFT_DEFAULT, 8 ); - BitBufferWrite( bitstream, (pbFactor << 5) | numU, 8 ); - for ( indx = 0; indx < numU; indx++ ) - BitBufferWrite( bitstream, coefsU[numU - 1][indx], 16 ); - - BitBufferWrite( bitstream, (mode << 4) | DENSHIFT_DEFAULT, 8 ); - BitBufferWrite( bitstream, (pbFactor << 5) | numV, 8 ); - for ( indx = 0; indx < numV; indx++ ) - BitBufferWrite( bitstream, coefsV[numV - 1][indx], 16 ); - - // if shift active, write the interleaved shift buffers - if ( bytesShifted != 0 ) - { - uint32_t bitShift = bytesShifted * 8; - - //Assert( bitShift <= 16 ); - - for ( indx = 0; indx < (numSamples * 2); indx += 2 ) - { - uint32_t shiftedVal; - - shiftedVal = ((uint32_t) p->mShiftBufferUV[indx + 0] << bitShift) | (uint32_t) p->mShiftBufferUV[indx + 1]; - BitBufferWrite( bitstream, shiftedVal, bitShift * 2 ); - } - } - - // run the dynamic predictor and lossless compression for the "left" channel - // - note: we always use mode 0 in the "fast" path so we don't need the code for mode != 0 - pc_block( p->mMixBufferU, p->mPredictorU, numSamples, coefsU[numU - 1], numU, chanBits, DENSHIFT_DEFAULT ); - - set_ag_params( &agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples, numSamples, MAX_RUN_DEFAULT ); - status = dyn_comp( &agParams, p->mPredictorU, bitstream, numSamples, chanBits, &bits1 ); - RequireNoErr( status, goto Exit; ); - - // run the dynamic predictor and lossless compression for the "right" channel - pc_block( p->mMixBufferV, p->mPredictorV, numSamples, coefsV[numV - 1], numV, chanBits, DENSHIFT_DEFAULT ); - - set_ag_params( &agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples, numSamples, MAX_RUN_DEFAULT ); - status = dyn_comp( &agParams, p->mPredictorV, bitstream, numSamples, chanBits, &bits2 ); - RequireNoErr( status, goto Exit; ); - - // do bit requirement calculations - minBits1 = bits1 + (numU * sizeof(int16_t) * 8); - minBits2 = bits2 + (numV * sizeof(int16_t) * 8); - - // test for escape hatch if best calculated compressed size turns out to be more than the input size - minBits = minBits1 + minBits2 + (8 /* mixRes/maxRes/etc. */ * 8) + ((partialFrame == true) ? 32 : 0); - if ( bytesShifted != 0 ) - minBits += (numSamples * (bytesShifted * 8) * 2); - - escapeBits = (numSamples * p->mBitDepth * 2) + ((partialFrame == true) ? 32 : 0) + (2 * 8); /* 2 common header bytes */ - - doEscape = (minBits >= escapeBits) ? true : false; - - if ( doEscape == false ) - { - /* if we happened to create a compressed packet that was actually bigger than an escape packet would be, - chuck it and do an escape packet - */ - minBits = BitBufferGetPosition( bitstream ) - BitBufferGetPosition( &startBits ); - if ( minBits >= escapeBits ) - { - doEscape = true; - printf( "compressed frame too big: %u vs. %u\n", minBits, escapeBits ); - } - - } - - if ( doEscape == true ) - { - /* escape */ - - // reset bitstream position since we speculatively wrote the compressed version - *bitstream = startBits; - - // write escape frame - status = EncodeStereoEscape(p, bitstream, inputBuffer, stride, numSamples ); - -#if VERBOSE_DEBUG - DebugMsg( "escape!: %u vs %u\n", minBits, (numSamples * p->mBitDepth * 2) ); -#endif - } - -Exit: - return status; -} - -/* - EncodeStereoEscape() - - encode stereo escape frame -*/ -static int32_t -EncodeStereoEscape(ALAC_ENCODER *p, struct BitBuffer * bitstream, int32_t * inputBuffer, uint32_t stride, uint32_t numSamples ) -{ - uint8_t partialFrame; - uint32_t indx; - - // flag whether or not this is a partial frame - partialFrame = (numSamples == p->mFrameSize) ? 0 : 1; - - // write bitstream header - BitBufferWrite( bitstream, 0, 12 ); - BitBufferWrite( bitstream, (partialFrame << 3) | 1, 4 ); // LSB = 1 means "frame not compressed" - if ( partialFrame ) - BitBufferWrite( bitstream, numSamples, 32 ); - - // just copy the input data to the output buffer - switch ( p->mBitDepth ) - { - case 16: - for ( indx = 0; indx < (numSamples * stride); indx += stride ) - { - BitBufferWrite( bitstream, inputBuffer[indx + 0] >> 16, 16 ); - BitBufferWrite( bitstream, inputBuffer[indx + 1] >> 16, 16 ); - } - break; - case 20: - for ( indx = 0; indx < (numSamples * stride); indx += stride ) - { - BitBufferWrite( bitstream, inputBuffer[indx + 0] >> 12, 16 ); - BitBufferWrite( bitstream, inputBuffer[indx + 1] >> 12, 16 ); - } - break; - case 24: - // mix24() with mixres param = 0 means de-interleave so use it to simplify things - mix24( inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, 0, 0, p->mShiftBufferUV, 0 ); - for ( indx = 0; indx < numSamples; indx++ ) - { - BitBufferWrite( bitstream, p->mMixBufferU[indx] >> 8, 24 ); - BitBufferWrite( bitstream, p->mMixBufferV[indx] >> 8, 24 ); - } - break; - case 32: - for ( indx = 0; indx < (numSamples * stride); indx += stride ) - { - BitBufferWrite( bitstream, inputBuffer[indx + 0], 32 ); - BitBufferWrite( bitstream, inputBuffer[indx + 1], 32 ); - } - break; - } - - return ALAC_noErr; -} - -/* - EncodeMono() - - encode a mono input buffer -*/ -static int32_t -EncodeMono(ALAC_ENCODER *p, struct BitBuffer * bitstream, int32_t * inputBuffer, uint32_t stride, uint32_t channelIndex, uint32_t numSamples ) -{ - BitBuffer startBits = *bitstream; // squirrel away copy of current state in case we need to go back and do an escape packet - AGParamRec agParams; - uint32_t bits1; - uint32_t numU; - SearchCoefs coefsU; - uint32_t dilate; - uint32_t minBits, bestU; - uint32_t minU, maxU; - uint32_t indx, indx2; - uint8_t bytesShifted; - uint32_t shift; - uint32_t mask; - uint32_t chanBits; - uint8_t pbFactor; - uint8_t partialFrame; - uint32_t escapeBits; - bool doEscape; - int32_t status = ALAC_noErr; - uint32_t converge; - - - // make sure we handle this bit-depth before we get going - RequireAction( (p->mBitDepth == 16) || (p->mBitDepth == 20) || (p->mBitDepth == 24) || (p->mBitDepth == 32), return kALAC_ParamError; ); - - // reload coefs array from previous frame - coefsU = (SearchCoefs) p->mCoefsU[channelIndex]; - - // pick bit depth for actual encoding - // - we lop off the lower byte(s) for 24-/32-bit encodings - if ( p->mBitDepth == 32 ) - bytesShifted = 2; - else if ( p->mBitDepth >= 24 ) - bytesShifted = 1; - else - bytesShifted = 0; - - shift = bytesShifted * 8; - mask = (1ul << shift) - 1; - chanBits = p->mBitDepth - (bytesShifted * 8); - - // flag whether or not this is a partial frame - partialFrame = (numSamples == p->mFrameSize) ? 0 : 1; - - // convert N-bit data to 32-bit for predictor - switch ( p->mBitDepth ) - { - case 16: - // convert 16-bit data to 32-bit for predictor - for ( indx = 0, indx2 = 0; indx < numSamples; indx++, indx2 += stride ) - p->mMixBufferU[indx] = inputBuffer[indx2] >> 16; - break; - - case 20: - // convert 20-bit data to 32-bit for predictor - for ( indx = 0, indx2 = 0; indx < numSamples; indx++, indx2 += stride ) - p->mMixBufferU[indx] = inputBuffer[indx2] >> 12; - break; - case 24: - // convert 24-bit data to 32-bit for the predictor and extract the shifted off byte(s) - for ( indx = 0, indx2 = 0; indx < numSamples; indx++, indx2 += stride ) - { - p->mMixBufferU[indx] = inputBuffer[indx2] >> 8; - p->mShiftBufferUV[indx] = (uint16_t)(p->mMixBufferU[indx] & mask); - p->mMixBufferU[indx] >>= shift; - } - - break; - case 32: - // just copy the 32-bit input data for the predictor and extract the shifted off byte(s) - for ( indx = 0, indx2 = 0; indx < numSamples; indx++, indx2 += stride ) - { - p->mShiftBufferUV[indx] = (uint16_t)(inputBuffer[indx2] & mask); - p->mMixBufferU[indx] = inputBuffer[indx2] >> shift; - } - break; - } - - // brute-force encode optimization loop (implied "encode depth" of 0 if comparing to cmd line tool) - // - run over variations of the encoding params to find the best choice - minU = 4; - maxU = 8; - minBits = 1ul << 31; - pbFactor = 4; - - bestU = minU; - - for ( numU = minU; numU <= maxU; numU += 4 ) - { - BitBuffer workBits; - uint32_t numBits; - - BitBufferInit( &workBits, p->mWorkBuffer, p->mMaxOutputBytes ); - - dilate = 32; - for ( converge = 0; converge < 7; converge++ ) - pc_block( p->mMixBufferU, p->mPredictorU, numSamples/dilate, coefsU[numU-1], numU, chanBits, DENSHIFT_DEFAULT ); - - dilate = 8; - pc_block( p->mMixBufferU, p->mPredictorU, numSamples/dilate, coefsU[numU-1], numU, chanBits, DENSHIFT_DEFAULT ); - - set_ag_params( &agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples/dilate, numSamples/dilate, MAX_RUN_DEFAULT ); - status = dyn_comp( &agParams, p->mPredictorU, &workBits, numSamples/dilate, chanBits, &bits1 ); - RequireNoErr( status, goto Exit; ); - - numBits = (dilate * bits1) + (16 * numU); - if ( numBits < minBits ) - { - bestU = numU; - minBits = numBits; - } - } - - // test for escape hatch if best calculated compressed size turns out to be more than the input size - // - first, add bits for the header bytes mixRes/maxRes/shiftU/filterU - minBits += (4 /* mixRes/maxRes/etc. */ * 8) + ((partialFrame == true) ? 32 : 0); - if ( bytesShifted != 0 ) - minBits += (numSamples * (bytesShifted * 8)); - - escapeBits = (numSamples * p->mBitDepth) + ((partialFrame == true) ? 32 : 0) + (2 * 8); /* 2 common header bytes */ - - doEscape = (minBits >= escapeBits) ? true : false; - - if ( doEscape == false ) - { - // write bitstream header - BitBufferWrite( bitstream, 0, 12 ); - BitBufferWrite( bitstream, (partialFrame << 3) | (bytesShifted << 1), 4 ); - if ( partialFrame ) - BitBufferWrite( bitstream, numSamples, 32 ); - BitBufferWrite( bitstream, 0, 16 ); // mixBits = mixRes = 0 - - // write the params and predictor coefs - numU = bestU; - BitBufferWrite( bitstream, (0 << 4) | DENSHIFT_DEFAULT, 8 ); // modeU = 0 - BitBufferWrite( bitstream, (pbFactor << 5) | numU, 8 ); - for ( indx = 0; indx < numU; indx++ ) - BitBufferWrite( bitstream, coefsU[numU-1][indx], 16 ); - - // if shift active, write the interleaved shift buffers - if ( bytesShifted != 0 ) - { - for ( indx = 0; indx < numSamples; indx++ ) - BitBufferWrite( bitstream, p->mShiftBufferUV[indx], shift ); - } - - // run the dynamic predictor with the best result - pc_block( p->mMixBufferU, p->mPredictorU, numSamples, coefsU[numU-1], numU, chanBits, DENSHIFT_DEFAULT ); - - // do lossless compression - set_standard_ag_params( &agParams, numSamples, numSamples ); - status = dyn_comp( &agParams, p->mPredictorU, bitstream, numSamples, chanBits, &bits1 ); - //AssertNoErr( status ); - - - /* if we happened to create a compressed packet that was actually bigger than an escape packet would be, - chuck it and do an escape packet - */ - minBits = BitBufferGetPosition( bitstream ) - BitBufferGetPosition( &startBits ); - if ( minBits >= escapeBits ) - { - *bitstream = startBits; // reset bitstream state - doEscape = true; - printf( "compressed frame too big: %u vs. %u\n", minBits, escapeBits ); - } - } - - if ( doEscape == true ) - { - // write bitstream header and coefs - BitBufferWrite( bitstream, 0, 12 ); - BitBufferWrite( bitstream, (partialFrame << 3) | 1, 4 ); // LSB = 1 means "frame not compressed" - if ( partialFrame ) - BitBufferWrite( bitstream, numSamples, 32 ); - - // just copy the input data to the output buffer - switch ( p->mBitDepth ) - { - case 16: - for ( indx = 0; indx < (numSamples * stride); indx += stride ) - BitBufferWrite( bitstream, inputBuffer[indx] >> 16, 16 ); - break; - case 20: - // convert 20-bit data to 32-bit for simplicity - for ( indx = 0; indx < (numSamples * stride); indx += stride ) - BitBufferWrite( bitstream, inputBuffer[indx] >> 12, 20 ); - break; - case 24: - // convert 24-bit data to 32-bit for simplicity - for ( indx = 0, indx2 = 0; indx < numSamples; indx++, indx2 += stride ) - { - p->mMixBufferU[indx] = inputBuffer[indx2] >> 8; - BitBufferWrite( bitstream, p->mMixBufferU[indx], 24 ); - } - break; - case 32: - for ( indx = 0; indx < (numSamples * stride); indx += stride ) - BitBufferWrite( bitstream, inputBuffer[indx], 32 ); - break; - } -#if VERBOSE_DEBUG - DebugMsg( "escape!: %u vs %u\n", minBits, (numSamples * p->mBitDepth) ); -#endif - } - -Exit: - return status; -} - -#if PRAGMA_MARK -#pragma mark - -#endif - -/* - Encode() - - encode the next block of samples -*/ -int32_t -alac_encode(ALAC_ENCODER *p, uint32_t numChannels, uint32_t numSamples, - int32_t * theReadBuffer, unsigned char * theWriteBuffer, uint32_t * ioNumBytes) -{ - uint32_t outputSize; - BitBuffer bitstream; - int32_t status; - - // create a bit buffer structure pointing to our output buffer - BitBufferInit( &bitstream, theWriteBuffer, p->mMaxOutputBytes ); - - if ( numChannels == 2 ) - { - // add 3-bit frame start tag ID_CPE = channel pair & 4-bit element instance tag = 0 - BitBufferWrite( &bitstream, ID_CPE, 3 ); - BitBufferWrite( &bitstream, 0, 4 ); - - // encode stereo input buffer - if ( p->mFastMode == false ) - status = EncodeStereo(p, &bitstream, theReadBuffer, 2, 0, numSamples ); - else - status = EncodeStereoFast(p, &bitstream, theReadBuffer, 2, 0, numSamples ); - RequireNoErr( status, goto Exit; ); - } - else if ( numChannels == 1 ) - { - // add 3-bit frame start tag ID_SCE = mono channel & 4-bit element instance tag = 0 - BitBufferWrite( &bitstream, ID_SCE, 3 ); - BitBufferWrite( &bitstream, 0, 4 ); - - // encode mono input buffer - status = EncodeMono(p, &bitstream, theReadBuffer, 1, 0, numSamples ); - RequireNoErr( status, goto Exit; ); - } - else - { - int32_t * inputBuffer; - uint32_t tag; - uint32_t channelIndex; - uint32_t inputIncrement; - uint8_t stereoElementTag; - uint8_t monoElementTag; - uint8_t lfeElementTag; - - inputBuffer = theReadBuffer; - inputIncrement = ((p->mBitDepth + 7) / 8); - - stereoElementTag = 0; - monoElementTag = 0; - lfeElementTag = 0; - - for ( channelIndex = 0; channelIndex < numChannels; ) - { - tag = (sChannelMaps[numChannels - 1] & (0x7ul << (channelIndex * 3))) >> (channelIndex * 3); - - BitBufferWrite( &bitstream, tag, 3 ); - switch ( tag ) - { - case ID_SCE: - // mono - BitBufferWrite( &bitstream, monoElementTag, 4 ); - - status = EncodeMono(p, &bitstream, inputBuffer, numChannels, channelIndex, numSamples ); - - inputBuffer += inputIncrement; - channelIndex++; - monoElementTag++; - break; - - case ID_CPE: - // stereo - BitBufferWrite( &bitstream, stereoElementTag, 4 ); - - status = EncodeStereo(p,&bitstream, inputBuffer, numChannels, channelIndex, numSamples ); - - inputBuffer += (inputIncrement * 2); - channelIndex += 2; - stereoElementTag++; - break; - - case ID_LFE: - // LFE channel (subwoofer) - BitBufferWrite( &bitstream, lfeElementTag, 4 ); - - status = EncodeMono(p, &bitstream, inputBuffer, numChannels, channelIndex, numSamples ); - - inputBuffer += inputIncrement; - channelIndex++; - lfeElementTag++; - break; - - default: - printf( "That ain't right! (%u)\n", tag ); - status = kALAC_ParamError; - goto Exit; - } - - RequireNoErr( status, goto Exit; ); - } - } - -#if VERBOSE_DEBUG -{ - // if there is room left in the output buffer, add some random fill data to test decoder - int32_t bitsLeft; - int32_t bytesLeft; - - bitsLeft = BitBufferGetPosition( &bitstream ) - 3; // - 3 for ID_END tag - bytesLeft = bitstream.byteSize - ((bitsLeft + 7) / 8); - - if ( (bytesLeft > 20) && ((bytesLeft & 0x4u) != 0) ) - AddFiller( &bitstream, bytesLeft ); -} -#endif - - // add 3-bit frame end tag: ID_END - BitBufferWrite( &bitstream, ID_END, 3 ); - - // byte-align the output data - BitBufferByteAlign( &bitstream, true ); - - outputSize = BitBufferGetPosition( &bitstream ) / 8; - //Assert( outputSize <= mMaxOutputBytes ); - - - // all good, let iTunes know what happened and remember the total number of input sample frames - *ioNumBytes = outputSize; - //mEncodedFrames += encodeMsg->numInputSamples; - - // gather encoding stats - p->mTotalBytesGenerated += outputSize; - p->mMaxFrameBytes = MAX( p->mMaxFrameBytes, outputSize ); - - status = ALAC_noErr; - -Exit: - return status; -} - - -#if PRAGMA_MARK -#pragma mark - -#endif - -/* - GetConfig() -*/ -void -GetConfig(ALAC_ENCODER *p, ALACSpecificConfig * config ) -{ - config->frameLength = Swap32NtoB(p->mFrameSize); - config->compatibleVersion = (uint8_t) kALACCompatibleVersion; - config->bitDepth = (uint8_t) p->mBitDepth; - config->pb = (uint8_t) PB0; - config->kb = (uint8_t) KB0; - config->mb = (uint8_t) MB0; - config->numChannels = (uint8_t) p->mNumChannels; - config->maxRun = Swap16NtoB((uint16_t) MAX_RUN_DEFAULT); - config->maxFrameBytes = Swap32NtoB(p->mMaxFrameBytes); - config->avgBitRate = Swap32NtoB(p->mAvgBitRate); - config->sampleRate = Swap32NtoB(p->mOutputSampleRate); -} - -uint32_t -alac_get_magic_cookie_size(uint32_t inNumChannels) -{ - if (inNumChannels > 2) - { - return sizeof(ALACSpecificConfig) + kChannelAtomSize + sizeof(ALACAudioChannelLayout); - } - else - { - return sizeof(ALACSpecificConfig); - } -} - -void -alac_get_magic_cookie(ALAC_ENCODER *p, void * outCookie, uint32_t * ioSize ) -{ - ALACSpecificConfig theConfig = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - ALACAudioChannelLayout theChannelLayout = {0, 0, 0}; - uint8_t theChannelAtom[kChannelAtomSize] = {0, 0, 0, 0, 'c', 'h', 'a', 'n', 0, 0, 0, 0}; - uint32_t theCookieSize = sizeof(ALACSpecificConfig); - uint8_t * theCookiePointer = (uint8_t *)outCookie; - - GetConfig(p, &theConfig); - if (theConfig.numChannels > 2) - { - theChannelLayout.mChannelLayoutTag = Swap32NtoB(ALACChannelLayoutTags[theConfig.numChannels - 1]); - theCookieSize += (sizeof(ALACAudioChannelLayout) + kChannelAtomSize); - } - if (*ioSize >= theCookieSize) - { - memcpy(theCookiePointer, &theConfig, sizeof(ALACSpecificConfig)); - theChannelAtom[3] = (sizeof(ALACAudioChannelLayout) + kChannelAtomSize); - if (theConfig.numChannels > 2) - { - theCookiePointer += sizeof(ALACSpecificConfig); - memcpy(theCookiePointer, theChannelAtom, kChannelAtomSize); - theCookiePointer += kChannelAtomSize; - memcpy(theCookiePointer, &theChannelLayout, sizeof(ALACAudioChannelLayout)); - } - *ioSize = theCookieSize; - } - else - { - *ioSize = 0; // no incomplete cookies - } -} - -/* - alac_encoder_init() - - initialize the encoder component with the current config -*/ -int32_t -alac_encoder_init (ALAC_ENCODER *p, uint32_t samplerate, uint32_t channels, uint32_t format_flags, uint32_t frameSize) -{ - int32_t status; - uint32_t indx; - int32_t channel, search; - - p->mFrameSize = (frameSize > 0 && frameSize <= ALAC_FRAME_LENGTH) ? frameSize : ALAC_FRAME_LENGTH ; - - p->mOutputSampleRate = samplerate; - p->mNumChannels = channels; - switch (format_flags) - { - case 1: - p->mBitDepth = 16; - break; - case 2: - p->mBitDepth = 20; - break; - case 3: - p->mBitDepth = 24; - break; - case 4: - p->mBitDepth = 32; - break; - default: - break; - } - - // set up default encoding parameters and state - // - note: mFrameSize is set in the constructor or via alac_set_frame_size() which must be called before this routine - for ( indx = 0; indx < kALACMaxChannels; indx++ ) - p->mLastMixRes[indx] = kDefaultMixRes; - - // the maximum output frame size can be no bigger than (samplesPerBlock * numChannels * ((10 + sampleSize)/8) + 1) - // but note that this can be bigger than the input size! - // - since we don't yet know what our input format will be, use our max allowed sample size in the calculation - p->mMaxOutputBytes = p->mFrameSize * p->mNumChannels * ((10 + kMaxSampleSize) / 8) + 1; - - status = ALAC_noErr; - - // initialize coefs arrays once b/c retaining state across blocks actually improves the encode ratio - for ( channel = 0; channel < (int32_t) p->mNumChannels; channel++ ) - { - for ( search = 0; search < kALACMaxSearches; search++ ) - { - init_coefs( p->mCoefsU[channel][search], DENSHIFT_DEFAULT, kALACMaxCoefs ); - init_coefs( p->mCoefsV[channel][search], DENSHIFT_DEFAULT, kALACMaxCoefs ); - } - } - - return status; -} - -/* - alac_get_source_format() - - given the input format, return one of our supported formats -*/ -void -alac_get_source_format(ALAC_ENCODER *p, const AudioFormatDescription * source, AudioFormatDescription * output ) -{ - (void) output ; - // default is 16-bit native endian - // - note: for float input we assume that's coming from one of our decoders (mp3, aac) so it only makes sense - // to encode to 16-bit since the source was lossy in the first place - // - note: if not a supported bit depth, find the closest supported bit depth to the input one - if ( (source->mFormatID != kALACFormatLinearPCM) || ((source->mFormatFlags & kALACFormatFlagIsFloat) != 0) || - ( source->mBitsPerChannel <= 16 ) ) - p->mBitDepth = 16; - else if ( source->mBitsPerChannel <= 20 ) - p->mBitDepth = 20; - else if ( source->mBitsPerChannel <= 24 ) - p->mBitDepth = 24; - else - p->mBitDepth = 32; - - // we support 16/20/24/32-bit integer data at any sample rate and our target number of channels - // and sample rate were specified when we were configured - /* - MakeUncompressedAudioFormat( mNumChannels, (float) mOutputSampleRate, mBitDepth, kAudioFormatFlagsNativeIntegerPacked, output ); - */ -} - - - -#if VERBOSE_DEBUG - -#if PRAGMA_MARK -#pragma mark - -#endif - -/* - AddFiller() - - add fill and data stream elements to the bitstream to test the decoder -*/ -static void AddFiller( BitBuffer * bits, int32_t numBytes ) -{ - uint8_t tag; - int32_t indx; - - // out of lameness, subtract 6 bytes to deal with header + alignment as required for fill/data elements - numBytes -= 6; - if ( numBytes <= 0 ) - return; - - // randomly pick Fill or Data Stream Element based on numBytes requested - tag = (numBytes & 0x8) ? ID_FIL : ID_DSE; - - BitBufferWrite( bits, tag, 3 ); - if ( tag == ID_FIL ) - { - // can't write more than 269 bytes in a fill element - numBytes = (numBytes > 269) ? 269 : numBytes; - - // fill element = 4-bit size unless >= 15 then 4-bit size + 8-bit extension size - if ( numBytes >= 15 ) - { - uint16_t extensionSize; - - BitBufferWrite( bits, 15, 4 ); - - // 8-bit extension count field is "extra + 1" which is weird but I didn't define the syntax - // - otherwise, there's no way to represent 15 - // - for example, to really mean 15 bytes you must encode extensionSize = 1 - // - why it's not like data stream elements I have no idea - extensionSize = (numBytes - 15) + 1; - //Assert( extensionSize <= 255 ); - BitBufferWrite( bits, extensionSize, 8 ); - } - else - BitBufferWrite( bits, numBytes, 4 ); - - BitBufferWrite( bits, 0x10, 8 ); // extension_type = FILL_DATA = b0001 or'ed with fill_nibble = b0000 - for ( indx = 0; indx < (numBytes - 1); indx++ ) - BitBufferWrite( bits, 0xa5, 8 ); // fill_byte = b10100101 = 0xa5 - } - else - { - // can't write more than 510 bytes in a data stream element - numBytes = (numBytes > 510) ? 510 : numBytes; - - BitBufferWrite( bits, 0, 4 ); // element instance tag - BitBufferWrite( bits, 1, 1 ); // byte-align flag = true - - // data stream element = 8-bit size unless >= 255 then 8-bit size + 8-bit size - if ( numBytes >= 255 ) - { - BitBufferWrite( bits, 255, 8 ); - BitBufferWrite( bits, numBytes - 255, 8 ); - } - else - BitBufferWrite( bits, numBytes, 8 ); - - BitBufferByteAlign( bits, true ); // byte-align with zeros - - for ( indx = 0; indx < numBytes; indx++ ) - BitBufferWrite( bits, 0x5a, 8 ); - } -} - -#endif /* VERBOSE_DEBUG */ diff --git a/libs/libsndfile/src/ALAC/dp_dec.c b/libs/libsndfile/src/ALAC/dp_dec.c deleted file mode 100644 index 45aae7a9e1..0000000000 --- a/libs/libsndfile/src/ALAC/dp_dec.c +++ /dev/null @@ -1,375 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: dp_dec.c - - Contains: Dynamic Predictor decode routines - - Copyright: (c) 2001-2011 Apple, Inc. -*/ - - -#include "dplib.h" -#include - -#if __GNUC__ -#define ALWAYS_INLINE __attribute__((always_inline)) -#else -#define ALWAYS_INLINE -#endif - -#define LOOP_ALIGN - -static inline int32_t ALWAYS_INLINE sign_of_int( int32_t i ) -{ - int32_t negishift; - - negishift = ((uint32_t)-i) >> 31; - return negishift | (i >> 31); -} - -void unpc_block( int32_t * pc1, int32_t * out, int32_t num, int16_t * coefs, int32_t numactive, uint32_t chanbits, uint32_t denshift ) -{ - register int16_t a0, a1, a2, a3; - register int32_t b0, b1, b2, b3; - int32_t j, k, lim; - int32_t sum1, sg, sgn, top, dd; - int32_t * pout; - int32_t del, del0; - uint32_t chanshift = 32 - chanbits; - int32_t denhalf = 1<<(denshift-1); - - out[0] = pc1[0]; - if ( numactive == 0 ) - { - // just copy if numactive == 0 (but don't bother if in/out pointers the same) - if ( (num > 1) && (pc1 != out) ) - memcpy( &out[1], &pc1[1], (num - 1) * sizeof(int32_t) ); - return; - } - if ( numactive == 31 ) - { - // short-circuit if numactive == 31 - int32_t prev; - - /* this code is written such that the in/out buffers can be the same - to conserve buffer space on embedded devices like the iPod - - (original code) - for ( j = 1; j < num; j++ ) - del = pc1[j] + out[j-1]; - out[j] = (del << chanshift) >> chanshift; - */ - prev = out[0]; - for ( j = 1; j < num; j++ ) - { - del = pc1[j] + prev; - prev = (del << chanshift) >> chanshift; - out[j] = prev; - } - return; - } - - for ( j = 1; j <= numactive; j++ ) - { - del = pc1[j] + out[j-1]; - out[j] = (del << chanshift) >> chanshift; - } - - lim = numactive + 1; - - if ( numactive == 4 ) - { - // optimization for numactive == 4 - register int16_t ia0, ia1, ia2, ia3; - register int32_t ib0, ib1, ib2, ib3; - - ia0 = coefs[0]; - ia1 = coefs[1]; - ia2 = coefs[2]; - ia3 = coefs[3]; - - for ( j = lim; j < num; j++ ) - { - LOOP_ALIGN - - top = out[j - lim]; - pout = out + j - 1; - - ib0 = top - pout[0]; - ib1 = top - pout[-1]; - ib2 = top - pout[-2]; - ib3 = top - pout[-3]; - - sum1 = (denhalf - ia0 * ib0 - ia1 * ib1 - ia2 * ib2 - ia3 * ib3) >> denshift; - - del = pc1[j]; - del0 = del; - sg = sign_of_int(del); - del += top + sum1; - - out[j] = (del << chanshift) >> chanshift; - - if ( sg > 0 ) - { - sgn = sign_of_int( ib3 ); - ia3 -= sgn; - del0 -= (4 - 3) * ((sgn * ib3) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( ib2 ); - ia2 -= sgn; - del0 -= (4 - 2) * ((sgn * ib2) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( ib1 ); - ia1 -= sgn; - del0 -= (4 - 1) * ((sgn * ib1) >> denshift); - if ( del0 <= 0 ) - continue; - - ia0 -= sign_of_int( ib0 ); - } - else if ( sg < 0 ) - { - // note: to avoid unnecessary negations, we flip the value of "sgn" - sgn = -sign_of_int( ib3 ); - ia3 -= sgn; - del0 -= (4 - 3) * ((sgn * ib3) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( ib2 ); - ia2 -= sgn; - del0 -= (4 - 2) * ((sgn * ib2) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( ib1 ); - ia1 -= sgn; - del0 -= (4 - 1) * ((sgn * ib1) >> denshift); - if ( del0 >= 0 ) - continue; - - ia0 += sign_of_int( ib0 ); - } - } - - coefs[0] = ia0; - coefs[1] = ia1; - coefs[2] = ia2; - coefs[3] = ia3; - } - else if ( numactive == 8 ) - { - register int16_t a4, a5, a6, a7; - register int32_t b4, b5, b6, b7; - - // optimization for numactive == 8 - a0 = coefs[0]; - a1 = coefs[1]; - a2 = coefs[2]; - a3 = coefs[3]; - a4 = coefs[4]; - a5 = coefs[5]; - a6 = coefs[6]; - a7 = coefs[7]; - - for ( j = lim; j < num; j++ ) - { - LOOP_ALIGN - - top = out[j - lim]; - pout = out + j - 1; - - b0 = top - (*pout--); - b1 = top - (*pout--); - b2 = top - (*pout--); - b3 = top - (*pout--); - b4 = top - (*pout--); - b5 = top - (*pout--); - b6 = top - (*pout--); - b7 = top - (*pout); - pout += 8; - - sum1 = (denhalf - a0 * b0 - a1 * b1 - a2 * b2 - a3 * b3 - - a4 * b4 - a5 * b5 - a6 * b6 - a7 * b7) >> denshift; - - del = pc1[j]; - del0 = del; - sg = sign_of_int(del); - del += top + sum1; - - out[j] = (del << chanshift) >> chanshift; - - if ( sg > 0 ) - { - sgn = sign_of_int( b7 ); - a7 -= sgn; - del0 -= 1 * ((sgn * b7) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( b6 ); - a6 -= sgn; - del0 -= 2 * ((sgn * b6) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( b5 ); - a5 -= sgn; - del0 -= 3 * ((sgn * b5) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( b4 ); - a4 -= sgn; - del0 -= 4 * ((sgn * b4) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( b3 ); - a3 -= sgn; - del0 -= 5 * ((sgn * b3) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( b2 ); - a2 -= sgn; - del0 -= 6 * ((sgn * b2) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( b1 ); - a1 -= sgn; - del0 -= 7 * ((sgn * b1) >> denshift); - if ( del0 <= 0 ) - continue; - - a0 -= sign_of_int( b0 ); - } - else if ( sg < 0 ) - { - // note: to avoid unnecessary negations, we flip the value of "sgn" - sgn = -sign_of_int( b7 ); - a7 -= sgn; - del0 -= 1 * ((sgn * b7) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( b6 ); - a6 -= sgn; - del0 -= 2 * ((sgn * b6) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( b5 ); - a5 -= sgn; - del0 -= 3 * ((sgn * b5) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( b4 ); - a4 -= sgn; - del0 -= 4 * ((sgn * b4) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( b3 ); - a3 -= sgn; - del0 -= 5 * ((sgn * b3) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( b2 ); - a2 -= sgn; - del0 -= 6 * ((sgn * b2) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( b1 ); - a1 -= sgn; - del0 -= 7 * ((sgn * b1) >> denshift); - if ( del0 >= 0 ) - continue; - - a0 += sign_of_int( b0 ); - } - } - - coefs[0] = a0; - coefs[1] = a1; - coefs[2] = a2; - coefs[3] = a3; - coefs[4] = a4; - coefs[5] = a5; - coefs[6] = a6; - coefs[7] = a7; - } - else - { - // general case - for ( j = lim; j < num; j++ ) - { - LOOP_ALIGN - - sum1 = 0; - pout = out + j - 1; - top = out[j-lim]; - - for ( k = 0; k < numactive; k++ ) - sum1 += coefs[k] * (pout[-k] - top); - - del = pc1[j]; - del0 = del; - sg = sign_of_int( del ); - del += top + ((sum1 + denhalf) >> denshift); - out[j] = (del << chanshift) >> chanshift; - - if ( sg > 0 ) - { - for ( k = (numactive - 1); k >= 0; k-- ) - { - dd = top - pout[-k]; - sgn = sign_of_int( dd ); - coefs[k] -= sgn; - del0 -= (numactive - k) * ((sgn * dd) >> denshift); - if ( del0 <= 0 ) - break; - } - } - else if ( sg < 0 ) - { - for ( k = (numactive - 1); k >= 0; k-- ) - { - dd = top - pout[-k]; - sgn = sign_of_int( dd ); - coefs[k] += sgn; - del0 -= (numactive - k) * ((-sgn * dd) >> denshift); - if ( del0 >= 0 ) - break; - } - } - } - } -} diff --git a/libs/libsndfile/src/ALAC/dp_enc.c b/libs/libsndfile/src/ALAC/dp_enc.c deleted file mode 100644 index f81cdba520..0000000000 --- a/libs/libsndfile/src/ALAC/dp_enc.c +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: dp_enc.c - - Contains: Dynamic Predictor encode routines - - Copyright: (c) 2001-2011 Apple, Inc. -*/ - -#include "dplib.h" -#include - -#if __GNUC__ -#define ALWAYS_INLINE __attribute__((always_inline)) -#else -#define ALWAYS_INLINE -#endif - -#define LOOP_ALIGN - -void init_coefs( int16_t * coefs, uint32_t denshift, int32_t numPairs ) -{ - int32_t k; - int32_t den = 1 << denshift; - - coefs[0] = (AINIT * den) >> 4; - coefs[1] = (BINIT * den) >> 4; - coefs[2] = (CINIT * den) >> 4; - for ( k = 3; k < numPairs; k++ ) - coefs[k] = 0; -} - -void copy_coefs( int16_t * srcCoefs, int16_t * dstCoefs, int32_t numPairs ) -{ - int32_t k; - - for ( k = 0; k < numPairs; k++ ) - dstCoefs[k] = srcCoefs[k]; -} - -static inline int32_t ALWAYS_INLINE sign_of_int( int32_t i ) -{ - int32_t negishift; - - negishift = ((uint32_t)-i) >> 31; - return negishift | (i >> 31); -} - -void pc_block( int32_t * in, int32_t * pc1, int32_t num, int16_t * coefs, int32_t numactive, uint32_t chanbits, uint32_t denshift ) -{ - register int16_t a0, a1, a2, a3; - register int32_t b0, b1, b2, b3; - int32_t j, k, lim; - int32_t * pin; - int32_t sum1, dd; - int32_t sg, sgn; - int32_t top; - int32_t del, del0; - uint32_t chanshift = 32 - chanbits; - int32_t denhalf = 1 << (denshift - 1); - - pc1[0] = in[0]; - if ( numactive == 0 ) - { - // just copy if numactive == 0 (but don't bother if in/out pointers the same) - if ( (num > 1) && (in != pc1) ) - memcpy( &pc1[1], &in[1], (num - 1) * sizeof(int32_t) ); - return; - } - if ( numactive == 31 ) - { - // short-circuit if numactive == 31 - for( j = 1; j < num; j++ ) - { - del = in[j] - in[j-1]; - pc1[j] = (del << chanshift) >> chanshift; - } - return; - } - - for ( j = 1; j <= numactive; j++ ) - { - del = in[j] - in[j-1]; - pc1[j] = (del << chanshift) >> chanshift; - } - - lim = numactive + 1; - - if ( numactive == 4 ) - { - // optimization for numactive == 4 - a0 = coefs[0]; - a1 = coefs[1]; - a2 = coefs[2]; - a3 = coefs[3]; - - for ( j = lim; j < num; j++ ) - { - LOOP_ALIGN - - top = in[j - lim]; - pin = in + j - 1; - - b0 = top - pin[0]; - b1 = top - pin[-1]; - b2 = top - pin[-2]; - b3 = top - pin[-3]; - - sum1 = (denhalf - a0 * b0 - a1 * b1 - a2 * b2 - a3 * b3) >> denshift; - - del = in[j] - top - sum1; - del = (del << chanshift) >> chanshift; - pc1[j] = del; - del0 = del; - - sg = sign_of_int(del); - if ( sg > 0 ) - { - sgn = sign_of_int( b3 ); - a3 -= sgn; - del0 -= (4 - 3) * ((sgn * b3) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( b2 ); - a2 -= sgn; - del0 -= (4 - 2) * ((sgn * b2) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( b1 ); - a1 -= sgn; - del0 -= (4 - 1) * ((sgn * b1) >> denshift); - if ( del0 <= 0 ) - continue; - - a0 -= sign_of_int( b0 ); - } - else if ( sg < 0 ) - { - // note: to avoid unnecessary negations, we flip the value of "sgn" - sgn = -sign_of_int( b3 ); - a3 -= sgn; - del0 -= (4 - 3) * ((sgn * b3) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( b2 ); - a2 -= sgn; - del0 -= (4 - 2) * ((sgn * b2) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( b1 ); - a1 -= sgn; - del0 -= (4 - 1) * ((sgn * b1) >> denshift); - if ( del0 >= 0 ) - continue; - - a0 += sign_of_int( b0 ); - } - } - - coefs[0] = a0; - coefs[1] = a1; - coefs[2] = a2; - coefs[3] = a3; - } - else if ( numactive == 8 ) - { - // optimization for numactive == 8 - register int16_t a4, a5, a6, a7; - register int32_t b4, b5, b6, b7; - - a0 = coefs[0]; - a1 = coefs[1]; - a2 = coefs[2]; - a3 = coefs[3]; - a4 = coefs[4]; - a5 = coefs[5]; - a6 = coefs[6]; - a7 = coefs[7]; - - for ( j = lim; j < num; j++ ) - { - LOOP_ALIGN - - top = in[j - lim]; - pin = in + j - 1; - - b0 = top - (*pin--); - b1 = top - (*pin--); - b2 = top - (*pin--); - b3 = top - (*pin--); - b4 = top - (*pin--); - b5 = top - (*pin--); - b6 = top - (*pin--); - b7 = top - (*pin); - pin += 8; - - sum1 = (denhalf - a0 * b0 - a1 * b1 - a2 * b2 - a3 * b3 - - a4 * b4 - a5 * b5 - a6 * b6 - a7 * b7) >> denshift; - - del = in[j] - top - sum1; - del = (del << chanshift) >> chanshift; - pc1[j] = del; - del0 = del; - - sg = sign_of_int(del); - if ( sg > 0 ) - { - sgn = sign_of_int( b7 ); - a7 -= sgn; - del0 -= 1 * ((sgn * b7) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( b6 ); - a6 -= sgn; - del0 -= 2 * ((sgn * b6) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( b5 ); - a5 -= sgn; - del0 -= 3 * ((sgn * b5) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( b4 ); - a4 -= sgn; - del0 -= 4 * ((sgn * b4) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( b3 ); - a3 -= sgn; - del0 -= 5 * ((sgn * b3) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( b2 ); - a2 -= sgn; - del0 -= 6 * ((sgn * b2) >> denshift); - if ( del0 <= 0 ) - continue; - - sgn = sign_of_int( b1 ); - a1 -= sgn; - del0 -= 7 * ((sgn * b1) >> denshift); - if ( del0 <= 0 ) - continue; - - a0 -= sign_of_int( b0 ); - } - else if ( sg < 0 ) - { - // note: to avoid unnecessary negations, we flip the value of "sgn" - sgn = -sign_of_int( b7 ); - a7 -= sgn; - del0 -= 1 * ((sgn * b7) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( b6 ); - a6 -= sgn; - del0 -= 2 * ((sgn * b6) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( b5 ); - a5 -= sgn; - del0 -= 3 * ((sgn * b5) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( b4 ); - a4 -= sgn; - del0 -= 4 * ((sgn * b4) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( b3 ); - a3 -= sgn; - del0 -= 5 * ((sgn * b3) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( b2 ); - a2 -= sgn; - del0 -= 6 * ((sgn * b2) >> denshift); - if ( del0 >= 0 ) - continue; - - sgn = -sign_of_int( b1 ); - a1 -= sgn; - del0 -= 7 * ((sgn * b1) >> denshift); - if ( del0 >= 0 ) - continue; - - a0 += sign_of_int( b0 ); - } - } - - coefs[0] = a0; - coefs[1] = a1; - coefs[2] = a2; - coefs[3] = a3; - coefs[4] = a4; - coefs[5] = a5; - coefs[6] = a6; - coefs[7] = a7; - } - else - { -//pc_block_general: - // general case - for ( j = lim; j < num; j++ ) - { - LOOP_ALIGN - - top = in[j - lim]; - pin = in + j - 1; - - sum1 = 0; - for ( k = 0; k < numactive; k++ ) - sum1 -= coefs[k] * (top - pin[-k]); - - del = in[j] - top - ((sum1 + denhalf) >> denshift); - del = (del << chanshift) >> chanshift; - pc1[j] = del; - del0 = del; - - sg = sign_of_int( del ); - if ( sg > 0 ) - { - for ( k = (numactive - 1); k >= 0; k-- ) - { - dd = top - pin[-k]; - sgn = sign_of_int( dd ); - coefs[k] -= sgn; - del0 -= (numactive - k) * ((sgn * dd) >> denshift); - if ( del0 <= 0 ) - break; - } - } - else if ( sg < 0 ) - { - for ( k = (numactive - 1); k >= 0; k-- ) - { - dd = top - pin[-k]; - sgn = sign_of_int( dd ); - coefs[k] += sgn; - del0 -= (numactive - k) * ((-sgn * dd) >> denshift); - if ( del0 >= 0 ) - break; - } - } - } - } -} diff --git a/libs/libsndfile/src/ALAC/dplib.h b/libs/libsndfile/src/ALAC/dplib.h deleted file mode 100644 index 37d3353313..0000000000 --- a/libs/libsndfile/src/ALAC/dplib.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: dplib.h - - Contains: Dynamic Predictor routines - - Copyright: Copyright (C) 2001-2011 Apple, Inc. -*/ - -#ifndef __DPLIB_H__ -#define __DPLIB_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// defines - -#define DENSHIFT_MAX 15 -#define DENSHIFT_DEFAULT 9 -#define AINIT 38 -#define BINIT (-29) -#define CINIT (-2) -#define NUMCOEPAIRS 16 - -// prototypes - -void init_coefs( int16_t * coefs, uint32_t denshift, int32_t numPairs ); -void copy_coefs( int16_t * srcCoefs, int16_t * dstCoefs, int32_t numPairs ); - -// NOTE: these routines read at least "numactive" samples so the i/o buffers must be at least that big - -void pc_block( int32_t * in, int32_t * pc, int32_t num, int16_t * coefs, int32_t numactive, uint32_t chanbits, uint32_t denshift ); -void unpc_block( int32_t * pc, int32_t * out, int32_t num, int16_t * coefs, int32_t numactive, uint32_t chanbits, uint32_t denshift ); - -#ifdef __cplusplus -} -#endif - -#endif /* __DPLIB_H__ */ diff --git a/libs/libsndfile/src/ALAC/matrix_dec.c b/libs/libsndfile/src/ALAC/matrix_dec.c deleted file mode 100644 index cb812d1d4d..0000000000 --- a/libs/libsndfile/src/ALAC/matrix_dec.c +++ /dev/null @@ -1,320 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * Copyright (C) 2012 Erik de Castro Lopo - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: matrix_dec.c - - Contains: ALAC mixing/matrixing decode routines. - - Copyright: (c) 2004-2011 Apple, Inc. -*/ - -#include "matrixlib.h" -#include "ALACAudioTypes.h" - -// up to 24-bit "offset" macros for the individual bytes of a 20/24-bit word -#if TARGET_RT_BIG_ENDIAN - #define LBYTE 2 - #define MBYTE 1 - #define HBYTE 0 -#else - #define LBYTE 0 - #define MBYTE 1 - #define HBYTE 2 -#endif - -/* - There is no plain middle-side option; instead there are various mixing - modes including middle-side, each lossless, as embodied in the mix() - and unmix() functions. These functions exploit a generalized middle-side - transformation: - - u := [(rL + (m-r)R)/m]; - v := L - R; - - where [ ] denotes integer floor. The (lossless) inverse is - - L = u + v - [rV/m]; - R = L - v; -*/ - -// 16-bit routines - -void unmix16( int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, int32_t mixbits, int32_t mixres ) -{ - int32_t j; - - if ( mixres != 0 ) - { - /* matrixed stereo */ - for ( j = 0; j < numSamples; j++ ) - { - int32_t l, r; - - l = u[j] + v[j] - ((mixres * v[j]) >> mixbits); - r = l - v[j]; - - out[0] = l << 16; - out[1] = r << 16; - out += stride; - } - } - else - { - /* Conventional separated stereo. */ - for ( j = 0; j < numSamples; j++ ) - { - out[0] = u[j] << 16; - out[1] = v[j] << 16; - out += stride; - } - } -} - -// 20-bit routines -// - the 20 bits of data are left-justified in 3 bytes of storage but right-aligned for input/output predictor buffers - -void unmix20( int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, int32_t mixbits, int32_t mixres ) -{ - int32_t j; - - if ( mixres != 0 ) - { - /* matrixed stereo */ - for ( j = 0; j < numSamples; j++ ) - { - int32_t l, r; - - l = u[j] + v[j] - ((mixres * v[j]) >> mixbits); - r = l - v[j]; - - out[0] = l << 12; - out[1] = r << 12; - out += stride; - } - } - else - { - /* Conventional separated stereo. */ - for ( j = 0; j < numSamples; j++ ) - { - out[0] = u[j] << 12; - out[1] = v[j] << 12; - out += stride; - } - } -} - -// 24-bit routines -// - the 24 bits of data are right-justified in the input/output predictor buffers - -void unmix24( int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, - int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted ) -{ - int32_t shift = bytesShifted * 8; - int32_t l, r; - int32_t j, k; - - if ( mixres != 0 ) - { - /* matrixed stereo */ - if ( bytesShifted != 0 ) - { - for ( j = 0, k = 0; j < numSamples; j++, k += 2 ) - { - l = u[j] + v[j] - ((mixres * v[j]) >> mixbits); - r = l - v[j]; - - l = (l << shift) | (uint32_t) shiftUV[k + 0]; - r = (r << shift) | (uint32_t) shiftUV[k + 1]; - - out[0] = l << 8; - out[1] = r << 8; - out += stride; - } - } - else - { - for ( j = 0; j < numSamples; j++ ) - { - l = u[j] + v[j] - ((mixres * v[j]) >> mixbits); - r = l - v[j]; - - out[0] = l << 8; - out[1] = r << 8; - out += stride; - } - } - } - else - { - /* Conventional separated stereo. */ - if ( bytesShifted != 0 ) - { - for ( j = 0, k = 0; j < numSamples; j++, k += 2 ) - { - l = u[j]; - r = v[j]; - - l = (l << shift) | (uint32_t) shiftUV[k + 0]; - r = (r << shift) | (uint32_t) shiftUV[k + 1]; - - out[0] = l << 8; - out[1] = r << 8; - out += stride; - } - } - else - { - for ( j = 0; j < numSamples; j++ ) - { - out[0] = u[j] << 8; - out[1] = v[j] << 8; - out += stride; - } - } - } -} - -// 32-bit routines -// - note that these really expect the internal data width to be < 32 but the arrays are 32-bit -// - otherwise, the calculations might overflow into the 33rd bit and be lost -// - therefore, these routines deal with the specified "unused lower" bytes in the "shift" buffers - -void unmix32( int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, - int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted ) -{ - int32_t shift = bytesShifted * 8; - int32_t l, r; - int32_t j, k; - - if ( mixres != 0 ) - { - //Assert( bytesShifted != 0 ); - - /* matrixed stereo with shift */ - for ( j = 0, k = 0; j < numSamples; j++, k += 2 ) - { - int32_t lt, rt; - - lt = u[j]; - rt = v[j]; - - l = lt + rt - ((mixres * rt) >> mixbits); - r = l - rt; - - out[0] = (l << shift) | (uint32_t) shiftUV[k + 0]; - out[1] = (r << shift) | (uint32_t) shiftUV[k + 1]; - out += stride; - } - } - else - { - if ( bytesShifted == 0 ) - { - /* interleaving w/o shift */ - for ( j = 0; j < numSamples; j++ ) - { - out[0] = u[j]; - out[1] = v[j]; - out += stride; - } - } - else - { - /* interleaving with shift */ - for ( j = 0, k = 0; j < numSamples; j++, k += 2 ) - { - out[0] = (u[j] << shift) | (uint32_t) shiftUV[k + 0]; - out[1] = (v[j] << shift) | (uint32_t) shiftUV[k + 1]; - out += stride; - } - } - } -} - -// 20/24-bit <-> 32-bit helper routines (not really matrixing but convenient to put here) - -void copyPredictorTo24( int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples ) -{ - int32_t j; - - for ( j = 0; j < numSamples; j++ ) - { - out[0] = in[j] << 8; - out += stride; - } -} - -void copyPredictorTo24Shift( int32_t * in, uint16_t * shift, int32_t * out, uint32_t stride, int32_t numSamples, int32_t bytesShifted ) -{ - int32_t shiftVal = bytesShifted * 8; - int32_t j; - - //Assert( bytesShifted != 0 ); - - for ( j = 0; j < numSamples; j++ ) - { - int32_t val = in[j]; - - val = (val << shiftVal) | (uint32_t) shift[j]; - out[0] = val << 8; - out += stride; - } -} - -void copyPredictorTo20( int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples ) -{ - int32_t j; - - // 32-bit predictor values are right-aligned but 20-bit output values should be left-aligned - // in the 24-bit output buffer - for ( j = 0; j < numSamples; j++ ) - { - out[0] = in[j] << 12; - out += stride; - } -} - -void copyPredictorTo32( int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples ) -{ - int32_t i, j; - - // this is only a subroutine to abstract the "iPod can only output 16-bit data" problem - for ( i = 0, j = 0; i < numSamples; i++, j += stride ) - out[j] = in[i] << 8; -} - -void copyPredictorTo32Shift( int32_t * in, uint16_t * shift, int32_t * out, uint32_t stride, int32_t numSamples, int32_t bytesShifted ) -{ - int32_t * op = out; - uint32_t shiftVal = bytesShifted * 8; - int32_t j; - - //Assert( bytesShifted != 0 ); - - // this is only a subroutine to abstract the "iPod can only output 16-bit data" problem - for ( j = 0; j < numSamples; j++ ) - { - op[0] = (in[j] << shiftVal) | (uint32_t) shift[j]; - op += stride; - } -} diff --git a/libs/libsndfile/src/ALAC/matrix_enc.c b/libs/libsndfile/src/ALAC/matrix_enc.c deleted file mode 100644 index 5b4d1589eb..0000000000 --- a/libs/libsndfile/src/ALAC/matrix_enc.c +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * Copyright (C) 2012 Erik de Castro Lopo - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: matrix_enc.c - - Contains: ALAC mixing/matrixing encode routines. - - Copyright: (c) 2004-2011 Apple, Inc. -*/ - -#include "matrixlib.h" -#include "ALACAudioTypes.h" - -/* - There is no plain middle-side option; instead there are various mixing - modes including middle-side, each lossless, as embodied in the mix() - and unmix() functions. These functions exploit a generalized middle-side - transformation: - - u := [(rL + (m-r)R)/m]; - v := L - R; - - where [ ] denotes integer floor. The (lossless) inverse is - - L = u + v - [rV/m]; - R = L - v; -*/ - -// 16-bit routines - -void mix16( int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, int32_t mixbits, int32_t mixres ) -{ - int32_t j; - - if ( mixres != 0 ) - { - int32_t mod = 1 << mixbits; - int32_t m2; - - /* matrixed stereo */ - m2 = mod - mixres; - for ( j = 0; j < numSamples; j++ ) - { - int32_t l, r; - - l = in[0] >> 16; - r = in[1] >> 16; - in += stride; - u[j] = (mixres * l + m2 * r) >> mixbits; - v[j] = l - r; - } - } - else - { - /* Conventional separated stereo. */ - for ( j = 0; j < numSamples; j++ ) - { - u[j] = in[0] >> 16; - v[j] = in[1] >> 16; - in += stride; - } - } -} - -// 20-bit routines -// - the 20 bits of data are left-justified in 3 bytes of storage but right-aligned for input/output predictor buffers - -void mix20( int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, int32_t mixbits, int32_t mixres ) -{ - int32_t l, r; - int32_t j; - - if ( mixres != 0 ) - { - /* matrixed stereo */ - int32_t mod = 1 << mixbits; - int32_t m2 = mod - mixres; - - for ( j = 0; j < numSamples; j++ ) - { - l = in[0] >> 12; - r = in[1] >> 12; - in += stride; - - u[j] = (mixres * l + m2 * r) >> mixbits; - v[j] = l - r; - } - } - else - { - /* Conventional separated stereo. */ - for ( j = 0; j < numSamples; j++ ) - { - u[j] = in[0] >> 12; - v[j] = in[1] >> 12; - in += stride; - } - } -} - -// 24-bit routines -// - the 24 bits of data are right-justified in the input/output predictor buffers - -void mix24( int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, - int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted ) -{ - int32_t l, r; - int32_t shift = bytesShifted * 8; - uint32_t mask = (1ul << shift) - 1; - int32_t j, k; - - if ( mixres != 0 ) - { - /* matrixed stereo */ - int32_t mod = 1 << mixbits; - int32_t m2 = mod - mixres; - - if ( bytesShifted != 0 ) - { - for ( j = 0, k = 0; j < numSamples; j++, k += 2 ) - { - l = in[0] >> 8; - r = in[1] >> 8; - in += stride; - - shiftUV[k + 0] = (uint16_t)(l & mask); - shiftUV[k + 1] = (uint16_t)(r & mask); - - l >>= shift; - r >>= shift; - - u[j] = (mixres * l + m2 * r) >> mixbits; - v[j] = l - r; - } - } - else - { - for ( j = 0; j < numSamples; j++ ) - { - l = in[0] >> 8; - r = in[1] >> 8; - in += stride; - - u[j] = (mixres * l + m2 * r) >> mixbits; - v[j] = l - r; - } - } - } - else - { - /* Conventional separated stereo. */ - if ( bytesShifted != 0 ) - { - for ( j = 0, k = 0; j < numSamples; j++, k += 2 ) - { - l = in[0] >> 8; - r = in[1] >> 8; - in += stride; - - shiftUV[k + 0] = (uint16_t)(l & mask); - shiftUV[k + 1] = (uint16_t)(r & mask); - - l >>= shift; - r >>= shift; - - u[j] = l; - v[j] = r; - } - } - else - { - for ( j = 0; j < numSamples; j++ ) - { - l = in[0] >> 8; - r = in[1] >> 8; - in += stride; - } - } - } -} - -// 32-bit routines -// - note that these really expect the internal data width to be < 32 but the arrays are 32-bit -// - otherwise, the calculations might overflow into the 33rd bit and be lost -// - therefore, these routines deal with the specified "unused lower" bytes in the "shift" buffers - -void mix32( int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, - int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted ) -{ - int32_t shift = bytesShifted * 8; - uint32_t mask = (1ul << shift) - 1; - int32_t l, r; - int32_t j, k; - - if ( mixres != 0 ) - { - int32_t mod = 1 << mixbits; - int32_t m2; - - //Assert( bytesShifted != 0 ); - - /* matrixed stereo with shift */ - m2 = mod - mixres; - for ( j = 0, k = 0; j < numSamples; j++, k += 2 ) - { - l = in[0]; - r = in[1]; - in += stride; - - shiftUV[k + 0] = (uint16_t)(l & mask); - shiftUV[k + 1] = (uint16_t)(r & mask); - - l >>= shift; - r >>= shift; - - u[j] = (mixres * l + m2 * r) >> mixbits; - v[j] = l - r; - } - } - else - { - if ( bytesShifted == 0 ) - { - /* de-interleaving w/o shift */ - for ( j = 0; j < numSamples; j++ ) - { - u[j] = in[0]; - v[j] = in[1]; - in += stride; - } - } - else - { - /* de-interleaving with shift */ - for ( j = 0, k = 0; j < numSamples; j++, k += 2 ) - { - l = in[0]; - r = in[1]; - in += stride; - - shiftUV[k + 0] = (uint16_t)(l & mask); - shiftUV[k + 1] = (uint16_t)(r & mask); - - l >>= shift; - r >>= shift; - - u[j] = l; - v[j] = r; - } - } - } -} - diff --git a/libs/libsndfile/src/ALAC/matrixlib.h b/libs/libsndfile/src/ALAC/matrixlib.h deleted file mode 100644 index d405cbcd20..0000000000 --- a/libs/libsndfile/src/ALAC/matrixlib.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2011 Apple Inc. All rights reserved. - * Copyright (C) 2012 Erik de Castro Lopo - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -/* - File: matrixlib.h - - Contains: ALAC mixing/matrixing routines to/from 32-bit predictor buffers. - - Copyright: Copyright (C) 2004 to 2011 Apple, Inc. -*/ - -#ifndef __MATRIXLIB_H -#define __MATRIXLIB_H - -#pragma once - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// 16-bit routines -void mix16( int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, int32_t mixbits, int32_t mixres ); -void unmix16( int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, int32_t mixbits, int32_t mixres ); - -// 20-bit routines -void mix20( int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, int32_t mixbits, int32_t mixres ); -void unmix20( int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, int32_t mixbits, int32_t mixres ); - -// 24-bit routines -// - 24-bit data sometimes compresses better by shifting off the bottom byte so these routines deal with -// the specified "unused lower bytes" in the combined "shift" buffer -void mix24( int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, - int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted ); -void unmix24( int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, - int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted ); - -// 32-bit routines -// - note that these really expect the internal data width to be < 32-bit but the arrays are 32-bit -// - otherwise, the calculations might overflow into the 33rd bit and be lost -// - therefore, these routines deal with the specified "unused lower" bytes in the combined "shift" buffer -void mix32( int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, - int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted ); -void unmix32( int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, - int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted ); - -// 20/24/32-bit <-> 32-bit helper routines (not really matrixing but convenient to put here) -void copy20ToPredictor( int32_t * in, uint32_t stride, int32_t * out, int32_t numSamples ); -void copy24ToPredictor( int32_t * in, uint32_t stride, int32_t * out, int32_t numSamples ); - -void copyPredictorTo24( int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples ); -void copyPredictorTo24Shift( int32_t * in, uint16_t * shift, int32_t * out, uint32_t stride, int32_t numSamples, int32_t bytesShifted ); -void copyPredictorTo20( int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples ); - -void copyPredictorTo32( int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples ); -void copyPredictorTo32Shift( int32_t * in, uint16_t * shift, int32_t * out, uint32_t stride, int32_t numSamples, int32_t bytesShifted ); - -#ifdef __cplusplus -} -#endif - -#endif /* __MATRIXLIB_H */ diff --git a/libs/libsndfile/src/G72x/ChangeLog b/libs/libsndfile/src/G72x/ChangeLog deleted file mode 100644 index aa108dff7f..0000000000 --- a/libs/libsndfile/src/G72x/ChangeLog +++ /dev/null @@ -1,50 +0,0 @@ -2001-06-05 Erik de Castro Lopo - - * g72x.c - Added {} in function update () to prevent 'ambiguous else' warning messages. - -2000-07-14 Erik de Castro Lopo - - * g72x.c - Modified g72x_init_state () to fit in with the new structure of the code. - Implemented g72x_encode_block () and g72x_decode_block (). - -2000-07-12 Erik de Castro Lopo - - * g72x.h - Moved nearly all definitions and function prototypes from this file have been - moved to private.h. - Added an enum defining the 4 different G72x ADPCM codecs. - Added new function prototypes to define a cleaner interface to the encoder - and decoder. This new interface also allows samples to be processed in blocks - rather than on a sample by sample basis like the original code. - - * private.h - Added prototypes moved from g72x.h. - Changed struct g72x_state to a typedef struct { .. } G72x_PRIVATE. - Added fields to G72x_PRIVATE required for working on blocks of samples. - -2000-06-07 Erik de Castro Lopo - - * g72x.c - Fixed all compiler warnings. - Removed functions tandem_adjust() which is not required by libsndfile. - - * g721.c - Fixed all compiler warnings. - Removed functions tandem_adjust_alaw() and tandem_adjust_ulaw () which are not - required by libsndfile. - Removed second parameter to g721_encoder () which is not required. - - * g72x.h - Removed in_coding and out_coding parameters from all functions. These allowed - g72x encoding/decoding to/from A-law or u-law and are not required by libsndfile. - Removed unneeded defines for A-law, u-law and linear encoding. - - * g723_16.c - Removed second parameter (in_coding) for g723_16_encoder(). - Removed second parameter (out_coding) for g723_16_decoder(). - - * private.h - New file containing prototypes and tyepdefs private to G72x code. - diff --git a/libs/libsndfile/src/G72x/Makefile.am b/libs/libsndfile/src/G72x/Makefile.am deleted file mode 100644 index 62a0aa112f..0000000000 --- a/libs/libsndfile/src/G72x/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -## Process this file with automake to produce Makefile.in - -EXTRA_DIST = README README.original ChangeLog - -noinst_HEADERS = g72x.h g72x_priv.h -noinst_LTLIBRARIES = libg72x.la - -noinst_PROGRAMS = g72x_test - -CFILES = g72x.c g721.c g723_16.c g723_24.c g723_40.c - -libg72x_la_SOURCES = $(CFILES) $(noinst_HEADERS) - -g72x_test_SOURCES = g72x_test.c -g72x_test_LDADD = ./libg72x.la -lm - -check: g72x_test$(EXEEXT) - ./g72x_test$(EXEEXT) all - -# Disable autoheader. -AUTOHEADER=echo - diff --git a/libs/libsndfile/src/G72x/README b/libs/libsndfile/src/G72x/README deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libs/libsndfile/src/G72x/README.original b/libs/libsndfile/src/G72x/README.original deleted file mode 100644 index 23b0e7dd50..0000000000 --- a/libs/libsndfile/src/G72x/README.original +++ /dev/null @@ -1,94 +0,0 @@ -The files in this directory comprise ANSI-C language reference implementations -of the CCITT (International Telegraph and Telephone Consultative Committee) -G.711, G.721 and G.723 voice compressions. They have been tested on Sun -SPARCstations and passed 82 out of 84 test vectors published by CCITT -(Dec. 20, 1988) for G.721 and G.723. [The two remaining test vectors, -which the G.721 decoder implementation for u-law samples did not pass, -may be in error because they are identical to two other vectors for G.723_40.] - -This source code is released by Sun Microsystems, Inc. to the public domain. -Please give your acknowledgement in product literature if this code is used -in your product implementation. - -Sun Microsystems supports some CCITT audio formats in Solaris 2.0 system -software. However, Sun's implementations have been optimized for higher -performance on SPARCstations. - - -The source files for CCITT conversion routines in this directory are: - - g72x.h header file for g721.c, g723_24.c and g723_40.c - g711.c CCITT G.711 u-law and A-law compression - g72x.c common denominator of G.721 and G.723 ADPCM codes - g721.c CCITT G.721 32Kbps ADPCM coder (with g72x.c) - g723_24.c CCITT G.723 24Kbps ADPCM coder (with g72x.c) - g723_40.c CCITT G.723 40Kbps ADPCM coder (with g72x.c) - - -Simple conversions between u-law, A-law, and 16-bit linear PCM are invoked -as follows: - - unsigned char ucode, acode; - short pcm_val; - - ucode = linear2ulaw(pcm_val); - ucode = alaw2ulaw(acode); - - acode = linear2alaw(pcm_val); - acode = ulaw2alaw(ucode); - - pcm_val = ulaw2linear(ucode); - pcm_val = alaw2linear(acode); - - -The other CCITT compression routines are invoked as follows: - - #include "g72x.h" - - struct g72x_state state; - int sample, code; - - g72x_init_state(&state); - code = {g721,g723_24,g723_40}_encoder(sample, coding, &state); - sample = {g721,g723_24,g723_40}_decoder(code, coding, &state); - -where - coding = AUDIO_ENCODING_ULAW for 8-bit u-law samples - AUDIO_ENCODING_ALAW for 8-bit A-law samples - AUDIO_ENCODING_LINEAR for 16-bit linear PCM samples - - - -This directory also includes the following sample programs: - - encode.c CCITT ADPCM encoder - decode.c CCITT ADPCM decoder - Makefile makefile for the sample programs - - -The sample programs contain examples of how to call the various compression -routines and pack/unpack the bits. The sample programs read byte streams from -stdin and write to stdout. The input/output data is raw data (no file header -or other identifying information is embedded). The sample programs are -invoked as follows: - - encode [-3|4|5] [-a|u|l] outfile - decode [-3|4|5] [-a|u|l] outfile -where: - -3 encode to (decode from) G.723 24kbps (3-bit) data - -4 encode to (decode from) G.721 32kbps (4-bit) data [the default] - -5 encode to (decode from) G.723 40kbps (5-bit) data - -a encode from (decode to) A-law data - -u encode from (decode to) u-law data [the default] - -l encode from (decode to) 16-bit linear data - -Examples: - # Read 16-bit linear and output G.721 - encode -4 -l g721file - - # Read 40Kbps G.723 and output A-law - decode -5 -a alawfile - - # Compress and then decompress u-law data using 24Kbps G.723 - encode -3 ulawout - diff --git a/libs/libsndfile/src/G72x/g721.c b/libs/libsndfile/src/G72x/g721.c deleted file mode 100644 index d305ba8f0d..0000000000 --- a/libs/libsndfile/src/G72x/g721.c +++ /dev/null @@ -1,155 +0,0 @@ -/* - * This source code is a product of Sun Microsystems, Inc. and is provided - * for unrestricted use. Users may copy or modify this source code without - * charge. - * - * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING - * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun source code is provided with no support and without any obligation on - * the part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * g721.c - * - * Description: - * - * g721_encoder(), g721_decoder() - * - * These routines comprise an implementation of the CCITT G.721 ADPCM - * coding algorithm. Essentially, this implementation is identical to - * the bit level description except for a few deviations which - * take advantage of work station attributes, such as hardware 2's - * complement arithmetic and large memory. Specifically, certain time - * consuming operations such as multiplications are replaced - * with lookup tables and software 2's complement operations are - * replaced with hardware 2's complement. - * - * The deviation from the bit level specification (lookup tables) - * preserves the bit level performance specifications. - * - * As outlined in the G.721 Recommendation, the algorithm is broken - * down into modules. Each section of code below is preceded by - * the name of the module which it is implementing. - * - */ - -#include "g72x.h" -#include "g72x_priv.h" - -static short qtab_721[7] = {-124, 80, 178, 246, 300, 349, 400}; -/* - * Maps G.721 code word to reconstructed scale factor normalized log - * magnitude values. - */ -static short _dqlntab[16] = {-2048, 4, 135, 213, 273, 323, 373, 425, - 425, 373, 323, 273, 213, 135, 4, -2048}; - -/* Maps G.721 code word to log of scale factor multiplier. */ -static short _witab[16] = {-12, 18, 41, 64, 112, 198, 355, 1122, - 1122, 355, 198, 112, 64, 41, 18, -12}; -/* - * Maps G.721 code words to a set of values whose long and short - * term averages are computed and then compared to give an indication - * how stationary (steady state) the signal is. - */ -static short _fitab[16] = {0, 0, 0, 0x200, 0x200, 0x200, 0x600, 0xE00, - 0xE00, 0x600, 0x200, 0x200, 0x200, 0, 0, 0}; - -/* - * g721_encoder() - * - * Encodes the input vale of linear PCM, A-law or u-law data sl and returns - * the resulting code. -1 is returned for unknown input coding value. - */ -int -g721_encoder( - int sl, - G72x_STATE *state_ptr) -{ - short sezi, se, sez; /* ACCUM */ - short d; /* SUBTA */ - short sr; /* ADDB */ - short y; /* MIX */ - short dqsez; /* ADDC */ - short dq, i; - - /* linearize input sample to 14-bit PCM */ - sl >>= 2; /* 14-bit dynamic range */ - - sezi = predictor_zero(state_ptr); - sez = sezi >> 1; - se = (sezi + predictor_pole(state_ptr)) >> 1; /* estimated signal */ - - d = sl - se; /* estimation difference */ - - /* quantize the prediction difference */ - y = step_size(state_ptr); /* quantizer step size */ - i = quantize(d, y, qtab_721, 7); /* i = ADPCM code */ - - dq = reconstruct(i & 8, _dqlntab[i], y); /* quantized est diff */ - - sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconst. signal */ - - dqsez = sr + sez - se; /* pole prediction diff. */ - - update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr); - - return (i); -} - -/* - * g721_decoder() - * - * Description: - * - * Decodes a 4-bit code of G.721 encoded data of i and - * returns the resulting linear PCM, A-law or u-law value. - * return -1 for unknown out_coding value. - */ -int -g721_decoder( - int i, - G72x_STATE *state_ptr) -{ - short sezi, sei, sez, se; /* ACCUM */ - short y; /* MIX */ - short sr; /* ADDB */ - short dq; - short dqsez; - - i &= 0x0f; /* mask to get proper bits */ - sezi = predictor_zero(state_ptr); - sez = sezi >> 1; - sei = sezi + predictor_pole(state_ptr); - se = sei >> 1; /* se = estimated signal */ - - y = step_size(state_ptr); /* dynamic quantizer step size */ - - dq = reconstruct(i & 0x08, _dqlntab[i], y); /* quantized diff. */ - - sr = (dq < 0) ? (se - (dq & 0x3FFF)) : se + dq; /* reconst. signal */ - - dqsez = sr - se + sez; /* pole prediction diff. */ - - update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr); - - /* sr was 14-bit dynamic range */ - return (sr << 2); -} - diff --git a/libs/libsndfile/src/G72x/g723_16.c b/libs/libsndfile/src/G72x/g723_16.c deleted file mode 100644 index ae90b6c438..0000000000 --- a/libs/libsndfile/src/G72x/g723_16.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * This source code is a product of Sun Microsystems, Inc. and is provided - * for unrestricted use. Users may copy or modify this source code without - * charge. - * - * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING - * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun source code is provided with no support and without any obligation on - * the part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -/* 16kbps version created, used 24kbps code and changing as little as possible. - * G.726 specs are available from ITU's gopher or WWW site (http://www.itu.ch) - * If any errors are found, please contact me at mrand@tamu.edu - * -Marc Randolph - */ - -/* - * g723_16.c - * - * Description: - * - * g723_16_encoder(), g723_16_decoder() - * - * These routines comprise an implementation of the CCITT G.726 16 Kbps - * ADPCM coding algorithm. Essentially, this implementation is identical to - * the bit level description except for a few deviations which take advantage - * of workstation attributes, such as hardware 2's complement arithmetic. - * - */ - -#include "g72x.h" -#include "g72x_priv.h" - -/* - * Maps G.723_16 code word to reconstructed scale factor normalized log - * magnitude values. Comes from Table 11/G.726 - */ -static short _dqlntab[4] = { 116, 365, 365, 116}; - -/* Maps G.723_16 code word to log of scale factor multiplier. - * - * _witab[4] is actually {-22 , 439, 439, -22}, but FILTD wants it - * as WI << 5 (multiplied by 32), so we'll do that here - */ -static short _witab[4] = {-704, 14048, 14048, -704}; - -/* - * Maps G.723_16 code words to a set of values whose long and short - * term averages are computed and then compared to give an indication - * how stationary (steady state) the signal is. - */ - -/* Comes from FUNCTF */ -static short _fitab[4] = {0, 0xE00, 0xE00, 0}; - -/* Comes from quantizer decision level tables (Table 7/G.726) - */ -static short qtab_723_16[1] = {261}; - - -/* - * g723_16_encoder() - * - * Encodes a linear PCM, A-law or u-law input sample and returns its 2-bit code. - * Returns -1 if invalid input coding value. - */ -int -g723_16_encoder( - int sl, - G72x_STATE *state_ptr) -{ - short sei, sezi, se, sez; /* ACCUM */ - short d; /* SUBTA */ - short y; /* MIX */ - short sr; /* ADDB */ - short dqsez; /* ADDC */ - short dq, i; - - /* linearize input sample to 14-bit PCM */ - sl >>= 2; /* sl of 14-bit dynamic range */ - - sezi = predictor_zero(state_ptr); - sez = sezi >> 1; - sei = sezi + predictor_pole(state_ptr); - se = sei >> 1; /* se = estimated signal */ - - d = sl - se; /* d = estimation diff. */ - - /* quantize prediction difference d */ - y = step_size(state_ptr); /* quantizer step size */ - i = quantize(d, y, qtab_723_16, 1); /* i = ADPCM code */ - - /* Since quantize() only produces a three level output - * (1, 2, or 3), we must create the fourth one on our own - */ - if (i == 3) /* i code for the zero region */ - if ((d & 0x8000) == 0) /* If d > 0, i=3 isn't right... */ - i = 0; - - dq = reconstruct(i & 2, _dqlntab[i], y); /* quantized diff. */ - - sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconstructed signal */ - - dqsez = sr + sez - se; /* pole prediction diff. */ - - update(2, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr); - - return (i); -} - -/* - * g723_16_decoder() - * - * Decodes a 2-bit CCITT G.723_16 ADPCM code and returns - * the resulting 16-bit linear PCM, A-law or u-law sample value. - * -1 is returned if the output coding is unknown. - */ -int -g723_16_decoder( - int i, - G72x_STATE *state_ptr) -{ - short sezi, sei, sez, se; /* ACCUM */ - short y; /* MIX */ - short sr; /* ADDB */ - short dq; - short dqsez; - - i &= 0x03; /* mask to get proper bits */ - sezi = predictor_zero(state_ptr); - sez = sezi >> 1; - sei = sezi + predictor_pole(state_ptr); - se = sei >> 1; /* se = estimated signal */ - - y = step_size(state_ptr); /* adaptive quantizer step size */ - dq = reconstruct(i & 0x02, _dqlntab[i], y); /* unquantize pred diff */ - - sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* reconst. signal */ - - dqsez = sr - se + sez; /* pole prediction diff. */ - - update(2, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr); - - /* sr was of 14-bit dynamic range */ - return (sr << 2); -} - diff --git a/libs/libsndfile/src/G72x/g723_24.c b/libs/libsndfile/src/G72x/g723_24.c deleted file mode 100644 index 02b6c24a05..0000000000 --- a/libs/libsndfile/src/G72x/g723_24.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * This source code is a product of Sun Microsystems, Inc. and is provided - * for unrestricted use. Users may copy or modify this source code without - * charge. - * - * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING - * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun source code is provided with no support and without any obligation on - * the part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * g723_24.c - * - * Description: - * - * g723_24_encoder(), g723_24_decoder() - * - * These routines comprise an implementation of the CCITT G.723 24 Kbps - * ADPCM coding algorithm. Essentially, this implementation is identical to - * the bit level description except for a few deviations which take advantage - * of workstation attributes, such as hardware 2's complement arithmetic. - * - */ - -#include "g72x.h" -#include "g72x_priv.h" - -/* - * Maps G.723_24 code word to reconstructed scale factor normalized log - * magnitude values. - */ -static short _dqlntab[8] = {-2048, 135, 273, 373, 373, 273, 135, -2048}; - -/* Maps G.723_24 code word to log of scale factor multiplier. */ -static short _witab[8] = {-128, 960, 4384, 18624, 18624, 4384, 960, -128}; - -/* - * Maps G.723_24 code words to a set of values whose long and short - * term averages are computed and then compared to give an indication - * how stationary (steady state) the signal is. - */ -static short _fitab[8] = {0, 0x200, 0x400, 0xE00, 0xE00, 0x400, 0x200, 0}; - -static short qtab_723_24[3] = {8, 218, 331}; - -/* - * g723_24_encoder() - * - * Encodes a linear PCM, A-law or u-law input sample and returns its 3-bit code. - * Returns -1 if invalid input coding value. - */ -int -g723_24_encoder( - int sl, - G72x_STATE *state_ptr) -{ - short sei, sezi, se, sez; /* ACCUM */ - short d; /* SUBTA */ - short y; /* MIX */ - short sr; /* ADDB */ - short dqsez; /* ADDC */ - short dq, i; - - /* linearize input sample to 14-bit PCM */ - sl >>= 2; /* sl of 14-bit dynamic range */ - - sezi = predictor_zero(state_ptr); - sez = sezi >> 1; - sei = sezi + predictor_pole(state_ptr); - se = sei >> 1; /* se = estimated signal */ - - d = sl - se; /* d = estimation diff. */ - - /* quantize prediction difference d */ - y = step_size(state_ptr); /* quantizer step size */ - i = quantize(d, y, qtab_723_24, 3); /* i = ADPCM code */ - dq = reconstruct(i & 4, _dqlntab[i], y); /* quantized diff. */ - - sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconstructed signal */ - - dqsez = sr + sez - se; /* pole prediction diff. */ - - update(3, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr); - - return (i); -} - -/* - * g723_24_decoder() - * - * Decodes a 3-bit CCITT G.723_24 ADPCM code and returns - * the resulting 16-bit linear PCM, A-law or u-law sample value. - * -1 is returned if the output coding is unknown. - */ -int -g723_24_decoder( - int i, - G72x_STATE *state_ptr) -{ - short sezi, sei, sez, se; /* ACCUM */ - short y; /* MIX */ - short sr; /* ADDB */ - short dq; - short dqsez; - - i &= 0x07; /* mask to get proper bits */ - sezi = predictor_zero(state_ptr); - sez = sezi >> 1; - sei = sezi + predictor_pole(state_ptr); - se = sei >> 1; /* se = estimated signal */ - - y = step_size(state_ptr); /* adaptive quantizer step size */ - dq = reconstruct(i & 0x04, _dqlntab[i], y); /* unquantize pred diff */ - - sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* reconst. signal */ - - dqsez = sr - se + sez; /* pole prediction diff. */ - - update(3, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr); - - return (sr << 2); /* sr was of 14-bit dynamic range */ -} - diff --git a/libs/libsndfile/src/G72x/g723_40.c b/libs/libsndfile/src/G72x/g723_40.c deleted file mode 100644 index d520395340..0000000000 --- a/libs/libsndfile/src/G72x/g723_40.c +++ /dev/null @@ -1,153 +0,0 @@ -/* - * This source code is a product of Sun Microsystems, Inc. and is provided - * for unrestricted use. Users may copy or modify this source code without - * charge. - * - * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING - * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun source code is provided with no support and without any obligation on - * the part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * g723_40.c - * - * Description: - * - * g723_40_encoder(), g723_40_decoder() - * - * These routines comprise an implementation of the CCITT G.723 40Kbps - * ADPCM coding algorithm. Essentially, this implementation is identical to - * the bit level description except for a few deviations which - * take advantage of workstation attributes, such as hardware 2's - * complement arithmetic. - * - * The deviation from the bit level specification (lookup tables), - * preserves the bit level performance specifications. - * - * As outlined in the G.723 Recommendation, the algorithm is broken - * down into modules. Each section of code below is preceded by - * the name of the module which it is implementing. - * - */ - -#include "g72x.h" -#include "g72x_priv.h" - -/* - * Maps G.723_40 code word to ructeconstructed scale factor normalized log - * magnitude values. - */ -static short _dqlntab[32] = {-2048, -66, 28, 104, 169, 224, 274, 318, - 358, 395, 429, 459, 488, 514, 539, 566, - 566, 539, 514, 488, 459, 429, 395, 358, - 318, 274, 224, 169, 104, 28, -66, -2048}; - -/* Maps G.723_40 code word to log of scale factor multiplier. */ -static short _witab[32] = {448, 448, 768, 1248, 1280, 1312, 1856, 3200, - 4512, 5728, 7008, 8960, 11456, 14080, 16928, 22272, - 22272, 16928, 14080, 11456, 8960, 7008, 5728, 4512, - 3200, 1856, 1312, 1280, 1248, 768, 448, 448}; - -/* - * Maps G.723_40 code words to a set of values whose long and short - * term averages are computed and then compared to give an indication - * how stationary (steady state) the signal is. - */ -static short _fitab[32] = {0, 0, 0, 0, 0, 0x200, 0x200, 0x200, - 0x200, 0x200, 0x400, 0x600, 0x800, 0xA00, 0xC00, 0xC00, - 0xC00, 0xC00, 0xA00, 0x800, 0x600, 0x400, 0x200, 0x200, - 0x200, 0x200, 0x200, 0, 0, 0, 0, 0}; - -static short qtab_723_40[15] = {-122, -16, 68, 139, 198, 250, 298, 339, - 378, 413, 445, 475, 502, 528, 553}; - -/* - * g723_40_encoder() - * - * Encodes a 16-bit linear PCM, A-law or u-law input sample and retuens - * the resulting 5-bit CCITT G.723 40Kbps code. - * Returns -1 if the input coding value is invalid. - */ -int g723_40_encoder (int sl, G72x_STATE *state_ptr) -{ - short sei, sezi, se, sez; /* ACCUM */ - short d; /* SUBTA */ - short y; /* MIX */ - short sr; /* ADDB */ - short dqsez; /* ADDC */ - short dq, i; - - /* linearize input sample to 14-bit PCM */ - sl >>= 2; /* sl of 14-bit dynamic range */ - - sezi = predictor_zero(state_ptr); - sez = sezi >> 1; - sei = sezi + predictor_pole(state_ptr); - se = sei >> 1; /* se = estimated signal */ - - d = sl - se; /* d = estimation difference */ - - /* quantize prediction difference */ - y = step_size(state_ptr); /* adaptive quantizer step size */ - i = quantize(d, y, qtab_723_40, 15); /* i = ADPCM code */ - - dq = reconstruct(i & 0x10, _dqlntab[i], y); /* quantized diff */ - - sr = (dq < 0) ? se - (dq & 0x7FFF) : se + dq; /* reconstructed signal */ - - dqsez = sr + sez - se; /* dqsez = pole prediction diff. */ - - update(5, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr); - - return (i); -} - -/* - * g723_40_decoder() - * - * Decodes a 5-bit CCITT G.723 40Kbps code and returns - * the resulting 16-bit linear PCM, A-law or u-law sample value. - * -1 is returned if the output coding is unknown. - */ -int g723_40_decoder (int i, G72x_STATE *state_ptr) -{ - short sezi, sei, sez, se; /* ACCUM */ - short y ; /* MIX */ - short sr; /* ADDB */ - short dq; - short dqsez; - - i &= 0x1f; /* mask to get proper bits */ - sezi = predictor_zero(state_ptr); - sez = sezi >> 1; - sei = sezi + predictor_pole(state_ptr); - se = sei >> 1; /* se = estimated signal */ - - y = step_size(state_ptr); /* adaptive quantizer step size */ - dq = reconstruct(i & 0x10, _dqlntab[i], y); /* estimation diff. */ - - sr = (dq < 0) ? (se - (dq & 0x7FFF)) : (se + dq); /* reconst. signal */ - - dqsez = sr - se + sez; /* pole prediction diff. */ - - update(5, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr); - - return (sr << 2); /* sr was of 14-bit dynamic range */ -} - diff --git a/libs/libsndfile/src/G72x/g72x.c b/libs/libsndfile/src/G72x/g72x.c deleted file mode 100644 index 3fae81aa8e..0000000000 --- a/libs/libsndfile/src/G72x/g72x.c +++ /dev/null @@ -1,644 +0,0 @@ -/* - * This source code is a product of Sun Microsystems, Inc. and is provided - * for unrestricted use. Users may copy or modify this source code without - * charge. - * - * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING - * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun source code is provided with no support and without any obligation on - * the part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * g72x.c - * - * Common routines for G.721 and G.723 conversions. - */ - -#include -#include -#include - -#include "g72x.h" -#include "g72x_priv.h" - -static G72x_STATE * g72x_state_new (void) ; -static int unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samples) ; -static int pack_bytes (int bits, const short * samples, unsigned char * block) ; - -static -short power2 [15] = -{ 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80, - 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000 -} ; - -/* - * quan() - * - * quantizes the input val against the table of size short integers. - * It returns i if table[i - 1] <= val < table[i]. - * - * Using linear search for simple coding. - */ -static -int quan (int val, short *table, int size) -{ - int i; - - for (i = 0; i < size; i++) - if (val < *table++) - break; - return (i); -} - -/* - * fmult() - * - * returns the integer product of the 14-bit integer "an" and - * "floating point" representation (4-bit exponent, 6-bit mantessa) "srn". - */ -static -int fmult (int an, int srn) -{ - short anmag, anexp, anmant; - short wanexp, wanmant; - short retval; - - anmag = (an > 0) ? an : ((-an) & 0x1FFF); - anexp = quan(anmag, power2, 15) - 6; - anmant = (anmag == 0) ? 32 : - (anexp >= 0) ? anmag >> anexp : anmag << -anexp; - wanexp = anexp + ((srn >> 6) & 0xF) - 13; - - /* - ** The original was : - ** wanmant = (anmant * (srn & 0x3F) + 0x30) >> 4 ; - ** but could see no valid reason for the + 0x30. - ** Removed it and it improved the SNR of the codec. - */ - - wanmant = (anmant * (srn & 0x3F)) >> 4 ; - - retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) : - (wanmant >> -wanexp); - - return (((an ^ srn) < 0) ? -retval : retval); -} - -static G72x_STATE * g72x_state_new (void) -{ return calloc (1, sizeof (G72x_STATE)) ; -} - -/* - * private_init_state() - * - * This routine initializes and/or resets the G72x_PRIVATE structure - * pointed to by 'state_ptr'. - * All the initial state values are specified in the CCITT G.721 document. - */ -void private_init_state (G72x_STATE *state_ptr) -{ - int cnta; - - state_ptr->yl = 34816; - state_ptr->yu = 544; - state_ptr->dms = 0; - state_ptr->dml = 0; - state_ptr->ap = 0; - for (cnta = 0; cnta < 2; cnta++) { - state_ptr->a[cnta] = 0; - state_ptr->pk[cnta] = 0; - state_ptr->sr[cnta] = 32; - } - for (cnta = 0; cnta < 6; cnta++) { - state_ptr->b[cnta] = 0; - state_ptr->dq[cnta] = 32; - } - state_ptr->td = 0; -} /* private_init_state */ - -struct g72x_state * g72x_reader_init (int codec, int *blocksize, int *samplesperblock) -{ G72x_STATE *pstate ; - - if ((pstate = g72x_state_new ()) == NULL) - return NULL ; - - private_init_state (pstate) ; - - pstate->encoder = NULL ; - - switch (codec) - { case G723_16_BITS_PER_SAMPLE : /* 2 bits per sample. */ - pstate->decoder = g723_16_decoder ; - *blocksize = G723_16_BYTES_PER_BLOCK ; - *samplesperblock = G723_16_SAMPLES_PER_BLOCK ; - pstate->codec_bits = 2 ; - pstate->blocksize = G723_16_BYTES_PER_BLOCK ; - pstate->samplesperblock = G723_16_SAMPLES_PER_BLOCK ; - break ; - - case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */ - pstate->decoder = g723_24_decoder ; - *blocksize = G723_24_BYTES_PER_BLOCK ; - *samplesperblock = G723_24_SAMPLES_PER_BLOCK ; - pstate->codec_bits = 3 ; - pstate->blocksize = G723_24_BYTES_PER_BLOCK ; - pstate->samplesperblock = G723_24_SAMPLES_PER_BLOCK ; - break ; - - case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */ - pstate->decoder = g721_decoder ; - *blocksize = G721_32_BYTES_PER_BLOCK ; - *samplesperblock = G721_32_SAMPLES_PER_BLOCK ; - pstate->codec_bits = 4 ; - pstate->blocksize = G721_32_BYTES_PER_BLOCK ; - pstate->samplesperblock = G721_32_SAMPLES_PER_BLOCK ; - break ; - - case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */ - pstate->decoder = g723_40_decoder ; - *blocksize = G721_40_BYTES_PER_BLOCK ; - *samplesperblock = G721_40_SAMPLES_PER_BLOCK ; - pstate->codec_bits = 5 ; - pstate->blocksize = G721_40_BYTES_PER_BLOCK ; - pstate->samplesperblock = G721_40_SAMPLES_PER_BLOCK ; - break ; - - default : - free (pstate) ; - return NULL ; - } ; - - return pstate ; -} /* g72x_reader_init */ - -struct g72x_state * g72x_writer_init (int codec, int *blocksize, int *samplesperblock) -{ G72x_STATE *pstate ; - - if ((pstate = g72x_state_new ()) == NULL) - return NULL ; - - private_init_state (pstate) ; - pstate->decoder = NULL ; - - switch (codec) - { case G723_16_BITS_PER_SAMPLE : /* 2 bits per sample. */ - pstate->encoder = g723_16_encoder ; - *blocksize = G723_16_BYTES_PER_BLOCK ; - *samplesperblock = G723_16_SAMPLES_PER_BLOCK ; - pstate->codec_bits = 2 ; - pstate->blocksize = G723_16_BYTES_PER_BLOCK ; - pstate->samplesperblock = G723_16_SAMPLES_PER_BLOCK ; - break ; - - case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */ - pstate->encoder = g723_24_encoder ; - *blocksize = G723_24_BYTES_PER_BLOCK ; - *samplesperblock = G723_24_SAMPLES_PER_BLOCK ; - pstate->codec_bits = 3 ; - pstate->blocksize = G723_24_BYTES_PER_BLOCK ; - pstate->samplesperblock = G723_24_SAMPLES_PER_BLOCK ; - break ; - - case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */ - pstate->encoder = g721_encoder ; - *blocksize = G721_32_BYTES_PER_BLOCK ; - *samplesperblock = G721_32_SAMPLES_PER_BLOCK ; - pstate->codec_bits = 4 ; - pstate->blocksize = G721_32_BYTES_PER_BLOCK ; - pstate->samplesperblock = G721_32_SAMPLES_PER_BLOCK ; - break ; - - case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */ - pstate->encoder = g723_40_encoder ; - *blocksize = G721_40_BYTES_PER_BLOCK ; - *samplesperblock = G721_40_SAMPLES_PER_BLOCK ; - pstate->codec_bits = 5 ; - pstate->blocksize = G721_40_BYTES_PER_BLOCK ; - pstate->samplesperblock = G721_40_SAMPLES_PER_BLOCK ; - break ; - - default : - free (pstate) ; - return NULL ; - } ; - - return pstate ; -} /* g72x_writer_init */ - -int g72x_decode_block (G72x_STATE *pstate, const unsigned char *block, short *samples) -{ int k, count ; - - count = unpack_bytes (pstate->codec_bits, pstate->blocksize, block, samples) ; - - for (k = 0 ; k < count ; k++) - samples [k] = pstate->decoder (samples [k], pstate) ; - - return 0 ; -} /* g72x_decode_block */ - -int g72x_encode_block (G72x_STATE *pstate, short *samples, unsigned char *block) -{ int k, count ; - - for (k = 0 ; k < pstate->samplesperblock ; k++) - samples [k] = pstate->encoder (samples [k], pstate) ; - - count = pack_bytes (pstate->codec_bits, samples, block) ; - - return count ; -} /* g72x_encode_block */ - -/* - * predictor_zero() - * - * computes the estimated signal from 6-zero predictor. - * - */ -int predictor_zero (G72x_STATE *state_ptr) -{ - int i; - int sezi; - - sezi = fmult(state_ptr->b[0] >> 2, state_ptr->dq[0]); - for (i = 1; i < 6; i++) /* ACCUM */ - sezi += fmult(state_ptr->b[i] >> 2, state_ptr->dq[i]); - return (sezi); -} -/* - * predictor_pole() - * - * computes the estimated signal from 2-pole predictor. - * - */ -int predictor_pole(G72x_STATE *state_ptr) -{ - return (fmult(state_ptr->a[1] >> 2, state_ptr->sr[1]) + - fmult(state_ptr->a[0] >> 2, state_ptr->sr[0])); -} -/* - * step_size() - * - * computes the quantization step size of the adaptive quantizer. - * - */ -int step_size (G72x_STATE *state_ptr) -{ - int y; - int dif; - int al; - - if (state_ptr->ap >= 256) - return (state_ptr->yu); - else { - y = state_ptr->yl >> 6; - dif = state_ptr->yu - y; - al = state_ptr->ap >> 2; - if (dif > 0) - y += (dif * al) >> 6; - else if (dif < 0) - y += (dif * al + 0x3F) >> 6; - return (y); - } -} - -/* - * quantize() - * - * Given a raw sample, 'd', of the difference signal and a - * quantization step size scale factor, 'y', this routine returns the - * ADPCM codeword to which that sample gets quantized. The step - * size scale factor division operation is done in the log base 2 domain - * as a subtraction. - */ -int quantize( - int d, /* Raw difference signal sample */ - int y, /* Step size multiplier */ - short *table, /* quantization table */ - int size) /* table size of short integers */ -{ - short dqm; /* Magnitude of 'd' */ - short expon; /* Integer part of base 2 log of 'd' */ - short mant; /* Fractional part of base 2 log */ - short dl; /* Log of magnitude of 'd' */ - short dln; /* Step size scale factor normalized log */ - int i; - - /* - * LOG - * - * Compute base 2 log of 'd', and store in 'dl'. - */ - dqm = abs(d); - expon = quan(dqm >> 1, power2, 15); - mant = ((dqm << 7) >> expon) & 0x7F; /* Fractional portion. */ - dl = (expon << 7) + mant; - - /* - * SUBTB - * - * "Divide" by step size multiplier. - */ - dln = dl - (y >> 2); - - /* - * QUAN - * - * Obtain codword i for 'd'. - */ - i = quan(dln, table, size); - if (d < 0) /* take 1's complement of i */ - return ((size << 1) + 1 - i); - else if (i == 0) /* take 1's complement of 0 */ - return ((size << 1) + 1); /* new in 1988 */ - else - return (i); -} -/* - * reconstruct() - * - * Returns reconstructed difference signal 'dq' obtained from - * codeword 'i' and quantization step size scale factor 'y'. - * Multiplication is performed in log base 2 domain as addition. - */ -int -reconstruct( - int sign, /* 0 for non-negative value */ - int dqln, /* G.72x codeword */ - int y) /* Step size multiplier */ -{ - short dql; /* Log of 'dq' magnitude */ - short dex; /* Integer part of log */ - short dqt; - short dq; /* Reconstructed difference signal sample */ - - dql = dqln + (y >> 2); /* ADDA */ - - if (dql < 0) { - return ((sign) ? -0x8000 : 0); - } else { /* ANTILOG */ - dex = (dql >> 7) & 15; - dqt = 128 + (dql & 127); - dq = (dqt << 7) >> (14 - dex); - return ((sign) ? (dq - 0x8000) : dq); - } -} - - -/* - * update() - * - * updates the state variables for each output code - */ -void -update( - int code_size, /* distinguish 723_40 with others */ - int y, /* quantizer step size */ - int wi, /* scale factor multiplier */ - int fi, /* for long/short term energies */ - int dq, /* quantized prediction difference */ - int sr, /* reconstructed signal */ - int dqsez, /* difference from 2-pole predictor */ - G72x_STATE *state_ptr) /* coder state pointer */ -{ - int cnt; - short mag, expon; /* Adaptive predictor, FLOAT A */ - short a2p = 0; /* LIMC */ - short a1ul; /* UPA1 */ - short pks1; /* UPA2 */ - short fa1; - char tr; /* tone/transition detector */ - short ylint, thr2, dqthr; - short ylfrac, thr1; - short pk0; - - pk0 = (dqsez < 0) ? 1 : 0; /* needed in updating predictor poles */ - - mag = dq & 0x7FFF; /* prediction difference magnitude */ - /* TRANS */ - ylint = state_ptr->yl >> 15; /* exponent part of yl */ - ylfrac = (state_ptr->yl >> 10) & 0x1F; /* fractional part of yl */ - thr1 = (32 + ylfrac) << ylint; /* threshold */ - thr2 = (ylint > 9) ? 31 << 10 : thr1; /* limit thr2 to 31 << 10 */ - dqthr = (thr2 + (thr2 >> 1)) >> 1; /* dqthr = 0.75 * thr2 */ - if (state_ptr->td == 0) /* signal supposed voice */ - tr = 0; - else if (mag <= dqthr) /* supposed data, but small mag */ - tr = 0; /* treated as voice */ - else /* signal is data (modem) */ - tr = 1; - - /* - * Quantizer scale factor adaptation. - */ - - /* FUNCTW & FILTD & DELAY */ - /* update non-steady state step size multiplier */ - state_ptr->yu = y + ((wi - y) >> 5); - - /* LIMB */ - if (state_ptr->yu < 544) /* 544 <= yu <= 5120 */ - state_ptr->yu = 544; - else if (state_ptr->yu > 5120) - state_ptr->yu = 5120; - - /* FILTE & DELAY */ - /* update steady state step size multiplier */ - state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6); - - /* - * Adaptive predictor coefficients. - */ - if (tr == 1) { /* reset a's and b's for modem signal */ - state_ptr->a[0] = 0; - state_ptr->a[1] = 0; - state_ptr->b[0] = 0; - state_ptr->b[1] = 0; - state_ptr->b[2] = 0; - state_ptr->b[3] = 0; - state_ptr->b[4] = 0; - state_ptr->b[5] = 0; - } else { /* update a's and b's */ - pks1 = pk0 ^ state_ptr->pk[0]; /* UPA2 */ - - /* update predictor pole a[1] */ - a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7); - if (dqsez != 0) { - fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0]; - if (fa1 < -8191) /* a2p = function of fa1 */ - a2p -= 0x100; - else if (fa1 > 8191) - a2p += 0xFF; - else - a2p += fa1 >> 5; - - if (pk0 ^ state_ptr->pk[1]) - { /* LIMC */ - if (a2p <= -12160) - a2p = -12288; - else if (a2p >= 12416) - a2p = 12288; - else - a2p -= 0x80; - } - else if (a2p <= -12416) - a2p = -12288; - else if (a2p >= 12160) - a2p = 12288; - else - a2p += 0x80; - } - - /* TRIGB & DELAY */ - state_ptr->a[1] = a2p; - - /* UPA1 */ - /* update predictor pole a[0] */ - state_ptr->a[0] -= state_ptr->a[0] >> 8; - if (dqsez != 0) - { if (pks1 == 0) - state_ptr->a[0] += 192; - else - state_ptr->a[0] -= 192; - } ; - - /* LIMD */ - a1ul = 15360 - a2p; - if (state_ptr->a[0] < -a1ul) - state_ptr->a[0] = -a1ul; - else if (state_ptr->a[0] > a1ul) - state_ptr->a[0] = a1ul; - - /* UPB : update predictor zeros b[6] */ - for (cnt = 0; cnt < 6; cnt++) { - if (code_size == 5) /* for 40Kbps G.723 */ - state_ptr->b[cnt] -= state_ptr->b[cnt] >> 9; - else /* for G.721 and 24Kbps G.723 */ - state_ptr->b[cnt] -= state_ptr->b[cnt] >> 8; - if (dq & 0x7FFF) { /* XOR */ - if ((dq ^ state_ptr->dq[cnt]) >= 0) - state_ptr->b[cnt] += 128; - else - state_ptr->b[cnt] -= 128; - } - } - } - - for (cnt = 5; cnt > 0; cnt--) - state_ptr->dq[cnt] = state_ptr->dq[cnt-1]; - /* FLOAT A : convert dq[0] to 4-bit exp, 6-bit mantissa f.p. */ - if (mag == 0) { - state_ptr->dq[0] = (dq >= 0) ? 0x20 : 0xFC20; - } else { - expon = quan(mag, power2, 15); - state_ptr->dq[0] = (dq >= 0) ? - (expon << 6) + ((mag << 6) >> expon) : - (expon << 6) + ((mag << 6) >> expon) - 0x400; - } - - state_ptr->sr[1] = state_ptr->sr[0]; - /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */ - if (sr == 0) { - state_ptr->sr[0] = 0x20; - } else if (sr > 0) { - expon = quan(sr, power2, 15); - state_ptr->sr[0] = (expon << 6) + ((sr << 6) >> expon); - } else if (sr > -32768) { - mag = -sr; - expon = quan(mag, power2, 15); - state_ptr->sr[0] = (expon << 6) + ((mag << 6) >> expon) - 0x400; - } else - state_ptr->sr[0] = (short) 0xFC20; - - /* DELAY A */ - state_ptr->pk[1] = state_ptr->pk[0]; - state_ptr->pk[0] = pk0; - - /* TONE */ - if (tr == 1) /* this sample has been treated as data */ - state_ptr->td = 0; /* next one will be treated as voice */ - else if (a2p < -11776) /* small sample-to-sample correlation */ - state_ptr->td = 1; /* signal may be data */ - else /* signal is voice */ - state_ptr->td = 0; - - /* - * Adaptation speed control. - */ - state_ptr->dms += (fi - state_ptr->dms) >> 5; /* FILTA */ - state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7); /* FILTB */ - - if (tr == 1) - state_ptr->ap = 256; - else if (y < 1536) /* SUBTC */ - state_ptr->ap += (0x200 - state_ptr->ap) >> 4; - else if (state_ptr->td == 1) - state_ptr->ap += (0x200 - state_ptr->ap) >> 4; - else if (abs((state_ptr->dms << 2) - state_ptr->dml) >= - (state_ptr->dml >> 3)) - state_ptr->ap += (0x200 - state_ptr->ap) >> 4; - else - state_ptr->ap += (-state_ptr->ap) >> 4; - - return ; -} /* update */ - -/*------------------------------------------------------------------------------ -*/ - -static int -unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samples) -{ unsigned int in_buffer = 0 ; - unsigned char in_byte ; - int k, in_bits = 0, bindex = 0 ; - - for (k = 0 ; bindex <= blocksize && k < G72x_BLOCK_SIZE ; k++) - { if (in_bits < bits) - { in_byte = block [bindex++] ; - - in_buffer |= (in_byte << in_bits); - in_bits += 8; - } - samples [k] = in_buffer & ((1 << bits) - 1); - in_buffer >>= bits; - in_bits -= bits; - } ; - - return k ; -} /* unpack_bytes */ - -static int -pack_bytes (int bits, const short * samples, unsigned char * block) -{ - unsigned int out_buffer = 0 ; - int k, bindex = 0, out_bits = 0 ; - unsigned char out_byte ; - - for (k = 0 ; k < G72x_BLOCK_SIZE ; k++) - { out_buffer |= (samples [k] << out_bits) ; - out_bits += bits ; - if (out_bits >= 8) - { out_byte = out_buffer & 0xFF ; - out_bits -= 8 ; - out_buffer >>= 8 ; - block [bindex++] = out_byte ; - } - } ; - - return bindex ; -} /* pack_bytes */ - diff --git a/libs/libsndfile/src/G72x/g72x.h b/libs/libsndfile/src/G72x/g72x.h deleted file mode 100644 index d7631e6d8e..0000000000 --- a/libs/libsndfile/src/G72x/g72x.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -** Copyright (C) 1999-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* -** This file is not the same as the original file from Sun Microsystems. Nearly -** all the original definitions and function prototypes that were in the file -** of this name have been moved to g72x_priv.h. -*/ - -#ifndef G72X_HEADER_FILE -#define G72X_HEADER_FILE - -/* -** Number of samples per block to process. -** Must be a common multiple of possible bits per sample : 2, 3, 4, 5 and 8. -*/ -#define G72x_BLOCK_SIZE (3 * 5 * 8) - -/* -** Identifiers for the differing kinds of G72x ADPCM codecs. -** The identifiers also define the number of encoded bits per sample. -*/ - -enum -{ G723_16_BITS_PER_SAMPLE = 2, - G723_24_BITS_PER_SAMPLE = 3, - G723_40_BITS_PER_SAMPLE = 5, - - G721_32_BITS_PER_SAMPLE = 4, - G721_40_BITS_PER_SAMPLE = 5, - - G723_16_SAMPLES_PER_BLOCK = G72x_BLOCK_SIZE, - G723_24_SAMPLES_PER_BLOCK = G723_24_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G723_24_BITS_PER_SAMPLE), - G723_40_SAMPLES_PER_BLOCK = G723_40_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G723_40_BITS_PER_SAMPLE), - - G721_32_SAMPLES_PER_BLOCK = G72x_BLOCK_SIZE, - G721_40_SAMPLES_PER_BLOCK = G721_40_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G721_40_BITS_PER_SAMPLE), - - G723_16_BYTES_PER_BLOCK = (G723_16_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8, - G723_24_BYTES_PER_BLOCK = (G723_24_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8, - G723_40_BYTES_PER_BLOCK = (G723_40_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8, - - G721_32_BYTES_PER_BLOCK = (G721_32_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8, - G721_40_BYTES_PER_BLOCK = (G721_40_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8 -} ; - -/* Forward declaration of of g72x_state. */ - -struct g72x_state ; - -/* External function definitions. */ - -struct g72x_state * g72x_reader_init (int codec, int *blocksize, int *samplesperblock) ; -struct g72x_state * g72x_writer_init (int codec, int *blocksize, int *samplesperblock) ; -/* -** Initialize the ADPCM state table for the given codec. -** Return 0 on success, 1 on fail. -*/ - -int g72x_decode_block (struct g72x_state *pstate, const unsigned char *block, short *samples) ; -/* -** The caller fills data->block with data->bytes bytes before calling the -** function. The value data->bytes must be an integer multiple of -** data->blocksize and be <= data->max_bytes. -** When it returns, the caller can read out data->samples samples. -*/ - -int g72x_encode_block (struct g72x_state *pstate, short *samples, unsigned char *block) ; -/* -** The caller fills state->samples some integer multiple data->samples_per_block -** (up to G72x_BLOCK_SIZE) samples before calling the function. -** When it returns, the caller can read out bytes encoded bytes. -*/ - -#endif /* !G72X_HEADER_FILE */ - diff --git a/libs/libsndfile/src/G72x/g72x_priv.h b/libs/libsndfile/src/G72x/g72x_priv.h deleted file mode 100644 index 867c64b385..0000000000 --- a/libs/libsndfile/src/G72x/g72x_priv.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * This source code is a product of Sun Microsystems, Inc. and is provided - * for unrestricted use. Users may copy or modify this source code without - * charge. - * - * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING - * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun source code is provided with no support and without any obligation on - * the part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -#ifndef G72X_PRIVATE_H -#define G72X_PRIVATE_H - -#ifdef __cplusplus -#error "This code is not designed to be compiled with a C++ compiler." -#endif - -/* -** The following is the definition of the state structure used by the -** G.721/G.723 encoder and decoder to preserve their internal state -** between successive calls. The meanings of the majority of the state -** structure fields are explained in detail in the CCITT Recommendation -** G.721. The field names are essentially identical to variable names -** in the bit level description of the coding algorithm included in this -** Recommendation. -*/ - -struct g72x_state -{ long yl; /* Locked or steady state step size multiplier. */ - short yu; /* Unlocked or non-steady state step size multiplier. */ - short dms; /* Short term energy estimate. */ - short dml; /* Long term energy estimate. */ - short ap; /* Linear weighting coefficient of 'yl' and 'yu'. */ - - short a[2]; /* Coefficients of pole portion of prediction filter. */ - short b[6]; /* Coefficients of zero portion of prediction filter. */ - short pk[2]; /* - ** Signs of previous two samples of a partially - ** reconstructed signal. - **/ - short dq[6]; /* - ** Previous 6 samples of the quantized difference - ** signal represented in an internal floating point - ** format. - **/ - short sr[2]; /* - ** Previous 2 samples of the quantized difference - ** signal represented in an internal floating point - ** format. - */ - char td; /* delayed tone detect, new in 1988 version */ - - /* The following struct members were added for libsndfile. The original - ** code worked by calling a set of functions on a sample by sample basis - ** which is slow on architectures like Intel x86. For libsndfile, this - ** was changed so that the encoding and decoding routines could work on - ** a block of samples at a time to reduce the function call overhead. - */ - int (*encoder) (int, struct g72x_state* state) ; - int (*decoder) (int, struct g72x_state* state) ; - - int codec_bits, blocksize, samplesperblock ; -} ; - -typedef struct g72x_state G72x_STATE ; - -int predictor_zero (G72x_STATE *state_ptr); - -int predictor_pole (G72x_STATE *state_ptr); - -int step_size (G72x_STATE *state_ptr); - -int quantize (int d, int y, short *table, int size); - -int reconstruct (int sign, int dqln, int y); - -void update (int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, G72x_STATE *state_ptr); - -int g721_encoder (int sample, G72x_STATE *state_ptr); -int g721_decoder (int code, G72x_STATE *state_ptr); - -int g723_16_encoder (int sample, G72x_STATE *state_ptr); -int g723_16_decoder (int code, G72x_STATE *state_ptr); - -int g723_24_encoder (int sample, G72x_STATE *state_ptr); -int g723_24_decoder (int code, G72x_STATE *state_ptr); - -int g723_40_encoder (int sample, G72x_STATE *state_ptr); -int g723_40_decoder (int code, G72x_STATE *state_ptr); - -void private_init_state (G72x_STATE *state_ptr) ; - -#endif /* G72X_PRIVATE_H */ diff --git a/libs/libsndfile/src/G72x/g72x_test.c b/libs/libsndfile/src/G72x/g72x_test.c deleted file mode 100644 index 79cabce11b..0000000000 --- a/libs/libsndfile/src/G72x/g72x_test.c +++ /dev/null @@ -1,214 +0,0 @@ -/* -** Copyright (C) 1999-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include -#include -#include -#include -#include - -#include "g72x.h" -#include "g72x_priv.h" - -#ifndef M_PI -#define M_PI 3.14159265358979323846264338 -#endif - -#define BUFFER_SIZE (1<<14) /* Should be (1<<14) */ -#define SAMPLE_RATE 11025 - - -static void g721_test (void) ; -static void g723_test (double margin) ; - -static void gen_signal_double (double *data, double scale, int datalen) ; -static int error_function (double data, double orig, double margin) ; - -static int oct_save_short (short *a, short *b, int len) ; - -int -main (int argc, char *argv []) -{ int bDoAll = 0 ; - int nTests = 0 ; - - if (argc != 2) - { printf ("Usage : %s \n", argv [0]) ; - printf (" Where is one of the following:\n") ; - printf (" g721 - test G721 encoder and decoder\n") ; - printf (" g723 - test G721 encoder and decoder\n") ; - printf (" all - perform all tests\n") ; - exit (1) ; - } ; - - bDoAll=!strcmp (argv [1], "all"); - - if (bDoAll || ! strcmp (argv [1], "g721")) - { g721_test () ; - nTests++ ; - } ; - - if (bDoAll || ! strcmp (argv [1], "g723")) - { g723_test (0.53) ; - nTests++ ; - } ; - - if (nTests == 0) - { printf ("Mono : ************************************\n") ; - printf ("Mono : * No '%s' test defined.\n", argv [1]) ; - printf ("Mono : ************************************\n") ; - return 1 ; - } ; - - return 0 ; -} /* main */ - -static void -g721_test (void) -{ - return ; -} /* g721_test */ - -static void -g723_test (double margin) -{ static double orig_buffer [BUFFER_SIZE] ; - static short orig [BUFFER_SIZE] ; - static short data [BUFFER_SIZE] ; - - G72x_STATE encoder_state, decoder_state ; - - long k ; - int code, position, max_err ; - - private_init_state (&encoder_state) ; - encoder_state.encoder = g723_24_encoder ; - encoder_state.codec_bits = 3 ; - - private_init_state (&decoder_state) ; - decoder_state.decoder = g723_24_decoder ; - decoder_state.codec_bits = 3 ; - - memset (data, 0, BUFFER_SIZE * sizeof (short)) ; - memset (orig, 0, BUFFER_SIZE * sizeof (short)) ; - - printf (" g723_test : ") ; - fflush (stdout) ; - - gen_signal_double (orig_buffer, 32000.0, BUFFER_SIZE) ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - orig [k] = (short) orig_buffer [k] ; - - /* Write and read data here. */ - position = 0 ; - max_err = 0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - { code = encoder_state.encoder (orig [k], &encoder_state) ; - data [k] = decoder_state.decoder (code, &decoder_state) ; - if (abs (orig [k] - data [k]) > max_err) - { position = k ; - max_err = abs (orig [k] - data [k]) ; - } ; - } ; - - printf ("\n\nMax error of %d at postion %d.\n", max_err, position) ; - - for (k = 0 ; k < BUFFER_SIZE ; k++) - { if (error_function (data [k], orig [k], margin)) - { printf ("Line %d: Incorrect sample A (#%ld : %d should be %d).\n", __LINE__, k, data [k], orig [k]) ; - oct_save_short (orig, data, BUFFER_SIZE) ; - exit (1) ; - } ; - } ; - - - printf ("ok\n") ; - - return ; -} /* g723_test */ - - -#define SIGNAL_MAXVAL 30000.0 -#define DECAY_COUNT 1000 - -static void -gen_signal_double (double *gendata, double scale, int gendatalen) -{ int k, ramplen ; - double amp = 0.0 ; - - ramplen = DECAY_COUNT ; - - for (k = 0 ; k < gendatalen ; k++) - { if (k <= ramplen) - amp = scale * k / ((double) ramplen) ; - else if (k > gendatalen - ramplen) - amp = scale * (gendatalen - k) / ((double) ramplen) ; - - gendata [k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE)) - + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ; - } ; - - return ; -} /* gen_signal_double */ - -static int -error_function (double data, double orig, double margin) -{ double error ; - - if (fabs (orig) <= 500.0) - error = fabs (fabs (data) - fabs(orig)) / 2000.0 ; - else if (fabs (orig) <= 1000.0) - error = fabs (data - orig) / 3000.0 ; - else - error = fabs (data - orig) / fabs (orig) ; - - if (error > margin) - { printf ("\n\n*******************\nError : %f\n", error) ; - return 1 ; - } ; - return 0 ; -} /* error_function */ - -static int -oct_save_short (short *a, short *b, int len) -{ FILE *file ; - int k ; - - if (! (file = fopen ("error.dat", "w"))) - return 1 ; - - fprintf (file, "# Not created by Octave\n") ; - - fprintf (file, "# name: a\n") ; - fprintf (file, "# type: matrix\n") ; - fprintf (file, "# rows: %d\n", len) ; - fprintf (file, "# columns: 1\n") ; - - for (k = 0 ; k < len ; k++) - fprintf (file, "% d\n", a [k]) ; - - fprintf (file, "# name: b\n") ; - fprintf (file, "# type: matrix\n") ; - fprintf (file, "# rows: %d\n", len) ; - fprintf (file, "# columns: 1\n") ; - - for (k = 0 ; k < len ; k++) - fprintf (file, "% d\n", b [k]) ; - - fclose (file) ; - return 0 ; -} /* oct_save_short */ - diff --git a/libs/libsndfile/src/GSM610/COPYRIGHT b/libs/libsndfile/src/GSM610/COPYRIGHT deleted file mode 100644 index eba0e523bb..0000000000 --- a/libs/libsndfile/src/GSM610/COPYRIGHT +++ /dev/null @@ -1,16 +0,0 @@ -Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, -Technische Universitaet Berlin - -Any use of this software is permitted provided that this notice is not -removed and that neither the authors nor the Technische Universitaet Berlin -are deemed to have made any representations as to the suitability of this -software for any purpose nor are held responsible for any defects of -this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - -As a matter of courtesy, the authors request to be informed about uses -this software has found, about bugs in this software, and about any -improvements that may be of general interest. - -Berlin, 28.11.1994 -Jutta Degener -Carsten Bormann diff --git a/libs/libsndfile/src/GSM610/ChangeLog b/libs/libsndfile/src/GSM610/ChangeLog deleted file mode 100644 index 24f524882d..0000000000 --- a/libs/libsndfile/src/GSM610/ChangeLog +++ /dev/null @@ -1,56 +0,0 @@ -2004-05-12 Erik de Castro Lopo - - * gsm610_priv.h - Replace ugly macros with inline functions. - - * *.c - Remove temporary variables used by macros and other minor fixes required by - above change. - -2003-06-02 Erik de Castro Lopo - - * rpe.c - Renamed variables "exp" to "expon" to avoid shadowed parameter warnigns. - -2002-06-08 Erik de Castro Lopo - - * long_term.c - Changes tp removed compiler warnings about shadowed parameters. - -2002-06-08 Erik de Castro Lopo - - * private.h - Made declarations of gsm_A, gsm_B, gsm_MIC etc extern. This fixed a compile - problem on MacOSX. - -2002-05-10 Erik de Castro Lopo - - * *.[ch] - Removed all pre-ANSI prototype kludges. Removed proto.h and unproto.h. - Started work on making GSM 6.10 files seekable. Currently they are not. - - * code.c private.h - Function Gsm_Coder () used a statically defined array. This was obviously - not re-entrant so moved it to struct gsm_state. - -2001-09-16 Erik de Castro Lopo - - * code.c - Added #includes for string.h and stdlib.h. - -2000-10-27 Erik de Castro Lopo - - * config.h - Removed some commented out #defines (ie //*efine) which were causing problems on - the Sun cc compiler. - -2000-02-29 Erik de Castro Lopo - - * private.h - Added #defines to emulate normal compile time options. - -2000-02-28 Erik de Castro Lopo - - * everthing - Created this directory and copied files from libgsm. - http://kbs.cs.tu-berlin.de/~jutta/toast.html diff --git a/libs/libsndfile/src/GSM610/Makefile.am b/libs/libsndfile/src/GSM610/Makefile.am deleted file mode 100644 index a7358f283b..0000000000 --- a/libs/libsndfile/src/GSM610/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -## Process this file with automake to produce Makefile.in - -EXTRA_DIST = README COPYRIGHT ChangeLog - -noinst_HEADERS = gsm.h config.h gsm610_priv.h -noinst_LTLIBRARIES = libgsm.la - -CFILES = add.c decode.c gsm_decode.c gsm_encode.c long_term.c preprocess.c \ - short_term.c code.c gsm_create.c gsm_destroy.c gsm_option.c lpc.c rpe.c table.c - -libgsm_la_SOURCES = $(CFILES) $(noinst_HEADERS) - -# Disable autoheader. -AUTOHEADER=echo - - diff --git a/libs/libsndfile/src/GSM610/README b/libs/libsndfile/src/GSM610/README deleted file mode 100644 index b57132b051..0000000000 --- a/libs/libsndfile/src/GSM610/README +++ /dev/null @@ -1,36 +0,0 @@ -GSM 06.10 13 kbit/s RPE/LTP speech codec ----------------------------------------- - -All the file in this directory were written by Jutta Degener -and Carsten Borman for The Communications and Operating Systems -Research Group (KBS) at the Technische Universitaet Berlin. - -Their work was released under the following license which is -assumed to be compatible with The GNU Lesser General Public License. - ----------------------------------------------------------------------------- - -Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, -Technische Universitaet Berlin - -Any use of this software is permitted provided that this notice is not -removed and that neither the authors nor the Technische Universitaet Berlin -are deemed to have made any representations as to the suitability of this -software for any purpose nor are held responsible for any defects of -this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - -As a matter of courtesy, the authors request to be informed about uses -this software has found, about bugs in this software, and about any -improvements that may be of general interest. - -Berlin, 28.11.1994 -Jutta Degener (jutta@cs.tu-berlin.de) -Carsten Bormann (cabo@cs.tu-berlin.de) - ----------------------------------------------------------------------------- - -Jutta Degener and Carsten Bormann's work can be found on their homepage -at: - - http://kbs.cs.tu-berlin.de/~jutta/toast.html - diff --git a/libs/libsndfile/src/GSM610/add.c b/libs/libsndfile/src/GSM610/add.c deleted file mode 100644 index 6f4eb5cc5f..0000000000 --- a/libs/libsndfile/src/GSM610/add.c +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* - * See private.h for the more commonly used macro versions. - */ - -#include -#include - -#include "gsm610_priv.h" - -#define saturate(x) \ - ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x)) - -word gsm_add ( word a, word b) -{ - longword sum = (longword)a + (longword)b; - return saturate(sum); -} - -word gsm_sub ( word a, word b) -{ - longword diff = (longword)a - (longword)b; - return saturate(diff); -} - -word gsm_mult ( word a, word b) -{ - if (a == MIN_WORD && b == MIN_WORD) - return MAX_WORD; - - return SASR_L( (longword)a * (longword)b, 15 ); -} - -word gsm_mult_r ( word a, word b) -{ - if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD; - else { - longword prod = (longword)a * (longword)b + 16384; - prod >>= 15; - return prod & 0xFFFF; - } -} - -word gsm_abs (word a) -{ - return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a; -} - -longword gsm_L_mult (word a, word b) -{ - assert( a != MIN_WORD || b != MIN_WORD ); - return ((longword)a * (longword)b) << 1; -} - -longword gsm_L_add ( longword a, longword b) -{ - if (a < 0) { - if (b >= 0) return a + b; - else { - ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1); - return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2; - } - } - else if (b <= 0) return a + b; - else { - ulongword A = (ulongword)a + (ulongword)b; - return A > MAX_LONGWORD ? MAX_LONGWORD : A; - } -} - -longword gsm_L_sub ( longword a, longword b) -{ - if (a >= 0) { - if (b >= 0) return a - b; - else { - /* a>=0, b<0 */ - - ulongword A = (ulongword)a + -(b + 1); - return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1); - } - } - else if (b <= 0) return a - b; - else { - /* a<0, b>0 */ - - ulongword A = (ulongword)-(a + 1) + b; - return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1; - } -} - -static unsigned char const bitoff[ 256 ] = { - 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -word gsm_norm (longword a ) -/* - * the number of left shifts needed to normalize the 32 bit - * variable L_var1 for positive values on the interval - * - * with minimum of - * minimum of 1073741824 (01000000000000000000000000000000) and - * maximum of 2147483647 (01111111111111111111111111111111) - * - * - * and for negative values on the interval with - * minimum of -2147483648 (-10000000000000000000000000000000) and - * maximum of -1073741824 ( -1000000000000000000000000000000). - * - * in order to normalize the result, the following - * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 ); - * - * (That's 'ffs', only from the left, not the right..) - */ -{ - assert(a != 0); - - if (a < 0) { - if (a <= -1073741824) return 0; - a = ~a; - } - - return a & 0xffff0000 - ? ( a & 0xff000000 - ? -1 + bitoff[ 0xFF & (a >> 24) ] - : 7 + bitoff[ 0xFF & (a >> 16) ] ) - : ( a & 0xff00 - ? 15 + bitoff[ 0xFF & (a >> 8) ] - : 23 + bitoff[ 0xFF & a ] ); -} - -longword gsm_L_asl (longword a, int n) -{ - if (n >= 32) return 0; - if (n <= -32) return -(a < 0); - if (n < 0) return gsm_L_asr(a, -n); - return a << n; -} - -word gsm_asr (word a, int n) -{ - if (n >= 16) return -(a < 0); - if (n <= -16) return 0; - if (n < 0) return a << -n; - - return SASR_W (a, (word) n); -} - -word gsm_asl (word a, int n) -{ - if (n >= 16) return 0; - if (n <= -16) return -(a < 0); - if (n < 0) return gsm_asr(a, -n); - return a << n; -} - -longword gsm_L_asr (longword a, int n) -{ - if (n >= 32) return -(a < 0); - if (n <= -32) return 0; - if (n < 0) return a << -n; - - return SASR_L (a, (word) n); -} - -/* -** word gsm_asr (word a, int n) -** { -** if (n >= 16) return -(a < 0); -** if (n <= -16) return 0; -** if (n < 0) return a << -n; -** -** # ifdef SASR_W -** return a >> n; -** # else -** if (a >= 0) return a >> n; -** else return -(word)( -(uword)a >> n ); -** # endif -** } -** -*/ -/* - * (From p. 46, end of section 4.2.5) - * - * NOTE: The following lines gives [sic] one correct implementation - * of the div(num, denum) arithmetic operation. Compute div - * which is the integer division of num by denum: with denum - * >= num > 0 - */ - -word gsm_div (word num, word denum) -{ - longword L_num = num; - longword L_denum = denum; - word div = 0; - int k = 15; - - /* The parameter num sometimes becomes zero. - * Although this is explicitly guarded against in 4.2.5, - * we assume that the result should then be zero as well. - */ - - /* assert(num != 0); */ - - assert(num >= 0 && denum >= num); - if (num == 0) - return 0; - - while (k--) { - div <<= 1; - L_num <<= 1; - - if (L_num >= L_denum) { - L_num -= L_denum; - div++; - } - } - - return div; -} - diff --git a/libs/libsndfile/src/GSM610/code.c b/libs/libsndfile/src/GSM610/code.c deleted file mode 100644 index 78cb853c1d..0000000000 --- a/libs/libsndfile/src/GSM610/code.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - - -#include -#include - -#include "gsm610_priv.h" - -/* - * 4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER - */ - -void Gsm_Coder ( - - struct gsm_state * State, - - word * s, /* [0..159] samples IN */ - -/* - * The RPE-LTD coder works on a frame by frame basis. The length of - * the frame is equal to 160 samples. Some computations are done - * once per frame to produce at the output of the coder the - * LARc[1..8] parameters which are the coded LAR coefficients and - * also to realize the inverse filtering operation for the entire - * frame (160 samples of signal d[0..159]). These parts produce at - * the output of the coder: - */ - - word * LARc, /* [0..7] LAR coefficients OUT */ - -/* - * Procedure 4.2.11 to 4.2.18 are to be executed four times per - * frame. That means once for each sub-segment RPE-LTP analysis of - * 40 samples. These parts produce at the output of the coder: - */ - - word * Nc, /* [0..3] LTP lag OUT */ - word * bc, /* [0..3] coded LTP gain OUT */ - word * Mc, /* [0..3] RPE grid selection OUT */ - word * xmaxc,/* [0..3] Coded maximum amplitude OUT */ - word * xMc /* [13*4] normalized RPE samples OUT */ -) -{ - int k; - word * dp = State->dp0 + 120; /* [ -120...-1 ] */ - word * dpp = dp; /* [ 0...39 ] */ - - word so[160]; - - Gsm_Preprocess (State, s, so); - Gsm_LPC_Analysis (State, so, LARc); - Gsm_Short_Term_Analysis_Filter (State, LARc, so); - - for (k = 0; k <= 3; k++, xMc += 13) { - - Gsm_Long_Term_Predictor ( State, - so+k*40, /* d [0..39] IN */ - dp, /* dp [-120..-1] IN */ - State->e + 5, /* e [0..39] OUT */ - dpp, /* dpp [0..39] OUT */ - Nc++, - bc++); - - Gsm_RPE_Encoding ( /*-S,-*/ - State->e + 5, /* e ][0..39][ IN/OUT */ - xmaxc++, Mc++, xMc ); - /* - * Gsm_Update_of_reconstructed_short_time_residual_signal - * ( dpp, State->e + 5, dp ); - */ - - { register int i; - for (i = 0; i <= 39; i++) - dp[ i ] = GSM_ADD( State->e[5 + i], dpp[i] ); - } - dp += 40; - dpp += 40; - - } - (void)memcpy( (char *)State->dp0, (char *)(State->dp0 + 160), - 120 * sizeof(*State->dp0) ); -} - diff --git a/libs/libsndfile/src/GSM610/config.h b/libs/libsndfile/src/GSM610/config.h deleted file mode 100644 index f3eeb82e89..0000000000 --- a/libs/libsndfile/src/GSM610/config.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -#ifndef CONFIG_H -#define CONFIG_H - -#define HAS_STDLIB_H 1 /* /usr/include/stdlib.h */ -#define HAS_FCNTL_H 1 /* /usr/include/fcntl.h */ - -#define HAS_FSTAT 1 /* fstat syscall */ -#define HAS_FCHMOD 1 /* fchmod syscall */ -#define HAS_CHMOD 1 /* chmod syscall */ -#define HAS_FCHOWN 1 /* fchown syscall */ -#define HAS_CHOWN 1 /* chown syscall */ - -#define HAS_STRING_H 1 /* /usr/include/string.h */ - -#define HAS_UNISTD_H 1 /* /usr/include/unistd.h */ -#define HAS_UTIME 1 /* POSIX utime(path, times) */ -#define HAS_UTIME_H 1 /* UTIME header file */ - -#endif /* CONFIG_H */ - diff --git a/libs/libsndfile/src/GSM610/decode.c b/libs/libsndfile/src/GSM610/decode.c deleted file mode 100644 index 350df12969..0000000000 --- a/libs/libsndfile/src/GSM610/decode.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -#include - -#include "gsm610_priv.h" - -/* - * 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER - */ - -static void Postprocessing ( - struct gsm_state * S, - register word * s) -{ - register int k; - register word msr = S->msr; - register word tmp; - - for (k = 160; k--; s++) { - tmp = GSM_MULT_R( msr, 28180 ); - msr = GSM_ADD(*s, tmp); /* Deemphasis */ - *s = GSM_ADD(msr, msr) & 0xFFF8; /* Truncation & Upscaling */ - } - S->msr = msr; -} - -void Gsm_Decoder ( - struct gsm_state * S, - - word * LARcr, /* [0..7] IN */ - - word * Ncr, /* [0..3] IN */ - word * bcr, /* [0..3] IN */ - word * Mcr, /* [0..3] IN */ - word * xmaxcr, /* [0..3] IN */ - word * xMcr, /* [0..13*4] IN */ - - word * s) /* [0..159] OUT */ -{ - int j, k; - word erp[40], wt[160]; - word * drp = S->dp0 + 120; - - for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) { - - Gsm_RPE_Decoding( /*-S,-*/ *xmaxcr, *Mcr, xMcr, erp ); - Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp ); - - for (k = 0; k <= 39; k++) wt[ j * 40 + k ] = drp[ k ]; - } - - Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s ); - Postprocessing(S, s); -} - diff --git a/libs/libsndfile/src/GSM610/gsm.h b/libs/libsndfile/src/GSM610/gsm.h deleted file mode 100644 index 48aecc75aa..0000000000 --- a/libs/libsndfile/src/GSM610/gsm.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -#ifndef GSM_H -#define GSM_H - -#include /* for FILE * */ - -/* - * Interface - */ - -typedef struct gsm_state * gsm; -typedef short gsm_signal; /* signed 16 bit */ -typedef unsigned char gsm_byte; -typedef gsm_byte gsm_frame[33]; /* 33 * 8 bits */ - -#define GSM_MAGIC 0xD /* 13 kbit/s RPE-LTP */ - -#define GSM_PATCHLEVEL 10 -#define GSM_MINOR 0 -#define GSM_MAJOR 1 - -#define GSM_OPT_VERBOSE 1 -#define GSM_OPT_FAST 2 -#define GSM_OPT_LTP_CUT 3 -#define GSM_OPT_WAV49 4 -#define GSM_OPT_FRAME_INDEX 5 -#define GSM_OPT_FRAME_CHAIN 6 - -gsm gsm_create (void); - -/* Added for libsndfile : May 6, 2002 */ -void gsm_init (gsm); - -void gsm_destroy (gsm); - -int gsm_print (FILE *, gsm, gsm_byte *); -int gsm_option (gsm, int, int *); - -void gsm_encode (gsm, gsm_signal *, gsm_byte *); -int gsm_decode (gsm, gsm_byte *, gsm_signal *); - -int gsm_explode (gsm, gsm_byte *, gsm_signal *); -void gsm_implode (gsm, gsm_signal *, gsm_byte *); - -#endif /* GSM_H */ - - diff --git a/libs/libsndfile/src/GSM610/gsm610_priv.h b/libs/libsndfile/src/GSM610/gsm610_priv.h deleted file mode 100644 index e121c1c34e..0000000000 --- a/libs/libsndfile/src/GSM610/gsm610_priv.h +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -#ifndef PRIVATE_H -#define PRIVATE_H - -/* Added by Erik de Castro Lopo */ -#define USE_FLOAT_MUL -#define FAST -#define WAV49 - -#ifdef __cplusplus -#error "This code is not designed to be compiled with a C++ compiler." -#endif -/* Added by Erik de Castro Lopo */ - - - -typedef short word; /* 16 bit signed int */ -typedef int longword; /* 32 bit signed int */ - -typedef unsigned short uword; /* unsigned word */ -typedef unsigned int ulongword; /* unsigned longword */ - -struct gsm_state -{ word dp0[ 280 ] ; - - word z1; /* preprocessing.c, Offset_com. */ - longword L_z2; /* Offset_com. */ - int mp; /* Preemphasis */ - - word u[8] ; /* short_term_aly_filter.c */ - word LARpp[2][8] ; /* */ - word j; /* */ - - word ltp_cut; /* long_term.c, LTP crosscorr. */ - word nrp; /* 40 */ /* long_term.c, synthesis */ - word v[9] ; /* short_term.c, synthesis */ - word msr; /* decoder.c, Postprocessing */ - - char verbose; /* only used if !NDEBUG */ - char fast; /* only used if FAST */ - - char wav_fmt; /* only used if WAV49 defined */ - unsigned char frame_index; /* odd/even chaining */ - unsigned char frame_chain; /* half-byte to carry forward */ - - /* Moved here from code.c where it was defined as static */ - word e[50] ; -} ; - -typedef struct gsm_state GSM_STATE ; - -#define MIN_WORD (-32767 - 1) -#define MAX_WORD 32767 - -#define MIN_LONGWORD (-2147483647 - 1) -#define MAX_LONGWORD 2147483647 - -/* Signed arithmetic shift right. */ -static inline word -SASR_W (word x, word by) -{ return (x >> by) ; -} /* SASR */ - -static inline longword -SASR_L (longword x, word by) -{ return (x >> by) ; -} /* SASR */ - -/* - * Prototypes from add.c - */ -word gsm_mult (word a, word b) ; -longword gsm_L_mult (word a, word b) ; -word gsm_mult_r (word a, word b) ; - -word gsm_div (word num, word denum) ; - -word gsm_add (word a, word b ) ; -longword gsm_L_add (longword a, longword b ) ; - -word gsm_sub (word a, word b) ; -longword gsm_L_sub (longword a, longword b) ; - -word gsm_abs (word a) ; - -word gsm_norm (longword a ) ; - -longword gsm_L_asl (longword a, int n) ; -word gsm_asl (word a, int n) ; - -longword gsm_L_asr (longword a, int n) ; -word gsm_asr (word a, int n) ; - -/* - * Inlined functions from add.h - */ - -static inline longword -GSM_MULT_R (word a, word b) -{ return (((longword) (a)) * ((longword) (b)) + 16384) >> 15 ; -} /* GSM_MULT_R */ - -static inline longword -GSM_MULT (word a, word b) -{ return (((longword) (a)) * ((longword) (b))) >> 15 ; -} /* GSM_MULT */ - -static inline longword -GSM_L_MULT (word a, word b) -{ return ((longword) (a)) * ((longword) (b)) << 1 ; -} /* GSM_L_MULT */ - -static inline longword -GSM_L_ADD (longword a, longword b) -{ ulongword utmp ; - - if (a < 0 && b < 0) - { utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1) ; - return (utmp >= (ulongword) MAX_LONGWORD) ? MIN_LONGWORD : -(longword)utmp-2 ; - } ; - - if (a > 0 && b > 0) - { utmp = (ulongword) a + (ulongword) b ; - return (utmp >= (ulongword) MAX_LONGWORD) ? MAX_LONGWORD : utmp ; - } ; - - return a + b ; -} /* GSM_L_ADD */ - -static inline longword -GSM_ADD (word a, word b) -{ longword ltmp ; - - ltmp = ((longword) a) + ((longword) b) ; - - if (ltmp >= MAX_WORD) - return MAX_WORD ; - if (ltmp <= MIN_WORD) - return MIN_WORD ; - - return ltmp ; -} /* GSM_ADD */ - -static inline longword -GSM_SUB (word a, word b) -{ longword ltmp ; - - ltmp = ((longword) a) - ((longword) b) ; - - if (ltmp >= MAX_WORD) - ltmp = MAX_WORD ; - else if (ltmp <= MIN_WORD) - ltmp = MIN_WORD ; - - return ltmp ; -} /* GSM_SUB */ - -static inline word -GSM_ABS (word a) -{ - if (a > 0) - return a ; - if (a == MIN_WORD) - return MAX_WORD ; - return -a ; -} /* GSM_ADD */ - - -/* - * More prototypes from implementations.. - */ -void Gsm_Coder ( - struct gsm_state * S, - word * s, /* [0..159] samples IN */ - word * LARc, /* [0..7] LAR coefficients OUT */ - word * Nc, /* [0..3] LTP lag OUT */ - word * bc, /* [0..3] coded LTP gain OUT */ - word * Mc, /* [0..3] RPE grid selection OUT */ - word * xmaxc,/* [0..3] Coded maximum amplitude OUT */ - word * xMc) ;/* [13*4] normalized RPE samples OUT */ - -void Gsm_Long_Term_Predictor ( /* 4x for 160 samples */ - struct gsm_state * S, - word * d, /* [0..39] residual signal IN */ - word * dp, /* [-120..-1] d' IN */ - word * e, /* [0..40] OUT */ - word * dpp, /* [0..40] OUT */ - word * Nc, /* correlation lag OUT */ - word * bc) ; /* gain factor OUT */ - -void Gsm_LPC_Analysis ( - struct gsm_state * S, - word * s, /* 0..159 signals IN/OUT */ - word * LARc) ; /* 0..7 LARc's OUT */ - -void Gsm_Preprocess ( - struct gsm_state * S, - word * s, word * so) ; - -void Gsm_Encoding ( - struct gsm_state * S, - word * e, - word * ep, - word * xmaxc, - word * Mc, - word * xMc) ; - -void Gsm_Short_Term_Analysis_Filter ( - struct gsm_state * S, - word * LARc, /* coded log area ratio [0..7] IN */ - word * d) ; /* st res. signal [0..159] IN/OUT */ - -void Gsm_Decoder ( - struct gsm_state * S, - word * LARcr, /* [0..7] IN */ - word * Ncr, /* [0..3] IN */ - word * bcr, /* [0..3] IN */ - word * Mcr, /* [0..3] IN */ - word * xmaxcr, /* [0..3] IN */ - word * xMcr, /* [0..13*4] IN */ - word * s) ; /* [0..159] OUT */ - -void Gsm_Decoding ( - struct gsm_state * S, - word xmaxcr, - word Mcr, - word * xMcr, /* [0..12] IN */ - word * erp) ; /* [0..39] OUT */ - -void Gsm_Long_Term_Synthesis_Filtering ( - struct gsm_state* S, - word Ncr, - word bcr, - word * erp, /* [0..39] IN */ - word * drp) ; /* [-120..-1] IN, [0..40] OUT */ - -void Gsm_RPE_Decoding ( - /*-struct gsm_state *S,-*/ - word xmaxcr, - word Mcr, - word * xMcr, /* [0..12], 3 bits IN */ - word * erp) ; /* [0..39] OUT */ - -void Gsm_RPE_Encoding ( - /*-struct gsm_state * S,-*/ - word * e, /* -5..-1][0..39][40..44 IN/OUT */ - word * xmaxc, /* OUT */ - word * Mc, /* OUT */ - word * xMc) ; /* [0..12] OUT */ - -void Gsm_Short_Term_Synthesis_Filter ( - struct gsm_state * S, - word * LARcr, /* log area ratios [0..7] IN */ - word * drp, /* received d [0...39] IN */ - word * s) ; /* signal s [0..159] OUT */ - -void Gsm_Update_of_reconstructed_short_time_residual_signal ( - word * dpp, /* [0...39] IN */ - word * ep, /* [0...39] IN */ - word * dp) ; /* [-120...-1] IN/OUT */ - -/* - * Tables from table.c - */ -#ifndef GSM_TABLE_C - -extern word gsm_A [8], gsm_B [8], gsm_MIC [8], gsm_MAC [8] ; -extern word gsm_INVA [8] ; -extern word gsm_DLB [4], gsm_QLB [4] ; -extern word gsm_H [11] ; -extern word gsm_NRFAC [8] ; -extern word gsm_FAC [8] ; - -#endif /* GSM_TABLE_C */ - -/* - * Debugging - */ -#ifdef NDEBUG - -# define gsm_debug_words(a, b, c, d) /* nil */ -# define gsm_debug_longwords(a, b, c, d) /* nil */ -# define gsm_debug_word(a, b) /* nil */ -# define gsm_debug_longword(a, b) /* nil */ - -#else /* !NDEBUG => DEBUG */ - - void gsm_debug_words (char * name, int, int, word *) ; - void gsm_debug_longwords (char * name, int, int, longword *) ; - void gsm_debug_longword (char * name, longword) ; - void gsm_debug_word (char * name, word) ; - -#endif /* !NDEBUG */ - -#endif /* PRIVATE_H */ - diff --git a/libs/libsndfile/src/GSM610/gsm_create.c b/libs/libsndfile/src/GSM610/gsm_create.c deleted file mode 100644 index 2bb430776d..0000000000 --- a/libs/libsndfile/src/GSM610/gsm_create.c +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -#include "config.h" - -#include -#include -#include - - - -#include "gsm.h" -#include "gsm610_priv.h" - -gsm gsm_create (void) -{ - gsm r; - - r = malloc (sizeof(struct gsm_state)); - if (!r) return r; - - memset((char *)r, 0, sizeof (struct gsm_state)); - r->nrp = 40; - - return r; -} - -/* Added for libsndfile : May 6, 2002. Not sure if it works. */ -void gsm_init (gsm state) -{ - memset (state, 0, sizeof (struct gsm_state)) ; - state->nrp = 40 ; -} - diff --git a/libs/libsndfile/src/GSM610/gsm_decode.c b/libs/libsndfile/src/GSM610/gsm_decode.c deleted file mode 100644 index b13308a807..0000000000 --- a/libs/libsndfile/src/GSM610/gsm_decode.c +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -#include "gsm610_priv.h" - -#include "gsm.h" - -int gsm_decode (gsm s, gsm_byte * c, gsm_signal * target) -{ - word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; - -#ifdef WAV49 - if (s->wav_fmt) { - - uword sr = 0; - - s->frame_index = !s->frame_index; - if (s->frame_index) { - - sr = *c++; - LARc[0] = sr & 0x3f; sr >>= 6; - sr |= (uword)*c++ << 2; - LARc[1] = sr & 0x3f; sr >>= 6; - sr |= (uword)*c++ << 4; - LARc[2] = sr & 0x1f; sr >>= 5; - LARc[3] = sr & 0x1f; sr >>= 5; - sr |= (uword)*c++ << 2; - LARc[4] = sr & 0xf; sr >>= 4; - LARc[5] = sr & 0xf; sr >>= 4; - sr |= (uword)*c++ << 2; /* 5 */ - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[0] = sr & 0x7f; sr >>= 7; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[0] = sr & 0x3f; sr >>= 6; - xmc[0] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[1] = sr & 0x7; sr >>= 3; - xmc[2] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - xmc[5] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 10 */ - xmc[6] = sr & 0x7; sr >>= 3; - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[9] = sr & 0x7; sr >>= 3; - xmc[10] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[1] = sr & 0x7f; sr >>= 7; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[1] = sr & 0x3f; sr >>= 6; - xmc[13] = sr & 0x7; sr >>= 3; - sr = *c++; /* 15 */ - xmc[14] = sr & 0x7; sr >>= 3; - xmc[15] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - xmc[18] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[19] = sr & 0x7; sr >>= 3; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[22] = sr & 0x7; sr >>= 3; - xmc[23] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; /* 20 */ - Nc[2] = sr & 0x7f; sr >>= 7; - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[2] = sr & 0x3f; sr >>= 6; - xmc[26] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[27] = sr & 0x7; sr >>= 3; - xmc[28] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - xmc[31] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[32] = sr & 0x7; sr >>= 3; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - sr = *c++; /* 25 */ - xmc[35] = sr & 0x7; sr >>= 3; - xmc[36] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[3] = sr & 0x7f; sr >>= 7; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[3] = sr & 0x3f; sr >>= 6; - xmc[39] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[40] = sr & 0x7; sr >>= 3; - xmc[41] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; /* 30 */ - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - xmc[44] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[45] = sr & 0x7; sr >>= 3; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[48] = sr & 0x7; sr >>= 3; - xmc[49] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - - s->frame_chain = sr & 0xf; - } - else { - sr = s->frame_chain; - sr |= (uword)*c++ << 4; /* 1 */ - LARc[0] = sr & 0x3f; sr >>= 6; - LARc[1] = sr & 0x3f; sr >>= 6; - sr = *c++; - LARc[2] = sr & 0x1f; sr >>= 5; - sr |= (uword)*c++ << 3; - LARc[3] = sr & 0x1f; sr >>= 5; - LARc[4] = sr & 0xf; sr >>= 4; - sr |= (uword)*c++ << 2; - LARc[5] = sr & 0xf; sr >>= 4; - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr = *c++; /* 5 */ - Nc[0] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[0] = sr & 0x3f; sr >>= 6; - xmc[0] = sr & 0x7; sr >>= 3; - xmc[1] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[2] = sr & 0x7; sr >>= 3; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[5] = sr & 0x7; sr >>= 3; - xmc[6] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; /* 10 */ - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - xmc[9] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[10] = sr & 0x7; sr >>= 3; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[1] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[1] = sr & 0x3f; sr >>= 6; - xmc[13] = sr & 0x7; sr >>= 3; - xmc[14] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 15 */ - xmc[15] = sr & 0x7; sr >>= 3; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[18] = sr & 0x7; sr >>= 3; - xmc[19] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - xmc[22] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[23] = sr & 0x7; sr >>= 3; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[2] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; /* 20 */ - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[2] = sr & 0x3f; sr >>= 6; - xmc[26] = sr & 0x7; sr >>= 3; - xmc[27] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[28] = sr & 0x7; sr >>= 3; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[31] = sr & 0x7; sr >>= 3; - xmc[32] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - xmc[35] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 25 */ - xmc[36] = sr & 0x7; sr >>= 3; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[3] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[3] = sr & 0x3f; sr >>= 6; - xmc[39] = sr & 0x7; sr >>= 3; - xmc[40] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[41] = sr & 0x7; sr >>= 3; - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - sr = *c++; /* 30 */ - xmc[44] = sr & 0x7; sr >>= 3; - xmc[45] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - xmc[48] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[49] = sr & 0x7; sr >>= 3; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - } - } - else -#endif - { - /* GSM_MAGIC = (*c >> 4) & 0xF; */ - - if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1; - - LARc[0] = (*c++ & 0xF) << 2; /* 1 */ - LARc[0] |= (*c >> 6) & 0x3; - LARc[1] = *c++ & 0x3F; - LARc[2] = (*c >> 3) & 0x1F; - LARc[3] = (*c++ & 0x7) << 2; - LARc[3] |= (*c >> 6) & 0x3; - LARc[4] = (*c >> 2) & 0xF; - LARc[5] = (*c++ & 0x3) << 2; - LARc[5] |= (*c >> 6) & 0x3; - LARc[6] = (*c >> 3) & 0x7; - LARc[7] = *c++ & 0x7; - Nc[0] = (*c >> 1) & 0x7F; - bc[0] = (*c++ & 0x1) << 1; - bc[0] |= (*c >> 7) & 0x1; - Mc[0] = (*c >> 5) & 0x3; - xmaxc[0] = (*c++ & 0x1F) << 1; - xmaxc[0] |= (*c >> 7) & 0x1; - xmc[0] = (*c >> 4) & 0x7; - xmc[1] = (*c >> 1) & 0x7; - xmc[2] = (*c++ & 0x1) << 2; - xmc[2] |= (*c >> 6) & 0x3; - xmc[3] = (*c >> 3) & 0x7; - xmc[4] = *c++ & 0x7; - xmc[5] = (*c >> 5) & 0x7; - xmc[6] = (*c >> 2) & 0x7; - xmc[7] = (*c++ & 0x3) << 1; /* 10 */ - xmc[7] |= (*c >> 7) & 0x1; - xmc[8] = (*c >> 4) & 0x7; - xmc[9] = (*c >> 1) & 0x7; - xmc[10] = (*c++ & 0x1) << 2; - xmc[10] |= (*c >> 6) & 0x3; - xmc[11] = (*c >> 3) & 0x7; - xmc[12] = *c++ & 0x7; - Nc[1] = (*c >> 1) & 0x7F; - bc[1] = (*c++ & 0x1) << 1; - bc[1] |= (*c >> 7) & 0x1; - Mc[1] = (*c >> 5) & 0x3; - xmaxc[1] = (*c++ & 0x1F) << 1; - xmaxc[1] |= (*c >> 7) & 0x1; - xmc[13] = (*c >> 4) & 0x7; - xmc[14] = (*c >> 1) & 0x7; - xmc[15] = (*c++ & 0x1) << 2; - xmc[15] |= (*c >> 6) & 0x3; - xmc[16] = (*c >> 3) & 0x7; - xmc[17] = *c++ & 0x7; - xmc[18] = (*c >> 5) & 0x7; - xmc[19] = (*c >> 2) & 0x7; - xmc[20] = (*c++ & 0x3) << 1; - xmc[20] |= (*c >> 7) & 0x1; - xmc[21] = (*c >> 4) & 0x7; - xmc[22] = (*c >> 1) & 0x7; - xmc[23] = (*c++ & 0x1) << 2; - xmc[23] |= (*c >> 6) & 0x3; - xmc[24] = (*c >> 3) & 0x7; - xmc[25] = *c++ & 0x7; - Nc[2] = (*c >> 1) & 0x7F; - bc[2] = (*c++ & 0x1) << 1; /* 20 */ - bc[2] |= (*c >> 7) & 0x1; - Mc[2] = (*c >> 5) & 0x3; - xmaxc[2] = (*c++ & 0x1F) << 1; - xmaxc[2] |= (*c >> 7) & 0x1; - xmc[26] = (*c >> 4) & 0x7; - xmc[27] = (*c >> 1) & 0x7; - xmc[28] = (*c++ & 0x1) << 2; - xmc[28] |= (*c >> 6) & 0x3; - xmc[29] = (*c >> 3) & 0x7; - xmc[30] = *c++ & 0x7; - xmc[31] = (*c >> 5) & 0x7; - xmc[32] = (*c >> 2) & 0x7; - xmc[33] = (*c++ & 0x3) << 1; - xmc[33] |= (*c >> 7) & 0x1; - xmc[34] = (*c >> 4) & 0x7; - xmc[35] = (*c >> 1) & 0x7; - xmc[36] = (*c++ & 0x1) << 2; - xmc[36] |= (*c >> 6) & 0x3; - xmc[37] = (*c >> 3) & 0x7; - xmc[38] = *c++ & 0x7; - Nc[3] = (*c >> 1) & 0x7F; - bc[3] = (*c++ & 0x1) << 1; - bc[3] |= (*c >> 7) & 0x1; - Mc[3] = (*c >> 5) & 0x3; - xmaxc[3] = (*c++ & 0x1F) << 1; - xmaxc[3] |= (*c >> 7) & 0x1; - xmc[39] = (*c >> 4) & 0x7; - xmc[40] = (*c >> 1) & 0x7; - xmc[41] = (*c++ & 0x1) << 2; - xmc[41] |= (*c >> 6) & 0x3; - xmc[42] = (*c >> 3) & 0x7; - xmc[43] = *c++ & 0x7; /* 30 */ - xmc[44] = (*c >> 5) & 0x7; - xmc[45] = (*c >> 2) & 0x7; - xmc[46] = (*c++ & 0x3) << 1; - xmc[46] |= (*c >> 7) & 0x1; - xmc[47] = (*c >> 4) & 0x7; - xmc[48] = (*c >> 1) & 0x7; - xmc[49] = (*c++ & 0x1) << 2; - xmc[49] |= (*c >> 6) & 0x3; - xmc[50] = (*c >> 3) & 0x7; - xmc[51] = *c & 0x7; /* 33 */ - } - - Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target); - - return 0; -} - diff --git a/libs/libsndfile/src/GSM610/gsm_destroy.c b/libs/libsndfile/src/GSM610/gsm_destroy.c deleted file mode 100644 index 9b417116d8..0000000000 --- a/libs/libsndfile/src/GSM610/gsm_destroy.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -#include "gsm.h" -#include "config.h" - -#ifdef HAS_STDLIB_H -# include -#else -# ifdef HAS_MALLOC_H -# include -# else - extern void free(); -# endif -#endif - -void gsm_destroy (gsm S) -{ - if (S) free((char *)S); -} - diff --git a/libs/libsndfile/src/GSM610/gsm_encode.c b/libs/libsndfile/src/GSM610/gsm_encode.c deleted file mode 100644 index 5c9e1ab33e..0000000000 --- a/libs/libsndfile/src/GSM610/gsm_encode.c +++ /dev/null @@ -1,449 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -#include "gsm610_priv.h" -#include "gsm.h" - -void gsm_encode (gsm s, gsm_signal * source, gsm_byte * c) -{ - word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; - - Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc); - - - /* variable size - - GSM_MAGIC 4 - - LARc[0] 6 - LARc[1] 6 - LARc[2] 5 - LARc[3] 5 - LARc[4] 4 - LARc[5] 4 - LARc[6] 3 - LARc[7] 3 - - Nc[0] 7 - bc[0] 2 - Mc[0] 2 - xmaxc[0] 6 - xmc[0] 3 - xmc[1] 3 - xmc[2] 3 - xmc[3] 3 - xmc[4] 3 - xmc[5] 3 - xmc[6] 3 - xmc[7] 3 - xmc[8] 3 - xmc[9] 3 - xmc[10] 3 - xmc[11] 3 - xmc[12] 3 - - Nc[1] 7 - bc[1] 2 - Mc[1] 2 - xmaxc[1] 6 - xmc[13] 3 - xmc[14] 3 - xmc[15] 3 - xmc[16] 3 - xmc[17] 3 - xmc[18] 3 - xmc[19] 3 - xmc[20] 3 - xmc[21] 3 - xmc[22] 3 - xmc[23] 3 - xmc[24] 3 - xmc[25] 3 - - Nc[2] 7 - bc[2] 2 - Mc[2] 2 - xmaxc[2] 6 - xmc[26] 3 - xmc[27] 3 - xmc[28] 3 - xmc[29] 3 - xmc[30] 3 - xmc[31] 3 - xmc[32] 3 - xmc[33] 3 - xmc[34] 3 - xmc[35] 3 - xmc[36] 3 - xmc[37] 3 - xmc[38] 3 - - Nc[3] 7 - bc[3] 2 - Mc[3] 2 - xmaxc[3] 6 - xmc[39] 3 - xmc[40] 3 - xmc[41] 3 - xmc[42] 3 - xmc[43] 3 - xmc[44] 3 - xmc[45] 3 - xmc[46] 3 - xmc[47] 3 - xmc[48] 3 - xmc[49] 3 - xmc[50] 3 - xmc[51] 3 - */ - -#ifdef WAV49 - - if (s->wav_fmt) { - s->frame_index = !s->frame_index; - if (s->frame_index) { - - uword sr; - - sr = 0; - sr = sr >> 6 | LARc[0] << 10; - sr = sr >> 6 | LARc[1] << 10; - *c++ = sr >> 4; - sr = sr >> 5 | LARc[2] << 11; - *c++ = sr >> 7; - sr = sr >> 5 | LARc[3] << 11; - sr = sr >> 4 | LARc[4] << 12; - *c++ = sr >> 6; - sr = sr >> 4 | LARc[5] << 12; - sr = sr >> 3 | LARc[6] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | LARc[7] << 13; - sr = sr >> 7 | Nc[0] << 9; - *c++ = sr >> 5; - sr = sr >> 2 | bc[0] << 14; - sr = sr >> 2 | Mc[0] << 14; - sr = sr >> 6 | xmaxc[0] << 10; - *c++ = sr >> 3; - sr = sr >> 3 | xmc[0] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[1] << 13; - sr = sr >> 3 | xmc[2] << 13; - sr = sr >> 3 | xmc[3] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[4] << 13; - sr = sr >> 3 | xmc[5] << 13; - sr = sr >> 3 | xmc[6] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[7] << 13; - sr = sr >> 3 | xmc[8] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[9] << 13; - sr = sr >> 3 | xmc[10] << 13; - sr = sr >> 3 | xmc[11] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[12] << 13; - sr = sr >> 7 | Nc[1] << 9; - *c++ = sr >> 5; - sr = sr >> 2 | bc[1] << 14; - sr = sr >> 2 | Mc[1] << 14; - sr = sr >> 6 | xmaxc[1] << 10; - *c++ = sr >> 3; - sr = sr >> 3 | xmc[13] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[14] << 13; - sr = sr >> 3 | xmc[15] << 13; - sr = sr >> 3 | xmc[16] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[17] << 13; - sr = sr >> 3 | xmc[18] << 13; - sr = sr >> 3 | xmc[19] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[20] << 13; - sr = sr >> 3 | xmc[21] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[22] << 13; - sr = sr >> 3 | xmc[23] << 13; - sr = sr >> 3 | xmc[24] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[25] << 13; - sr = sr >> 7 | Nc[2] << 9; - *c++ = sr >> 5; - sr = sr >> 2 | bc[2] << 14; - sr = sr >> 2 | Mc[2] << 14; - sr = sr >> 6 | xmaxc[2] << 10; - *c++ = sr >> 3; - sr = sr >> 3 | xmc[26] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[27] << 13; - sr = sr >> 3 | xmc[28] << 13; - sr = sr >> 3 | xmc[29] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[30] << 13; - sr = sr >> 3 | xmc[31] << 13; - sr = sr >> 3 | xmc[32] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[33] << 13; - sr = sr >> 3 | xmc[34] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[35] << 13; - sr = sr >> 3 | xmc[36] << 13; - sr = sr >> 3 | xmc[37] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[38] << 13; - sr = sr >> 7 | Nc[3] << 9; - *c++ = sr >> 5; - sr = sr >> 2 | bc[3] << 14; - sr = sr >> 2 | Mc[3] << 14; - sr = sr >> 6 | xmaxc[3] << 10; - *c++ = sr >> 3; - sr = sr >> 3 | xmc[39] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[40] << 13; - sr = sr >> 3 | xmc[41] << 13; - sr = sr >> 3 | xmc[42] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[43] << 13; - sr = sr >> 3 | xmc[44] << 13; - sr = sr >> 3 | xmc[45] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[46] << 13; - sr = sr >> 3 | xmc[47] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[48] << 13; - sr = sr >> 3 | xmc[49] << 13; - sr = sr >> 3 | xmc[50] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[51] << 13; - sr = sr >> 4; - *c = sr >> 8; - s->frame_chain = *c; - } - else { - uword sr; - - sr = 0; - sr = sr >> 4 | s->frame_chain << 12; - sr = sr >> 6 | LARc[0] << 10; - *c++ = sr >> 6; - sr = sr >> 6 | LARc[1] << 10; - *c++ = sr >> 8; - sr = sr >> 5 | LARc[2] << 11; - sr = sr >> 5 | LARc[3] << 11; - *c++ = sr >> 6; - sr = sr >> 4 | LARc[4] << 12; - sr = sr >> 4 | LARc[5] << 12; - *c++ = sr >> 6; - sr = sr >> 3 | LARc[6] << 13; - sr = sr >> 3 | LARc[7] << 13; - *c++ = sr >> 8; - sr = sr >> 7 | Nc[0] << 9; - sr = sr >> 2 | bc[0] << 14; - *c++ = sr >> 7; - sr = sr >> 2 | Mc[0] << 14; - sr = sr >> 6 | xmaxc[0] << 10; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[0] << 13; - sr = sr >> 3 | xmc[1] << 13; - sr = sr >> 3 | xmc[2] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[3] << 13; - sr = sr >> 3 | xmc[4] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[5] << 13; - sr = sr >> 3 | xmc[6] << 13; - sr = sr >> 3 | xmc[7] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[8] << 13; - sr = sr >> 3 | xmc[9] << 13; - sr = sr >> 3 | xmc[10] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[11] << 13; - sr = sr >> 3 | xmc[12] << 13; - *c++ = sr >> 8; - sr = sr >> 7 | Nc[1] << 9; - sr = sr >> 2 | bc[1] << 14; - *c++ = sr >> 7; - sr = sr >> 2 | Mc[1] << 14; - sr = sr >> 6 | xmaxc[1] << 10; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[13] << 13; - sr = sr >> 3 | xmc[14] << 13; - sr = sr >> 3 | xmc[15] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[16] << 13; - sr = sr >> 3 | xmc[17] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[18] << 13; - sr = sr >> 3 | xmc[19] << 13; - sr = sr >> 3 | xmc[20] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[21] << 13; - sr = sr >> 3 | xmc[22] << 13; - sr = sr >> 3 | xmc[23] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[24] << 13; - sr = sr >> 3 | xmc[25] << 13; - *c++ = sr >> 8; - sr = sr >> 7 | Nc[2] << 9; - sr = sr >> 2 | bc[2] << 14; - *c++ = sr >> 7; - sr = sr >> 2 | Mc[2] << 14; - sr = sr >> 6 | xmaxc[2] << 10; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[26] << 13; - sr = sr >> 3 | xmc[27] << 13; - sr = sr >> 3 | xmc[28] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[29] << 13; - sr = sr >> 3 | xmc[30] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[31] << 13; - sr = sr >> 3 | xmc[32] << 13; - sr = sr >> 3 | xmc[33] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[34] << 13; - sr = sr >> 3 | xmc[35] << 13; - sr = sr >> 3 | xmc[36] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[37] << 13; - sr = sr >> 3 | xmc[38] << 13; - *c++ = sr >> 8; - sr = sr >> 7 | Nc[3] << 9; - sr = sr >> 2 | bc[3] << 14; - *c++ = sr >> 7; - sr = sr >> 2 | Mc[3] << 14; - sr = sr >> 6 | xmaxc[3] << 10; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[39] << 13; - sr = sr >> 3 | xmc[40] << 13; - sr = sr >> 3 | xmc[41] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[42] << 13; - sr = sr >> 3 | xmc[43] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[44] << 13; - sr = sr >> 3 | xmc[45] << 13; - sr = sr >> 3 | xmc[46] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[47] << 13; - sr = sr >> 3 | xmc[48] << 13; - sr = sr >> 3 | xmc[49] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[50] << 13; - sr = sr >> 3 | xmc[51] << 13; - *c++ = sr >> 8; - } - } - - else - -#endif /* WAV49 */ - { - - *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */ - | ((LARc[0] >> 2) & 0xF); - *c++ = ((LARc[0] & 0x3) << 6) - | (LARc[1] & 0x3F); - *c++ = ((LARc[2] & 0x1F) << 3) - | ((LARc[3] >> 2) & 0x7); - *c++ = ((LARc[3] & 0x3) << 6) - | ((LARc[4] & 0xF) << 2) - | ((LARc[5] >> 2) & 0x3); - *c++ = ((LARc[5] & 0x3) << 6) - | ((LARc[6] & 0x7) << 3) - | (LARc[7] & 0x7); - *c++ = ((Nc[0] & 0x7F) << 1) - | ((bc[0] >> 1) & 0x1); - *c++ = ((bc[0] & 0x1) << 7) - | ((Mc[0] & 0x3) << 5) - | ((xmaxc[0] >> 1) & 0x1F); - *c++ = ((xmaxc[0] & 0x1) << 7) - | ((xmc[0] & 0x7) << 4) - | ((xmc[1] & 0x7) << 1) - | ((xmc[2] >> 2) & 0x1); - *c++ = ((xmc[2] & 0x3) << 6) - | ((xmc[3] & 0x7) << 3) - | (xmc[4] & 0x7); - *c++ = ((xmc[5] & 0x7) << 5) /* 10 */ - | ((xmc[6] & 0x7) << 2) - | ((xmc[7] >> 1) & 0x3); - *c++ = ((xmc[7] & 0x1) << 7) - | ((xmc[8] & 0x7) << 4) - | ((xmc[9] & 0x7) << 1) - | ((xmc[10] >> 2) & 0x1); - *c++ = ((xmc[10] & 0x3) << 6) - | ((xmc[11] & 0x7) << 3) - | (xmc[12] & 0x7); - *c++ = ((Nc[1] & 0x7F) << 1) - | ((bc[1] >> 1) & 0x1); - *c++ = ((bc[1] & 0x1) << 7) - | ((Mc[1] & 0x3) << 5) - | ((xmaxc[1] >> 1) & 0x1F); - *c++ = ((xmaxc[1] & 0x1) << 7) - | ((xmc[13] & 0x7) << 4) - | ((xmc[14] & 0x7) << 1) - | ((xmc[15] >> 2) & 0x1); - *c++ = ((xmc[15] & 0x3) << 6) - | ((xmc[16] & 0x7) << 3) - | (xmc[17] & 0x7); - *c++ = ((xmc[18] & 0x7) << 5) - | ((xmc[19] & 0x7) << 2) - | ((xmc[20] >> 1) & 0x3); - *c++ = ((xmc[20] & 0x1) << 7) - | ((xmc[21] & 0x7) << 4) - | ((xmc[22] & 0x7) << 1) - | ((xmc[23] >> 2) & 0x1); - *c++ = ((xmc[23] & 0x3) << 6) - | ((xmc[24] & 0x7) << 3) - | (xmc[25] & 0x7); - *c++ = ((Nc[2] & 0x7F) << 1) /* 20 */ - | ((bc[2] >> 1) & 0x1); - *c++ = ((bc[2] & 0x1) << 7) - | ((Mc[2] & 0x3) << 5) - | ((xmaxc[2] >> 1) & 0x1F); - *c++ = ((xmaxc[2] & 0x1) << 7) - | ((xmc[26] & 0x7) << 4) - | ((xmc[27] & 0x7) << 1) - | ((xmc[28] >> 2) & 0x1); - *c++ = ((xmc[28] & 0x3) << 6) - | ((xmc[29] & 0x7) << 3) - | (xmc[30] & 0x7); - *c++ = ((xmc[31] & 0x7) << 5) - | ((xmc[32] & 0x7) << 2) - | ((xmc[33] >> 1) & 0x3); - *c++ = ((xmc[33] & 0x1) << 7) - | ((xmc[34] & 0x7) << 4) - | ((xmc[35] & 0x7) << 1) - | ((xmc[36] >> 2) & 0x1); - *c++ = ((xmc[36] & 0x3) << 6) - | ((xmc[37] & 0x7) << 3) - | (xmc[38] & 0x7); - *c++ = ((Nc[3] & 0x7F) << 1) - | ((bc[3] >> 1) & 0x1); - *c++ = ((bc[3] & 0x1) << 7) - | ((Mc[3] & 0x3) << 5) - | ((xmaxc[3] >> 1) & 0x1F); - *c++ = ((xmaxc[3] & 0x1) << 7) - | ((xmc[39] & 0x7) << 4) - | ((xmc[40] & 0x7) << 1) - | ((xmc[41] >> 2) & 0x1); - *c++ = ((xmc[41] & 0x3) << 6) /* 30 */ - | ((xmc[42] & 0x7) << 3) - | (xmc[43] & 0x7); - *c++ = ((xmc[44] & 0x7) << 5) - | ((xmc[45] & 0x7) << 2) - | ((xmc[46] >> 1) & 0x3); - *c++ = ((xmc[46] & 0x1) << 7) - | ((xmc[47] & 0x7) << 4) - | ((xmc[48] & 0x7) << 1) - | ((xmc[49] >> 2) & 0x1); - *c++ = ((xmc[49] & 0x3) << 6) - | ((xmc[50] & 0x7) << 3) - | (xmc[51] & 0x7); - - } -} - diff --git a/libs/libsndfile/src/GSM610/gsm_option.c b/libs/libsndfile/src/GSM610/gsm_option.c deleted file mode 100644 index 0139c353f7..0000000000 --- a/libs/libsndfile/src/GSM610/gsm_option.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -#include "gsm610_priv.h" - -#include "gsm.h" - -int gsm_option (gsm r, int opt, int * val) -{ - int result = -1; - - switch (opt) { - case GSM_OPT_LTP_CUT: -#ifdef LTP_CUT - result = r->ltp_cut; - if (val) r->ltp_cut = *val; -#endif - break; - - case GSM_OPT_VERBOSE: -#ifndef NDEBUG - result = r->verbose; - if (val) r->verbose = *val; -#endif - break; - - case GSM_OPT_FAST: - -#if defined(FAST) && defined(USE_FLOAT_MUL) - result = r->fast; - if (val) r->fast = !!*val; -#endif - break; - - case GSM_OPT_FRAME_CHAIN: - -#ifdef WAV49 - result = r->frame_chain; - if (val) r->frame_chain = *val; -#endif - break; - - case GSM_OPT_FRAME_INDEX: - -#ifdef WAV49 - result = r->frame_index; - if (val) r->frame_index = *val; -#endif - break; - - case GSM_OPT_WAV49: - -#ifdef WAV49 - result = r->wav_fmt; - if (val) r->wav_fmt = !!*val; -#endif - break; - - default: - break; - } - return result; -} diff --git a/libs/libsndfile/src/GSM610/long_term.c b/libs/libsndfile/src/GSM610/long_term.c deleted file mode 100644 index 0d2cd0ff47..0000000000 --- a/libs/libsndfile/src/GSM610/long_term.c +++ /dev/null @@ -1,959 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -#include -#include - -#include "gsm610_priv.h" - -/* - * 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION - */ - - -/* - * This module computes the LTP gain (bc) and the LTP lag (Nc) - * for the long term analysis filter. This is done by calculating a - * maximum of the cross-correlation function between the current - * sub-segment short term residual signal d[0..39] (output of - * the short term analysis filter; for simplification the index - * of this array begins at 0 and ends at 39 for each sub-segment of the - * RPE-LTP analysis) and the previous reconstructed short term - * residual signal dp[ -120 .. -1 ]. A dynamic scaling must be - * performed to avoid overflow. - */ - - /* The next procedure exists in six versions. First two integer - * version (if USE_FLOAT_MUL is not defined); then four floating - * point versions, twice with proper scaling (USE_FLOAT_MUL defined), - * once without (USE_FLOAT_MUL and FAST defined, and fast run-time - * option used). Every pair has first a Cut version (see the -C - * option to toast or the LTP_CUT option to gsm_option()), then the - * uncut one. (For a detailed explanation of why this is altogether - * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered - * Harmful''.) - */ - -#ifndef USE_FLOAT_MUL - -#ifdef LTP_CUT - -static void Cut_Calculation_of_the_LTP_parameters ( - - struct gsm_state * st, - - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - word wt[40]; - - longword L_result; - longword L_max, L_power; - word R, S, dmax, scal, best_k; - word ltp_cut; - - register word temp, wt_k; - - /* Search of the optimum scaling of d[0..39]. - */ - dmax = 0; - for (k = 0; k <= 39; k++) { - temp = d[k]; - temp = GSM_ABS( temp ); - if (temp > dmax) { - dmax = temp; - best_k = k; - } - } - temp = 0; - if (dmax == 0) scal = 0; - else { - assert(dmax > 0); - temp = gsm_norm( (longword)dmax << 16 ); - } - if (temp > 6) scal = 0; - else scal = 6 - temp; - assert(scal >= 0); - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - wt_k = SASR_W(d[best_k], scal); - - for (lambda = 40; lambda <= 120; lambda++) { - L_result = (longword)wt_k * dp[best_k - lambda]; - if (L_result > L_max) { - Nc = lambda; - L_max = L_result; - } - } - *Nc_out = Nc; - L_max <<= 1; - - /* Rescaling of L_max - */ - assert(scal <= 100 && scal >= -100); - L_max = L_max >> (6 - scal); /* sub(6, scal) */ - - assert( Nc <= 120 && Nc >= 40); - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - L_power = 0; - for (k = 0; k <= 39; k++) { - - register longword L_temp; - - L_temp = SASR_W( dp[k - Nc], 3 ); - L_power += L_temp * L_temp; - } - L_power <<= 1; /* from L_MULT */ - - /* Normalization of L_max and L_power - */ - - if (L_max <= 0) { - *bc_out = 0; - return; - } - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - temp = gsm_norm( L_power ); - - R = SASR( L_max << temp, 16 ); - S = SASR( L_power << temp, 16 ); - - /* Coding of the LTP gain - */ - - /* Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; - *bc_out = bc; -} - -#endif /* LTP_CUT */ - -static void Calculation_of_the_LTP_parameters ( - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - word wt[40]; - - longword L_max, L_power; - word R, S, dmax, scal; - register word temp; - - /* Search of the optimum scaling of d[0..39]. - */ - dmax = 0; - - for (k = 0; k <= 39; k++) { - temp = d[k]; - temp = GSM_ABS( temp ); - if (temp > dmax) dmax = temp; - } - - temp = 0; - if (dmax == 0) scal = 0; - else { - assert(dmax > 0); - temp = gsm_norm( (longword)dmax << 16 ); - } - - if (temp > 6) scal = 0; - else scal = 6 - temp; - - assert(scal >= 0); - - /* Initialization of a working array wt - */ - - for (k = 0; k <= 39; k++) wt[k] = SASR_W( d[k], scal ); - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda++) { - -# undef STEP -# define STEP(k) (longword)wt[k] * dp[k - lambda] - - register longword L_result; - - L_result = STEP(0) ; L_result += STEP(1) ; - L_result += STEP(2) ; L_result += STEP(3) ; - L_result += STEP(4) ; L_result += STEP(5) ; - L_result += STEP(6) ; L_result += STEP(7) ; - L_result += STEP(8) ; L_result += STEP(9) ; - L_result += STEP(10) ; L_result += STEP(11) ; - L_result += STEP(12) ; L_result += STEP(13) ; - L_result += STEP(14) ; L_result += STEP(15) ; - L_result += STEP(16) ; L_result += STEP(17) ; - L_result += STEP(18) ; L_result += STEP(19) ; - L_result += STEP(20) ; L_result += STEP(21) ; - L_result += STEP(22) ; L_result += STEP(23) ; - L_result += STEP(24) ; L_result += STEP(25) ; - L_result += STEP(26) ; L_result += STEP(27) ; - L_result += STEP(28) ; L_result += STEP(29) ; - L_result += STEP(30) ; L_result += STEP(31) ; - L_result += STEP(32) ; L_result += STEP(33) ; - L_result += STEP(34) ; L_result += STEP(35) ; - L_result += STEP(36) ; L_result += STEP(37) ; - L_result += STEP(38) ; L_result += STEP(39) ; - - if (L_result > L_max) { - - Nc = lambda; - L_max = L_result; - } - } - - *Nc_out = Nc; - - L_max <<= 1; - - /* Rescaling of L_max - */ - assert(scal <= 100 && scal >= -100); - L_max = L_max >> (6 - scal); /* sub(6, scal) */ - - assert( Nc <= 120 && Nc >= 40); - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - L_power = 0; - for (k = 0; k <= 39; k++) { - - register longword L_temp; - - L_temp = SASR_W( dp[k - Nc], 3 ); - L_power += L_temp * L_temp; - } - L_power <<= 1; /* from L_MULT */ - - /* Normalization of L_max and L_power - */ - - if (L_max <= 0) { - *bc_out = 0; - return; - } - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - temp = gsm_norm( L_power ); - - R = SASR_L( L_max << temp, 16 ); - S = SASR_L( L_power << temp, 16 ); - - /* Coding of the LTP gain - */ - - /* Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; - *bc_out = bc; -} - -#else /* USE_FLOAT_MUL */ - -#ifdef LTP_CUT - -static void Cut_Calculation_of_the_LTP_parameters ( - struct gsm_state * st, /* IN */ - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - word ltp_cut; - - float wt_float[40]; - float dp_float_base[120], * dp_float = dp_float_base + 120; - - longword L_max, L_power; - word R, S, dmax, scal; - register word temp; - - /* Search of the optimum scaling of d[0..39]. - */ - dmax = 0; - - for (k = 0; k <= 39; k++) { - temp = d[k]; - temp = GSM_ABS( temp ); - if (temp > dmax) dmax = temp; - } - - temp = 0; - if (dmax == 0) scal = 0; - else { - assert(dmax > 0); - temp = gsm_norm( (longword)dmax << 16 ); - } - - if (temp > 6) scal = 0; - else scal = 6 - temp; - - assert(scal >= 0); - ltp_cut = (longword)SASR_W(dmax, scal) * st->ltp_cut / 100; - - - /* Initialization of a working array wt - */ - - for (k = 0; k < 40; k++) { - register word w = SASR_W( d[k], scal ); - if (w < 0 ? w > -ltp_cut : w < ltp_cut) { - wt_float[k] = 0.0; - } - else { - wt_float[k] = w; - } - } - for (k = -120; k < 0; k++) dp_float[k] = dp[k]; - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda += 9) { - - /* Calculate L_result for l = lambda .. lambda + 9. - */ - register float *lp = dp_float - lambda; - - register float W; - register float a = lp[-8], b = lp[-7], c = lp[-6], - d = lp[-5], e = lp[-4], f = lp[-3], - g = lp[-2], h = lp[-1]; - register float E; - register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, - S5 = 0, S6 = 0, S7 = 0, S8 = 0; - -# undef STEP -# define STEP(K, a, b, c, d, e, f, g, h) \ - if ((W = wt_float[K]) != 0.0) { \ - E = W * a; S8 += E; \ - E = W * b; S7 += E; \ - E = W * c; S6 += E; \ - E = W * d; S5 += E; \ - E = W * e; S4 += E; \ - E = W * f; S3 += E; \ - E = W * g; S2 += E; \ - E = W * h; S1 += E; \ - a = lp[K]; \ - E = W * a; S0 += E; } else (a = lp[K]) - -# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) -# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) -# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) -# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) -# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) -# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) -# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) -# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) - - STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); - STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); - - STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); - STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); - - STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); - STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); - - STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); - STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); - - STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); - STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); - -# undef STEP_A -# undef STEP_B -# undef STEP_C -# undef STEP_D -# undef STEP_E -# undef STEP_F -# undef STEP_G -# undef STEP_H - - if (S0 > L_max) { L_max = S0; Nc = lambda; } - if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } - if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } - if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } - if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } - if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } - if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } - if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } - if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } - - } - *Nc_out = Nc; - - L_max <<= 1; - - /* Rescaling of L_max - */ - assert(scal <= 100 && scal >= -100); - L_max = L_max >> (6 - scal); /* sub(6, scal) */ - - assert( Nc <= 120 && Nc >= 40); - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - L_power = 0; - for (k = 0; k <= 39; k++) { - - register longword L_temp; - - L_temp = SASR_W( dp[k - Nc], 3 ); - L_power += L_temp * L_temp; - } - L_power <<= 1; /* from L_MULT */ - - /* Normalization of L_max and L_power - */ - - if (L_max <= 0) { - *bc_out = 0; - return; - } - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - temp = gsm_norm( L_power ); - - R = SASR( L_max << temp, 16 ); - S = SASR( L_power << temp, 16 ); - - /* Coding of the LTP gain - */ - - /* Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; - *bc_out = bc; -} - -#endif /* LTP_CUT */ - -static void Calculation_of_the_LTP_parameters ( - register word * din, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - - float wt_float[40]; - float dp_float_base[120], * dp_float = dp_float_base + 120; - - longword L_max, L_power; - word R, S, dmax, scal; - register word temp; - - /* Search of the optimum scaling of d[0..39]. - */ - dmax = 0; - - for (k = 0; k <= 39; k++) { - temp = din [k] ; - temp = GSM_ABS (temp) ; - if (temp > dmax) dmax = temp; - } - - temp = 0; - if (dmax == 0) scal = 0; - else { - assert(dmax > 0); - temp = gsm_norm( (longword)dmax << 16 ); - } - - if (temp > 6) scal = 0; - else scal = 6 - temp; - - assert(scal >= 0); - - /* Initialization of a working array wt - */ - - for (k = 0; k < 40; k++) wt_float[k] = SASR_W (din [k], scal) ; - for (k = -120; k < 0; k++) dp_float[k] = dp[k]; - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda += 9) { - - /* Calculate L_result for l = lambda .. lambda + 9. - */ - register float *lp = dp_float - lambda; - - register float W; - register float a = lp[-8], b = lp[-7], c = lp[-6], - d = lp[-5], e = lp[-4], f = lp[-3], - g = lp[-2], h = lp[-1]; - register float E; - register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, - S5 = 0, S6 = 0, S7 = 0, S8 = 0; - -# undef STEP -# define STEP(K, a, b, c, d, e, f, g, h) \ - W = wt_float[K]; \ - E = W * a; S8 += E; \ - E = W * b; S7 += E; \ - E = W * c; S6 += E; \ - E = W * d; S5 += E; \ - E = W * e; S4 += E; \ - E = W * f; S3 += E; \ - E = W * g; S2 += E; \ - E = W * h; S1 += E; \ - a = lp[K]; \ - E = W * a; S0 += E - -# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) -# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) -# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) -# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) -# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) -# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) -# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) -# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) - - STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); - STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); - - STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); - STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); - - STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); - STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); - - STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); - STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); - - STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); - STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); - -# undef STEP_A -# undef STEP_B -# undef STEP_C -# undef STEP_D -# undef STEP_E -# undef STEP_F -# undef STEP_G -# undef STEP_H - - if (S0 > L_max) { L_max = S0; Nc = lambda; } - if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } - if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } - if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } - if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } - if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } - if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } - if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } - if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } - } - *Nc_out = Nc; - - L_max <<= 1; - - /* Rescaling of L_max - */ - assert(scal <= 100 && scal >= -100); - L_max = L_max >> (6 - scal); /* sub(6, scal) */ - - assert( Nc <= 120 && Nc >= 40); - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - L_power = 0; - for (k = 0; k <= 39; k++) { - - register longword L_temp; - - L_temp = SASR_W( dp[k - Nc], 3 ); - L_power += L_temp * L_temp; - } - L_power <<= 1; /* from L_MULT */ - - /* Normalization of L_max and L_power - */ - - if (L_max <= 0) { - *bc_out = 0; - return; - } - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - temp = gsm_norm( L_power ); - - R = SASR_L ( L_max << temp, 16 ); - S = SASR_L ( L_power << temp, 16 ); - - /* Coding of the LTP gain - */ - - /* Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; - *bc_out = bc; -} - -#ifdef FAST -#ifdef LTP_CUT - -static void Cut_Fast_Calculation_of_the_LTP_parameters ( - struct gsm_state * st, /* IN */ - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - register float wt_float; - word Nc, bc; - word wt_max, best_k, ltp_cut; - - float dp_float_base[120], * dp_float = dp_float_base + 120; - - register float L_result, L_max, L_power; - - wt_max = 0; - - for (k = 0; k < 40; ++k) { - if ( d[k] > wt_max) wt_max = d[best_k = k]; - else if (-d[k] > wt_max) wt_max = -d[best_k = k]; - } - - assert(wt_max >= 0); - wt_float = (float)wt_max; - - for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k]; - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda++) { - L_result = wt_float * dp_float[best_k - lambda]; - if (L_result > L_max) { - Nc = lambda; - L_max = L_result; - } - } - - *Nc_out = Nc; - if (L_max <= 0.) { - *bc_out = 0; - return; - } - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - dp_float -= Nc; - L_power = 0; - for (k = 0; k < 40; ++k) { - register float f = dp_float[k]; - L_power += f * f; - } - - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - /* Coding of the LTP gain - * Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - lambda = L_max / L_power * 32768.; - for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break; - *bc_out = bc; -} - -#endif /* LTP_CUT */ - -static void Fast_Calculation_of_the_LTP_parameters ( - register word * din, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - - float wt_float[40]; - float dp_float_base[120], * dp_float = dp_float_base + 120; - - register float L_max, L_power; - - for (k = 0; k < 40; ++k) wt_float[k] = (float) din [k] ; - for (k = -120; k < 0; ++k) dp_float[k] = (float) dp [k] ; - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda += 9) { - - /* Calculate L_result for l = lambda .. lambda + 9. - */ - register float *lp = dp_float - lambda; - - register float W; - register float a = lp[-8], b = lp[-7], c = lp[-6], - d = lp[-5], e = lp[-4], f = lp[-3], - g = lp[-2], h = lp[-1]; - register float E; - register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, - S5 = 0, S6 = 0, S7 = 0, S8 = 0; - -# undef STEP -# define STEP(K, a, b, c, d, e, f, g, h) \ - W = wt_float[K]; \ - E = W * a; S8 += E; \ - E = W * b; S7 += E; \ - E = W * c; S6 += E; \ - E = W * d; S5 += E; \ - E = W * e; S4 += E; \ - E = W * f; S3 += E; \ - E = W * g; S2 += E; \ - E = W * h; S1 += E; \ - a = lp[K]; \ - E = W * a; S0 += E - -# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) -# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) -# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) -# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) -# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) -# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) -# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) -# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) - - STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); - STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); - - STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); - STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); - - STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); - STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); - - STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); - STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); - - STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); - STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); - - if (S0 > L_max) { L_max = S0; Nc = lambda; } - if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } - if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } - if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } - if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } - if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } - if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } - if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } - if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } - } - *Nc_out = Nc; - - if (L_max <= 0.) { - *bc_out = 0; - return; - } - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - dp_float -= Nc; - L_power = 0; - for (k = 0; k < 40; ++k) { - register float f = dp_float[k]; - L_power += f * f; - } - - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - /* Coding of the LTP gain - * Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - lambda = L_max / L_power * 32768.; - for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break; - *bc_out = bc; -} - -#endif /* FAST */ -#endif /* USE_FLOAT_MUL */ - - -/* 4.2.12 */ - -static void Long_term_analysis_filtering ( - word bc, /* IN */ - word Nc, /* IN */ - register word * dp, /* previous d [-120..-1] IN */ - register word * d, /* d [0..39] IN */ - register word * dpp, /* estimate [0..39] OUT */ - register word * e /* long term res. signal [0..39] OUT */ -) -/* - * In this part, we have to decode the bc parameter to compute - * the samples of the estimate dpp[0..39]. The decoding of bc needs the - * use of table 4.3b. The long term residual signal e[0..39] - * is then calculated to be fed to the RPE encoding section. - */ -{ - register int k; - -# undef STEP -# define STEP(BP) \ - for (k = 0; k <= 39; k++) { \ - dpp[k] = GSM_MULT_R( BP, dp[k - Nc]); \ - e[k] = GSM_SUB( d[k], dpp[k] ); \ - } - - switch (bc) { - case 0: STEP( 3277 ); break; - case 1: STEP( 11469 ); break; - case 2: STEP( 21299 ); break; - case 3: STEP( 32767 ); break; - } -} - -void Gsm_Long_Term_Predictor ( /* 4x for 160 samples */ - - struct gsm_state * S, - - word * d, /* [0..39] residual signal IN */ - word * dp, /* [-120..-1] d' IN */ - - word * e, /* [0..39] OUT */ - word * dpp, /* [0..39] OUT */ - word * Nc, /* correlation lag OUT */ - word * bc /* gain factor OUT */ -) -{ - assert( d ); assert( dp ); assert( e ); - assert( dpp); assert( Nc ); assert( bc ); - -#if defined(FAST) && defined(USE_FLOAT_MUL) - if (S->fast) -#if defined (LTP_CUT) - if (S->ltp_cut) - Cut_Fast_Calculation_of_the_LTP_parameters(S, - d, dp, bc, Nc); - else -#endif /* LTP_CUT */ - Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc ); - else -#endif /* FAST & USE_FLOAT_MUL */ -#ifdef LTP_CUT - if (S->ltp_cut) - Cut_Calculation_of_the_LTP_parameters(S, d, dp, bc, Nc); - else -#endif - Calculation_of_the_LTP_parameters(d, dp, bc, Nc); - - Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e ); -} - -/* 4.3.2 */ -void Gsm_Long_Term_Synthesis_Filtering ( - struct gsm_state * S, - - word Ncr, - word bcr, - register word * erp, /* [0..39] IN */ - register word * drp /* [-120..-1] IN, [-120..40] OUT */ -) -/* - * This procedure uses the bcr and Ncr parameter to realize the - * long term synthesis filtering. The decoding of bcr needs - * table 4.3b. - */ -{ - register int k; - word brp, drpp, Nr; - - /* Check the limits of Nr. - */ - Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr; - S->nrp = Nr; - assert(Nr >= 40 && Nr <= 120); - - /* Decoding of the LTP gain bcr - */ - brp = gsm_QLB[ bcr ]; - - /* Computation of the reconstructed short term residual - * signal drp[0..39] - */ - assert(brp != MIN_WORD); - - for (k = 0; k <= 39; k++) { - drpp = GSM_MULT_R( brp, drp[ k - Nr ] ); - drp[k] = GSM_ADD( erp[k], drpp ); - } - - /* - * Update of the reconstructed short term residual signal - * drp[ -1..-120 ] - */ - - for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ]; -} diff --git a/libs/libsndfile/src/GSM610/lpc.c b/libs/libsndfile/src/GSM610/lpc.c deleted file mode 100644 index 0e776e3639..0000000000 --- a/libs/libsndfile/src/GSM610/lpc.c +++ /dev/null @@ -1,331 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -#include -#include - -#include "gsm610_priv.h" - -/* - * 4.2.4 .. 4.2.7 LPC ANALYSIS SECTION - */ - -/* 4.2.4 */ - - -static void Autocorrelation ( - word * s, /* [0..159] IN/OUT */ - longword * L_ACF) /* [0..8] OUT */ -/* - * The goal is to compute the array L_ACF[k]. The signal s[i] must - * be scaled in order to avoid an overflow situation. - */ -{ - register int k, i; - - word temp, smax, scalauto; - -#ifdef USE_FLOAT_MUL - float float_s[160]; -#endif - - /* Dynamic scaling of the array s[0..159] - */ - - /* Search for the maximum. - */ - smax = 0; - for (k = 0; k <= 159; k++) { - temp = GSM_ABS( s[k] ); - if (temp > smax) smax = temp; - } - - /* Computation of the scaling factor. - */ - if (smax == 0) scalauto = 0; - else { - assert(smax > 0); - scalauto = 4 - gsm_norm( (longword)smax << 16 );/* sub(4,..) */ - } - - /* Scaling of the array s[0...159] - */ - - if (scalauto > 0) { - -# ifdef USE_FLOAT_MUL -# define SCALE(n) \ - case n: for (k = 0; k <= 159; k++) \ - float_s[k] = (float) \ - (s[k] = GSM_MULT_R(s[k], 16384 >> (n-1)));\ - break; -# else -# define SCALE(n) \ - case n: for (k = 0; k <= 159; k++) \ - s[k] = GSM_MULT_R( s[k], 16384 >> (n-1) );\ - break; -# endif /* USE_FLOAT_MUL */ - - switch (scalauto) { - SCALE(1) - SCALE(2) - SCALE(3) - SCALE(4) - } -# undef SCALE - } -# ifdef USE_FLOAT_MUL - else for (k = 0; k <= 159; k++) float_s[k] = (float) s[k]; -# endif - - /* Compute the L_ACF[..]. - */ - { -# ifdef USE_FLOAT_MUL - register float * sp = float_s; - register float sl = *sp; - -# define STEP(k) L_ACF[k] += (longword)(sl * sp[ -(k) ]); -# else - word * sp = s; - word sl = *sp; - -# define STEP(k) L_ACF[k] += ((longword)sl * sp[ -(k) ]); -# endif - -# define NEXTI sl = *++sp - - - for (k = 9; k--; L_ACF[k] = 0) ; - - STEP (0); - NEXTI; - STEP(0); STEP(1); - NEXTI; - STEP(0); STEP(1); STEP(2); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7); - - for (i = 8; i <= 159; i++) { - - NEXTI; - - STEP(0); - STEP(1); STEP(2); STEP(3); STEP(4); - STEP(5); STEP(6); STEP(7); STEP(8); - } - - for (k = 9; k--; L_ACF[k] <<= 1) ; - - } - /* Rescaling of the array s[0..159] - */ - if (scalauto > 0) { - assert(scalauto <= 4); - for (k = 160; k--; *s++ <<= scalauto) ; - } -} - -#if defined(USE_FLOAT_MUL) && defined(FAST) - -static void Fast_Autocorrelation ( - word * s, /* [0..159] IN/OUT */ - longword * L_ACF) /* [0..8] OUT */ -{ - register int k, i; - float f_L_ACF[9]; - float scale; - - float s_f[160]; - register float *sf = s_f; - - for (i = 0; i < 160; ++i) sf[i] = s[i]; - for (k = 0; k <= 8; k++) { - register float L_temp2 = 0; - register float *sfl = sf - k; - for (i = k; i < 160; ++i) L_temp2 += sf[i] * sfl[i]; - f_L_ACF[k] = L_temp2; - } - scale = MAX_LONGWORD / f_L_ACF[0]; - - for (k = 0; k <= 8; k++) { - L_ACF[k] = f_L_ACF[k] * scale; - } -} -#endif /* defined (USE_FLOAT_MUL) && defined (FAST) */ - -/* 4.2.5 */ - -static void Reflection_coefficients ( - longword * L_ACF, /* 0...8 IN */ - register word * r /* 0...7 OUT */ -) -{ - register int i, m, n; - register word temp; - word ACF[9]; /* 0..8 */ - word P[ 9]; /* 0..8 */ - word K[ 9]; /* 2..8 */ - - /* Schur recursion with 16 bits arithmetic. - */ - - if (L_ACF[0] == 0) { - for (i = 8; i--; *r++ = 0) ; - return; - } - - assert( L_ACF[0] != 0 ); - temp = gsm_norm( L_ACF[0] ); - - assert(temp >= 0 && temp < 32); - - /* ? overflow ? */ - for (i = 0; i <= 8; i++) ACF[i] = SASR_L( L_ACF[i] << temp, 16 ); - - /* Initialize array P[..] and K[..] for the recursion. - */ - - for (i = 1; i <= 7; i++) K[ i ] = ACF[ i ]; - for (i = 0; i <= 8; i++) P[ i ] = ACF[ i ]; - - /* Compute reflection coefficients - */ - for (n = 1; n <= 8; n++, r++) { - - temp = P[1]; - temp = GSM_ABS(temp); - if (P[0] < temp) { - for (i = n; i <= 8; i++) *r++ = 0; - return; - } - - *r = gsm_div( temp, P[0] ); - - assert(*r >= 0); - if (P[1] > 0) *r = -*r; /* r[n] = sub(0, r[n]) */ - assert (*r != MIN_WORD); - if (n == 8) return; - - /* Schur recursion - */ - temp = GSM_MULT_R( P[1], *r ); - P[0] = GSM_ADD( P[0], temp ); - - for (m = 1; m <= 8 - n; m++) { - temp = GSM_MULT_R( K[ m ], *r ); - P[m] = GSM_ADD( P[ m+1 ], temp ); - - temp = GSM_MULT_R( P[ m+1 ], *r ); - K[m] = GSM_ADD( K[ m ], temp ); - } - } -} - -/* 4.2.6 */ - -static void Transformation_to_Log_Area_Ratios ( - register word * r /* 0..7 IN/OUT */ -) -/* - * The following scaling for r[..] and LAR[..] has been used: - * - * r[..] = integer( real_r[..]*32768. ); -1 <= real_r < 1. - * LAR[..] = integer( real_LAR[..] * 16384 ); - * with -1.625 <= real_LAR <= 1.625 - */ -{ - register word temp; - register int i; - - - /* Computation of the LAR[0..7] from the r[0..7] - */ - for (i = 1; i <= 8; i++, r++) { - - temp = *r; - temp = GSM_ABS(temp); - assert(temp >= 0); - - if (temp < 22118) { - temp >>= 1; - } else if (temp < 31130) { - assert( temp >= 11059 ); - temp -= 11059; - } else { - assert( temp >= 26112 ); - temp -= 26112; - temp <<= 2; - } - - *r = *r < 0 ? -temp : temp; - assert( *r != MIN_WORD ); - } -} - -/* 4.2.7 */ - -static void Quantization_and_coding ( - register word * LAR /* [0..7] IN/OUT */ -) -{ - register word temp; - - /* This procedure needs four tables; the following equations - * give the optimum scaling for the constants: - * - * A[0..7] = integer( real_A[0..7] * 1024 ) - * B[0..7] = integer( real_B[0..7] * 512 ) - * MAC[0..7] = maximum of the LARc[0..7] - * MIC[0..7] = minimum of the LARc[0..7] - */ - -# undef STEP -# define STEP( A, B, MAC, MIC ) \ - temp = GSM_MULT( A, *LAR ); \ - temp = GSM_ADD( temp, B ); \ - temp = GSM_ADD( temp, 256 ); \ - temp = SASR_W( temp, 9 ); \ - *LAR = temp>MAC ? MAC - MIC : (tempfast) Fast_Autocorrelation (s, L_ACF ); - else -#endif - Autocorrelation (s, L_ACF ); - Reflection_coefficients (L_ACF, LARc ); - Transformation_to_Log_Area_Ratios (LARc); - Quantization_and_coding (LARc); -} diff --git a/libs/libsndfile/src/GSM610/preprocess.c b/libs/libsndfile/src/GSM610/preprocess.c deleted file mode 100644 index 723e226a56..0000000000 --- a/libs/libsndfile/src/GSM610/preprocess.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -#include -#include - -#include "gsm610_priv.h" - -/* 4.2.0 .. 4.2.3 PREPROCESSING SECTION - * - * After A-law to linear conversion (or directly from the - * Ato D converter) the following scaling is assumed for - * input to the RPE-LTP algorithm: - * - * in: 0.1.....................12 - * S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.* - * - * Where S is the sign bit, v a valid bit, and * a "don't care" bit. - * The original signal is called sop[..] - * - * out: 0.1................... 12 - * S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0 - */ - - -void Gsm_Preprocess ( - struct gsm_state * S, - word * s, - word * so ) /* [0..159] IN/OUT */ -{ - - word z1 = S->z1; - longword L_z2 = S->L_z2; - word mp = S->mp; - - word s1; - longword L_s2; - - longword L_temp; - - word msp, lsp; - word SO; - - register int k = 160; - - while (k--) { - - /* 4.2.1 Downscaling of the input signal - */ - SO = SASR_W( *s, 3 ) << 2; - s++; - - assert (SO >= -0x4000); /* downscaled by */ - assert (SO <= 0x3FFC); /* previous routine. */ - - - /* 4.2.2 Offset compensation - * - * This part implements a high-pass filter and requires extended - * arithmetic precision for the recursive part of this filter. - * The input of this procedure is the array so[0...159] and the - * output the array sof[ 0...159 ]. - */ - /* Compute the non-recursive part - */ - - s1 = SO - z1; /* s1 = gsm_sub( *so, z1 ); */ - z1 = SO; - - assert(s1 != MIN_WORD); - - /* Compute the recursive part - */ - L_s2 = s1; - L_s2 <<= 15; - - /* Execution of a 31 bv 16 bits multiplication - */ - - msp = SASR_L( L_z2, 15 ); - lsp = L_z2-((longword)msp<<15); /* gsm_L_sub(L_z2,(msp<<15)); */ - - L_s2 += GSM_MULT_R( lsp, 32735 ); - L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/ - L_z2 = GSM_L_ADD( L_temp, L_s2 ); - - /* Compute sof[k] with rounding - */ - L_temp = GSM_L_ADD( L_z2, 16384 ); - - /* 4.2.3 Preemphasis - */ - - msp = GSM_MULT_R( mp, -28180 ); - mp = SASR_L( L_temp, 15 ); - *so++ = GSM_ADD( mp, msp ); - } - - S->z1 = z1; - S->L_z2 = L_z2; - S->mp = mp; -} diff --git a/libs/libsndfile/src/GSM610/rpe.c b/libs/libsndfile/src/GSM610/rpe.c deleted file mode 100644 index d8f931e214..0000000000 --- a/libs/libsndfile/src/GSM610/rpe.c +++ /dev/null @@ -1,480 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -#include -#include - -#include "gsm610_priv.h" - -/* 4.2.13 .. 4.2.17 RPE ENCODING SECTION - */ - -/* 4.2.13 */ - -static void Weighting_filter ( - register word * e, /* signal [-5..0.39.44] IN */ - word * x /* signal [0..39] OUT */ -) -/* - * The coefficients of the weighting filter are stored in a table - * (see table 4.4). The following scaling is used: - * - * H[0..10] = integer( real_H[ 0..10] * 8192 ); - */ -{ - /* word wt[ 50 ]; */ - - register longword L_result; - register int k /* , i */ ; - - /* Initialization of a temporary working array wt[0...49] - */ - - /* for (k = 0; k <= 4; k++) wt[k] = 0; - * for (k = 5; k <= 44; k++) wt[k] = *e++; - * for (k = 45; k <= 49; k++) wt[k] = 0; - * - * (e[-5..-1] and e[40..44] are allocated by the caller, - * are initially zero and are not written anywhere.) - */ - e -= 5; - - /* Compute the signal x[0..39] - */ - for (k = 0; k <= 39; k++) { - - L_result = 8192 >> 1; - - /* for (i = 0; i <= 10; i++) { - * L_temp = GSM_L_MULT( wt[k+i], gsm_H[i] ); - * L_result = GSM_L_ADD( L_result, L_temp ); - * } - */ - -#undef STEP -#define STEP( i, H ) (e[ k + i ] * (longword)H) - - /* Every one of these multiplications is done twice -- - * but I don't see an elegant way to optimize this. - * Do you? - */ - -#ifdef STUPID_COMPILER - L_result += STEP( 0, -134 ) ; - L_result += STEP( 1, -374 ) ; - /* + STEP( 2, 0 ) */ - L_result += STEP( 3, 2054 ) ; - L_result += STEP( 4, 5741 ) ; - L_result += STEP( 5, 8192 ) ; - L_result += STEP( 6, 5741 ) ; - L_result += STEP( 7, 2054 ) ; - /* + STEP( 8, 0 ) */ - L_result += STEP( 9, -374 ) ; - L_result += STEP( 10, -134 ) ; -#else - L_result += - STEP( 0, -134 ) - + STEP( 1, -374 ) - /* + STEP( 2, 0 ) */ - + STEP( 3, 2054 ) - + STEP( 4, 5741 ) - + STEP( 5, 8192 ) - + STEP( 6, 5741 ) - + STEP( 7, 2054 ) - /* + STEP( 8, 0 ) */ - + STEP( 9, -374 ) - + STEP(10, -134 ) - ; -#endif - - /* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *) - * L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *) - * - * x[k] = SASR( L_result, 16 ); - */ - - /* 2 adds vs. >>16 => 14, minus one shift to compensate for - * those we lost when replacing L_MULT by '*'. - */ - - L_result = SASR_L( L_result, 13 ); - x[k] = ( L_result < MIN_WORD ? MIN_WORD - : (L_result > MAX_WORD ? MAX_WORD : L_result )); - } -} - -/* 4.2.14 */ - -static void RPE_grid_selection ( - word * x, /* [0..39] IN */ - word * xM, /* [0..12] OUT */ - word * Mc_out /* OUT */ -) -/* - * The signal x[0..39] is used to select the RPE grid which is - * represented by Mc. - */ -{ - /* register word temp1; */ - register int /* m, */ i; - register longword L_result, L_temp; - longword EM; /* xxx should be L_EM? */ - word Mc; - - longword L_common_0_3; - - EM = 0; - Mc = 0; - - /* for (m = 0; m <= 3; m++) { - * L_result = 0; - * - * - * for (i = 0; i <= 12; i++) { - * - * temp1 = SASR_W( x[m + 3*i], 2 ); - * - * assert(temp1 != MIN_WORD); - * - * L_temp = GSM_L_MULT( temp1, temp1 ); - * L_result = GSM_L_ADD( L_temp, L_result ); - * } - * - * if (L_result > EM) { - * Mc = m; - * EM = L_result; - * } - * } - */ - -#undef STEP -#define STEP( m, i ) L_temp = SASR_W( x[m + 3 * i], 2 ); \ - L_result += L_temp * L_temp; - - /* common part of 0 and 3 */ - - L_result = 0; - STEP( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 ); - STEP( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 ); - STEP( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12); - L_common_0_3 = L_result; - - /* i = 0 */ - - STEP( 0, 0 ); - L_result <<= 1; /* implicit in L_MULT */ - EM = L_result; - - /* i = 1 */ - - L_result = 0; - STEP( 1, 0 ); - STEP( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 ); - STEP( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 ); - STEP( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12); - L_result <<= 1; - if (L_result > EM) { - Mc = 1; - EM = L_result; - } - - /* i = 2 */ - - L_result = 0; - STEP( 2, 0 ); - STEP( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 ); - STEP( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 ); - STEP( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12); - L_result <<= 1; - if (L_result > EM) { - Mc = 2; - EM = L_result; - } - - /* i = 3 */ - - L_result = L_common_0_3; - STEP( 3, 12 ); - L_result <<= 1; - if (L_result > EM) { - Mc = 3; - EM = L_result; - } - - /**/ - - /* Down-sampling by a factor 3 to get the selected xM[0..12] - * RPE sequence. - */ - for (i = 0; i <= 12; i ++) xM[i] = x[Mc + 3*i]; - *Mc_out = Mc; -} - -/* 4.12.15 */ - -static void APCM_quantization_xmaxc_to_exp_mant ( - word xmaxc, /* IN */ - word * expon_out, /* OUT */ - word * mant_out ) /* OUT */ -{ - word expon, mant; - - /* Compute expononent and mantissa of the decoded version of xmaxc - */ - - expon = 0; - if (xmaxc > 15) expon = SASR_W(xmaxc, 3) - 1; - mant = xmaxc - (expon << 3); - - if (mant == 0) { - expon = -4; - mant = 7; - } - else { - while (mant <= 7) { - mant = mant << 1 | 1; - expon--; - } - mant -= 8; - } - - assert( expon >= -4 && expon <= 6 ); - assert( mant >= 0 && mant <= 7 ); - - *expon_out = expon; - *mant_out = mant; -} - -static void APCM_quantization ( - word * xM, /* [0..12] IN */ - word * xMc, /* [0..12] OUT */ - word * mant_out, /* OUT */ - word * expon_out, /* OUT */ - word * xmaxc_out /* OUT */ -) -{ - int i, itest; - - word xmax, xmaxc, temp, temp1, temp2; - word expon, mant; - - - /* Find the maximum absolute value xmax of xM[0..12]. - */ - - xmax = 0; - for (i = 0; i <= 12; i++) { - temp = xM[i]; - temp = GSM_ABS(temp); - if (temp > xmax) xmax = temp; - } - - /* Qantizing and coding of xmax to get xmaxc. - */ - - expon = 0; - temp = SASR_W( xmax, 9 ); - itest = 0; - - for (i = 0; i <= 5; i++) { - - itest |= (temp <= 0); - temp = SASR_W( temp, 1 ); - - assert(expon <= 5); - if (itest == 0) expon++; /* expon = add (expon, 1) */ - } - - assert(expon <= 6 && expon >= 0); - temp = expon + 5; - - assert(temp <= 11 && temp >= 0); - xmaxc = gsm_add( SASR_W(xmax, temp), (word) (expon << 3) ); - - /* Quantizing and coding of the xM[0..12] RPE sequence - * to get the xMc[0..12] - */ - - APCM_quantization_xmaxc_to_exp_mant( xmaxc, &expon, &mant ); - - /* This computation uses the fact that the decoded version of xmaxc - * can be calculated by using the expononent and the mantissa part of - * xmaxc (logarithmic table). - * So, this method avoids any division and uses only a scaling - * of the RPE samples by a function of the expononent. A direct - * multiplication by the inverse of the mantissa (NRFAC[0..7] - * found in table 4.5) gives the 3 bit coded version xMc[0..12] - * of the RPE samples. - */ - - - /* Direct computation of xMc[0..12] using table 4.5 - */ - - assert( expon <= 4096 && expon >= -4096); - assert( mant >= 0 && mant <= 7 ); - - temp1 = 6 - expon; /* normalization by the expononent */ - temp2 = gsm_NRFAC[ mant ]; /* inverse mantissa */ - - for (i = 0; i <= 12; i++) { - - assert(temp1 >= 0 && temp1 < 16); - - temp = xM[i] << temp1; - temp = GSM_MULT( temp, temp2 ); - temp = SASR_W(temp, 12); - xMc[i] = temp + 4; /* see note below */ - } - - /* NOTE: This equation is used to make all the xMc[i] positive. - */ - - *mant_out = mant; - *expon_out = expon; - *xmaxc_out = xmaxc; -} - -/* 4.2.16 */ - -static void APCM_inverse_quantization ( - register word * xMc, /* [0..12] IN */ - word mant, - word expon, - register word * xMp) /* [0..12] OUT */ -/* - * This part is for decoding the RPE sequence of coded xMc[0..12] - * samples to obtain the xMp[0..12] array. Table 4.6 is used to get - * the mantissa of xmaxc (FAC[0..7]). - */ -{ - int i; - word temp, temp1, temp2, temp3; - - assert( mant >= 0 && mant <= 7 ); - - temp1 = gsm_FAC[ mant ]; /* see 4.2-15 for mant */ - temp2 = gsm_sub( 6, expon ); /* see 4.2-15 for exp */ - temp3 = gsm_asl( 1, gsm_sub( temp2, 1 )); - - for (i = 13; i--;) { - - assert( *xMc <= 7 && *xMc >= 0 ); /* 3 bit unsigned */ - - /* temp = gsm_sub( *xMc++ << 1, 7 ); */ - temp = (*xMc++ << 1) - 7; /* restore sign */ - assert( temp <= 7 && temp >= -7 ); /* 4 bit signed */ - - temp <<= 12; /* 16 bit signed */ - temp = GSM_MULT_R( temp1, temp ); - temp = GSM_ADD( temp, temp3 ); - *xMp++ = gsm_asr( temp, temp2 ); - } -} - -/* 4.2.17 */ - -static void RPE_grid_positioning ( - word Mc, /* grid position IN */ - register word * xMp, /* [0..12] IN */ - register word * ep /* [0..39] OUT */ -) -/* - * This procedure computes the reconstructed long term residual signal - * ep[0..39] for the LTP analysis filter. The inputs are the Mc - * which is the grid position selection and the xMp[0..12] decoded - * RPE samples which are upsampled by a factor of 3 by inserting zero - * values. - */ -{ - int i = 13; - - assert(0 <= Mc && Mc <= 3); - - switch (Mc) { - case 3: *ep++ = 0; - case 2: do { - *ep++ = 0; - case 1: *ep++ = 0; - case 0: *ep++ = *xMp++; - } while (--i); - } - while (++Mc < 4) *ep++ = 0; - - /* - - int i, k; - for (k = 0; k <= 39; k++) ep[k] = 0; - for (i = 0; i <= 12; i++) { - ep[ Mc + (3*i) ] = xMp[i]; - } - */ -} - -/* 4.2.18 */ - -/* This procedure adds the reconstructed long term residual signal - * ep[0..39] to the estimated signal dpp[0..39] from the long term - * analysis filter to compute the reconstructed short term residual - * signal dp[-40..-1]; also the reconstructed short term residual - * array dp[-120..-41] is updated. - */ - -#if 0 /* Has been inlined in code.c */ -void Gsm_Update_of_reconstructed_short_time_residual_signal ( - word * dpp, /* [0...39] IN */ - word * ep, /* [0...39] IN */ - word * dp) /* [-120...-1] IN/OUT */ -{ - int k; - - for (k = 0; k <= 79; k++) - dp[ -120 + k ] = dp[ -80 + k ]; - - for (k = 0; k <= 39; k++) - dp[ -40 + k ] = gsm_add( ep[k], dpp[k] ); -} -#endif /* Has been inlined in code.c */ - -void Gsm_RPE_Encoding ( - /*-struct gsm_state * S,-*/ - - word * e, /* -5..-1][0..39][40..44 IN/OUT */ - word * xmaxc, /* OUT */ - word * Mc, /* OUT */ - word * xMc) /* [0..12] OUT */ -{ - word x[40]; - word xM[13], xMp[13]; - word mant, expon; - - Weighting_filter(e, x); - RPE_grid_selection(x, xM, Mc); - - APCM_quantization( xM, xMc, &mant, &expon, xmaxc); - APCM_inverse_quantization( xMc, mant, expon, xMp); - - RPE_grid_positioning( *Mc, xMp, e ); - -} - -void Gsm_RPE_Decoding ( - /*-struct gsm_state * S,-*/ - - word xmaxcr, - word Mcr, - word * xMcr, /* [0..12], 3 bits IN */ - word * erp /* [0..39] OUT */ -) -{ - word expon, mant; - word xMp[ 13 ]; - - APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &expon, &mant ); - APCM_inverse_quantization( xMcr, mant, expon, xMp ); - RPE_grid_positioning( Mcr, xMp, erp ); - -} diff --git a/libs/libsndfile/src/GSM610/short_term.c b/libs/libsndfile/src/GSM610/short_term.c deleted file mode 100644 index 904856318f..0000000000 --- a/libs/libsndfile/src/GSM610/short_term.c +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -#include -#include - -#include "gsm610_priv.h" - -/* - * SHORT TERM ANALYSIS FILTERING SECTION - */ - -/* 4.2.8 */ - -static void Decoding_of_the_coded_Log_Area_Ratios ( - word * LARc, /* coded log area ratio [0..7] IN */ - word * LARpp) /* out: decoded .. */ -{ - register word temp1 /* , temp2 */; - - /* This procedure requires for efficient implementation - * two tables. - * - * INVA[1..8] = integer( (32768 * 8) / real_A[1..8]) - * MIC[1..8] = minimum value of the LARc[1..8] - */ - - /* Compute the LARpp[1..8] - */ - - /* for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) { - * - * temp1 = GSM_ADD( *LARc, *MIC ) << 10; - * temp2 = *B << 1; - * temp1 = GSM_SUB( temp1, temp2 ); - * - * assert(*INVA != MIN_WORD); - * - * temp1 = GSM_MULT_R( *INVA, temp1 ); - * *LARpp = GSM_ADD( temp1, temp1 ); - * } - */ - -#undef STEP -#define STEP( B, MIC, INVA ) \ - temp1 = GSM_ADD( *LARc++, MIC ) << 10; \ - temp1 = GSM_SUB( temp1, B << 1 ); \ - temp1 = GSM_MULT_R( INVA, temp1 ); \ - *LARpp++ = GSM_ADD( temp1, temp1 ); - - STEP( 0, -32, 13107 ); - STEP( 0, -32, 13107 ); - STEP( 2048, -16, 13107 ); - STEP( -2560, -16, 13107 ); - - STEP( 94, -8, 19223 ); - STEP( -1792, -8, 17476 ); - STEP( -341, -4, 31454 ); - STEP( -1144, -4, 29708 ); - - /* NOTE: the addition of *MIC is used to restore - * the sign of *LARc. - */ -} - -/* 4.2.9 */ -/* Computation of the quantized reflection coefficients - */ - -/* 4.2.9.1 Interpolation of the LARpp[1..8] to get the LARp[1..8] - */ - -/* - * Within each frame of 160 analyzed speech samples the short term - * analysis and synthesis filters operate with four different sets of - * coefficients, derived from the previous set of decoded LARs(LARpp(j-1)) - * and the actual set of decoded LARs (LARpp(j)) - * - * (Initial value: LARpp(j-1)[1..8] = 0.) - */ - -static void Coefficients_0_12 ( - register word * LARpp_j_1, - register word * LARpp_j, - register word * LARp) -{ - register int i; - - for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) { - *LARp = GSM_ADD( SASR_W( *LARpp_j_1, 2 ), SASR_W( *LARpp_j, 2 )); - *LARp = GSM_ADD( *LARp, SASR_W( *LARpp_j_1, 1)); - } -} - -static void Coefficients_13_26 ( - register word * LARpp_j_1, - register word * LARpp_j, - register word * LARp) -{ - register int i; - for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { - *LARp = GSM_ADD( SASR_W( *LARpp_j_1, 1), SASR_W( *LARpp_j, 1 )); - } -} - -static void Coefficients_27_39 ( - register word * LARpp_j_1, - register word * LARpp_j, - register word * LARp) -{ - register int i; - - for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { - *LARp = GSM_ADD( SASR_W( *LARpp_j_1, 2 ), SASR_W( *LARpp_j, 2 )); - *LARp = GSM_ADD( *LARp, SASR_W( *LARpp_j, 1 )); - } -} - - -static void Coefficients_40_159 ( - register word * LARpp_j, - register word * LARp) -{ - register int i; - - for (i = 1; i <= 8; i++, LARp++, LARpp_j++) - *LARp = *LARpp_j; -} - -/* 4.2.9.2 */ - -static void LARp_to_rp ( - register word * LARp) /* [0..7] IN/OUT */ -/* - * The input of this procedure is the interpolated LARp[0..7] array. - * The reflection coefficients, rp[i], are used in the analysis - * filter and in the synthesis filter. - */ -{ - register int i; - register word temp; - - for (i = 1; i <= 8; i++, LARp++) { - - /* temp = GSM_ABS( *LARp ); - * - * if (temp < 11059) temp <<= 1; - * else if (temp < 20070) temp += 11059; - * else temp = GSM_ADD( temp >> 2, 26112 ); - * - * *LARp = *LARp < 0 ? -temp : temp; - */ - - if (*LARp < 0) { - temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp); - *LARp = - ((temp < 11059) ? temp << 1 - : ((temp < 20070) ? temp + 11059 - : GSM_ADD( (word) (temp >> 2), (word) 26112 ))); - } else { - temp = *LARp; - *LARp = (temp < 11059) ? temp << 1 - : ((temp < 20070) ? temp + 11059 - : GSM_ADD( (word) (temp >> 2), (word) 26112 )); - } - } -} - - -/* 4.2.10 */ -static void Short_term_analysis_filtering ( - struct gsm_state * S, - register word * rp, /* [0..7] IN */ - register int k_n, /* k_end - k_start */ - register word * s /* [0..n-1] IN/OUT */ -) -/* - * This procedure computes the short term residual signal d[..] to be fed - * to the RPE-LTP loop from the s[..] signal and from the local rp[..] - * array (quantized reflection coefficients). As the call of this - * procedure can be done in many ways (see the interpolation of the LAR - * coefficient), it is assumed that the computation begins with index - * k_start (for arrays d[..] and s[..]) and stops with index k_end - * (k_start and k_end are defined in 4.2.9.1). This procedure also - * needs to keep the array u[0..7] in memory for each call. - */ -{ - register word * u = S->u; - register int i; - register word di, zzz, ui, sav, rpi; - - for (; k_n--; s++) { - - di = sav = *s; - - for (i = 0; i < 8; i++) { /* YYY */ - - ui = u[i]; - rpi = rp[i]; - u[i] = sav; - - zzz = GSM_MULT_R(rpi, di); - sav = GSM_ADD( ui, zzz); - - zzz = GSM_MULT_R(rpi, ui); - di = GSM_ADD( di, zzz ); - } - - *s = di; - } -} - -#if defined(USE_FLOAT_MUL) && defined(FAST) - -static void Fast_Short_term_analysis_filtering ( - struct gsm_state * S, - register word * rp, /* [0..7] IN */ - register int k_n, /* k_end - k_start */ - register word * s /* [0..n-1] IN/OUT */ -) -{ - register word * u = S->u; - register int i; - - float uf[8], - rpf[8]; - - register float scalef = 3.0517578125e-5; - register float sav, di, temp; - - for (i = 0; i < 8; ++i) { - uf[i] = u[i]; - rpf[i] = rp[i] * scalef; - } - for (; k_n--; s++) { - sav = di = *s; - for (i = 0; i < 8; ++i) { - register float rpfi = rpf[i]; - register float ufi = uf[i]; - - uf[i] = sav; - temp = rpfi * di + ufi; - di += rpfi * ufi; - sav = temp; - } - *s = di; - } - for (i = 0; i < 8; ++i) u[i] = uf[i]; -} -#endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */ - -static void Short_term_synthesis_filtering ( - struct gsm_state * S, - register word * rrp, /* [0..7] IN */ - register int k, /* k_end - k_start */ - register word * wt, /* [0..k-1] IN */ - register word * sr /* [0..k-1] OUT */ -) -{ - register word * v = S->v; - register int i; - register word sri, tmp1, tmp2; - - while (k--) { - sri = *wt++; - for (i = 8; i--;) { - - /* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) ); - */ - tmp1 = rrp[i]; - tmp2 = v[i]; - tmp2 = ( tmp1 == MIN_WORD && tmp2 == MIN_WORD - ? MAX_WORD - : 0x0FFFF & (( (longword)tmp1 * (longword)tmp2 - + 16384) >> 15)) ; - - sri = GSM_SUB( sri, tmp2 ); - - /* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) ); - */ - tmp1 = ( tmp1 == MIN_WORD && sri == MIN_WORD - ? MAX_WORD - : 0x0FFFF & (( (longword)tmp1 * (longword)sri - + 16384) >> 15)) ; - - v[i+1] = GSM_ADD( v[i], tmp1); - } - *sr++ = v[0] = sri; - } -} - - -#if defined(FAST) && defined(USE_FLOAT_MUL) - -static void Fast_Short_term_synthesis_filtering ( - struct gsm_state * S, - register word * rrp, /* [0..7] IN */ - register int k, /* k_end - k_start */ - register word * wt, /* [0..k-1] IN */ - register word * sr /* [0..k-1] OUT */ -) -{ - register word * v = S->v; - register int i; - - float va[9], rrpa[8]; - register float scalef = 3.0517578125e-5, temp; - - for (i = 0; i < 8; ++i) { - va[i] = v[i]; - rrpa[i] = (float)rrp[i] * scalef; - } - while (k--) { - register float sri = *wt++; - for (i = 8; i--;) { - sri -= rrpa[i] * va[i]; - if (sri < -32768.) sri = -32768.; - else if (sri > 32767.) sri = 32767.; - - temp = va[i] + rrpa[i] * sri; - if (temp < -32768.) temp = -32768.; - else if (temp > 32767.) temp = 32767.; - va[i+1] = temp; - } - *sr++ = va[0] = sri; - } - for (i = 0; i < 9; ++i) v[i] = va[i]; -} - -#endif /* defined(FAST) && defined(USE_FLOAT_MUL) */ - -void Gsm_Short_Term_Analysis_Filter ( - - struct gsm_state * S, - - word * LARc, /* coded log area ratio [0..7] IN */ - word * s /* signal [0..159] IN/OUT */ -) -{ - word * LARpp_j = S->LARpp[ S->j ]; - word * LARpp_j_1 = S->LARpp[ S->j ^= 1 ]; - - word LARp[8]; - -#undef FILTER -#if defined(FAST) && defined(USE_FLOAT_MUL) -# define FILTER (* (S->fast \ - ? Fast_Short_term_analysis_filtering \ - : Short_term_analysis_filtering )) - -#else -# define FILTER Short_term_analysis_filtering -#endif - - Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j ); - - Coefficients_0_12( LARpp_j_1, LARpp_j, LARp ); - LARp_to_rp( LARp ); - FILTER( S, LARp, 13, s); - - Coefficients_13_26( LARpp_j_1, LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 14, s + 13); - - Coefficients_27_39( LARpp_j_1, LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 13, s + 27); - - Coefficients_40_159( LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 120, s + 40); -} - -void Gsm_Short_Term_Synthesis_Filter ( - struct gsm_state * S, - - word * LARcr, /* received log area ratios [0..7] IN */ - word * wt, /* received d [0..159] IN */ - - word * s /* signal s [0..159] OUT */ -) -{ - word * LARpp_j = S->LARpp[ S->j ]; - word * LARpp_j_1 = S->LARpp[ S->j ^=1 ]; - - word LARp[8]; - -#undef FILTER -#if defined(FAST) && defined(USE_FLOAT_MUL) - -# define FILTER (* (S->fast \ - ? Fast_Short_term_synthesis_filtering \ - : Short_term_synthesis_filtering )) -#else -# define FILTER Short_term_synthesis_filtering -#endif - - Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j ); - - Coefficients_0_12( LARpp_j_1, LARpp_j, LARp ); - LARp_to_rp( LARp ); - FILTER( S, LARp, 13, wt, s ); - - Coefficients_13_26( LARpp_j_1, LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 14, wt + 13, s + 13 ); - - Coefficients_27_39( LARpp_j_1, LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 13, wt + 27, s + 27 ); - - Coefficients_40_159( LARpp_j, LARp ); - LARp_to_rp( LARp ); - FILTER(S, LARp, 120, wt + 40, s + 40); -} diff --git a/libs/libsndfile/src/GSM610/table.c b/libs/libsndfile/src/GSM610/table.c deleted file mode 100644 index 8b83f78cf5..0000000000 --- a/libs/libsndfile/src/GSM610/table.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* Most of these tables are inlined at their point of use. - */ - -/* 4.4 TABLES USED IN THE FIXED POINT IMPLEMENTATION OF THE RPE-LTP - * CODER AND DECODER - * - * (Most of them inlined, so watch out.) - */ - -#define GSM_TABLE_C -#include "gsm610_priv.h" - -/* Table 4.1 Quantization of the Log.-Area Ratios - */ -/* i 1 2 3 4 5 6 7 8 */ -word gsm_A[8] = {20480, 20480, 20480, 20480, 13964, 15360, 8534, 9036}; -word gsm_B[8] = { 0, 0, 2048, -2560, 94, -1792, -341, -1144}; -word gsm_MIC[8] = { -32, -32, -16, -16, -8, -8, -4, -4 }; -word gsm_MAC[8] = { 31, 31, 15, 15, 7, 7, 3, 3 }; - - -/* Table 4.2 Tabulation of 1/A[1..8] - */ -word gsm_INVA[8]={ 13107, 13107, 13107, 13107, 19223, 17476, 31454, 29708 }; - - -/* Table 4.3a Decision level of the LTP gain quantizer - */ -/* bc 0 1 2 3 */ -word gsm_DLB[4] = { 6554, 16384, 26214, 32767 }; - - -/* Table 4.3b Quantization levels of the LTP gain quantizer - */ -/* bc 0 1 2 3 */ -word gsm_QLB[4] = { 3277, 11469, 21299, 32767 }; - - -/* Table 4.4 Coefficients of the weighting filter - */ -/* i 0 1 2 3 4 5 6 7 8 9 10 */ -word gsm_H[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 }; - - -/* Table 4.5 Normalized inverse mantissa used to compute xM/xmax - */ -/* i 0 1 2 3 4 5 6 7 */ -word gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 }; - - -/* Table 4.6 Normalized direct mantissa used to compute xM/xmax - */ -/* i 0 1 2 3 4 5 6 7 */ -word gsm_FAC[8] = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 }; diff --git a/libs/libsndfile/src/Makefile.am b/libs/libsndfile/src/Makefile.am deleted file mode 100644 index 7c307a8b42..0000000000 --- a/libs/libsndfile/src/Makefile.am +++ /dev/null @@ -1,134 +0,0 @@ -## Process this file with automake to produce Makefile.in - -AUTOMAKE_OPTIONS = subdir-objects - -AM_CPPFLAGS = @EXTERNAL_CFLAGS@ - -lib_LTLIBRARIES = libsndfile.la -include_HEADERS = sndfile.hh -nodist_include_HEADERS = sndfile.h - -noinst_LTLIBRARIES = GSM610/libgsm.la G72x/libg72x.la ALAC/libalac.la libcommon.la - -OS_SPECIFIC_CFLAGS = @OS_SPECIFIC_CFLAGS@ -OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@ - -SYMBOL_FILES = Symbols.gnu-binutils Symbols.darwin libsndfile-1.def Symbols.os2 Symbols.static - -EXTRA_DIST = sndfile.h.in config.h.in test_endswap.tpl test_endswap.def \ - create_symbols_file.py binheader_writef_check.py \ - GSM610/README GSM610/COPYRIGHT GSM610/ChangeLog \ - G72x/README G72x/README.original G72x/ChangeLog \ - make-static-lib-hidden-privates.sh - -noinst_HEADERS = common.h sfconfig.h sfendian.h wav_w64.h sf_unistd.h ogg.h chanmap.h - -noinst_PROGRAMS = - -COMMON = common.c file_io.c command.c pcm.c ulaw.c alaw.c float32.c \ - double64.c ima_adpcm.c ms_adpcm.c gsm610.c dwvw.c vox_adpcm.c \ - interleave.c strings.c dither.c cart.c broadcast.c audio_detect.c \ - ima_oki_adpcm.c ima_oki_adpcm.h alac.c chunk.c ogg.c chanmap.c \ - windows.c id3.c $(WIN_VERSION_FILE) - -FILESPECIFIC = sndfile.c aiff.c au.c avr.c caf.c dwd.c flac.c g72x.c htk.c ircam.c \ - macbinary3.c macos.c mat4.c mat5.c nist.c paf.c pvf.c raw.c rx2.c sd2.c \ - sds.c svx.c txw.c voc.c wve.c w64.c wav_w64.c wav.c xi.c mpc2k.c rf64.c \ - ogg_vorbis.c ogg_speex.c ogg_pcm.c ogg_opus.c - -CLEANFILES = *~ *.exe G72x/*.exe - -if USE_WIN_VERSION_FILE -WIN_VERSION_FILE = version-metadata.rc -else -WIN_VERSION_FILE = -endif - -#=============================================================================== -# MinGW requires -no-undefined if a DLL is to be built. -libsndfile_la_LDFLAGS = -no-undefined -version-info @SHARED_VERSION_INFO@ @SHLIB_VERSION_ARG@ -libsndfile_la_SOURCES = $(FILESPECIFIC) $(noinst_HEADERS) -nodist_libsndfile_la_SOURCES = $(nodist_include_HEADERS) -libsndfile_la_LIBADD = GSM610/libgsm.la G72x/libg72x.la ALAC/libalac.la \ - libcommon.la @EXTERNAL_LIBS@ -lm - -libcommon_la_SOURCES = $(COMMON) - -#====================================================================== -# Subdir libraries. - -GSM610_libgsm_la_SOURCES = GSM610/config.h GSM610/gsm.h GSM610/gsm610_priv.h \ - GSM610/add.c GSM610/code.c GSM610/decode.c GSM610/gsm_create.c \ - GSM610/gsm_decode.c GSM610/gsm_destroy.c GSM610/gsm_encode.c \ - GSM610/gsm_option.c GSM610/long_term.c GSM610/lpc.c GSM610/preprocess.c \ - GSM610/rpe.c GSM610/short_term.c GSM610/table.c - -G72x_libg72x_la_SOURCES = G72x/g72x.h G72x/g72x_priv.h \ - G72x/g721.c G72x/g723_16.c G72x/g723_24.c G72x/g723_40.c G72x/g72x.c - -ALAC_libalac_la_SOURCES = ALAC/ALACAudioTypes.h ALAC/ALACBitUtilities.h \ - ALAC/EndianPortable.h ALAC/aglib.h ALAC/dplib.h ALAC/matrixlib.h \ - ALAC/alac_codec.h \ - ALAC/ALACBitUtilities.c ALAC/ag_dec.c \ - ALAC/ag_enc.c ALAC/dp_dec.c ALAC/dp_enc.c ALAC/matrix_dec.c \ - ALAC/matrix_enc.c ALAC/alac_decoder.c ALAC/alac_encoder.c - -#=============================================================================== -# Test programs. - -#test_main_SOURCES = test_main.c test_main.h test_conversions.c test_float.c test_endswap.c \ -# test_audio_detect.c test_log_printf.c test_file_io.c test_ima_oki_adpcm.c \ -# test_strncpy_crlf.c test_broadcast_var.c test_cart_var.c -#test_main_LDADD = libcommon.la - -#G72x_g72x_test_SOURCES = G72x/g72x_test.c -#G72x_g72x_test_LDADD = G72x/libg72x.la - -#test_endswap.c: test_endswap.def test_endswap.tpl -# cd $(srcdir) && autogen --writable test_endswap.def && cd $(abs_builddir) - -genfiles : #$(SYMBOL_FILES) - -check : - @if [ -x /usr/bin/python ]; then $(srcdir)/binheader_writef_check.py $(srcdir)/*.c ; fi -# G72x/g72x_test$(EXEEXT) all - ./test_main$(EXEEXT) - -# Need this target to force building of test programs. -checkprograms : $(check_PROGRAMS) - -#====================================================================== -# Generate an OS specific Symbols files. This is done when the author -# builds the distribution tarball. There should be not need for the -# end user to create these files. - -Symbols.gnu-binutils: create_symbols_file.py - python $(srcdir)/create_symbols_file.py linux $(VERSION) > $@ - -Symbols.darwin: create_symbols_file.py - python $(srcdir)/create_symbols_file.py darwin $(VERSION) > $@ - -libsndfile-1.def: create_symbols_file.py - python $(srcdir)/create_symbols_file.py win32 $(VERSION) > $@ - -Symbols.os2: create_symbols_file.py - python $(srcdir)/create_symbols_file.py os2 $(VERSION) > $@ - -Symbols.static: create_symbols_file.py - python $(srcdir)/create_symbols_file.py static $(VERSION) > $@ - -# Fake dependancy to force the creation of these files. -#sndfile.o : $(SYMBOL_FILES) - -#====================================================================== -# Building windows resource files (if needed). - -.rc.lo: - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) $< -o $@ - -#====================================================================== -# Disable autoheader. -AUTOHEADER=echo - - - diff --git a/libs/libsndfile/src/Symbols.darwin b/libs/libsndfile/src/Symbols.darwin deleted file mode 100644 index a671460756..0000000000 --- a/libs/libsndfile/src/Symbols.darwin +++ /dev/null @@ -1,37 +0,0 @@ -# Auto-generated by create_symbols_file.py - -_sf_command -_sf_open -_sf_close -_sf_seek -_sf_error -_sf_perror -_sf_error_str -_sf_error_number -_sf_format_check -_sf_read_raw -_sf_readf_short -_sf_readf_int -_sf_readf_float -_sf_readf_double -_sf_read_short -_sf_read_int -_sf_read_float -_sf_read_double -_sf_write_raw -_sf_writef_short -_sf_writef_int -_sf_writef_float -_sf_writef_double -_sf_write_short -_sf_write_int -_sf_write_float -_sf_write_double -_sf_strerror -_sf_get_string -_sf_set_string -_sf_version_string -_sf_open_fd -_sf_open_virtual -_sf_write_sync - diff --git a/libs/libsndfile/src/Symbols.linux b/libs/libsndfile/src/Symbols.linux deleted file mode 100644 index 163346f700..0000000000 --- a/libs/libsndfile/src/Symbols.linux +++ /dev/null @@ -1,42 +0,0 @@ -# Auto-generated by create_symbols_file.py - -libsndfile.so.1.0 -{ - global: - sf_command ; - sf_open ; - sf_close ; - sf_seek ; - sf_error ; - sf_perror ; - sf_error_str ; - sf_error_number ; - sf_format_check ; - sf_read_raw ; - sf_readf_short ; - sf_readf_int ; - sf_readf_float ; - sf_readf_double ; - sf_read_short ; - sf_read_int ; - sf_read_float ; - sf_read_double ; - sf_write_raw ; - sf_writef_short ; - sf_writef_int ; - sf_writef_float ; - sf_writef_double ; - sf_write_short ; - sf_write_int ; - sf_write_float ; - sf_write_double ; - sf_strerror ; - sf_get_string ; - sf_set_string ; - sf_open_fd ; - sf_open_virtual ; - sf_write_sync ; - local: - * ; -} ; - diff --git a/libs/libsndfile/src/Symbols.os2 b/libs/libsndfile/src/Symbols.os2 deleted file mode 100644 index 118ceba728..0000000000 --- a/libs/libsndfile/src/Symbols.os2 +++ /dev/null @@ -1,43 +0,0 @@ -; Auto-generated by create_symbols_file.py - -LIBRARY sndfile1 -INITINSTANCE TERMINSTANCE -CODE PRELOAD MOVEABLE DISCARDABLE -DATA PRELOAD MOVEABLE MULTIPLE NONSHARED -EXPORTS - -_sf_command @1 -_sf_open @2 -_sf_close @3 -_sf_seek @4 -_sf_error @7 -_sf_perror @8 -_sf_error_str @9 -_sf_error_number @10 -_sf_format_check @11 -_sf_read_raw @16 -_sf_readf_short @17 -_sf_readf_int @18 -_sf_readf_float @19 -_sf_readf_double @20 -_sf_read_short @21 -_sf_read_int @22 -_sf_read_float @23 -_sf_read_double @24 -_sf_write_raw @32 -_sf_writef_short @33 -_sf_writef_int @34 -_sf_writef_float @35 -_sf_writef_double @36 -_sf_write_short @37 -_sf_write_int @38 -_sf_write_float @39 -_sf_write_double @40 -_sf_strerror @50 -_sf_get_string @60 -_sf_set_string @61 -_sf_version_string @68 -_sf_open_fd @70 -_sf_open_virtual @80 -_sf_write_sync @90 - diff --git a/libs/libsndfile/src/aiff.c b/libs/libsndfile/src/aiff.c deleted file mode 100644 index c0175b2f24..0000000000 --- a/libs/libsndfile/src/aiff.c +++ /dev/null @@ -1,1778 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** Copyright (C) 2005 David Viens -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#ifdef HAVE_INTTYPES_H -#include -#endif - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" -#include "chanmap.h" - -/*------------------------------------------------------------------------------ - * Macros to handle big/little endian issues. - */ - -#define FORM_MARKER (MAKE_MARKER ('F', 'O', 'R', 'M')) -#define AIFF_MARKER (MAKE_MARKER ('A', 'I', 'F', 'F')) -#define AIFC_MARKER (MAKE_MARKER ('A', 'I', 'F', 'C')) -#define COMM_MARKER (MAKE_MARKER ('C', 'O', 'M', 'M')) -#define SSND_MARKER (MAKE_MARKER ('S', 'S', 'N', 'D')) -#define MARK_MARKER (MAKE_MARKER ('M', 'A', 'R', 'K')) -#define INST_MARKER (MAKE_MARKER ('I', 'N', 'S', 'T')) -#define APPL_MARKER (MAKE_MARKER ('A', 'P', 'P', 'L')) -#define CHAN_MARKER (MAKE_MARKER ('C', 'H', 'A', 'N')) - -#define c_MARKER (MAKE_MARKER ('(', 'c', ')', ' ')) -#define NAME_MARKER (MAKE_MARKER ('N', 'A', 'M', 'E')) -#define AUTH_MARKER (MAKE_MARKER ('A', 'U', 'T', 'H')) -#define ANNO_MARKER (MAKE_MARKER ('A', 'N', 'N', 'O')) -#define COMT_MARKER (MAKE_MARKER ('C', 'O', 'M', 'T')) -#define FVER_MARKER (MAKE_MARKER ('F', 'V', 'E', 'R')) -#define SFX_MARKER (MAKE_MARKER ('S', 'F', 'X', '!')) - -#define PEAK_MARKER (MAKE_MARKER ('P', 'E', 'A', 'K')) -#define basc_MARKER (MAKE_MARKER ('b', 'a', 's', 'c')) - -/* Supported AIFC encodings.*/ -#define NONE_MARKER (MAKE_MARKER ('N', 'O', 'N', 'E')) -#define sowt_MARKER (MAKE_MARKER ('s', 'o', 'w', 't')) -#define twos_MARKER (MAKE_MARKER ('t', 'w', 'o', 's')) -#define raw_MARKER (MAKE_MARKER ('r', 'a', 'w', ' ')) -#define in24_MARKER (MAKE_MARKER ('i', 'n', '2', '4')) -#define ni24_MARKER (MAKE_MARKER ('4', '2', 'n', '1')) -#define in32_MARKER (MAKE_MARKER ('i', 'n', '3', '2')) -#define ni32_MARKER (MAKE_MARKER ('2', '3', 'n', 'i')) - -#define fl32_MARKER (MAKE_MARKER ('f', 'l', '3', '2')) -#define FL32_MARKER (MAKE_MARKER ('F', 'L', '3', '2')) -#define fl64_MARKER (MAKE_MARKER ('f', 'l', '6', '4')) -#define FL64_MARKER (MAKE_MARKER ('F', 'L', '6', '4')) - -#define ulaw_MARKER (MAKE_MARKER ('u', 'l', 'a', 'w')) -#define ULAW_MARKER (MAKE_MARKER ('U', 'L', 'A', 'W')) -#define alaw_MARKER (MAKE_MARKER ('a', 'l', 'a', 'w')) -#define ALAW_MARKER (MAKE_MARKER ('A', 'L', 'A', 'W')) - -#define DWVW_MARKER (MAKE_MARKER ('D', 'W', 'V', 'W')) -#define GSM_MARKER (MAKE_MARKER ('G', 'S', 'M', ' ')) -#define ima4_MARKER (MAKE_MARKER ('i', 'm', 'a', '4')) - -/* -** This value is officially assigned to Mega Nerd Pty Ltd by Apple -** Corportation as the Application marker for libsndfile. -** -** See : http://developer.apple.com/faq/datatype.html -*/ -#define m3ga_MARKER (MAKE_MARKER ('m', '3', 'g', 'a')) - -/* Unsupported AIFC encodings.*/ - -#define MAC3_MARKER (MAKE_MARKER ('M', 'A', 'C', '3')) -#define MAC6_MARKER (MAKE_MARKER ('M', 'A', 'C', '6')) -#define ADP4_MARKER (MAKE_MARKER ('A', 'D', 'P', '4')) - -/* Predfined chunk sizes. */ -#define SIZEOF_AIFF_COMM 18 -#define SIZEOF_AIFC_COMM_MIN 22 -#define SIZEOF_AIFC_COMM 24 -#define SIZEOF_SSND_CHUNK 8 -#define SIZEOF_INST_CHUNK 20 - -/* Is it constant? */ - -/* AIFC/IMA4 defines. */ -#define AIFC_IMA4_BLOCK_LEN 34 -#define AIFC_IMA4_SAMPLES_PER_BLOCK 64 - -#define AIFF_PEAK_CHUNK_SIZE(ch) (2 * sizeof (int) + ch * (sizeof (float) + sizeof (int))) - -/*------------------------------------------------------------------------------ - * Typedefs for file chunks. - */ - -enum -{ HAVE_FORM = 0x01, - HAVE_AIFF = 0x02, - HAVE_AIFC = 0x04, - HAVE_FVER = 0x08, - HAVE_COMM = 0x10, - HAVE_SSND = 0x20 -} ; - -typedef struct -{ unsigned int size ; - short numChannels ; - unsigned int numSampleFrames ; - short sampleSize ; - unsigned char sampleRate [10] ; - unsigned int encoding ; - char zero_bytes [2] ; -} COMM_CHUNK ; - -typedef struct -{ unsigned int offset ; - unsigned int blocksize ; -} SSND_CHUNK ; - -typedef struct -{ short playMode ; - unsigned short beginLoop ; - unsigned short endLoop ; -} INST_LOOP ; - -typedef struct -{ char baseNote ; /* all notes are MIDI note numbers */ - char detune ; /* cents off, only -50 to +50 are significant */ - char lowNote ; - char highNote ; - char lowVelocity ; /* 1 to 127 */ - char highVelocity ; /* 1 to 127 */ - short gain ; /* in dB, 0 is normal */ - INST_LOOP sustain_loop ; - INST_LOOP release_loop ; -} INST_CHUNK ; - - -enum -{ basc_SCALE_MINOR = 1, - basc_SCALE_MAJOR, - basc_SCALE_NEITHER, - basc_SCALE_BOTH -} ; - -enum -{ basc_TYPE_LOOP = 0, - basc_TYPE_ONE_SHOT -} ; - - -typedef struct -{ unsigned int version ; - unsigned int numBeats ; - unsigned short rootNote ; - unsigned short scaleType ; - unsigned short sigNumerator ; - unsigned short sigDenominator ; - unsigned short loopType ; -} basc_CHUNK ; - -typedef struct -{ unsigned short markerID ; - unsigned int position ; -} MARK_ID_POS ; - -typedef struct -{ sf_count_t comm_offset ; - sf_count_t ssnd_offset ; - - int chanmap_tag ; - - MARK_ID_POS *markstr ; -} AIFF_PRIVATE ; - -/*------------------------------------------------------------------------------ - * Private static functions. - */ - -static int aiff_close (SF_PRIVATE *psf) ; - -static int tenbytefloat2int (unsigned char *bytes) ; -static void uint2tenbytefloat (unsigned int num, unsigned char *bytes) ; - -static int aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt) ; - -static int aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt) ; - -static int aiff_write_header (SF_PRIVATE *psf, int calc_length) ; -static int aiff_write_tailer (SF_PRIVATE *psf) ; -static void aiff_write_strings (SF_PRIVATE *psf, int location) ; - -static int aiff_command (SF_PRIVATE *psf, int command, void *data, int datasize) ; - -static const char *get_loop_mode_str (short mode) ; - -static short get_loop_mode (short mode) ; - -static int aiff_read_basc_chunk (SF_PRIVATE * psf, int) ; - -static int aiff_read_chanmap (SF_PRIVATE * psf, unsigned dword) ; - -static unsigned int marker_to_position (const MARK_ID_POS *m, unsigned short n, int marksize) ; - -static int aiff_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) ; -static SF_CHUNK_ITERATOR * aiff_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) ; -static int aiff_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; -static int aiff_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -aiff_open (SF_PRIVATE *psf) -{ COMM_CHUNK comm_fmt ; - int error, subformat ; - - memset (&comm_fmt, 0, sizeof (comm_fmt)) ; - - subformat = SF_CODEC (psf->sf.format) ; - - if ((psf->container_data = calloc (1, sizeof (AIFF_PRIVATE))) == NULL) - return SFE_MALLOC_FAILED ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = aiff_read_header (psf, &comm_fmt))) - return error ; - - psf->next_chunk_iterator = aiff_next_chunk_iterator ; - psf->get_chunk_size = aiff_get_chunk_size ; - psf->get_chunk_data = aiff_get_chunk_data ; - - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - } ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if (psf->is_pipe) - return SFE_NO_PIPE_WRITE ; - - if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_AIFF) - return SFE_BAD_OPEN_FORMAT ; - - if (psf->file.mode == SFM_WRITE && (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)) - { if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL) - return SFE_MALLOC_FAILED ; - psf->peak_info->peak_loc = SF_PEAK_START ; - } ; - - if (psf->file.mode != SFM_RDWR || psf->filelength < 40) - { psf->filelength = 0 ; - psf->datalength = 0 ; - psf->dataoffset = 0 ; - psf->sf.frames = 0 ; - } ; - - psf->strings.flags = SF_STR_ALLOW_START | SF_STR_ALLOW_END ; - - if ((error = aiff_write_header (psf, SF_FALSE))) - return error ; - - psf->write_header = aiff_write_header ; - psf->set_chunk = aiff_set_chunk ; - } ; - - psf->container_close = aiff_close ; - psf->command = aiff_command ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_U8 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_PCM_S8 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_ULAW : - error = ulaw_init (psf) ; - break ; - - case SF_FORMAT_ALAW : - error = alaw_init (psf) ; - break ; - - /* Lite remove start */ - case SF_FORMAT_FLOAT : - error = float32_init (psf) ; - break ; - - case SF_FORMAT_DOUBLE : - error = double64_init (psf) ; - break ; - - case SF_FORMAT_DWVW_12 : - error = dwvw_init (psf, 12) ; - break ; - - case SF_FORMAT_DWVW_16 : - error = dwvw_init (psf, 16) ; - break ; - - case SF_FORMAT_DWVW_24 : - error = dwvw_init (psf, 24) ; - break ; - - case SF_FORMAT_DWVW_N : - if (psf->file.mode != SFM_READ) - { error = SFE_DWVW_BAD_BITWIDTH ; - break ; - } ; - if (comm_fmt.sampleSize >= 8 && comm_fmt.sampleSize < 24) - { error = dwvw_init (psf, comm_fmt.sampleSize) ; - psf->sf.frames = comm_fmt.numSampleFrames ; - break ; - } ; - psf_log_printf (psf, "AIFC/DWVW : Bad bitwidth %d\n", comm_fmt.sampleSize) ; - error = SFE_DWVW_BAD_BITWIDTH ; - break ; - - case SF_FORMAT_IMA_ADPCM : - /* - ** IMA ADPCM encoded AIFF files always have a block length - ** of 34 which decodes to 64 samples. - */ - error = aiff_ima_init (psf, AIFC_IMA4_BLOCK_LEN, AIFC_IMA4_SAMPLES_PER_BLOCK) ; - break ; - /* Lite remove end */ - - case SF_FORMAT_GSM610 : - error = gsm610_init (psf) ; - break ; - - default : return SFE_UNIMPLEMENTED ; - } ; - - - return error ; -} /* aiff_open */ - -/*========================================================================================== -** Private functions. -*/ - -/* This function ought to check size */ -static unsigned int -marker_to_position (const MARK_ID_POS *m, unsigned short n, int marksize) -{ int i ; - - for (i = 0 ; i < marksize ; i++) - if (m [i].markerID == n) - return m [i].position ; - return 0 ; -} /* marker_to_position */ - -static int -aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt) -{ SSND_CHUNK ssnd_fmt ; - AIFF_PRIVATE *paiff ; - BUF_UNION ubuf ; - unsigned chunk_size = 0, FORMsize, SSNDsize, bytesread ; - int k, found_chunk = 0, done = 0, error = 0 ; - char *cptr ; - int instr_found = 0, mark_found = 0, mark_count = 0 ; - - if (psf->filelength > SF_PLATFORM_S64 (0xffffffff)) - psf_log_printf (psf, "Warning : filelength > 0xffffffff. This is bad!!!!\n") ; - - if ((paiff = psf->container_data) == NULL) - return SFE_INTERNAL ; - - paiff->comm_offset = 0 ; - paiff->ssnd_offset = 0 ; - - /* Set position to start of file to begin reading header. */ - psf_binheader_readf (psf, "p", 0) ; - - memset (comm_fmt, 0, sizeof (COMM_CHUNK)) ; - - /* Until recently AIF* file were all BIG endian. */ - psf->endian = SF_ENDIAN_BIG ; - - /* AIFF files can apparently have their chunks in any order. However, they - ** must have a FORM chunk. Approach here is to read all the chunks one by - ** one and then check for the mandatory chunks at the end. - */ - while (! done) - { unsigned marker ; - size_t jump = chunk_size & 1 ; - - marker = chunk_size = 0 ; - psf_binheader_readf (psf, "Ejm4", jump, &marker, &chunk_size) ; - if (marker == 0) - { psf_log_printf (psf, "Have 0 marker.\n") ; - break ; - } ; - - if (psf->file.mode == SFM_RDWR && (found_chunk & HAVE_SSND)) - return SFE_AIFF_RW_SSND_NOT_LAST ; - - psf_store_read_chunk_u32 (&psf->rchunks, marker, psf_ftell (psf), chunk_size) ; - - switch (marker) - { case FORM_MARKER : - if (found_chunk) - return SFE_AIFF_NO_FORM ; - - FORMsize = chunk_size ; - - found_chunk |= HAVE_FORM ; - psf_binheader_readf (psf, "m", &marker) ; - switch (marker) - { case AIFC_MARKER : - case AIFF_MARKER : - found_chunk |= (marker == AIFC_MARKER) ? (HAVE_AIFC | HAVE_AIFF) : HAVE_AIFF ; - break ; - default : - break ; - } ; - - if (psf->fileoffset > 0 && psf->filelength > FORMsize + 8) - { /* Set file length. */ - psf->filelength = FORMsize + 8 ; - psf_log_printf (psf, "FORM : %u\n %M\n", FORMsize, marker) ; - } - else if (FORMsize != psf->filelength - 2 * SIGNED_SIZEOF (chunk_size)) - { chunk_size = psf->filelength - 2 * sizeof (chunk_size) ; - psf_log_printf (psf, "FORM : %u (should be %u)\n %M\n", FORMsize, chunk_size, marker) ; - FORMsize = chunk_size ; - } - else - psf_log_printf (psf, "FORM : %u\n %M\n", FORMsize, marker) ; - /* Set this to 0, so we don't jump a byte when parsing the next marker. */ - chunk_size = 0 ; - break ; - - - case COMM_MARKER : - paiff->comm_offset = psf_ftell (psf) - 8 ; - chunk_size += chunk_size & 1 ; - comm_fmt->size = chunk_size ; - if ((error = aiff_read_comm_chunk (psf, comm_fmt)) != 0) - return error ; - - found_chunk |= HAVE_COMM ; - break ; - - case PEAK_MARKER : - /* Must have COMM chunk before PEAK chunk. */ - if ((found_chunk & (HAVE_FORM | HAVE_AIFF | HAVE_COMM)) != (HAVE_FORM | HAVE_AIFF | HAVE_COMM)) - return SFE_AIFF_PEAK_B4_COMM ; - - psf_log_printf (psf, "%M : %d\n", marker, chunk_size) ; - if (chunk_size != AIFF_PEAK_CHUNK_SIZE (psf->sf.channels)) - { psf_binheader_readf (psf, "j", chunk_size) ; - psf_log_printf (psf, "*** File PEAK chunk too big.\n") ; - return SFE_WAV_BAD_PEAK ; - } ; - - if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL) - return SFE_MALLOC_FAILED ; - - /* read in rest of PEAK chunk. */ - psf_binheader_readf (psf, "E44", &(psf->peak_info->version), &(psf->peak_info->timestamp)) ; - - if (psf->peak_info->version != 1) - psf_log_printf (psf, " version : %d *** (should be version 1)\n", psf->peak_info->version) ; - else - psf_log_printf (psf, " version : %d\n", psf->peak_info->version) ; - - psf_log_printf (psf, " time stamp : %d\n", psf->peak_info->timestamp) ; - psf_log_printf (psf, " Ch Position Value\n") ; - - cptr = ubuf.cbuf ; - for (k = 0 ; k < psf->sf.channels ; k++) - { float value ; - unsigned int position ; - - psf_binheader_readf (psf, "Ef4", &value, &position) ; - psf->peak_info->peaks [k].value = value ; - psf->peak_info->peaks [k].position = position ; - - snprintf (cptr, sizeof (ubuf.scbuf), " %2d %-12" PRId64 " %g\n", - k, psf->peak_info->peaks [k].position, psf->peak_info->peaks [k].value) ; - cptr [sizeof (ubuf.scbuf) - 1] = 0 ; - psf_log_printf (psf, "%s", cptr) ; - } ; - - psf->peak_info->peak_loc = ((found_chunk & HAVE_SSND) == 0) ? SF_PEAK_START : SF_PEAK_END ; - break ; - - case SSND_MARKER : - if ((found_chunk & HAVE_AIFC) && (found_chunk & HAVE_FVER) == 0) - psf_log_printf (psf, "*** Valid AIFC files should have an FVER chunk.\n") ; - - paiff->ssnd_offset = psf_ftell (psf) - 8 ; - SSNDsize = chunk_size ; - psf_binheader_readf (psf, "E44", &(ssnd_fmt.offset), &(ssnd_fmt.blocksize)) ; - - psf->datalength = SSNDsize - sizeof (ssnd_fmt) ; - psf->dataoffset = psf_ftell (psf) ; - - if (psf->datalength > psf->filelength - psf->dataoffset || psf->datalength < 0) - { psf_log_printf (psf, " SSND : %u (should be %D)\n", SSNDsize, psf->filelength - psf->dataoffset + sizeof (SSND_CHUNK)) ; - psf->datalength = psf->filelength - psf->dataoffset ; - } - else - psf_log_printf (psf, " SSND : %u\n", SSNDsize) ; - - if (ssnd_fmt.offset == 0 || psf->dataoffset + ssnd_fmt.offset == ssnd_fmt.blocksize) - { psf_log_printf (psf, " Offset : %u\n", ssnd_fmt.offset) ; - psf_log_printf (psf, " Block Size : %u\n", ssnd_fmt.blocksize) ; - - psf->dataoffset += ssnd_fmt.offset ; - psf->datalength -= ssnd_fmt.offset ; - } - else - { psf_log_printf (psf, " Offset : %u\n", ssnd_fmt.offset) ; - psf_log_printf (psf, " Block Size : %u ???\n", ssnd_fmt.blocksize) ; - psf->dataoffset += ssnd_fmt.offset ; - psf->datalength -= ssnd_fmt.offset ; - } ; - - /* Only set dataend if there really is data at the end. */ - if (psf->datalength + psf->dataoffset < psf->filelength) - psf->dataend = psf->datalength + psf->dataoffset ; - - found_chunk |= HAVE_SSND ; - - if (! psf->sf.seekable) - break ; - - /* Seek to end of SSND chunk. */ - psf_fseek (psf, psf->dataoffset + psf->datalength, SEEK_SET) ; - break ; - - case c_MARKER : - if (chunk_size == 0) - break ; - if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf)) - { psf_log_printf (psf, " %M : %d (too big)\n", marker, chunk_size) ; - return SFE_INTERNAL ; - } ; - - cptr = ubuf.cbuf ; - psf_binheader_readf (psf, "b", cptr, chunk_size + (chunk_size & 1)) ; - cptr [chunk_size] = 0 ; - - psf_sanitize_string (cptr, chunk_size) ; - - psf_log_printf (psf, " %M : %s\n", marker, cptr) ; - psf_store_string (psf, SF_STR_COPYRIGHT, cptr) ; - chunk_size += chunk_size & 1 ; - break ; - - case AUTH_MARKER : - if (chunk_size == 0) - break ; - if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf) - 1) - { psf_log_printf (psf, " %M : %d (too big)\n", marker, chunk_size) ; - return SFE_INTERNAL ; - } ; - - cptr = ubuf.cbuf ; - psf_binheader_readf (psf, "b", cptr, chunk_size + (chunk_size & 1)) ; - cptr [chunk_size] = 0 ; - psf_log_printf (psf, " %M : %s\n", marker, cptr) ; - psf_store_string (psf, SF_STR_ARTIST, cptr) ; - chunk_size += chunk_size & 1 ; - break ; - - case COMT_MARKER : - { unsigned short count, id, len ; - unsigned int timestamp, bytes ; - - if (chunk_size == 0) - break ; - bytes = chunk_size ; - bytes -= psf_binheader_readf (psf, "E2", &count) ; - psf_log_printf (psf, " %M : %d\n count : %d\n", marker, chunk_size, count) ; - - for (k = 0 ; k < count ; k++) - { bytes -= psf_binheader_readf (psf, "E422", ×tamp, &id, &len) ; - psf_log_printf (psf, " time : 0x%x\n marker : %x\n length : %d\n", timestamp, id, len) ; - - if (len + 1 > SIGNED_SIZEOF (ubuf.scbuf)) - { psf_log_printf (psf, "\nError : string length (%d) too big.\n", len) ; - return SFE_INTERNAL ; - } ; - - cptr = ubuf.cbuf ; - bytes -= psf_binheader_readf (psf, "b", cptr, len) ; - cptr [len] = 0 ; - psf_log_printf (psf, " string : %s\n", cptr) ; - } ; - - if (bytes > 0) - psf_binheader_readf (psf, "j", bytes) ; - } ; - break ; - - case APPL_MARKER : - { unsigned appl_marker ; - - if (chunk_size == 0) - break ; - if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf) - 1) - { psf_log_printf (psf, " %M : %d (too big, skipping)\n", marker, chunk_size) ; - psf_binheader_readf (psf, "j", chunk_size + (chunk_size & 1)) ; - break ; - } ; - - if (chunk_size < 4) - { psf_log_printf (psf, " %M : %d (too small, skipping)\n", marker, chunk_size) ; - psf_binheader_readf (psf, "j", chunk_size + (chunk_size & 1)) ; - break ; - } ; - - cptr = ubuf.cbuf ; - psf_binheader_readf (psf, "mb", &appl_marker, cptr, chunk_size + (chunk_size & 1) - 4) ; - cptr [chunk_size] = 0 ; - - for (k = 0 ; k < (int) chunk_size ; k++) - if (! psf_isprint (cptr [k])) - { cptr [k] = 0 ; - break ; - } ; - - psf_log_printf (psf, " %M : %d\n AppSig : %M\n Name : %s\n", marker, chunk_size, appl_marker, cptr) ; - psf_store_string (psf, SF_STR_SOFTWARE, cptr) ; - chunk_size += chunk_size & 1 ; - } ; - break ; - - case NAME_MARKER : - if (chunk_size == 0) - break ; - if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf) - 2) - { psf_log_printf (psf, " %M : %d (too big)\n", marker, chunk_size) ; - return SFE_INTERNAL ; - } ; - - cptr = ubuf.cbuf ; - psf_binheader_readf (psf, "b", cptr, chunk_size + (chunk_size & 1)) ; - cptr [chunk_size] = 0 ; - psf_log_printf (psf, " %M : %s\n", marker, cptr) ; - psf_store_string (psf, SF_STR_TITLE, cptr) ; - chunk_size += chunk_size & 1 ; - break ; - - case ANNO_MARKER : - if (chunk_size == 0) - break ; - if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf) - 2) - { psf_log_printf (psf, " %M : %d (too big)\n", marker, chunk_size) ; - return SFE_INTERNAL ; - } ; - - cptr = ubuf.cbuf ; - psf_binheader_readf (psf, "b", cptr, chunk_size + (chunk_size & 1)) ; - cptr [chunk_size] = 0 ; - psf_log_printf (psf, " %M : %s\n", marker, cptr) ; - psf_store_string (psf, SF_STR_COMMENT, cptr) ; - chunk_size += chunk_size & 1 ; - break ; - - case INST_MARKER : - if (chunk_size != SIZEOF_INST_CHUNK) - { psf_log_printf (psf, " %M : %d (should be %d)\n", marker, chunk_size, SIZEOF_INST_CHUNK) ; - psf_binheader_readf (psf, "j", chunk_size) ; - break ; - } ; - psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ; - { unsigned char bytes [6] ; - short gain ; - - if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL) - return SFE_MALLOC_FAILED ; - - psf_binheader_readf (psf, "b", bytes, 6) ; - psf_log_printf (psf, " Base Note : %u\n Detune : %u\n" - " Low Note : %u\n High Note : %u\n" - " Low Vel. : %u\n High Vel. : %u\n", - bytes [0], bytes [1], bytes [2], bytes [3], bytes [4], bytes [5]) ; - psf->instrument->basenote = bytes [0] ; - psf->instrument->detune = bytes [1] ; - psf->instrument->key_lo = bytes [2] ; - psf->instrument->key_hi = bytes [3] ; - psf->instrument->velocity_lo = bytes [4] ; - psf->instrument->velocity_hi = bytes [5] ; - psf_binheader_readf (psf, "E2", &gain) ; - psf->instrument->gain = gain ; - psf_log_printf (psf, " Gain (dB) : %d\n", gain) ; - } ; - { short mode ; /* 0 - no loop, 1 - forward looping, 2 - backward looping */ - const char *loop_mode ; - unsigned short begin, end ; - - psf_binheader_readf (psf, "E222", &mode, &begin, &end) ; - loop_mode = get_loop_mode_str (mode) ; - mode = get_loop_mode (mode) ; - if (mode == SF_LOOP_NONE) - { psf->instrument->loop_count = 0 ; - psf->instrument->loops [0].mode = SF_LOOP_NONE ; - } - else - { psf->instrument->loop_count = 1 ; - psf->instrument->loops [0].mode = SF_LOOP_FORWARD ; - psf->instrument->loops [0].start = begin ; - psf->instrument->loops [0].end = end ; - psf->instrument->loops [0].count = 0 ; - } ; - psf_log_printf (psf, " Sustain\n mode : %d => %s\n begin : %u\n end : %u\n", - mode, loop_mode, begin, end) ; - psf_binheader_readf (psf, "E222", &mode, &begin, &end) ; - loop_mode = get_loop_mode_str (mode) ; - mode = get_loop_mode (mode) ; - if (mode == SF_LOOP_NONE) - psf->instrument->loops [1].mode = SF_LOOP_NONE ; - else - { psf->instrument->loop_count += 1 ; - psf->instrument->loops [1].mode = SF_LOOP_FORWARD ; - psf->instrument->loops [1].start = begin ; - psf->instrument->loops [1].end = end ; - psf->instrument->loops [1].count = 0 ; - } ; - psf_log_printf (psf, " Release\n mode : %d => %s\n begin : %u\n end : %u\n", - mode, loop_mode, begin, end) ; - } ; - instr_found++ ; - break ; - - case basc_MARKER : - psf_log_printf (psf, " basc : %u\n", chunk_size) ; - - if ((error = aiff_read_basc_chunk (psf, chunk_size))) - return error ; - break ; - - case MARK_MARKER : - psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ; - { unsigned short mark_id, n = 0 ; - unsigned int position ; - - bytesread = psf_binheader_readf (psf, "E2", &n) ; - mark_count = n ; - psf_log_printf (psf, " Count : %d\n", mark_count) ; - if (paiff->markstr != NULL) - { psf_log_printf (psf, "*** Second MARK chunk found. Throwing away the first.\n") ; - free (paiff->markstr) ; - } ; - paiff->markstr = calloc (mark_count, sizeof (MARK_ID_POS)) ; - if (paiff->markstr == NULL) - return SFE_MALLOC_FAILED ; - - for (n = 0 ; n < mark_count && bytesread < chunk_size ; n++) - { unsigned int pstr_len ; - unsigned char ch ; - - bytesread += psf_binheader_readf (psf, "E241", &mark_id, &position, &ch) ; - psf_log_printf (psf, " Mark ID : %u\n Position : %u\n", mark_id, position) ; - - pstr_len = (ch & 1) ? ch : ch + 1 ; - - if (pstr_len < sizeof (ubuf.scbuf) - 1) - { bytesread += psf_binheader_readf (psf, "b", ubuf.scbuf, pstr_len) ; - ubuf.scbuf [pstr_len] = 0 ; - } - else - { unsigned int read_len = pstr_len - (sizeof (ubuf.scbuf) - 1) ; - bytesread += psf_binheader_readf (psf, "bj", ubuf.scbuf, read_len, pstr_len - read_len) ; - ubuf.scbuf [sizeof (ubuf.scbuf) - 1] = 0 ; - } - - psf_log_printf (psf, " Name : %s\n", ubuf.scbuf) ; - - paiff->markstr [n].markerID = mark_id ; - paiff->markstr [n].position = position ; - /* - ** TODO if ubuf.scbuf is equal to - ** either Beg_loop, Beg loop or beg loop and spam - ** if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL) - ** return SFE_MALLOC_FAILED ; - */ - } ; - } ; - mark_found++ ; - psf_binheader_readf (psf, "j", chunk_size - bytesread) ; - break ; - - case FVER_MARKER : - found_chunk |= HAVE_FVER ; - /* Fall through to next case. */ - - case SFX_MARKER : - psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ; - psf_binheader_readf (psf, "j", chunk_size) ; - break ; - - case NONE_MARKER : - /* Fix for broken AIFC files with incorrect COMM chunk length. */ - chunk_size = (chunk_size >> 24) - 3 ; - psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ; - psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ; - break ; - - case CHAN_MARKER : - if (chunk_size < 12) - { psf_log_printf (psf, " %M : %d (should be >= 12)\n", marker, chunk_size) ; - psf_binheader_readf (psf, "j", chunk_size) ; - break ; - } - - psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ; - - if ((error = aiff_read_chanmap (psf, chunk_size))) - return error ; - break ; - - default : - if (psf_isprint ((marker >> 24) & 0xFF) && psf_isprint ((marker >> 16) & 0xFF) - && psf_isprint ((marker >> 8) & 0xFF) && psf_isprint (marker & 0xFF)) - { psf_log_printf (psf, " %M : %d (unknown marker)\n", marker, chunk_size) ; - - psf_binheader_readf (psf, "j", chunk_size) ; - break ; - } ; - if ((chunk_size = psf_ftell (psf)) & 0x03) - { psf_log_printf (psf, " Unknown chunk marker %X at position %d. Resyncing.\n", marker, chunk_size - 4) ; - - psf_binheader_readf (psf, "j", -3) ; - break ; - } ; - psf_log_printf (psf, "*** Unknown chunk marker %X at position %D. Exiting parser.\n", marker, psf_ftell (psf)) ; - done = 1 ; - break ; - } ; /* switch (marker) */ - - if ((! psf->sf.seekable) && (found_chunk & HAVE_SSND)) - break ; - - if (psf_ftell (psf) >= psf->filelength - (2 * SIGNED_SIZEOF (int32_t))) - break ; - } ; /* while (1) */ - - if (instr_found && mark_found) - { int j ; - - for (j = 0 ; j < psf->instrument->loop_count ; j ++) - { if (j < ARRAY_LEN (psf->instrument->loops)) - { psf->instrument->loops [j].start = marker_to_position (paiff->markstr, psf->instrument->loops [j].start, mark_count) ; - psf->instrument->loops [j].end = marker_to_position (paiff->markstr, psf->instrument->loops [j].end, mark_count) ; - psf->instrument->loops [j].mode = SF_LOOP_FORWARD ; - } ; - } ; - } ; - - if (! (found_chunk & HAVE_FORM)) - return SFE_AIFF_NO_FORM ; - - if (! (found_chunk & HAVE_AIFF)) - return SFE_AIFF_COMM_NO_FORM ; - - if (! (found_chunk & HAVE_COMM)) - return SFE_AIFF_SSND_NO_COMM ; - - if (! psf->dataoffset) - return SFE_AIFF_NO_DATA ; - - return 0 ; -} /* aiff_read_header */ - -static int -aiff_close (SF_PRIVATE *psf) -{ AIFF_PRIVATE *paiff = psf->container_data ; - - if (paiff != NULL && paiff->markstr != NULL) - { free (paiff->markstr) ; - paiff->markstr = NULL ; - } ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { aiff_write_tailer (psf) ; - aiff_write_header (psf, SF_TRUE) ; - } ; - - return 0 ; -} /* aiff_close */ - -static int -aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt) -{ BUF_UNION ubuf ; - int subformat, samplerate ; - - ubuf.scbuf [0] = 0 ; - - /* The COMM chunk has an int aligned to an odd word boundary. Some - ** procesors are not able to deal with this (ie bus fault) so we have - ** to take special care. - */ - - psf_binheader_readf (psf, "E242b", &(comm_fmt->numChannels), &(comm_fmt->numSampleFrames), - &(comm_fmt->sampleSize), &(comm_fmt->sampleRate), SIGNED_SIZEOF (comm_fmt->sampleRate)) ; - - if (comm_fmt->size > 0x10000 && (comm_fmt->size & 0xffff) == 0) - { psf_log_printf (psf, " COMM : %d (0x%x) *** should be ", comm_fmt->size, comm_fmt->size) ; - comm_fmt->size = ENDSWAP_32 (comm_fmt->size) ; - psf_log_printf (psf, "%d (0x%x)\n", comm_fmt->size, comm_fmt->size) ; - } - else - psf_log_printf (psf, " COMM : %d\n", comm_fmt->size) ; - - if (comm_fmt->size == SIZEOF_AIFF_COMM) - comm_fmt->encoding = NONE_MARKER ; - else if (comm_fmt->size == SIZEOF_AIFC_COMM_MIN) - psf_binheader_readf (psf, "Em", &(comm_fmt->encoding)) ; - else if (comm_fmt->size >= SIZEOF_AIFC_COMM) - { unsigned char encoding_len ; - unsigned read_len ; - - psf_binheader_readf (psf, "Em1", &(comm_fmt->encoding), &encoding_len) ; - - comm_fmt->size = SF_MIN (sizeof (ubuf.scbuf), make_size_t (comm_fmt->size)) ; - memset (ubuf.scbuf, 0, comm_fmt->size) ; - read_len = comm_fmt->size - SIZEOF_AIFC_COMM + 1 ; - psf_binheader_readf (psf, "b", ubuf.scbuf, read_len) ; - ubuf.scbuf [read_len + 1] = 0 ; - } ; - - samplerate = tenbytefloat2int (comm_fmt->sampleRate) ; - - psf_log_printf (psf, " Sample Rate : %d\n", samplerate) ; - psf_log_printf (psf, " Frames : %u%s\n", comm_fmt->numSampleFrames, (comm_fmt->numSampleFrames == 0 && psf->filelength > 104) ? " (Should not be 0)" : "") ; - psf_log_printf (psf, " Channels : %d\n", comm_fmt->numChannels) ; - - /* Found some broken 'fl32' files with comm.samplesize == 16. Fix it here. */ - if ((comm_fmt->encoding == fl32_MARKER || comm_fmt->encoding == FL32_MARKER) && comm_fmt->sampleSize != 32) - { psf_log_printf (psf, " Sample Size : %d (should be 32)\n", comm_fmt->sampleSize) ; - comm_fmt->sampleSize = 32 ; - } - else if ((comm_fmt->encoding == fl64_MARKER || comm_fmt->encoding == FL64_MARKER) && comm_fmt->sampleSize != 64) - { psf_log_printf (psf, " Sample Size : %d (should be 64)\n", comm_fmt->sampleSize) ; - comm_fmt->sampleSize = 64 ; - } - else - psf_log_printf (psf, " Sample Size : %d\n", comm_fmt->sampleSize) ; - - subformat = s_bitwidth_to_subformat (comm_fmt->sampleSize) ; - - psf->sf.samplerate = samplerate ; - psf->sf.frames = comm_fmt->numSampleFrames ; - psf->sf.channels = comm_fmt->numChannels ; - psf->bytewidth = BITWIDTH2BYTES (comm_fmt->sampleSize) ; - - psf->endian = SF_ENDIAN_BIG ; - - switch (comm_fmt->encoding) - { case NONE_MARKER : - psf->sf.format = (SF_FORMAT_AIFF | subformat) ; - break ; - - case twos_MARKER : - case in24_MARKER : - case in32_MARKER : - psf->sf.format = (SF_ENDIAN_BIG | SF_FORMAT_AIFF | subformat) ; - break ; - - case sowt_MARKER : - case ni24_MARKER : - case ni32_MARKER : - psf->endian = SF_ENDIAN_LITTLE ; - psf->sf.format = (SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | subformat) ; - break ; - - case fl32_MARKER : - case FL32_MARKER : - psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ; - break ; - - case ulaw_MARKER : - case ULAW_MARKER : - psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_ULAW) ; - break ; - - case alaw_MARKER : - case ALAW_MARKER : - psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_ALAW) ; - break ; - - case fl64_MARKER : - case FL64_MARKER : - psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_DOUBLE) ; - break ; - - case raw_MARKER : - psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM_U8) ; - break ; - - case DWVW_MARKER : - psf->sf.format = SF_FORMAT_AIFF ; - switch (comm_fmt->sampleSize) - { case 12 : - psf->sf.format |= SF_FORMAT_DWVW_12 ; - break ; - case 16 : - psf->sf.format |= SF_FORMAT_DWVW_16 ; - break ; - case 24 : - psf->sf.format |= SF_FORMAT_DWVW_24 ; - break ; - - default : - psf->sf.format |= SF_FORMAT_DWVW_N ; - break ; - } ; - break ; - - case GSM_MARKER : - psf->sf.format = SF_FORMAT_AIFF ; - psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_GSM610) ; - break ; - - - case ima4_MARKER : - psf->endian = SF_ENDIAN_BIG ; - psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM) ; - break ; - - default : - psf_log_printf (psf, "AIFC : Unimplemented format : %M\n", comm_fmt->encoding) ; - return SFE_UNIMPLEMENTED ; - } ; - - if (! ubuf.scbuf [0]) - psf_log_printf (psf, " Encoding : %M\n", comm_fmt->encoding) ; - else - psf_log_printf (psf, " Encoding : %M => %s\n", comm_fmt->encoding, ubuf.scbuf) ; - - return 0 ; -} /* aiff_read_comm_chunk */ - - -/*========================================================================================== -*/ - -static void -aiff_rewrite_header (SF_PRIVATE *psf) -{ - /* Assuming here that the header has already been written and just - ** needs to be corrected for new data length. That means that we - ** only change the length fields of the FORM and SSND chunks ; - ** everything else can be skipped over. - */ - int k, ch, comm_size, comm_frames ; - - psf_fseek (psf, 0, SEEK_SET) ; - psf_fread (psf->header, psf->dataoffset, 1, psf) ; - - psf->headindex = 0 ; - - /* FORM chunk. */ - psf_binheader_writef (psf, "Etm8", FORM_MARKER, psf->filelength - 8) ; - - /* COMM chunk. */ - if ((k = psf_find_read_chunk_m32 (&psf->rchunks, COMM_MARKER)) >= 0) - { psf->headindex = psf->rchunks.chunks [k].offset - 8 ; - comm_frames = psf->sf.frames ; - comm_size = psf->rchunks.chunks [k].len ; - psf_binheader_writef (psf, "Em42t4", COMM_MARKER, comm_size, psf->sf.channels, comm_frames) ; - } ; - - /* PEAK chunk. */ - if ((k = psf_find_read_chunk_m32 (&psf->rchunks, PEAK_MARKER)) >= 0) - { psf->headindex = psf->rchunks.chunks [k].offset - 8 ; - psf_binheader_writef (psf, "Em4", PEAK_MARKER, AIFF_PEAK_CHUNK_SIZE (psf->sf.channels)) ; - psf_binheader_writef (psf, "E44", 1, time (NULL)) ; - for (ch = 0 ; ch < psf->sf.channels ; ch++) - psf_binheader_writef (psf, "Eft8", (float) psf->peak_info->peaks [ch].value, psf->peak_info->peaks [ch].position) ; - } ; - - - /* SSND chunk. */ - if ((k = psf_find_read_chunk_m32 (&psf->rchunks, SSND_MARKER)) >= 0) - { psf->headindex = psf->rchunks.chunks [k].offset - 8 ; - psf_binheader_writef (psf, "Etm8", SSND_MARKER, psf->datalength + SIZEOF_SSND_CHUNK) ; - } ; - - /* Header mangling complete so write it out. */ - psf_fseek (psf, 0, SEEK_SET) ; - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - return ; -} /* aiff_rewrite_header */ - -static int -aiff_write_header (SF_PRIVATE *psf, int calc_length) -{ sf_count_t current ; - AIFF_PRIVATE *paiff ; - unsigned char comm_sample_rate [10], comm_zero_bytes [2] = { 0, 0 } ; - unsigned int comm_type, comm_size, comm_encoding, comm_frames = 0, uk ; - int k, endian, has_data = SF_FALSE ; - short bit_width ; - - if ((paiff = psf->container_data) == NULL) - return SFE_INTERNAL ; - - current = psf_ftell (psf) ; - - if (current > psf->dataoffset) - has_data = SF_TRUE ; - - if (calc_length) - { psf->filelength = psf_get_filelen (psf) ; - - psf->datalength = psf->filelength - psf->dataoffset ; - if (psf->dataend) - psf->datalength -= psf->filelength - psf->dataend ; - - if (psf->bytewidth > 0) - psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; - } ; - - if (psf->file.mode == SFM_RDWR && psf->dataoffset > 0 && psf->rchunks.count > 0) - { aiff_rewrite_header (psf) ; - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - return 0 ; - } ; - - endian = SF_ENDIAN (psf->sf.format) ; - if (CPU_IS_LITTLE_ENDIAN && endian == SF_ENDIAN_CPU) - endian = SF_ENDIAN_LITTLE ; - - /* Standard value here. */ - bit_width = psf->bytewidth * 8 ; - comm_frames = (psf->sf.frames > 0xFFFFFFFF) ? 0xFFFFFFFF : psf->sf.frames ; - - switch (SF_CODEC (psf->sf.format) | endian) - { case SF_FORMAT_PCM_S8 | SF_ENDIAN_BIG : - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = twos_MARKER ; - break ; - - case SF_FORMAT_PCM_S8 | SF_ENDIAN_LITTLE : - psf->endian = SF_ENDIAN_LITTLE ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = sowt_MARKER ; - break ; - - case SF_FORMAT_PCM_16 | SF_ENDIAN_BIG : - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = twos_MARKER ; - break ; - - case SF_FORMAT_PCM_16 | SF_ENDIAN_LITTLE : - psf->endian = SF_ENDIAN_LITTLE ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = sowt_MARKER ; - break ; - - case SF_FORMAT_PCM_24 | SF_ENDIAN_BIG : - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = in24_MARKER ; - break ; - - case SF_FORMAT_PCM_24 | SF_ENDIAN_LITTLE : - psf->endian = SF_ENDIAN_LITTLE ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = ni24_MARKER ; - break ; - - case SF_FORMAT_PCM_32 | SF_ENDIAN_BIG : - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = in32_MARKER ; - break ; - - case SF_FORMAT_PCM_32 | SF_ENDIAN_LITTLE : - psf->endian = SF_ENDIAN_LITTLE ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = ni32_MARKER ; - break ; - - case SF_FORMAT_PCM_S8 : /* SF_ENDIAN_FILE */ - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFF_MARKER ; - comm_size = SIZEOF_AIFF_COMM ; - comm_encoding = 0 ; - break ; - - case SF_FORMAT_FLOAT : /* Big endian floating point. */ - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = FL32_MARKER ; /* Use 'FL32' because its easier to read. */ - break ; - - case SF_FORMAT_DOUBLE : /* Big endian double precision floating point. */ - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = FL64_MARKER ; /* Use 'FL64' because its easier to read. */ - break ; - - case SF_FORMAT_ULAW : - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = ulaw_MARKER ; - break ; - - case SF_FORMAT_ALAW : - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = alaw_MARKER ; - break ; - - case SF_FORMAT_PCM_U8 : - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = raw_MARKER ; - break ; - - case SF_FORMAT_DWVW_12 : - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = DWVW_MARKER ; - - /* Override standard value here.*/ - bit_width = 12 ; - break ; - - case SF_FORMAT_DWVW_16 : - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = DWVW_MARKER ; - - /* Override standard value here.*/ - bit_width = 16 ; - break ; - - case SF_FORMAT_DWVW_24 : - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = DWVW_MARKER ; - - /* Override standard value here.*/ - bit_width = 24 ; - break ; - - case SF_FORMAT_GSM610 : - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = GSM_MARKER ; - - /* Override standard value here.*/ - bit_width = 16 ; - break ; - - case SF_FORMAT_IMA_ADPCM : - psf->endian = SF_ENDIAN_BIG ; - comm_type = AIFC_MARKER ; - comm_size = SIZEOF_AIFC_COMM ; - comm_encoding = ima4_MARKER ; - - /* Override standard value here.*/ - bit_width = 16 ; - comm_frames = psf->sf.frames / AIFC_IMA4_SAMPLES_PER_BLOCK ; - break ; - - default : return SFE_BAD_OPEN_FORMAT ; - } ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - psf_fseek (psf, 0, SEEK_SET) ; - - psf_binheader_writef (psf, "Etm8", FORM_MARKER, psf->filelength - 8) ; - - /* Write AIFF/AIFC marker and COM chunk. */ - if (comm_type == AIFC_MARKER) - /* AIFC must have an FVER chunk. */ - psf_binheader_writef (psf, "Emm44", comm_type, FVER_MARKER, 4, 0xA2805140) ; - else - psf_binheader_writef (psf, "Em", comm_type) ; - - paiff->comm_offset = psf->headindex - 8 ; - - memset (comm_sample_rate, 0, sizeof (comm_sample_rate)) ; - uint2tenbytefloat (psf->sf.samplerate, comm_sample_rate) ; - - psf_binheader_writef (psf, "Em42t42", COMM_MARKER, comm_size, psf->sf.channels, comm_frames, bit_width) ; - psf_binheader_writef (psf, "b", comm_sample_rate, sizeof (comm_sample_rate)) ; - - /* AIFC chunks have some extra data. */ - if (comm_type == AIFC_MARKER) - psf_binheader_writef (psf, "mb", comm_encoding, comm_zero_bytes, sizeof (comm_zero_bytes)) ; - - if (psf->channel_map && paiff->chanmap_tag) - psf_binheader_writef (psf, "Em4444", CHAN_MARKER, 12, paiff->chanmap_tag, 0, 0) ; - - if (psf->instrument != NULL) - { MARK_ID_POS m [4] ; - INST_CHUNK ch ; - unsigned short ct = 0 ; - - memset (m, 0, sizeof (m)) ; - memset (&ch, 0, sizeof (ch)) ; - - ch.baseNote = psf->instrument->basenote ; - ch.detune = psf->instrument->detune ; - ch.lowNote = psf->instrument->key_lo ; - ch.highNote = psf->instrument->key_hi ; - ch.lowVelocity = psf->instrument->velocity_lo ; - ch.highVelocity = psf->instrument->velocity_hi ; - ch.gain = psf->instrument->gain ; - if (psf->instrument->loops [0].mode != SF_LOOP_NONE) - { ch.sustain_loop.playMode = 1 ; - ch.sustain_loop.beginLoop = ct ; - m [0].markerID = ct++ ; - m [0].position = psf->instrument->loops [0].start ; - ch.sustain_loop.endLoop = ct ; - m [1].markerID = ct++ ; - m [1].position = psf->instrument->loops [0].end ; - } ; - if (psf->instrument->loops [1].mode != SF_LOOP_NONE) - { ch.release_loop.playMode = 1 ; - ch.release_loop.beginLoop = ct ; - m [2].markerID = ct++ ; - m [2].position = psf->instrument->loops [1].start ; - ch.release_loop.endLoop = ct ; - m [3].markerID = ct++ ; - m [3].position = psf->instrument->loops [1].end ; - } - else - { ch.release_loop.playMode = 0 ; - ch.release_loop.beginLoop = 0 ; - ch.release_loop.endLoop = 0 ; - } ; - - psf_binheader_writef (psf, "Em4111111", INST_MARKER, SIZEOF_INST_CHUNK, ch.baseNote, ch.detune, - ch.lowNote, ch.highNote, ch.lowVelocity, ch.highVelocity) ; - psf_binheader_writef (psf, "2222222", ch.gain, ch.sustain_loop.playMode, - ch.sustain_loop.beginLoop, ch.sustain_loop.endLoop, ch.release_loop.playMode, - ch.release_loop.beginLoop, ch.release_loop.endLoop) ; - - if (ct == 2) - psf_binheader_writef (psf, "Em42241b241b", - MARK_MARKER, 2 + 2 * (2 + 4 + 1 + 9), 2, - m [0].markerID, m [0].position, 8, "beg loop", make_size_t (9), - m [1].markerID, m [1].position, 8, "end loop", make_size_t (9)) ; - else if (ct == 4) - psf_binheader_writef (psf, "Em42 241b 241b 241b 241b", - MARK_MARKER, 2 + 4 * (2 + 4 + 1 + 9), 4, - m [0].markerID, m [0].position, 8, "beg loop", make_size_t (9), - m [1].markerID, m [1].position, 8, "end loop", make_size_t (9), - m [2].markerID, m [2].position, 8, "beg loop", make_size_t (9), - m [3].markerID, m [3].position, 8, "end loop", make_size_t (9)) ; - } ; - - if (psf->strings.flags & SF_STR_LOCATE_START) - aiff_write_strings (psf, SF_STR_LOCATE_START) ; - - if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_START) - { psf_binheader_writef (psf, "Em4", PEAK_MARKER, AIFF_PEAK_CHUNK_SIZE (psf->sf.channels)) ; - psf_binheader_writef (psf, "E44", 1, time (NULL)) ; - for (k = 0 ; k < psf->sf.channels ; k++) - psf_binheader_writef (psf, "Eft8", (float) psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ; - } ; - - /* Write custom headers. */ - for (uk = 0 ; uk < psf->wchunks.used ; uk++) - psf_binheader_writef (psf, "Em4b", psf->wchunks.chunks [uk].mark32, psf->wchunks.chunks [uk].len, psf->wchunks.chunks [uk].data, make_size_t (psf->wchunks.chunks [uk].len)) ; - - /* Write SSND chunk. */ - paiff->ssnd_offset = psf->headindex ; - psf_binheader_writef (psf, "Etm844", SSND_MARKER, psf->datalength + SIZEOF_SSND_CHUNK, 0, 0) ; - - /* Header construction complete so write it out. */ - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - if (has_data && psf->dataoffset != psf->headindex) - return psf->error = SFE_INTERNAL ; - - psf->dataoffset = psf->headindex ; - - if (! has_data) - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - else if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* aiff_write_header */ - -static int -aiff_write_tailer (SF_PRIVATE *psf) -{ int k ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - - psf->dataend = psf_fseek (psf, 0, SEEK_END) ; - - /* Make sure tailer data starts at even byte offset. Pad if necessary. */ - if (psf->dataend % 2 == 1) - { psf_fwrite (psf->header, 1, 1, psf) ; - psf->dataend ++ ; - } ; - - if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_END) - { psf_binheader_writef (psf, "Em4", PEAK_MARKER, AIFF_PEAK_CHUNK_SIZE (psf->sf.channels)) ; - psf_binheader_writef (psf, "E44", 1, time (NULL)) ; - for (k = 0 ; k < psf->sf.channels ; k++) - psf_binheader_writef (psf, "Eft8", (float) psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ; - } ; - - if (psf->strings.flags & SF_STR_LOCATE_END) - aiff_write_strings (psf, SF_STR_LOCATE_END) ; - - /* Write the tailer. */ - if (psf->headindex > 0) - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - return 0 ; -} /* aiff_write_tailer */ - -static void -aiff_write_strings (SF_PRIVATE *psf, int location) -{ int k, slen ; - - for (k = 0 ; k < SF_MAX_STRINGS ; k++) - { if (psf->strings.data [k].type == 0) - break ; - - if (psf->strings.data [k].flags != location) - continue ; - - switch (psf->strings.data [k].type) - { case SF_STR_SOFTWARE : - slen = strlen (psf->strings.storage + psf->strings.data [k].offset) ; - psf_binheader_writef (psf, "Em4mb", APPL_MARKER, slen + 4, m3ga_MARKER, psf->strings.storage + psf->strings.data [k].offset, make_size_t (slen + (slen & 1))) ; - break ; - - case SF_STR_TITLE : - psf_binheader_writef (psf, "EmS", NAME_MARKER, psf->strings.storage + psf->strings.data [k].offset) ; - break ; - - case SF_STR_COPYRIGHT : - psf_binheader_writef (psf, "EmS", c_MARKER, psf->strings.storage + psf->strings.data [k].offset) ; - break ; - - case SF_STR_ARTIST : - psf_binheader_writef (psf, "EmS", AUTH_MARKER, psf->strings.storage + psf->strings.data [k].offset) ; - break ; - - case SF_STR_COMMENT : - psf_binheader_writef (psf, "EmS", ANNO_MARKER, psf->strings.storage + psf->strings.data [k].offset) ; - break ; - - /* - case SF_STR_DATE : - psf_binheader_writef (psf, "Ems", ICRD_MARKER, psf->strings.data [k].str) ; - break ; - */ - } ; - } ; - - return ; -} /* aiff_write_strings */ - -static int -aiff_command (SF_PRIVATE * psf, int command, void * UNUSED (data), int UNUSED (datasize)) -{ AIFF_PRIVATE *paiff ; - - if ((paiff = psf->container_data) == NULL) - return SFE_INTERNAL ; - - switch (command) - { case SFC_SET_CHANNEL_MAP_INFO : - paiff->chanmap_tag = aiff_caf_find_channel_layout_tag (psf->channel_map, psf->sf.channels) ; - return (paiff->chanmap_tag != 0) ; - - default : - break ; - } ; - - return 0 ; -} /* aiff_command */ - -static const char* -get_loop_mode_str (short mode) -{ switch (mode) - { case 0 : return "none" ; - case 1 : return "forward" ; - case 2 : return "backward" ; - } ; - - return "*** unknown" ; -} /* get_loop_mode_str */ - -static short -get_loop_mode (short mode) -{ switch (mode) - { case 0 : return SF_LOOP_NONE ; - case 1 : return SF_LOOP_FORWARD ; - case 2 : return SF_LOOP_BACKWARD ; - } ; - - return SF_LOOP_NONE ; -} /* get_loop_mode */ - -/*========================================================================================== -** Rough hack at converting from 80 bit IEEE float in AIFF header to an int and -** back again. It assumes that all sample rates are between 1 and 800MHz, which -** should be OK as other sound file formats use a 32 bit integer to store sample -** rate. -** There is another (probably better) version in the source code to the SoX but it -** has a copyright which probably prevents it from being allowable as GPL/LGPL. -*/ - -static int -tenbytefloat2int (unsigned char *bytes) -{ int val = 3 ; - - if (bytes [0] & 0x80) /* Negative number. */ - return 0 ; - - if (bytes [0] <= 0x3F) /* Less than 1. */ - return 1 ; - - if (bytes [0] > 0x40) /* Way too big. */ - return 0x4000000 ; - - if (bytes [0] == 0x40 && bytes [1] > 0x1C) /* Too big. */ - return 800000000 ; - - /* Ok, can handle it. */ - - val = (bytes [2] << 23) | (bytes [3] << 15) | (bytes [4] << 7) | (bytes [5] >> 1) ; - - val >>= (29 - bytes [1]) ; - - return val ; -} /* tenbytefloat2int */ - -static void -uint2tenbytefloat (unsigned int num, unsigned char *bytes) -{ unsigned int mask = 0x40000000 ; - int count ; - - if (num <= 1) - { bytes [0] = 0x3F ; - bytes [1] = 0xFF ; - bytes [2] = 0x80 ; - return ; - } ; - - bytes [0] = 0x40 ; - - if (num >= mask) - { bytes [1] = 0x1D ; - return ; - } ; - - for (count = 0 ; count <= 32 ; count ++) - { if (num & mask) - break ; - mask >>= 1 ; - } ; - - num <<= count + 1 ; - bytes [1] = 29 - count ; - bytes [2] = (num >> 24) & 0xFF ; - bytes [3] = (num >> 16) & 0xFF ; - bytes [4] = (num >> 8) & 0xFF ; - bytes [5] = num & 0xFF ; - -} /* uint2tenbytefloat */ - -static int -aiff_read_basc_chunk (SF_PRIVATE * psf, int datasize) -{ const char * type_str ; - basc_CHUNK bc ; - int count ; - - count = psf_binheader_readf (psf, "E442", &bc.version, &bc.numBeats, &bc.rootNote) ; - count += psf_binheader_readf (psf, "E222", &bc.scaleType, &bc.sigNumerator, &bc.sigDenominator) ; - count += psf_binheader_readf (psf, "E2j", &bc.loopType, datasize - sizeof (bc)) ; - - psf_log_printf (psf, " Version ? : %u\n Num Beats : %u\n Root Note : 0x%x\n", - bc.version, bc.numBeats, bc.rootNote) ; - - switch (bc.scaleType) - { case basc_SCALE_MINOR : - type_str = "MINOR" ; - break ; - case basc_SCALE_MAJOR : - type_str = "MAJOR" ; - break ; - case basc_SCALE_NEITHER : - type_str = "NEITHER" ; - break ; - case basc_SCALE_BOTH : - type_str = "BOTH" ; - break ; - default : - type_str = "!!WRONG!!" ; - break ; - } ; - - psf_log_printf (psf, " ScaleType : 0x%x (%s)\n", bc.scaleType, type_str) ; - psf_log_printf (psf, " Time Sig : %d/%d\n", bc.sigNumerator, bc.sigDenominator) ; - - switch (bc.loopType) - { case basc_TYPE_ONE_SHOT : - type_str = "One Shot" ; - break ; - case basc_TYPE_LOOP : - type_str = "Loop" ; - break ; - default: - type_str = "!!WRONG!!" ; - break ; - } ; - - psf_log_printf (psf, " Loop Type : 0x%x (%s)\n", bc.loopType, type_str) ; - - if ((psf->loop_info = calloc (1, sizeof (SF_LOOP_INFO))) == NULL) - return SFE_MALLOC_FAILED ; - - psf->loop_info->time_sig_num = bc.sigNumerator ; - psf->loop_info->time_sig_den = bc.sigDenominator ; - psf->loop_info->loop_mode = (bc.loopType == basc_TYPE_ONE_SHOT) ? SF_LOOP_NONE : SF_LOOP_FORWARD ; - psf->loop_info->num_beats = bc.numBeats ; - - /* Can always be recalculated from other known fields. */ - psf->loop_info->bpm = (1.0 / psf->sf.frames) * psf->sf.samplerate - * ((bc.numBeats * 4.0) / bc.sigDenominator) * 60.0 ; - psf->loop_info->root_key = bc.rootNote ; - - if (count < datasize) - psf_binheader_readf (psf, "j", datasize - count) ; - - return 0 ; -} /* aiff_read_basc_chunk */ - - -static int -aiff_read_chanmap (SF_PRIVATE * psf, unsigned dword) -{ const AIFF_CAF_CHANNEL_MAP * map_info ; - unsigned channel_bitmap, channel_decriptions, bytesread ; - int layout_tag ; - - bytesread = psf_binheader_readf (psf, "444", &layout_tag, &channel_bitmap, &channel_decriptions) ; - - if ((map_info = aiff_caf_of_channel_layout_tag (layout_tag)) == NULL) - return 0 ; - - psf_log_printf (psf, " Tag : %x\n", layout_tag) ; - if (map_info) - psf_log_printf (psf, " Layout : %s\n", map_info->name) ; - - if (bytesread < dword) - psf_binheader_readf (psf, "j", dword - bytesread) ; - - if (map_info->channel_map != NULL) - { size_t chanmap_size = psf->sf.channels * sizeof (psf->channel_map [0]) ; - - free (psf->channel_map) ; - - if ((psf->channel_map = malloc (chanmap_size)) == NULL) - return SFE_MALLOC_FAILED ; - - memcpy (psf->channel_map, map_info->channel_map, chanmap_size) ; - } ; - - return 0 ; -} /* aiff_read_chanmap */ - -/*============================================================================== -*/ - -static int -aiff_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) -{ return psf_save_write_chunk (&psf->wchunks, chunk_info) ; -} /* aiff_set_chunk */ - -static SF_CHUNK_ITERATOR * -aiff_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) -{ return psf_next_chunk_iterator (&psf->rchunks, iterator) ; -} /* aiff_next_chunk_iterator */ - -static int -aiff_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) -{ int indx ; - - if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0) - return SFE_UNKNOWN_CHUNK ; - - chunk_info->datalen = psf->rchunks.chunks [indx].len ; - - return SFE_NO_ERROR ; -} /* aiff_get_chunk_size */ - -static int -aiff_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) -{ sf_count_t pos ; - int indx ; - - if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0) - return SFE_UNKNOWN_CHUNK ; - - if (chunk_info->data == NULL) - return SFE_BAD_CHUNK_DATA_PTR ; - - chunk_info->id_size = psf->rchunks.chunks [indx].id_size ; - memcpy (chunk_info->id, psf->rchunks.chunks [indx].id, sizeof (chunk_info->id) / sizeof (*chunk_info->id)) ; - - pos = psf_ftell (psf) ; - psf_fseek (psf, psf->rchunks.chunks [indx].offset, SEEK_SET) ; - psf_fread (chunk_info->data, SF_MIN (chunk_info->datalen, psf->rchunks.chunks [indx].len), 1, psf) ; - psf_fseek (psf, pos, SEEK_SET) ; - - return SFE_NO_ERROR ; -} /* aiff_get_chunk_data */ diff --git a/libs/libsndfile/src/alac.c b/libs/libsndfile/src/alac.c deleted file mode 100644 index 747e032769..0000000000 --- a/libs/libsndfile/src/alac.c +++ /dev/null @@ -1,964 +0,0 @@ -/* -** Copyright (C) 2011-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" -#include "ALAC/alac_codec.h" -#include "ALAC/ALACBitUtilities.h" - -#define ALAC_MAX_FRAME_SIZE 8192 -#define ALAC_BYTE_BUFFER_SIZE 82000 - - -typedef struct -{ uint32_t current, count, allocated ; - uint32_t packet_size [] ; -} PAKT_INFO ; - -typedef struct -{ sf_count_t input_data_pos ; - - PAKT_INFO * pakt_info ; - - int channels, final_write_block ; - - uint32_t frames_this_block, partial_block_frames, frames_per_block ; - uint32_t bits_per_sample, kuki_size ; - - - /* Can't have a decoder and an encoder at the same time so stick - ** them in an un-named union. - */ - union - { ALAC_DECODER decoder ; - ALAC_ENCODER encoder ; - } ; - - char enctmpname [512] ; - FILE *enctmp ; - - int buffer [] ; - -} ALAC_PRIVATE ; - -/*============================================================================================ -*/ - -static int alac_reader_init (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info) ; -static int alac_writer_init (SF_PRIVATE *psf) ; - -static sf_count_t alac_reader_calc_frames (SF_PRIVATE *psf, ALAC_PRIVATE *plac) ; - -static sf_count_t alac_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t alac_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t alac_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t alac_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t alac_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t alac_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t alac_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t alac_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static sf_count_t alac_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; - -static int alac_close (SF_PRIVATE *psf) ; -static int alac_byterate (SF_PRIVATE *psf) ; - -static int alac_decode_block (SF_PRIVATE *psf, ALAC_PRIVATE *plac) ; -static int alac_encode_block (SF_PRIVATE *psf, ALAC_PRIVATE *plac) ; - -static uint32_t alac_kuki_read (SF_PRIVATE * psf, uint32_t kuki_offset, uint8_t * kuki, size_t kuki_maxlen) ; - -static PAKT_INFO * alac_pakt_alloc (uint32_t initial_count) ; -static PAKT_INFO * alac_pakt_read_decode (SF_PRIVATE * psf, uint32_t pakt_offset) ; -static PAKT_INFO * alac_pakt_append (PAKT_INFO * info, uint32_t value) ; -static uint8_t * alac_pakt_encode (const SF_PRIVATE *psf, uint32_t * pakt_size) ; -static sf_count_t alac_pakt_block_offset (const PAKT_INFO *info, uint32_t block) ; - -/*============================================================================================ -** ALAC Reader initialisation function. -*/ - -int -alac_init (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info) -{ int error ; - - if ((psf->codec_data = calloc (1, sizeof (ALAC_PRIVATE) + psf->sf.channels * sizeof (int) * ALAC_MAX_FRAME_SIZE)) == NULL) - return SFE_MALLOC_FAILED ; - - psf->codec_close = alac_close ; - - switch (psf->file.mode) - { case SFM_RDWR : - return SFE_BAD_MODE_RW ; - - case SFM_READ : - if ((error = alac_reader_init (psf, info))) - return error ; - break ; - - case SFM_WRITE : - if ((error = alac_writer_init (psf))) - return error ; - break ; - - default : - psf_log_printf (psf, "%s : Bad psf->file.mode.\n", __func__) ; - return SFE_INTERNAL ; - } ; - - psf->byterate = alac_byterate ; - - return 0 ; -} /* aiff_alac_init */ - -void -alac_get_desc_chunk_items (int subformat, uint32_t *fmt_flags, uint32_t *frames_per_packet) -{ switch (subformat) - { case SF_FORMAT_ALAC_16 : - *fmt_flags = 1 ; - break ; - case SF_FORMAT_ALAC_20 : - *fmt_flags = 2 ; - break ; - case SF_FORMAT_ALAC_24 : - *fmt_flags = 3 ; - break ; - case SF_FORMAT_ALAC_32 : - *fmt_flags = 4 ; - break ; - default : - break ; - } ; - *frames_per_packet = ALAC_FRAME_LENGTH ; -} /* alac_get_desc_chunk_items */ - -static int -alac_close (SF_PRIVATE *psf) -{ ALAC_PRIVATE *plac ; - BUF_UNION ubuf ; - - plac = psf->codec_data ; - - if (psf->file.mode == SFM_WRITE) - { ALAC_ENCODER *penc = &plac->encoder ; - SF_CHUNK_INFO chunk_info ; - sf_count_t readcount ; - uint32_t pakt_size = 0, saved_partial_block_frames ; -#ifndef _MSC_VER - uint8_t *kuki_data [plac->kuki_size]; -#else - uint8_t *kuki_data = (uint8_t *)_alloca(plac->kuki_size); -#endif - - plac->final_write_block = 1 ; - saved_partial_block_frames = plac->partial_block_frames ; - - /* If a block has been partially assembled, write it out as the final block. */ - if (plac->partial_block_frames && plac->partial_block_frames < plac->frames_per_block) - alac_encode_block (psf, plac) ; - - plac->partial_block_frames = saved_partial_block_frames ; - - alac_get_magic_cookie (penc, kuki_data, &plac->kuki_size) ; - - memset (&chunk_info, 0, sizeof (chunk_info)) ; - chunk_info.id_size = snprintf (chunk_info.id, sizeof (chunk_info.id), "kuki") ; - chunk_info.data = kuki_data ; - chunk_info.datalen = plac->kuki_size ; - psf_save_write_chunk (&psf->wchunks, &chunk_info) ; - - memset (&chunk_info, 0, sizeof (chunk_info)) ; - chunk_info.id_size = snprintf (chunk_info.id, sizeof (chunk_info.id), "pakt") ; - chunk_info.data = alac_pakt_encode (psf, &pakt_size) ; - chunk_info.datalen = pakt_size ; - psf_save_write_chunk (&psf->wchunks, &chunk_info) ; - - free (chunk_info.data) ; - chunk_info.data = NULL ; - - psf->write_header (psf, 1) ; - - if (plac->enctmp != NULL) - { fseek (plac->enctmp, 0, SEEK_SET) ; - - while ((readcount = fread (ubuf.ucbuf, 1, sizeof (ubuf.ucbuf), plac->enctmp)) > 0) - psf_fwrite (ubuf.ucbuf, 1, readcount, psf) ; - fclose (plac->enctmp) ; - remove (plac->enctmpname) ; - } ; - free(kuki_data); - } ; - - if (plac->pakt_info) - free (plac->pakt_info) ; - plac->pakt_info = NULL ; - - return 0 ; -} /* alac_close */ - -static int -alac_byterate (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_READ) - return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ; - - return -1 ; -} /* alac_byterate */ - -/*============================================================================================ -** ALAC initialisation Functions. -*/ - -static int -alac_reader_init (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info) -{ ALAC_PRIVATE *plac ; - uint32_t kuki_size ; - union { uint8_t kuki [512] ; uint32_t alignment ; } u ; - - if (info == NULL) - { psf_log_printf (psf, "%s : ALAC_DECODER_INFO is NULL.\n", __func__) ; - return SFE_INTERNAL ; - } ; - - plac = psf->codec_data ; - - plac->channels = psf->sf.channels ; - plac->frames_per_block = info->frames_per_packet ; - plac->bits_per_sample = info->bits_per_sample ; - - if (plac->pakt_info != NULL) - free (plac->pakt_info) ; - plac->pakt_info = alac_pakt_read_decode (psf, info->pakt_offset) ; - - - if (plac->pakt_info == NULL) - { psf_log_printf (psf, "%s : alac_pkt_read() returns NULL.\n", __func__) ; - return SFE_MALLOC_FAILED ; - } ; - - /* Read in the ALAC cookie data and pass it to the init function. */ - kuki_size = alac_kuki_read (psf, info->kuki_offset, u.kuki, sizeof (u.kuki)) ; - - alac_decoder_init (&plac->decoder, u.kuki, kuki_size) ; - - switch (info->bits_per_sample) - { case 16 : - case 20 : - case 24 : - case 32 : - psf->read_short = alac_read_s ; - psf->read_int = alac_read_i ; - psf->read_float = alac_read_f ; - psf->read_double = alac_read_d ; - break ; - - default : - printf ("%s : info->bits_per_sample %u\n", __func__, info->bits_per_sample) ; - return SFE_UNSUPPORTED_ENCODING ; - } ; - - psf->codec_close = alac_close ; - psf->seek = alac_seek ; - - psf->sf.frames = alac_reader_calc_frames (psf, plac) ; - alac_seek (psf, SFM_READ, 0) ; - - return 0 ; -} /* alac_reader_init */ - -static int -alac_writer_init (SF_PRIVATE *psf) -{ ALAC_PRIVATE *plac ; - uint32_t alac_format_flags = 0 ; - - plac = psf->codec_data ; - - if (psf->file.mode != SFM_WRITE) - return SFE_BAD_MODE_RW ; - - plac->channels = psf->sf.channels ; - plac->kuki_size = alac_get_magic_cookie_size (psf->sf.channels) ; - - psf->write_short = alac_write_s ; - psf->write_int = alac_write_i ; - psf->write_float = alac_write_f ; - psf->write_double = alac_write_d ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_ALAC_16 : - alac_format_flags = 1 ; - plac->bits_per_sample = 16 ; - break ; - - case SF_FORMAT_ALAC_20 : - alac_format_flags = 2 ; - plac->bits_per_sample = 20 ; - break ; - - case SF_FORMAT_ALAC_24 : - alac_format_flags = 3 ; - plac->bits_per_sample = 24 ; - break ; - - case SF_FORMAT_ALAC_32 : - alac_format_flags = 4 ; - plac->bits_per_sample = 32 ; - break ; - - default : - psf_log_printf (psf, "%s : Can't figure out bits per sample.\n", __func__) ; - return SFE_UNIMPLEMENTED ; - } ; - - plac->frames_per_block = ALAC_FRAME_LENGTH ; - - plac->pakt_info = alac_pakt_alloc (2000) ; - - if ((plac->enctmp = psf_open_tmpfile (plac->enctmpname, sizeof (plac->enctmpname))) == NULL) - { psf_log_printf (psf, "Error : Failed to open temp file '%s' : \n", plac->enctmpname, strerror (errno)) ; - return SFE_ALAC_FAIL_TMPFILE ; - } ; - - alac_encoder_init (&plac->encoder, psf->sf.samplerate, psf->sf.channels, alac_format_flags, ALAC_FRAME_LENGTH) ; - - return 0 ; -} /* alac_writer_init */ - -/*============================================================================================ -** ALAC block decoder and encoder. -*/ - -static inline uint32_t -alac_reader_next_packet_size (PAKT_INFO * info) -{ if (info->current >= info->count) - return 0 ; - return info->packet_size [info->current++] ; -} /* alac_reader_next_packet_size */ - -static sf_count_t -alac_reader_calc_frames (SF_PRIVATE *psf, ALAC_PRIVATE *plac) -{ sf_count_t frames = 0 ; - uint32_t current_pos = 1, blocks = 0 ; - - plac->pakt_info->current = 0 ; - - while (current_pos < psf->filelength && current_pos > 0) - { current_pos = alac_reader_next_packet_size (plac->pakt_info) ; - blocks = current_pos > 0 ? blocks + 1 : blocks ; - } ; - - if (blocks == 0) - return 0 ; - - /* Only count full blocks. */ - frames = plac->frames_per_block * (blocks - 1) ; - - alac_seek (psf, SFM_READ, frames) ; - alac_decode_block (psf, plac) ; - frames += plac->frames_this_block ; - - plac->pakt_info->current = 0 ; - - return frames ; -} /* alac_reader_calc_frames */ - -static int -alac_decode_block (SF_PRIVATE *psf, ALAC_PRIVATE *plac) -{ ALAC_DECODER *pdec = &plac->decoder ; - uint8_t byte_buffer [ALAC_BYTE_BUFFER_SIZE] ; - uint32_t packet_size ; - BitBuffer bit_buffer ; - - packet_size = alac_reader_next_packet_size (plac->pakt_info) ; - if (packet_size == 0) - { if (plac->pakt_info->current < plac->pakt_info->count) - psf_log_printf (psf, "packet_size is 0 (%d of %d)\n", plac->pakt_info->current, plac->pakt_info->count) ; - return 0 ; - } ; - - psf_fseek (psf, plac->input_data_pos, SEEK_SET) ; - - if (packet_size > SIGNED_SIZEOF (byte_buffer)) - { psf_log_printf (psf, "%s : bad packet_size (%u)\n", __func__, packet_size) ; - return 0 ; - } ; - - if ((packet_size != psf_fread (byte_buffer, 1, packet_size, psf))) - return 0 ; - - BitBufferInit (&bit_buffer, byte_buffer, packet_size) ; - - plac->input_data_pos += packet_size ; - plac->frames_this_block = 0 ; - alac_decode (pdec, &bit_buffer, plac->buffer, plac->frames_per_block, psf->sf.channels, &plac->frames_this_block) ; - - plac->partial_block_frames = 0 ; - - return 1 ; -} /* alac_decode_block */ - - -static int -alac_encode_block (SF_PRIVATE * psf, ALAC_PRIVATE *plac) -{ ALAC_ENCODER *penc = &plac->encoder ; - uint32_t num_bytes = 0 ; -#ifndef _MSC_VER - uint8_t byte_buffer [psf->sf.channels * ALAC_BYTE_BUFFER_SIZE] ; -#else - uint8_t* byte_buffer = (uint8_t*)_alloca (psf->sf.channels * ALAC_BYTE_BUFFER_SIZE) ; -#endif - - alac_encode (penc, plac->channels, plac->partial_block_frames, plac->buffer, byte_buffer, &num_bytes) ; - - if (fwrite (byte_buffer, 1, num_bytes, plac->enctmp) != num_bytes) - { - free (byte_buffer); - return 0 ; - } - free(byte_buffer); - - if ((plac->pakt_info = alac_pakt_append (plac->pakt_info, num_bytes)) == NULL) - return 0 ; - - plac->partial_block_frames = 0 ; - - return 1 ; -} /* alac_encode_block */ - -/*============================================================================================ -** ALAC read functions. -*/ - -static sf_count_t -alac_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ ALAC_PRIVATE *plac ; - int *iptr ; - int k, readcount ; - sf_count_t total = 0 ; - - if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) - return 0 ; - - while (len > 0) - { if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0) - break ; - - readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ; - readcount = readcount > len ? len : readcount ; - - iptr = plac->buffer + plac->partial_block_frames * plac->channels ; - - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = iptr [k] >> 16 ; - - plac->partial_block_frames += readcount / plac->channels ; - total += readcount ; - len -= readcount ; - } ; - - return total ; -} /* alac_read_s */ - -static sf_count_t -alac_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ ALAC_PRIVATE *plac ; - int *iptr ; - int k, readcount ; - sf_count_t total = 0 ; - - if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) - return 0 ; - - while (len > 0) - { if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0) - break ; - - readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ; - readcount = readcount > len ? len : readcount ; - - iptr = plac->buffer + plac->partial_block_frames * plac->channels ; - - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = iptr [k] ; - - plac->partial_block_frames += readcount / plac->channels ; - total += readcount ; - len -= readcount ; - } ; - - return total ; -} /* alac_read_i */ - -static sf_count_t -alac_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ ALAC_PRIVATE *plac ; - int *iptr ; - int k, readcount ; - sf_count_t total = 0 ; - float normfact ; - - if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) - return 0 ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ; - - while (len > 0) - { if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0) - break ; - - readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ; - readcount = readcount > len ? len : readcount ; - - iptr = plac->buffer + plac->partial_block_frames * plac->channels ; - - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * iptr [k] ; - - plac->partial_block_frames += readcount / plac->channels ; - total += readcount ; - len -= readcount ; - } ; - - return total ; -} /* alac_read_f */ - -static sf_count_t -alac_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ ALAC_PRIVATE *plac ; - int *iptr ; - int k, readcount ; - sf_count_t total = 0 ; - double normfact ; - - if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) - return 0 ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ; - - while (len > 0) - { if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0) - break ; - - readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ; - readcount = readcount > len ? len : readcount ; - - iptr = plac->buffer + plac->partial_block_frames * plac->channels ; - - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * iptr [k] ; - - plac->partial_block_frames += readcount / plac->channels ; - total += readcount ; - len -= readcount ; - } ; - - return total ; -} /* alac_read_d */ - -/*============================================================================================ -*/ - -static sf_count_t -alac_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) -{ ALAC_PRIVATE *plac ; - int newblock, newsample ; - - if (! psf->codec_data) - return 0 ; - plac = (ALAC_PRIVATE*) psf->codec_data ; - - if (psf->datalength < 0 || psf->dataoffset < 0) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - if (offset == 0) - { psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - - plac->frames_this_block = 0 ; - plac->input_data_pos = psf->dataoffset ; - plac->pakt_info->current = 0 ; - return 0 ; - } ; - - if (offset < 0 || offset > plac->pakt_info->count * plac->frames_per_block) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - newblock = offset / plac->frames_per_block ; - newsample = offset % plac->frames_per_block ; - - if (mode == SFM_READ) - { plac->input_data_pos = psf->dataoffset + alac_pakt_block_offset (plac->pakt_info, newblock) ; - - plac->pakt_info->current = newblock ; - alac_decode_block (psf, plac) ; - plac->partial_block_frames = newsample ; - } - else - { /* What to do about write??? */ - psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - return newblock * plac->frames_per_block + newsample ; -} /* alac_seek */ - -/*========================================================================================== -** ALAC Write Functions. -*/ - -static sf_count_t -alac_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ ALAC_PRIVATE *plac ; - int *iptr ; - int k, writecount ; - sf_count_t total = 0 ; - - if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) - return 0 ; - - while (len > 0) - { writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ; - writecount = (writecount == 0 || writecount > len) ? len : writecount ; - - iptr = plac->buffer + plac->partial_block_frames * plac->channels ; - - for (k = 0 ; k < writecount ; k++) - iptr [k] = ptr [total + k] << 16 ; - - plac->partial_block_frames += writecount / plac->channels ; - total += writecount ; - len -= writecount ; - - if (plac->partial_block_frames >= plac->frames_per_block) - alac_encode_block (psf, plac) ; - } ; - - return total ; -} /* alac_write_s */ - -static sf_count_t -alac_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ ALAC_PRIVATE *plac ; - int *iptr ; - int k, writecount ; - sf_count_t total = 0 ; - - if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) - return 0 ; - - while (len > 0) - { writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ; - writecount = (writecount == 0 || writecount > len) ? len : writecount ; - - iptr = plac->buffer + plac->partial_block_frames * plac->channels ; - - for (k = 0 ; k < writecount ; k++) - iptr [k] = ptr [total + k] ; - - plac->partial_block_frames += writecount / plac->channels ; - total += writecount ; - len -= writecount ; - - if (plac->partial_block_frames >= plac->frames_per_block) - alac_encode_block (psf, plac) ; - } ; - - return total ; -} /* alac_write_i */ - -static sf_count_t -alac_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ ALAC_PRIVATE *plac ; - void (*convert) (const float *, int *t, int, int) ; - int *iptr ; - int writecount ; - sf_count_t total = 0 ; - - if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) - return 0 ; - - convert = (psf->add_clipping) ? psf_f2i_clip_array : psf_f2i_array ; - - while (len > 0) - { writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ; - writecount = (writecount == 0 || writecount > len) ? len : writecount ; - - iptr = plac->buffer + plac->partial_block_frames * plac->channels ; - - convert (ptr, iptr, writecount, psf->norm_float) ; - - plac->partial_block_frames += writecount / plac->channels ; - total += writecount ; - len -= writecount ; - - if (plac->partial_block_frames >= plac->frames_per_block) - alac_encode_block (psf, plac) ; - } ; - - return total ; -} /* alac_write_f */ - -static sf_count_t -alac_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ ALAC_PRIVATE *plac ; - void (*convert) (const double *, int *t, int, int) ; - int *iptr ; - int writecount ; - sf_count_t total = 0 ; - - if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) - return 0 ; - - convert = (psf->add_clipping) ? psf_d2i_clip_array : psf_d2i_array ; - - while (len > 0) - { writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ; - writecount = (writecount == 0 || writecount > len) ? len : writecount ; - - iptr = plac->buffer + plac->partial_block_frames * plac->channels ; - - convert (ptr, iptr, writecount, psf->norm_float) ; - - plac->partial_block_frames += writecount / plac->channels ; - total += writecount ; - len -= writecount ; - - if (plac->partial_block_frames >= plac->frames_per_block) - alac_encode_block (psf, plac) ; - } ; - - return total ; -} /* alac_write_d */ - -/*============================================================================== -** PAKT_INFO handling. -*/ - -static PAKT_INFO * -alac_pakt_alloc (uint32_t initial_count) -{ PAKT_INFO * info ; - - if ((info = calloc (1, sizeof (PAKT_INFO) + initial_count * sizeof (info->packet_size [0]))) == NULL) - return NULL ; - - info->allocated = initial_count ; - info->current = 0 ; - info->count = 0 ; - - return info ; -} /* alac_pakt_alloc */ - -static PAKT_INFO * -alac_pakt_append (PAKT_INFO * info, uint32_t value) -{ - if (info->count >= info->allocated) - { PAKT_INFO * temp ; - uint32_t newcount = info->allocated + info->allocated / 2 ; - - if ((temp = realloc (info, sizeof (PAKT_INFO) + newcount * sizeof (info->packet_size [0]))) == NULL) - return NULL ; - - info = temp ; - info->allocated = newcount ; - } ; - - info->packet_size [info->count++] = value ; - return info ; -} /* alac_pakt_append */ - -static PAKT_INFO * -alac_pakt_read_decode (SF_PRIVATE * psf, uint32_t UNUSED (pakt_offset)) -{ SF_CHUNK_INFO chunk_info ; - PAKT_INFO * info = NULL ; - uint8_t *pakt_data = NULL ; - uint32_t bcount, value = 1, pakt_size ; - SF_CHUNK_ITERATOR * chunk_iterator ; - - - memset (&chunk_info, 0, sizeof (chunk_info)) ; - snprintf (chunk_info.id, sizeof (chunk_info.id), "pakt") ; - chunk_info.id_size = 4 ; - - if ((chunk_iterator = psf_get_chunk_iterator (psf, chunk_info.id)) == NULL) - { printf ("%s %d : no chunk iterator found\n\n", __func__, __LINE__) ; - free (chunk_info.data) ; - chunk_info.data = NULL ; - return NULL ; - } ; - - psf->get_chunk_size (psf, chunk_iterator, &chunk_info) ; - - pakt_size = chunk_info.datalen ; - chunk_info.data = pakt_data = malloc (pakt_size + 5) ; - - if ((bcount = psf->get_chunk_data (psf, chunk_iterator, &chunk_info)) != SF_ERR_NO_ERROR) - { printf ("%s %d : %s\n\n", __func__, __LINE__, sf_error_number (bcount)) ; - while (chunk_iterator) - chunk_iterator = psf->next_chunk_iterator (psf, chunk_iterator) ; - free (chunk_info.data) ; - chunk_info.data = NULL ; - return NULL ; - } ; - - while (chunk_iterator) - chunk_iterator = psf->next_chunk_iterator (psf, chunk_iterator) ; - - info = alac_pakt_alloc (pakt_size / 4) ; - - /* Start at 24 bytes in, skipping over the 'pakt' chunks header. */ - for (bcount = 24 ; bcount < pakt_size && value != 0 ; ) - { uint8_t byte ; - int32_t count = 0 ; - - value = 0 ; - do - { byte = pakt_data [bcount + count] ; - value = (value << 7) + (byte & 0x7F) ; - - count ++ ; - if (count > 5 || bcount + count > pakt_size) - { printf ("%s %d : Ooops! count %d bcount %d\n", __func__, __LINE__, count, bcount) ; - value = 0 ; - break ; - } ; - } - while (byte & 0x80) ; - - bcount += count ; - - if ((info = alac_pakt_append (info, value)) == NULL) - goto FreeExit ; - } ; - - free (pakt_data) ; - - return info ; - -FreeExit : - free (pakt_data) ; - free (info) ; - return NULL ; -} /* alac_pakt_read_decode */ - -static uint8_t * -alac_pakt_encode (const SF_PRIVATE *psf, uint32_t * pakt_size_out) -{ const ALAC_PRIVATE *plac ; - const PAKT_INFO *info ; - uint8_t *data ; - uint32_t k, allocated, pakt_size ; - - plac = psf->codec_data ; - info = plac->pakt_info ; - - allocated = 100 + 2 * info->count ; - if ((data = calloc (1, allocated)) == NULL) - return NULL ; - - psf_put_be64 (data, 0, info->count) ; - psf_put_be64 (data, 8, psf->sf.frames) ; - psf_put_be32 (data, 20, kALACDefaultFramesPerPacket - plac->partial_block_frames) ; - - /* Real 'pakt' data starts after 24 byte header. */ - pakt_size = 24 ; - - for (k = 0 ; k < info->count ; k++) - { int32_t value = info->packet_size [k] ; - - if ((value & 0x7f) == value) - { data [pakt_size++] = value ; - continue ; - } ; - - if ((value & 0x3fff) == value) - { data [pakt_size++] = (value >> 7) | 0x80 ; - data [pakt_size++] = value & 0x7f ; - continue ; - } ; - - if ((value & 0x1fffff) == value) - { data [pakt_size++] = (value >> 14) | 0x80 ; - data [pakt_size++] = ((value >> 7) & 0x7f) | 0x80 ; - data [pakt_size++] = value & 0x7f ; - continue ; - } ; - - if ((value & 0x0fffffff) == value) - { data [pakt_size++] = (value >> 21) | 0x80 ; - data [pakt_size++] = ((value >> 14) & 0x7f) | 0x80 ; - data [pakt_size++] = ((value >> 7) & 0x7f) | 0x80 ; - data [pakt_size++] = value & 0x7f ; - continue ; - } ; - - *pakt_size_out = 0 ; - free (data) ; - return NULL ; - } ; - - *pakt_size_out = pakt_size ; - return data ; -} /* alac_pakt_encode */ - -static sf_count_t -alac_pakt_block_offset (const PAKT_INFO *info, uint32_t block) -{ sf_count_t offset = 0 ; - uint32_t k ; - - for (k = 0 ; k < block ; k++) - offset += info->packet_size [k] ; - - return offset ; -} /* alac_pakt_block_offset */ - -static uint32_t -alac_kuki_read (SF_PRIVATE * psf, uint32_t kuki_offset, uint8_t * kuki, size_t kuki_maxlen) -{ uint32_t marker ; - uint64_t kuki_size ; - - if (psf_fseek (psf, kuki_offset, SEEK_SET) != kuki_offset) - return 0 ; - - psf_fread (&marker, 1, sizeof (marker), psf) ; - if (marker != MAKE_MARKER ('k', 'u', 'k', 'i')) - return 0 ; - - psf_fread (&kuki_size, 1, sizeof (kuki_size), psf) ; - kuki_size = BE2H_64 (kuki_size) ; - - if (kuki_size == 0 || kuki_size > kuki_maxlen) - { psf_log_printf (psf, "%s : Bad size (%D) of 'kuki' chunk.\n", __func__, kuki_size) ; - return 0 ; - } ; - - psf_fread (kuki, 1, kuki_size, psf) ; - - return kuki_size ; -} /* alac_kuki_read */ diff --git a/libs/libsndfile/src/alaw.c b/libs/libsndfile/src/alaw.c deleted file mode 100644 index 81d7696863..0000000000 --- a/libs/libsndfile/src/alaw.c +++ /dev/null @@ -1,548 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include - -#include "sndfile.h" -#include "common.h" - -static sf_count_t alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t alaw_write_s2alaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t alaw_write_i2alaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t alaw_write_f2alaw (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t alaw_write_d2alaw (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static void alaw2s_array (unsigned char *buffer, int count, short *ptr) ; -static void alaw2i_array (unsigned char *buffer, int count, int *ptr) ; -static void alaw2f_array (unsigned char *buffer, int count, float *ptr, float normfact) ; -static void alaw2d_array (unsigned char *buffer, int count, double *ptr, double normfact) ; - -static void s2alaw_array (const short *buffer, int count, unsigned char *ptr) ; -static void i2alaw_array (const int *buffer, int count, unsigned char *ptr) ; -static void f2alaw_array (const float *buffer, int count, unsigned char *ptr, float normfact) ; -static void d2alaw_array (const double *buffer, int count, unsigned char *ptr, double normfact) ; - - -int -alaw_init (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) - { psf->read_short = alaw_read_alaw2s ; - psf->read_int = alaw_read_alaw2i ; - psf->read_float = alaw_read_alaw2f ; - psf->read_double = alaw_read_alaw2d ; - } ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { psf->write_short = alaw_write_s2alaw ; - psf->write_int = alaw_write_i2alaw ; - psf->write_float = alaw_write_f2alaw ; - psf->write_double = alaw_write_d2alaw ; - } ; - - psf->bytewidth = 1 ; - psf->blockwidth = psf->sf.channels ; - - if (psf->filelength > psf->dataoffset) - psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : psf->filelength - psf->dataoffset ; - else - psf->datalength = 0 ; - - psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ; - - return 0 ; -} /* alaw_init */ - -/*============================================================================== - * Private static functions and data. - */ - -static -short alaw_decode [256] = -{ -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, - -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, - -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, - -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, - -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944, - -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136, - -11008, -10496, -12032, -11520, -8960, -8448, -9984, -9472, - -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568, - -344, -328, -376, -360, -280, -264, -312, -296, - -472, -456, -504, -488, -408, -392, -440, -424, - -88, -72, -120, -104, -24, -8, -56, -40, - -216, -200, -248, -232, -152, -136, -184, -168, - -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, - -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, - -688, -656, -752, -720, -560, -528, -624, -592, - -944, -912, -1008, -976, -816, -784, -880, -848, - 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, - 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, - 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, - 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, - 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, - 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, - 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, - 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, - 344, 328, 376, 360, 280, 264, 312, 296, - 472, 456, 504, 488, 408, 392, 440, 424, - 88, 72, 120, 104, 24, 8, 56, 40, - 216, 200, 248, 232, 152, 136, 184, 168, - 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, - 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, - 688, 656, 752, 720, 560, 528, 624, 592, - 944, 912, 1008, 976, 816, 784, 880, 848 -} ; /* alaw_decode */ - -static -unsigned char alaw_encode [2048 + 1] = -{ 0xd5, 0xd4, 0xd7, 0xd6, 0xd1, 0xd0, 0xd3, 0xd2, 0xdd, 0xdc, 0xdf, 0xde, - 0xd9, 0xd8, 0xdb, 0xda, 0xc5, 0xc4, 0xc7, 0xc6, 0xc1, 0xc0, 0xc3, 0xc2, - 0xcd, 0xcc, 0xcf, 0xce, 0xc9, 0xc8, 0xcb, 0xca, 0xf5, 0xf5, 0xf4, 0xf4, - 0xf7, 0xf7, 0xf6, 0xf6, 0xf1, 0xf1, 0xf0, 0xf0, 0xf3, 0xf3, 0xf2, 0xf2, - 0xfd, 0xfd, 0xfc, 0xfc, 0xff, 0xff, 0xfe, 0xfe, 0xf9, 0xf9, 0xf8, 0xf8, - 0xfb, 0xfb, 0xfa, 0xfa, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, - 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe1, 0xe1, 0xe1, 0xe1, - 0xe0, 0xe0, 0xe0, 0xe0, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, - 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xef, 0xef, 0xef, 0xef, - 0xee, 0xee, 0xee, 0xee, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, - 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, - 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, 0x96, - 0x96, 0x96, 0x96, 0x96, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, - 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x93, 0x93, 0x93, 0x93, - 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, - 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, 0x9c, 0x9c, - 0x9c, 0x9c, 0x9c, 0x9c, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, - 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, - 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, - 0x9a, 0x9a, 0x9a, 0x9a, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0xb5, 0xb5, 0xb5, 0xb5, - 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, - 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, - 0xb5, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, - 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, - 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, - 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, - 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, - 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, - 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, - 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, - 0xb6, 0xb6, 0xb6, 0xb6, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, - 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, - 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, - 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, - 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, - 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb3, 0xb3, 0xb3, 0xb3, - 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, - 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, - 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, - 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, - 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, - 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, - 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, - 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, - 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, - 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, - 0xbc, 0xbc, 0xbc, 0xbc, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, - 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, - 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, - 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, - 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, - 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xb9, 0xb9, 0xb9, 0xb9, - 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, - 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, - 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, - 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, - 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, - 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, - 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, - 0xba, 0xba, 0xba, 0xba, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, - 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, - 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, - 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, - 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, - 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, - 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, - 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, - 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, - 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, - 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, - 0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, - 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, - 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, - 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, - 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, - 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa1, 0xa1, 0xa1, 0xa1, - 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, - 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, - 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, - 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, - 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, - 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, - 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, - 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, - 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, - 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, - 0xa0, 0xa0, 0xa0, 0xa0, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, - 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, - 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, - 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, - 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, - 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, - 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, - 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, - 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, - 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, - 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, - 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, - 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, - 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, - 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, - 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, - 0xad, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xaf, 0xaf, 0xaf, 0xaf, - 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, - 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, - 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, - 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, - 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, - 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, - 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, - 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, - 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, - 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, - 0xae, 0xae, 0xae, 0xae, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, - 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, - 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, - 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, - 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, - 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8, - 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, - 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, - 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, - 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, - 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, - 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, - 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, - 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, - 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, - 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, - 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa -} ; /* alaw_encode */ - -static inline void -alaw2s_array (unsigned char *buffer, int count, short *ptr) -{ while (--count >= 0) - ptr [count] = alaw_decode [(int) buffer [count]] ; -} /* alaw2s_array */ - -static inline void -alaw2i_array (unsigned char *buffer, int count, int *ptr) -{ while (--count >= 0) - ptr [count] = alaw_decode [(int) buffer [count]] << 16 ; -} /* alaw2i_array */ - -static inline void -alaw2f_array (unsigned char *buffer, int count, float *ptr, float normfact) -{ while (--count >= 0) - ptr [count] = normfact * alaw_decode [(int) buffer [count]] ; -} /* alaw2f_array */ - -static inline void -alaw2d_array (unsigned char *buffer, int count, double *ptr, double normfact) -{ while (--count >= 0) - ptr [count] = normfact * alaw_decode [(int) buffer [count]] ; -} /* alaw2d_array */ - -static inline void -s2alaw_array (const short *ptr, int count, unsigned char *buffer) -{ while (--count >= 0) - { if (ptr [count] >= 0) - buffer [count] = alaw_encode [ptr [count] / 16] ; - else - buffer [count] = 0x7F & alaw_encode [ptr [count] / -16] ; - } ; -} /* s2alaw_array */ - -static inline void -i2alaw_array (const int *ptr, int count, unsigned char *buffer) -{ while (--count >= 0) - { if (ptr [count] >= 0) - buffer [count] = alaw_encode [ptr [count] >> (16 + 4)] ; - else - buffer [count] = 0x7F & alaw_encode [- ptr [count] >> (16 + 4)] ; - } ; -} /* i2alaw_array */ - -static inline void -f2alaw_array (const float *ptr, int count, unsigned char *buffer, float normfact) -{ while (--count >= 0) - { if (ptr [count] >= 0) - buffer [count] = alaw_encode [lrintf (normfact * ptr [count])] ; - else - buffer [count] = 0x7F & alaw_encode [- lrintf (normfact * ptr [count])] ; - } ; -} /* f2alaw_array */ - -static inline void -d2alaw_array (const double *ptr, int count, unsigned char *buffer, double normfact) -{ while (--count >= 0) - { if (ptr [count] >= 0) - buffer [count] = alaw_encode [lrint (normfact * ptr [count])] ; - else - buffer [count] = 0x7F & alaw_encode [- lrint (normfact * ptr [count])] ; - } ; -} /* d2alaw_array */ - -/*============================================================================== -*/ - -static sf_count_t -alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; - alaw2s_array (ubuf.ucbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* alaw_read_alaw2s */ - -static sf_count_t -alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; - alaw2i_array (ubuf.ucbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* alaw_read_alaw2i */ - -static sf_count_t -alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float normfact ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; - alaw2f_array (ubuf.ucbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* alaw_read_alaw2f */ - -static sf_count_t -alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double normfact ; - - normfact = (psf->norm_double) ? 1.0 / ((double) 0x8000) : 1.0 ; - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; - alaw2d_array (ubuf.ucbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* alaw_read_alaw2d */ - -/*============================================================================================= -*/ - -static sf_count_t -alaw_write_s2alaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - s2alaw_array (ptr + total, bufferlen, ubuf.ucbuf) ; - writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* alaw_write_s2alaw */ - -static sf_count_t -alaw_write_i2alaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - i2alaw_array (ptr + total, bufferlen, ubuf.ucbuf) ; - writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* alaw_write_i2alaw */ - -static sf_count_t -alaw_write_f2alaw (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - float normfact ; - - normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) / 16.0 : 1.0 / 16 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - f2alaw_array (ptr + total, bufferlen, ubuf.ucbuf, normfact) ; - writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* alaw_write_f2alaw */ - -static sf_count_t -alaw_write_d2alaw (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - double normfact ; - - normfact = (psf->norm_double) ? (1.0 * 0x7FFF) / 16.0 : 1.0 / 16.0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - d2alaw_array (ptr + total, bufferlen, ubuf.ucbuf, normfact) ; - writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* alaw_write_d2alaw */ - diff --git a/libs/libsndfile/src/au.c b/libs/libsndfile/src/au.c deleted file mode 100644 index bcd869a70a..0000000000 --- a/libs/libsndfile/src/au.c +++ /dev/null @@ -1,450 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/*------------------------------------------------------------------------------ -** Macros to handle big/little endian issues. -*/ - -#define DOTSND_MARKER (MAKE_MARKER ('.', 's', 'n', 'd')) -#define DNSDOT_MARKER (MAKE_MARKER ('d', 'n', 's', '.')) - -#define AU_DATA_OFFSET 24 - -/*------------------------------------------------------------------------------ -** Known AU file encoding types. -*/ - -enum -{ AU_ENCODING_ULAW_8 = 1, /* 8-bit u-law samples */ - AU_ENCODING_PCM_8 = 2, /* 8-bit linear samples */ - AU_ENCODING_PCM_16 = 3, /* 16-bit linear samples */ - AU_ENCODING_PCM_24 = 4, /* 24-bit linear samples */ - AU_ENCODING_PCM_32 = 5, /* 32-bit linear samples */ - - AU_ENCODING_FLOAT = 6, /* floating-point samples */ - AU_ENCODING_DOUBLE = 7, /* double-precision float samples */ - AU_ENCODING_INDIRECT = 8, /* fragmented sampled data */ - AU_ENCODING_NESTED = 9, /* ? */ - AU_ENCODING_DSP_CORE = 10, /* DSP program */ - AU_ENCODING_DSP_DATA_8 = 11, /* 8-bit fixed-point samples */ - AU_ENCODING_DSP_DATA_16 = 12, /* 16-bit fixed-point samples */ - AU_ENCODING_DSP_DATA_24 = 13, /* 24-bit fixed-point samples */ - AU_ENCODING_DSP_DATA_32 = 14, /* 32-bit fixed-point samples */ - - AU_ENCODING_DISPLAY = 16, /* non-audio display data */ - AU_ENCODING_MULAW_SQUELCH = 17, /* ? */ - AU_ENCODING_EMPHASIZED = 18, /* 16-bit linear with emphasis */ - AU_ENCODING_NEXT = 19, /* 16-bit linear with compression (NEXT) */ - AU_ENCODING_COMPRESSED_EMPHASIZED = 20, /* A combination of the two above */ - AU_ENCODING_DSP_COMMANDS = 21, /* Music Kit DSP commands */ - AU_ENCODING_DSP_COMMANDS_SAMPLES = 22, /* ? */ - - AU_ENCODING_ADPCM_G721_32 = 23, /* G721 32 kbs ADPCM - 4 bits per sample. */ - AU_ENCODING_ADPCM_G722 = 24, /* G722 64 kbs ADPCM */ - AU_ENCODING_ADPCM_G723_24 = 25, /* G723 24 kbs ADPCM - 3 bits per sample. */ - AU_ENCODING_ADPCM_G723_40 = 26, /* G723 40 kbs ADPCM - 5 bits per sample. */ - - AU_ENCODING_ALAW_8 = 27 -} ; - -/*------------------------------------------------------------------------------ -** Typedefs. -*/ - -typedef struct -{ int dataoffset ; - int datasize ; - int encoding ; - int samplerate ; - int channels ; -} AU_FMT ; - - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int au_close (SF_PRIVATE *psf) ; - -static int au_format_to_encoding (int format) ; - -static int au_write_header (SF_PRIVATE *psf, int calc_length) ; -static int au_read_header (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -au_open (SF_PRIVATE *psf) -{ int subformat ; - int error = 0 ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = au_read_header (psf))) - return error ; - } ; - - if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_AU) - return SFE_BAD_OPEN_FORMAT ; - - subformat = SF_CODEC (psf->sf.format) ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { psf->endian = SF_ENDIAN (psf->sf.format) ; - if (CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_CPU) - psf->endian = SF_ENDIAN_LITTLE ; - else if (psf->endian != SF_ENDIAN_LITTLE) - psf->endian = SF_ENDIAN_BIG ; - - if (au_write_header (psf, SF_FALSE)) - return psf->error ; - - psf->write_header = au_write_header ; - } ; - - psf->container_close = au_close ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - switch (subformat) - { case SF_FORMAT_ULAW : /* 8-bit Ulaw encoding. */ - ulaw_init (psf) ; - break ; - - case SF_FORMAT_PCM_S8 : /* 8-bit linear PCM. */ - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_PCM_16 : /* 16-bit linear PCM. */ - case SF_FORMAT_PCM_24 : /* 24-bit linear PCM */ - case SF_FORMAT_PCM_32 : /* 32-bit linear PCM. */ - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_ALAW : /* 8-bit Alaw encoding. */ - alaw_init (psf) ; - break ; - - /* Lite remove start */ - case SF_FORMAT_FLOAT : /* 32-bit floats. */ - error = float32_init (psf) ; - break ; - - case SF_FORMAT_DOUBLE : /* 64-bit double precision floats. */ - error = double64_init (psf) ; - break ; - - case SF_FORMAT_G721_32 : - error = g72x_init (psf) ; - psf->sf.seekable = SF_FALSE ; - break ; - - case SF_FORMAT_G723_24 : - error = g72x_init (psf) ; - psf->sf.seekable = SF_FALSE ; - break ; - - case SF_FORMAT_G723_40 : - error = g72x_init (psf) ; - psf->sf.seekable = SF_FALSE ; - break ; - /* Lite remove end */ - - default : break ; - } ; - - return error ; -} /* au_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -au_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - au_write_header (psf, SF_TRUE) ; - - return 0 ; -} /* au_close */ - -static int -au_write_header (SF_PRIVATE *psf, int calc_length) -{ sf_count_t current ; - int encoding, datalength ; - - if (psf->pipeoffset > 0) - return 0 ; - - current = psf_ftell (psf) ; - - if (calc_length) - { psf->filelength = psf_get_filelen (psf) ; - - psf->datalength = psf->filelength - psf->dataoffset ; - if (psf->dataend) - psf->datalength -= psf->filelength - psf->dataend ; - } ; - - encoding = au_format_to_encoding (SF_CODEC (psf->sf.format)) ; - if (! encoding) - return (psf->error = SFE_BAD_OPEN_FORMAT) ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - - /* - ** Only attempt to seek if we are not writng to a pipe. If we are - ** writing to a pipe we shouldn't be here anyway. - */ - if (psf->is_pipe == SF_FALSE) - psf_fseek (psf, 0, SEEK_SET) ; - - /* - ** AU format files allow a datalength value of -1 if the datalength - ** is not know at the time the header is written. - ** Also use this value of -1 if the datalength > 2 gigabytes. - */ - if (psf->datalength < 0 || psf->datalength > 0x7FFFFFFF) - datalength = -1 ; - else - datalength = (int) (psf->datalength & 0x7FFFFFFF) ; - - if (psf->endian == SF_ENDIAN_BIG) - { psf_binheader_writef (psf, "Em4", DOTSND_MARKER, AU_DATA_OFFSET) ; - psf_binheader_writef (psf, "E4444", datalength, encoding, psf->sf.samplerate, psf->sf.channels) ; - } - else if (psf->endian == SF_ENDIAN_LITTLE) - { psf_binheader_writef (psf, "em4", DNSDOT_MARKER, AU_DATA_OFFSET) ; - psf_binheader_writef (psf, "e4444", datalength, encoding, psf->sf.samplerate, psf->sf.channels) ; - } - else - return (psf->error = SFE_BAD_OPEN_FORMAT) ; - - /* Header construction complete so write it out. */ - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - psf->dataoffset = psf->headindex ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* au_write_header */ - -static int -au_format_to_encoding (int format) -{ - switch (format) - { case SF_FORMAT_PCM_S8 : return AU_ENCODING_PCM_8 ; - case SF_FORMAT_PCM_16 : return AU_ENCODING_PCM_16 ; - case SF_FORMAT_PCM_24 : return AU_ENCODING_PCM_24 ; - case SF_FORMAT_PCM_32 : return AU_ENCODING_PCM_32 ; - - case SF_FORMAT_FLOAT : return AU_ENCODING_FLOAT ; - case SF_FORMAT_DOUBLE : return AU_ENCODING_DOUBLE ; - - case SF_FORMAT_ULAW : return AU_ENCODING_ULAW_8 ; - case SF_FORMAT_ALAW : return AU_ENCODING_ALAW_8 ; - - case SF_FORMAT_G721_32 : return AU_ENCODING_ADPCM_G721_32 ; - case SF_FORMAT_G723_24 : return AU_ENCODING_ADPCM_G723_24 ; - case SF_FORMAT_G723_40 : return AU_ENCODING_ADPCM_G723_40 ; - - default : break ; - } ; - return 0 ; -} /* au_format_to_encoding */ - -static int -au_read_header (SF_PRIVATE *psf) -{ AU_FMT au_fmt ; - int marker, dword ; - - memset (&au_fmt, 0, sizeof (au_fmt)) ; - psf_binheader_readf (psf, "pm", 0, &marker) ; - psf_log_printf (psf, "%M\n", marker) ; - - if (marker == DOTSND_MARKER) - { psf->endian = SF_ENDIAN_BIG ; - - psf_binheader_readf (psf, "E44444", &(au_fmt.dataoffset), &(au_fmt.datasize), - &(au_fmt.encoding), &(au_fmt.samplerate), &(au_fmt.channels)) ; - } - else if (marker == DNSDOT_MARKER) - { psf->endian = SF_ENDIAN_LITTLE ; - psf_binheader_readf (psf, "e44444", &(au_fmt.dataoffset), &(au_fmt.datasize), - &(au_fmt.encoding), &(au_fmt.samplerate), &(au_fmt.channels)) ; - } - else - return SFE_AU_NO_DOTSND ; - - psf_log_printf (psf, " Data Offset : %d\n", au_fmt.dataoffset) ; - - if (psf->fileoffset > 0 && au_fmt.datasize == -1) - { psf_log_printf (psf, " Data Size : -1\n") ; - return SFE_AU_EMBED_BAD_LEN ; - } ; - - if (psf->fileoffset > 0) - { psf->filelength = au_fmt.dataoffset + au_fmt.datasize ; - psf_log_printf (psf, " Data Size : %d\n", au_fmt.datasize) ; - } - else if (au_fmt.datasize == -1 || au_fmt.dataoffset + au_fmt.datasize == psf->filelength) - psf_log_printf (psf, " Data Size : %d\n", au_fmt.datasize) ; - else if (au_fmt.dataoffset + au_fmt.datasize < psf->filelength) - { psf->filelength = au_fmt.dataoffset + au_fmt.datasize ; - psf_log_printf (psf, " Data Size : %d\n", au_fmt.datasize) ; - } - else - { dword = psf->filelength - au_fmt.dataoffset ; - psf_log_printf (psf, " Data Size : %d (should be %d)\n", au_fmt.datasize, dword) ; - au_fmt.datasize = dword ; - } ; - - psf->dataoffset = au_fmt.dataoffset ; - psf->datalength = psf->filelength - psf->dataoffset ; - - if (psf_ftell (psf) < psf->dataoffset) - psf_binheader_readf (psf, "j", psf->dataoffset - psf_ftell (psf)) ; - - psf->sf.samplerate = au_fmt.samplerate ; - psf->sf.channels = au_fmt.channels ; - - /* Only fill in type major. */ - if (psf->endian == SF_ENDIAN_BIG) - psf->sf.format = SF_FORMAT_AU ; - else if (psf->endian == SF_ENDIAN_LITTLE) - psf->sf.format = SF_ENDIAN_LITTLE | SF_FORMAT_AU ; - - psf_log_printf (psf, " Encoding : %d => ", au_fmt.encoding) ; - - psf->sf.format = SF_ENDIAN (psf->sf.format) ; - - switch (au_fmt.encoding) - { case AU_ENCODING_ULAW_8 : - psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_ULAW ; - psf->bytewidth = 1 ; /* Before decoding */ - psf_log_printf (psf, "8-bit ISDN u-law\n") ; - break ; - - case AU_ENCODING_PCM_8 : - psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_S8 ; - psf->bytewidth = 1 ; - psf_log_printf (psf, "8-bit linear PCM\n") ; - break ; - - case AU_ENCODING_PCM_16 : - psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_16 ; - psf->bytewidth = 2 ; - psf_log_printf (psf, "16-bit linear PCM\n") ; - break ; - - case AU_ENCODING_PCM_24 : - psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_24 ; - psf->bytewidth = 3 ; - psf_log_printf (psf, "24-bit linear PCM\n") ; - break ; - - case AU_ENCODING_PCM_32 : - psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_32 ; - psf->bytewidth = 4 ; - psf_log_printf (psf, "32-bit linear PCM\n") ; - break ; - - case AU_ENCODING_FLOAT : - psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_FLOAT ; - psf->bytewidth = 4 ; - psf_log_printf (psf, "32-bit float\n") ; - break ; - - case AU_ENCODING_DOUBLE : - psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_DOUBLE ; - psf->bytewidth = 8 ; - psf_log_printf (psf, "64-bit double precision float\n") ; - break ; - - case AU_ENCODING_ALAW_8 : - psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_ALAW ; - psf->bytewidth = 1 ; /* Before decoding */ - psf_log_printf (psf, "8-bit ISDN A-law\n") ; - break ; - - case AU_ENCODING_ADPCM_G721_32 : - psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_G721_32 ; - psf->bytewidth = 0 ; - psf_log_printf (psf, "G721 32kbs ADPCM\n") ; - break ; - - case AU_ENCODING_ADPCM_G723_24 : - psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_G723_24 ; - psf->bytewidth = 0 ; - psf_log_printf (psf, "G723 24kbs ADPCM\n") ; - break ; - - case AU_ENCODING_ADPCM_G723_40 : - psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_G723_40 ; - psf->bytewidth = 0 ; - psf_log_printf (psf, "G723 40kbs ADPCM\n") ; - break ; - - case AU_ENCODING_ADPCM_G722 : - psf_log_printf (psf, "G722 64 kbs ADPCM (unsupported)\n") ; - break ; - - case AU_ENCODING_NEXT : - psf_log_printf (psf, "Weird NeXT encoding format (unsupported)\n") ; - break ; - - default : - psf_log_printf (psf, "Unknown!!\n") ; - break ; - } ; - - psf_log_printf (psf, " Sample Rate : %d\n", au_fmt.samplerate) ; - if (au_fmt.channels < 1) - { psf_log_printf (psf, " Channels : %d **** should be >= 1\n", au_fmt.channels) ; - return SFE_CHANNEL_COUNT_ZERO ; - } - else - psf_log_printf (psf, " Channels : %d\n", au_fmt.channels) ; - - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - - if (! psf->sf.frames && psf->blockwidth) - psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; - - return 0 ; -} /* au_read_header */ - diff --git a/libs/libsndfile/src/audio_detect.c b/libs/libsndfile/src/audio_detect.c deleted file mode 100644 index 9cac83bcff..0000000000 --- a/libs/libsndfile/src/audio_detect.c +++ /dev/null @@ -1,105 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - - -#include "sfconfig.h" - -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include -#include - -#include "common.h" - -typedef struct -{ int le_float ; - int be_float ; - int le_int_24_32 ; - int be_int_24_32 ; -} VOTE ; - - -static void vote_for_format (VOTE * vote, const unsigned char * data, int datalen) ; - -int -audio_detect (SF_PRIVATE * psf, AUDIO_DETECT *ad, const unsigned char * data, int datalen) -{ VOTE vote ; - - if (psf == NULL) - return 0 ; - - if (ad == NULL || datalen < 256) - return 0 ; - - vote_for_format (&vote, data, datalen) ; - - psf_log_printf (psf, "audio_detect :\n" - " le_float : %d\n" - " be_float : %d\n" - " le_int_24_32 : %d\n" - " be_int_24_32 : %d\n", - vote.le_float, vote.be_float, vote.le_int_24_32, vote.be_int_24_32) ; - - if (0) puts (psf->parselog.buf) ; - - if (ad->endianness == SF_ENDIAN_LITTLE && vote.le_float > (3 * datalen) / 4) - { /* Almost certainly 32 bit floats. */ - return SF_FORMAT_FLOAT ; - } ; - - if (ad->endianness == SF_ENDIAN_LITTLE && vote.le_int_24_32 > (3 * datalen) / 4) - { /* Almost certainly 24 bit data stored in 32 bit ints. */ - return SF_FORMAT_PCM_32 ; - } ; - - return 0 ; -} /* data_detect */ - -static void -vote_for_format (VOTE * vote, const unsigned char * data, int datalen) -{ - int k ; - - memset (vote, 0, sizeof (VOTE)) ; - - datalen -= datalen % 4 ; - - for (k = 0 ; k < datalen ; k ++) - { if ((k % 4) == 0) - { if (data [k] == 0 && data [k + 1] != 0) - vote->le_int_24_32 += 4 ; - - if (data [2] != 0 && data [3] == 0) - vote->le_int_24_32 += 4 ; - - if (data [0] != 0 && data [3] > 0x43 && data [3] < 0x4B) - vote->le_float += 4 ; - - if (data [3] != 0 && data [0] > 0x43 && data [0] < 0x4B) - vote->be_float += 4 ; - } ; - } ; - - return ; -} /* vote_for_format */ - diff --git a/libs/libsndfile/src/avr.c b/libs/libsndfile/src/avr.c deleted file mode 100644 index a235b0d7a4..0000000000 --- a/libs/libsndfile/src/avr.c +++ /dev/null @@ -1,246 +0,0 @@ -/* -** Copyright (C) 2004-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#define TWOBIT_MARKER (MAKE_MARKER ('2', 'B', 'I', 'T')) -#define AVR_HDR_SIZE 128 - -#define SFE_AVR_X 666 - -/* -** From: hyc@hanauma.Jpl.Nasa.Gov (Howard Chu) -** -** A lot of PD software exists to play Mac .snd files on the ST. One other -** format that seems pretty popular (used by a number of commercial packages) -** is the AVR format (from Audio Visual Research). This format has a 128 byte -** header that looks like this (its actually packed, but thats not portable): -*/ - -typedef struct -{ int marker ; /* 2BIT */ - char name [8] ; /* null-padded sample name */ - short mono ; /* 0 = mono, 0xffff = stereo */ - short rez ; /* 8 = 8 bit, 16 = 16 bit */ - short sign ; /* 0 = unsigned, 0xffff = signed */ - - short loop ; /* 0 = no loop, 0xffff = looping sample */ - short midi ; /* 0xffff = no MIDI note assigned, */ - /* 0xffXX = single key note assignment */ - /* 0xLLHH = key split, low/hi note */ - int srate ; /* sample frequency in hertz */ - int frames ; /* sample length in bytes or words (see rez) */ - int lbeg ; /* offset to start of loop in bytes or words. */ - /* set to zero if unused */ - int lend ; /* offset to end of loop in bytes or words. */ - /* set to sample length if unused */ - short res1 ; /* Reserved, MIDI keyboard split */ - short res2 ; /* Reserved, sample compression */ - short res3 ; /* Reserved */ - char ext [20] ; /* Additional filename space, used if (name[7] != 0) */ - char user [64] ; /* User defined. Typically ASCII message */ -} AVR_HEADER ; - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int avr_close (SF_PRIVATE *psf) ; - -static int avr_read_header (SF_PRIVATE *psf) ; -static int avr_write_header (SF_PRIVATE *psf, int calc_length) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -avr_open (SF_PRIVATE *psf) -{ int error = 0 ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = avr_read_header (psf))) - return error ; - } ; - - if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_AVR) - return SFE_BAD_OPEN_FORMAT ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { psf->endian = SF_ENDIAN_BIG ; - - if (avr_write_header (psf, SF_FALSE)) - return psf->error ; - - psf->write_header = avr_write_header ; - } ; - - psf->container_close = avr_close ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - error = pcm_init (psf) ; - - return error ; -} /* avr_open */ - -static int -avr_read_header (SF_PRIVATE *psf) -{ AVR_HEADER hdr ; - - memset (&hdr, 0, sizeof (hdr)) ; - - psf_binheader_readf (psf, "pmb", 0, &hdr.marker, &hdr.name, sizeof (hdr.name)) ; - psf_log_printf (psf, "%M\n", hdr.marker) ; - - if (hdr.marker != TWOBIT_MARKER) - return SFE_AVR_X ; - - psf_log_printf (psf, " Name : %s\n", hdr.name) ; - - psf_binheader_readf (psf, "E22222", &hdr.mono, &hdr.rez, &hdr.sign, &hdr.loop, &hdr.midi) ; - - psf->sf.channels = (hdr.mono & 1) + 1 ; - - psf_log_printf (psf, " Channels : %d\n Bit width : %d\n Signed : %s\n", - (hdr.mono & 1) + 1, hdr.rez, hdr.sign ? "yes" : "no") ; - - switch ((hdr.rez << 16) + (hdr.sign & 1)) - { case ((8 << 16) + 0) : - psf->sf.format = SF_FORMAT_AVR | SF_FORMAT_PCM_U8 ; - psf->bytewidth = 1 ; - break ; - - case ((8 << 16) + 1) : - psf->sf.format = SF_FORMAT_AVR | SF_FORMAT_PCM_S8 ; - psf->bytewidth = 1 ; - break ; - - case ((16 << 16) + 1) : - psf->sf.format = SF_FORMAT_AVR | SF_FORMAT_PCM_16 ; - psf->bytewidth = 2 ; - break ; - - default : - psf_log_printf (psf, "Error : bad rez/sign combination.\n") ; - return SFE_AVR_X ; - } ; - - psf_binheader_readf (psf, "E4444", &hdr.srate, &hdr.frames, &hdr.lbeg, &hdr.lend) ; - - psf->sf.frames = hdr.frames ; - psf->sf.samplerate = hdr.srate ; - - psf_log_printf (psf, " Frames : %D\n", psf->sf.frames) ; - psf_log_printf (psf, " Sample rate : %d\n", psf->sf.samplerate) ; - - psf_binheader_readf (psf, "E222", &hdr.res1, &hdr.res2, &hdr.res3) ; - psf_binheader_readf (psf, "bb", hdr.ext, sizeof (hdr.ext), hdr.user, sizeof (hdr.user)) ; - - psf_log_printf (psf, " Ext : %s\n User : %s\n", hdr.ext, hdr.user) ; - - psf->endian = SF_ENDIAN_BIG ; - - psf->dataoffset = AVR_HDR_SIZE ; - psf->datalength = hdr.frames * (hdr.rez / 8) ; - - if (psf->fileoffset > 0) - psf->filelength = AVR_HDR_SIZE + psf->datalength ; - - if (psf_ftell (psf) != psf->dataoffset) - psf_binheader_readf (psf, "j", psf->dataoffset - psf_ftell (psf)) ; - - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - - if (psf->sf.frames == 0 && psf->blockwidth) - psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; - - return 0 ; -} /* avr_read_header */ - -static int -avr_write_header (SF_PRIVATE *psf, int calc_length) -{ sf_count_t current ; - int sign ; - - if (psf->pipeoffset > 0) - return 0 ; - - current = psf_ftell (psf) ; - - if (calc_length) - { psf->filelength = psf_get_filelen (psf) ; - - psf->datalength = psf->filelength - psf->dataoffset ; - if (psf->dataend) - psf->datalength -= psf->filelength - psf->dataend ; - - psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; - } ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - - /* - ** Only attempt to seek if we are not writng to a pipe. If we are - ** writing to a pipe we shouldn't be here anyway. - */ - if (psf->is_pipe == SF_FALSE) - psf_fseek (psf, 0, SEEK_SET) ; - - psf_binheader_writef (psf, "Emz22", TWOBIT_MARKER, make_size_t (8), - psf->sf.channels == 2 ? 0xFFFF : 0, psf->bytewidth * 8) ; - - sign = ((SF_CODEC (psf->sf.format)) == SF_FORMAT_PCM_U8) ? 0 : 0xFFFF ; - - psf_binheader_writef (psf, "E222", sign, 0, 0xFFFF) ; - psf_binheader_writef (psf, "E4444", psf->sf.samplerate, psf->sf.frames, 0, 0) ; - - psf_binheader_writef (psf, "E222zz", 0, 0, 0, make_size_t (20), make_size_t (64)) ; - - /* Header construction complete so write it out. */ - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - psf->dataoffset = psf->headindex ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* avr_write_header */ - -static int -avr_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - avr_write_header (psf, SF_TRUE) ; - - return 0 ; -} /* avr_close */ - diff --git a/libs/libsndfile/src/binheader_writef_check.py b/libs/libsndfile/src/binheader_writef_check.py deleted file mode 100644 index 6ee609e010..0000000000 --- a/libs/libsndfile/src/binheader_writef_check.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/python - -# Copyright (C) 2006-2011 Erik de Castro Lopo -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# * Neither the author nor the names of any contributors may be used -# to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -# This parses C code using regexes (yes, thats horrible) and makes sure -# that calling conventions to the function psf_binheader_writef are -# correct. - - - -import re, string, sys - -_whitespace_re = re.compile ("\s+", re.MULTILINE) - -def find_binheader_writefs (data): - lst = re.findall ('psf_binheader_writef\s*\(\s*[a-zA-Z_]+\s*,\s*\"[^;]+;', data, re.MULTILINE) - return [_whitespace_re.sub (" ", x) for x in lst] - -def find_format_string (s): - fmt = re.search ('"([^"]+)"', s) - if not fmt: - print ("Bad format in :\n\n\t%s\n\n" % s) - sys.exit (1) - fmt = fmt.groups () - if len (fmt) != 1: - print ("Bad format in :\n\n\t%s\n\n" % s) - sys.exit (1) - return _whitespace_re.sub ("", fmt [0]) - -def get_param_list (data): - dlist = re.search ("\((.+)\)\s*;", data) - dlist = dlist.groups ()[0] - dlist = dlist.split(",") - dlist = [x.strip() for x in dlist] - return dlist [2:] - -def handle_file (fname): - errors = 0 - data = open (fname, "r").read () - - writefs = find_binheader_writefs (data) - for item in writefs: - fmt = find_format_string (item) - params = get_param_list (item) - param_index = 0 - - # print item - - for ch in fmt: - if ch in 'Eet ': - continue - - # print " param [%d] %c : %s" % (param_index, ch, params [param_index]) - - if ch != 'b': - param_index += 1 - continue - - # print item - # print " param [%d] %c : %s <-> %s" % (param_index, ch, params [param_index], params [param_index + 1]) - - # print (params [param_index + 1]) - if params [param_index + 1].find ("sizeof") < 0 \ - and params [param_index + 1].find ("make_size_t") < 0 \ - and params [param_index + 1].find ("strlen") < 0: - if errors == 0: sys.stdout.write ("\n") - print ("\n%s :" % fname) - print (" param [%d] %c : %s <-> %s" % (param_index, ch, params [param_index], params [param_index + 1])) - print (" %s" % item) - errors += 1 - param_index += 2 - - return errors - -#=============================================================================== - -if len (sys.argv) > 1: - sys.stdout.write ("\n binheader_writef_check :") - sys.stdout.flush () - errors = 0 - for fname in sys.argv [1:]: - errors += handle_file (fname) - if errors > 0: - print ("\nErrors : %d\n" % errors) - sys.exit (1) - -print ("ok\n") - diff --git a/libs/libsndfile/src/broadcast.c b/libs/libsndfile/src/broadcast.c deleted file mode 100644 index 128a6a2c55..0000000000 --- a/libs/libsndfile/src/broadcast.c +++ /dev/null @@ -1,191 +0,0 @@ -/* -** Copyright (C) 2006-2013 Erik de Castro Lopo -** Copyright (C) 2006 Paul Davis -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#include "common.h" - - -static int gen_coding_history (char * added_history, int added_history_max, const SF_INFO * psfinfo) ; - -static inline size_t -bc_min_size (const SF_BROADCAST_INFO* info) -{ if (info == NULL) - return 0 ; - - return offsetof (SF_BROADCAST_INFO, coding_history) + info->coding_history_size ; -} /* bc_min_size */ - -SF_BROADCAST_INFO_16K* -broadcast_var_alloc (void) -{ return calloc (1, sizeof (SF_BROADCAST_INFO_16K)) ; -} /* broadcast_var_alloc */ - -int -broadcast_var_set (SF_PRIVATE *psf, const SF_BROADCAST_INFO * info, size_t datasize) -{ size_t len ; - - if (info == NULL) - return SF_FALSE ; - - if (bc_min_size (info) > datasize) - { psf->error = SFE_BAD_BROADCAST_INFO_SIZE ; - return SF_FALSE ; - } ; - - if (datasize >= sizeof (SF_BROADCAST_INFO_16K)) - { psf->error = SFE_BAD_BROADCAST_INFO_TOO_BIG ; - return SF_FALSE ; - } ; - - if (psf->broadcast_16k == NULL) - { if ((psf->broadcast_16k = broadcast_var_alloc ()) == NULL) - { psf->error = SFE_MALLOC_FAILED ; - return SF_FALSE ; - } ; - } ; - - /* Only copy the first part of the struct. */ - memcpy (psf->broadcast_16k, info, offsetof (SF_BROADCAST_INFO, coding_history)) ; - - psf_strlcpy_crlf (psf->broadcast_16k->coding_history, info->coding_history, sizeof (psf->broadcast_16k->coding_history), datasize - offsetof (SF_BROADCAST_INFO, coding_history)) ; - len = strlen (psf->broadcast_16k->coding_history) ; - - if (len > 0 && psf->broadcast_16k->coding_history [len - 1] != '\n') - psf_strlcat (psf->broadcast_16k->coding_history, sizeof (psf->broadcast_16k->coding_history), "\r\n") ; - - if (psf->file.mode == SFM_WRITE) - { char added_history [256] ; - - gen_coding_history (added_history, sizeof (added_history), &(psf->sf)) ; - psf_strlcat (psf->broadcast_16k->coding_history, sizeof (psf->broadcast_16k->coding_history), added_history) ; - } ; - - /* Force coding_history_size to be even. */ - len = strlen (psf->broadcast_16k->coding_history) ; - len += (len & 1) ? 1 : 0 ; - psf->broadcast_16k->coding_history_size = len ; - - /* Currently writing this version. */ - psf->broadcast_16k->version = 1 ; - - return SF_TRUE ; -} /* broadcast_var_set */ - - -int -broadcast_var_get (SF_PRIVATE *psf, SF_BROADCAST_INFO * data, size_t datasize) -{ size_t size ; - - if (psf->broadcast_16k == NULL) - return SF_FALSE ; - - size = SF_MIN (datasize, bc_min_size ((const SF_BROADCAST_INFO *) psf->broadcast_16k)) ; - - memcpy (data, psf->broadcast_16k, size) ; - - return SF_TRUE ; -} /* broadcast_var_get */ - -/*------------------------------------------------------------------------------ -*/ - -static int -gen_coding_history (char * added_history, int added_history_max, const SF_INFO * psfinfo) -{ char chnstr [16] ; - int count, width ; - - /* - ** From : http://www.sr.se/utveckling/tu/bwf/docs/codhist2.htm - ** - ** Parameter Variable string Unit - ** ========================================================================================== - ** Coding Algorithm A= - ** Sampling frequency F=<11000,22050,24000,32000,44100,48000> [Hz] - ** Bit-rate B= - ** Word Length W=<8, 12, 14, 16, 18, 20, 22, 24> [bits] - ** Mode M= - ** Text, free string T= - */ - - switch (psfinfo->channels) - { case 0 : - return SF_FALSE ; - - case 1 : - psf_strlcpy (chnstr, sizeof (chnstr), "mono") ; - break ; - - case 2 : - psf_strlcpy (chnstr, sizeof (chnstr), "stereo") ; - break ; - - default : - snprintf (chnstr, sizeof (chnstr), "%uchn", psfinfo->channels) ; - break ; - } ; - - switch (SF_CODEC (psfinfo->format)) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_S8 : - width = 8 ; - break ; - case SF_FORMAT_PCM_16 : - width = 16 ; - break ; - case SF_FORMAT_PCM_24 : - width = 24 ; - break ; - case SF_FORMAT_PCM_32 : - width = 32 ; - break ; - case SF_FORMAT_FLOAT : - width = 24 ; /* Bits in the mantissa + 1 */ - break ; - case SF_FORMAT_DOUBLE : - width = 53 ; /* Bits in the mantissa + 1 */ - break ; - case SF_FORMAT_ULAW : - case SF_FORMAT_ALAW : - width = 12 ; - break ; - default : - width = 42 ; - break ; - } ; - - count = snprintf (added_history, added_history_max, - "A=PCM,F=%u,W=%d,M=%s,T=%s-%s\r\n", - psfinfo->samplerate, width, chnstr, PACKAGE, VERSION) ; - - if (count >= added_history_max) - return 0 ; - - return count ; -} /* gen_coding_history */ - diff --git a/libs/libsndfile/src/caf.c b/libs/libsndfile/src/caf.c deleted file mode 100644 index 8f95d781eb..0000000000 --- a/libs/libsndfile/src/caf.c +++ /dev/null @@ -1,804 +0,0 @@ -/* -** Copyright (C) 2005-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#ifdef HAVE_INTTYPES_H -#include -#endif - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" -#include "chanmap.h" - -/*------------------------------------------------------------------------------ -** Macros to handle big/little endian issues. -*/ - -#define aac_MARKER MAKE_MARKER ('a', 'a', 'c', ' ') -#define alac_MARKER MAKE_MARKER ('a', 'l', 'a', 'c') -#define alaw_MARKER MAKE_MARKER ('a', 'l', 'a', 'w') -#define caff_MARKER MAKE_MARKER ('c', 'a', 'f', 'f') -#define chan_MARKER MAKE_MARKER ('c', 'h', 'a', 'n') -#define data_MARKER MAKE_MARKER ('d', 'a', 't', 'a') -#define desc_MARKER MAKE_MARKER ('d', 'e', 's', 'c') -#define edct_MARKER MAKE_MARKER ('e', 'd', 'c', 't') -#define free_MARKER MAKE_MARKER ('f', 'r', 'e', 'e') -#define ima4_MARKER MAKE_MARKER ('i', 'm', 'a', '4') -#define info_MARKER MAKE_MARKER ('i', 'n', 'f', 'o') -#define inst_MARKER MAKE_MARKER ('i', 'n', 's', 't') -#define kuki_MARKER MAKE_MARKER ('k', 'u', 'k', 'i') -#define lpcm_MARKER MAKE_MARKER ('l', 'p', 'c', 'm') -#define mark_MARKER MAKE_MARKER ('m', 'a', 'r', 'k') -#define midi_MARKER MAKE_MARKER ('m', 'i', 'd', 'i') -#define mp1_MARKER MAKE_MARKER ('.', 'm', 'p', '1') -#define mp2_MARKER MAKE_MARKER ('.', 'm', 'p', '2') -#define mp3_MARKER MAKE_MARKER ('.', 'm', 'p', '3') -#define ovvw_MARKER MAKE_MARKER ('o', 'v', 'v', 'w') -#define pakt_MARKER MAKE_MARKER ('p', 'a', 'k', 't') -#define peak_MARKER MAKE_MARKER ('p', 'e', 'a', 'k') -#define regn_MARKER MAKE_MARKER ('r', 'e', 'g', 'n') -#define strg_MARKER MAKE_MARKER ('s', 't', 'r', 'g') -#define umid_MARKER MAKE_MARKER ('u', 'm', 'i', 'd') -#define uuid_MARKER MAKE_MARKER ('u', 'u', 'i', 'd') -#define ulaw_MARKER MAKE_MARKER ('u', 'l', 'a', 'w') -#define MAC3_MARKER MAKE_MARKER ('M', 'A', 'C', '3') -#define MAC6_MARKER MAKE_MARKER ('M', 'A', 'C', '6') - -#define CAF_PEAK_CHUNK_SIZE(ch) ((int) (sizeof (int) + ch * (sizeof (float) + 8))) - -#define SFE_CAF_NOT_CAF 666 -#define SFE_CAF_NO_DESC 667 -#define SFE_CAF_BAD_PEAK 668 - -/*------------------------------------------------------------------------------ -** Typedefs. -*/ - -typedef struct -{ uint8_t srate [8] ; - uint32_t fmt_id ; - uint32_t fmt_flags ; - uint32_t pkt_bytes ; - uint32_t frames_per_packet ; - uint32_t channels_per_frame ; - uint32_t bits_per_chan ; -} DESC_CHUNK ; - -typedef struct -{ int chanmap_tag ; - - ALAC_DECODER_INFO alac ; -} CAF_PRIVATE ; - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int caf_close (SF_PRIVATE *psf) ; -static int caf_read_header (SF_PRIVATE *psf) ; -static int caf_write_header (SF_PRIVATE *psf, int calc_length) ; -static int caf_command (SF_PRIVATE *psf, int command, void *data, int datasize) ; -static int caf_read_chanmap (SF_PRIVATE * psf, sf_count_t chunk_size) ; - -static int caf_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) ; -static SF_CHUNK_ITERATOR * caf_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) ; -static int caf_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; -static int caf_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -caf_open (SF_PRIVATE *psf) -{ CAF_PRIVATE * pcaf ; - int subformat, format, error = 0 ; - - if ((psf->container_data = calloc (1, sizeof (CAF_PRIVATE))) == NULL) - return SFE_MALLOC_FAILED ; - - pcaf = psf->container_data ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = caf_read_header (psf))) - return error ; - - psf->next_chunk_iterator = caf_next_chunk_iterator ; - psf->get_chunk_size = caf_get_chunk_size ; - psf->get_chunk_data = caf_get_chunk_data ; - } ; - - subformat = SF_CODEC (psf->sf.format) ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if (psf->is_pipe) - return SFE_NO_PIPE_WRITE ; - - format = SF_CONTAINER (psf->sf.format) ; - if (format != SF_FORMAT_CAF) - return SFE_BAD_OPEN_FORMAT ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - if (psf->file.mode != SFM_RDWR || psf->filelength < 44) - { psf->filelength = 0 ; - psf->datalength = 0 ; - psf->dataoffset = 0 ; - psf->sf.frames = 0 ; - } ; - - psf->strings.flags = SF_STR_ALLOW_START ; - - /* - ** By default, add the peak chunk to floating point files. Default behaviour - ** can be switched off using sf_command (SFC_SET_PEAK_CHUNK, SF_FALSE). - */ - if (psf->file.mode == SFM_WRITE && (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)) - { if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL) - return SFE_MALLOC_FAILED ; - psf->peak_info->peak_loc = SF_PEAK_START ; - } ; - - if ((error = caf_write_header (psf, SF_FALSE)) != 0) - return error ; - - psf->write_header = caf_write_header ; - psf->set_chunk = caf_set_chunk ; - } ; - - psf->container_close = caf_close ; - psf->command = caf_command ; - - switch (subformat) - { case SF_FORMAT_PCM_S8 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_ULAW : - error = ulaw_init (psf) ; - break ; - - case SF_FORMAT_ALAW : - error = alaw_init (psf) ; - break ; - - /* Lite remove start */ - case SF_FORMAT_FLOAT : - error = float32_init (psf) ; - break ; - - case SF_FORMAT_DOUBLE : - error = double64_init (psf) ; - break ; - - case SF_FORMAT_ALAC_16 : - case SF_FORMAT_ALAC_20 : - case SF_FORMAT_ALAC_24 : - case SF_FORMAT_ALAC_32 : - if (psf->file.mode == SFM_READ) - /* Only pass the ALAC_DECODER_INFO in read mode. */ - error = alac_init (psf, &pcaf->alac) ; - else - error = alac_init (psf, NULL) ; - break ; - - /* Lite remove end */ - - default : - return SFE_UNSUPPORTED_ENCODING ; - } ; - - return error ; -} /* caf_open */ - -static int -caf_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - caf_write_header (psf, SF_TRUE) ; - - return 0 ; -} /* caf_close */ - -static int -caf_command (SF_PRIVATE * psf, int command, void * UNUSED (data), int UNUSED (datasize)) -{ CAF_PRIVATE *pcaf ; - - if ((pcaf = psf->container_data) == NULL) - return SFE_INTERNAL ; - - switch (command) - { case SFC_SET_CHANNEL_MAP_INFO : - pcaf->chanmap_tag = aiff_caf_find_channel_layout_tag (psf->channel_map, psf->sf.channels) ; - return (pcaf->chanmap_tag != 0) ; - - default : - break ; - } ; - - return 0 ; -} /* caf_command */ - -/*------------------------------------------------------------------------------ -*/ - -static int -decode_desc_chunk (SF_PRIVATE *psf, const DESC_CHUNK *desc) -{ int format = SF_FORMAT_CAF ; - - psf->sf.channels = desc->channels_per_frame ; - - if (desc->fmt_id == alac_MARKER) - { CAF_PRIVATE *pcaf ; - - if ((pcaf = psf->container_data) != NULL) - { switch (desc->fmt_flags) - { case 1 : - pcaf->alac.bits_per_sample = 16 ; - format |= SF_FORMAT_ALAC_16 ; - break ; - case 2 : - pcaf->alac.bits_per_sample = 20 ; - format |= SF_FORMAT_ALAC_20 ; - break ; - case 3 : - pcaf->alac.bits_per_sample = 24 ; - format |= SF_FORMAT_ALAC_24 ; - break ; - case 4 : - pcaf->alac.bits_per_sample = 32 ; - format |= SF_FORMAT_ALAC_32 ; - break ; - default : - psf_log_printf (psf, "Bad ALAC format flag value of %d\n", desc->fmt_flags) ; - } ; - - pcaf->alac.frames_per_packet = desc->frames_per_packet ; - } ; - - return format ; - } ; - - format |= psf->endian == SF_ENDIAN_LITTLE ? SF_ENDIAN_LITTLE : 0 ; - - if (desc->fmt_id == lpcm_MARKER && desc->fmt_flags & 1) - { /* Floating point data. */ - if (desc->bits_per_chan == 32 && desc->pkt_bytes == 4 * desc->channels_per_frame) - { psf->bytewidth = 4 ; - return format | SF_FORMAT_FLOAT ; - } ; - if (desc->bits_per_chan == 64 && desc->pkt_bytes == 8 * desc->channels_per_frame) - { psf->bytewidth = 8 ; - return format | SF_FORMAT_DOUBLE ; - } ; - } ; - - if (desc->fmt_id == lpcm_MARKER && (desc->fmt_flags & 1) == 0) - { /* Integer data. */ - if (desc->bits_per_chan == 32 && desc->pkt_bytes == 4 * desc->channels_per_frame) - { psf->bytewidth = 4 ; - return format | SF_FORMAT_PCM_32 ; - } ; - if (desc->bits_per_chan == 24 && desc->pkt_bytes == 3 * desc->channels_per_frame) - { psf->bytewidth = 3 ; - return format | SF_FORMAT_PCM_24 ; - } ; - if (desc->bits_per_chan == 16 && desc->pkt_bytes == 2 * desc->channels_per_frame) - { psf->bytewidth = 2 ; - return format | SF_FORMAT_PCM_16 ; - } ; - if (desc->bits_per_chan == 8 && desc->pkt_bytes == 1 * desc->channels_per_frame) - { psf->bytewidth = 1 ; - return format | SF_FORMAT_PCM_S8 ; - } ; - } ; - - if (desc->fmt_id == alaw_MARKER && desc->bits_per_chan == 8) - { psf->bytewidth = 1 ; - return format | SF_FORMAT_ALAW ; - } ; - - if (desc->fmt_id == ulaw_MARKER && desc->bits_per_chan == 8) - { psf->bytewidth = 1 ; - return format | SF_FORMAT_ULAW ; - } ; - - psf_log_printf (psf, "**** Unknown format identifier.\n") ; - - return 0 ; -} /* decode_desc_chunk */ - -static int -caf_read_header (SF_PRIVATE *psf) -{ CAF_PRIVATE *pcaf ; - BUF_UNION ubuf ; - DESC_CHUNK desc ; - sf_count_t chunk_size ; - double srate ; - short version, flags ; - int marker, k, have_data = 0, error ; - - if ((pcaf = psf->container_data) == NULL) - return SFE_INTERNAL ; - - memset (&desc, 0, sizeof (desc)) ; - - /* Set position to start of file to begin reading header. */ - psf_binheader_readf (psf, "pmE2E2", 0, &marker, &version, &flags) ; - psf_log_printf (psf, "%M\n Version : %d\n Flags : %x\n", marker, version, flags) ; - if (marker != caff_MARKER) - return SFE_CAF_NOT_CAF ; - - psf_binheader_readf (psf, "mE8b", &marker, &chunk_size, ubuf.ucbuf, 8) ; - srate = double64_be_read (ubuf.ucbuf) ; - snprintf (ubuf.cbuf, sizeof (ubuf.cbuf), "%5.3f", srate) ; - psf_log_printf (psf, "%M : %D\n Sample rate : %s\n", marker, chunk_size, ubuf.cbuf) ; - if (marker != desc_MARKER) - return SFE_CAF_NO_DESC ; - - if (chunk_size < SIGNED_SIZEOF (DESC_CHUNK)) - { psf_log_printf (psf, "**** Chunk size too small. Should be > 32 bytes.\n") ; - return SFE_MALFORMED_FILE ; - } ; - - psf->sf.samplerate = lrint (srate) ; - - psf_binheader_readf (psf, "mE44444", &desc.fmt_id, &desc.fmt_flags, &desc.pkt_bytes, &desc.frames_per_packet, - &desc.channels_per_frame, &desc.bits_per_chan) ; - psf_log_printf (psf, " Format id : %M\n Format flags : %x\n Bytes / packet : %u\n" - " Frames / packet : %u\n Channels / frame : %u\n Bits / channel : %u\n", - desc.fmt_id, desc.fmt_flags, desc.pkt_bytes, desc.frames_per_packet, desc.channels_per_frame, desc.bits_per_chan) ; - - if (desc.channels_per_frame > SF_MAX_CHANNELS) - { psf_log_printf (psf, "**** Bad channels per frame value %u.\n", desc.channels_per_frame) ; - return SFE_MALFORMED_FILE ; - } ; - - if (chunk_size > SIGNED_SIZEOF (DESC_CHUNK)) - psf_binheader_readf (psf, "j", (int) (chunk_size - sizeof (DESC_CHUNK))) ; - - psf->sf.channels = desc.channels_per_frame ; - - while (psf_ftell (psf) < psf->filelength) - { marker = 0 ; - chunk_size = 0 ; - - psf_binheader_readf (psf, "mE8", &marker, &chunk_size) ; - if (marker == 0) - { psf_log_printf (psf, "Have 0 marker.\n") ; - break ; - } ; - - psf_store_read_chunk_u32 (&psf->rchunks, marker, psf_ftell (psf), chunk_size) ; - - switch (marker) - { case peak_MARKER : - psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ; - if (chunk_size != CAF_PEAK_CHUNK_SIZE (psf->sf.channels)) - { psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ; - psf_log_printf (psf, "*** File PEAK chunk %D should be %d.\n", chunk_size, CAF_PEAK_CHUNK_SIZE (psf->sf.channels)) ; - return SFE_CAF_BAD_PEAK ; - } ; - - if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL) - return SFE_MALLOC_FAILED ; - - /* read in rest of PEAK chunk. */ - psf_binheader_readf (psf, "E4", & (psf->peak_info->edit_number)) ; - psf_log_printf (psf, " edit count : %d\n", psf->peak_info->edit_number) ; - - psf_log_printf (psf, " Ch Position Value\n") ; - for (k = 0 ; k < psf->sf.channels ; k++) - { sf_count_t position ; - float value ; - - psf_binheader_readf (psf, "Ef8", &value, &position) ; - psf->peak_info->peaks [k].value = value ; - psf->peak_info->peaks [k].position = position ; - - snprintf (ubuf.cbuf, sizeof (ubuf.cbuf), " %2d %-12" PRId64 " %g\n", k, position, value) ; - psf_log_printf (psf, ubuf.cbuf) ; - } ; - - psf->peak_info->peak_loc = SF_PEAK_START ; - break ; - - case chan_MARKER : - if (chunk_size < 12) - { psf_log_printf (psf, "%M : %D (should be >= 12)\n", marker, chunk_size) ; - psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ; - break ; - } - - psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ; - - if ((error = caf_read_chanmap (psf, chunk_size))) - return error ; - break ; - - case free_MARKER : - psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ; - psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ; - break ; - - case data_MARKER : - psf_binheader_readf (psf, "E4", &k) ; - psf_log_printf (psf, " edit : %u\n", k) ; - - if (chunk_size == -1) - { psf_log_printf (psf, "%M : -1\n") ; - chunk_size = psf->filelength - psf->headindex ; - } - else if (psf->filelength > 0 && psf->filelength < psf->headindex + chunk_size - 16) - psf_log_printf (psf, "%M : %D (should be %D)\n", marker, chunk_size, psf->filelength - psf->headindex - 8) ; - else - psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ; - - - psf->dataoffset = psf->headindex ; - - /* Subtract the 4 bytes of the 'edit' field above. */ - psf->datalength = chunk_size - 4 ; - - psf_binheader_readf (psf, "j", psf->datalength) ; - have_data = 1 ; - break ; - - case kuki_MARKER : - psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ; - pcaf->alac.kuki_offset = psf_ftell (psf) - 12 ; - psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ; - break ; - - case pakt_MARKER : - psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ; - - psf_binheader_readf (psf, "E8844", &pcaf->alac.packets, &pcaf->alac.valid_frames, - &pcaf->alac.priming_frames, &pcaf->alac.remainder_frames) ; - - psf_log_printf (psf, - " Packets : %D\n" - " Valid frames : %D\n" - " Priming frames : %d\n" - " Remainder frames : %d\n", - pcaf->alac.packets, pcaf->alac.valid_frames, pcaf->alac.priming_frames, - pcaf->alac.remainder_frames - ) ; - - if (pcaf->alac.packets == 0 && pcaf->alac.valid_frames == 0 - && pcaf->alac.priming_frames == 0 && pcaf->alac.remainder_frames == 0) - psf_log_printf (psf, "*** 'pakt' chunk header is all zero.\n") ; - - pcaf->alac.pakt_offset = psf_ftell (psf) - 12 ; - psf_binheader_readf (psf, "j", make_size_t (chunk_size) - 24) ; - break ; - - default : - psf_log_printf (psf, "%M : %D (skipped)\n", marker, chunk_size) ; - psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ; - break ; - } ; - - if (! psf->sf.seekable && have_data) - break ; - - if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (chunk_size)) - { psf_log_printf (psf, "End\n") ; - break ; - } ; - } ; - - if (have_data == 0) - { psf_log_printf (psf, "**** Error, could not find 'data' chunk.\n") ; - return SFE_MALFORMED_FILE ; - } ; - - psf->endian = (desc.fmt_flags & 2) ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ; - - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - - if ((psf->sf.format = decode_desc_chunk (psf, &desc)) == 0) - return SFE_UNSUPPORTED_ENCODING ; - - if (psf->bytewidth > 0) - psf->sf.frames = psf->datalength / psf->bytewidth ; - - return 0 ; -} /* caf_read_header */ - -/*------------------------------------------------------------------------------ -*/ - -static int -caf_write_header (SF_PRIVATE *psf, int calc_length) -{ BUF_UNION ubuf ; - CAF_PRIVATE *pcaf ; - DESC_CHUNK desc ; - sf_count_t current, free_len ; - uint32_t uk ; - int subformat, append_free_block = SF_TRUE ; - - if ((pcaf = psf->container_data) == NULL) - return SFE_INTERNAL ; - - memset (&desc, 0, sizeof (desc)) ; - - current = psf_ftell (psf) ; - - if (calc_length) - { psf->filelength = psf_get_filelen (psf) ; - - psf->datalength = psf->filelength - psf->dataoffset ; - - if (psf->dataend) - psf->datalength -= psf->filelength - psf->dataend ; - - if (psf->bytewidth > 0) - psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; - } ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - psf_fseek (psf, 0, SEEK_SET) ; - - /* 'caff' marker, version and flags. */ - psf_binheader_writef (psf, "Em22", caff_MARKER, 1, 0) ; - - /* 'desc' marker and chunk size. */ - psf_binheader_writef (psf, "Em8", desc_MARKER, (sf_count_t) (sizeof (DESC_CHUNK))) ; - - double64_be_write (1.0 * psf->sf.samplerate, ubuf.ucbuf) ; - psf_binheader_writef (psf, "b", ubuf.ucbuf, make_size_t (8)) ; - - subformat = SF_CODEC (psf->sf.format) ; - - psf->endian = SF_ENDIAN (psf->sf.format) ; - - if (CPU_IS_BIG_ENDIAN && (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU)) - psf->endian = SF_ENDIAN_BIG ; - else if (CPU_IS_LITTLE_ENDIAN && (psf->endian == SF_ENDIAN_LITTLE || psf->endian == SF_ENDIAN_CPU)) - psf->endian = SF_ENDIAN_LITTLE ; - - if (psf->endian == SF_ENDIAN_LITTLE) - desc.fmt_flags = 2 ; - else - psf->endian = SF_ENDIAN_BIG ; - - /* initial section (same for all, it appears) */ - switch (subformat) - { case SF_FORMAT_PCM_S8 : - desc.fmt_id = lpcm_MARKER ; - psf->bytewidth = 1 ; - desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; - desc.frames_per_packet = 1 ; - desc.channels_per_frame = psf->sf.channels ; - desc.bits_per_chan = 8 ; - break ; - - case SF_FORMAT_PCM_16 : - desc.fmt_id = lpcm_MARKER ; - psf->bytewidth = 2 ; - desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; - desc.frames_per_packet = 1 ; - desc.channels_per_frame = psf->sf.channels ; - desc.bits_per_chan = 16 ; - break ; - - case SF_FORMAT_PCM_24 : - psf->bytewidth = 3 ; - desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; - desc.frames_per_packet = 1 ; - desc.channels_per_frame = psf->sf.channels ; - desc.bits_per_chan = 24 ; - desc.fmt_id = lpcm_MARKER ; - break ; - - case SF_FORMAT_PCM_32 : - desc.fmt_id = lpcm_MARKER ; - psf->bytewidth = 4 ; - desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; - desc.frames_per_packet = 1 ; - desc.channels_per_frame = psf->sf.channels ; - desc.bits_per_chan = 32 ; - break ; - - case SF_FORMAT_FLOAT : - desc.fmt_id = lpcm_MARKER ; - desc.fmt_flags |= 1 ; - psf->bytewidth = 4 ; - desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; - desc.frames_per_packet = 1 ; - desc.channels_per_frame = psf->sf.channels ; - desc.bits_per_chan = 32 ; - break ; - - case SF_FORMAT_DOUBLE : - desc.fmt_id = lpcm_MARKER ; - desc.fmt_flags |= 1 ; - psf->bytewidth = 8 ; - desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; - desc.frames_per_packet = 1 ; - desc.channels_per_frame = psf->sf.channels ; - desc.bits_per_chan = 64 ; - break ; - - case SF_FORMAT_ALAW : - desc.fmt_id = alaw_MARKER ; - psf->bytewidth = 1 ; - desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; - desc.frames_per_packet = 1 ; - desc.channels_per_frame = psf->sf.channels ; - desc.bits_per_chan = 8 ; - break ; - - case SF_FORMAT_ULAW : - desc.fmt_id = ulaw_MARKER ; - psf->bytewidth = 1 ; - desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; - desc.frames_per_packet = 1 ; - desc.channels_per_frame = psf->sf.channels ; - desc.bits_per_chan = 8 ; - break ; - - case SF_FORMAT_ALAC_16 : - case SF_FORMAT_ALAC_20 : - case SF_FORMAT_ALAC_24 : - case SF_FORMAT_ALAC_32 : - desc.fmt_id = alac_MARKER ; - desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; - desc.channels_per_frame = psf->sf.channels ; - alac_get_desc_chunk_items (subformat, &desc.fmt_flags, &desc.frames_per_packet) ; - append_free_block = SF_FALSE ; - break ; - - default : - return SFE_UNIMPLEMENTED ; - } ; - - psf_binheader_writef (psf, "mE44444", desc.fmt_id, desc.fmt_flags, desc.pkt_bytes, desc.frames_per_packet, desc.channels_per_frame, desc.bits_per_chan) ; - -#if 0 - if (psf->strings.flags & SF_STR_LOCATE_START) - caf_write_strings (psf, SF_STR_LOCATE_START) ; -#endif - - if (psf->peak_info != NULL) - { int k ; - psf_binheader_writef (psf, "Em84", peak_MARKER, (sf_count_t) CAF_PEAK_CHUNK_SIZE (psf->sf.channels), psf->peak_info->edit_number) ; - for (k = 0 ; k < psf->sf.channels ; k++) - psf_binheader_writef (psf, "Ef8", (float) psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ; - } ; - - if (psf->channel_map && pcaf->chanmap_tag) - psf_binheader_writef (psf, "Em8444", chan_MARKER, (sf_count_t) 12, pcaf->chanmap_tag, 0, 0) ; - - /* Write custom headers. */ - for (uk = 0 ; uk < psf->wchunks.used ; uk++) - psf_binheader_writef (psf, "m44b", (int) psf->wchunks.chunks [uk].mark32, 0, psf->wchunks.chunks [uk].len, psf->wchunks.chunks [uk].data, make_size_t (psf->wchunks.chunks [uk].len)) ; - - if (append_free_block) - { /* Add free chunk so that the actual audio data starts at a multiple 0x1000. */ - free_len = 0x1000 - psf->headindex - 16 - 12 ; - while (free_len < 0) - free_len += 0x1000 ; - psf_binheader_writef (psf, "Em8z", free_MARKER, free_len, (int) free_len) ; - } ; - - psf_binheader_writef (psf, "Em84", data_MARKER, psf->datalength + 4, 0) ; - - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - if (psf->error) - return psf->error ; - - psf->dataoffset = psf->headindex ; - if (current < psf->dataoffset) - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - else if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* caf_write_header */ - -static int -caf_read_chanmap (SF_PRIVATE * psf, sf_count_t chunk_size) -{ const AIFF_CAF_CHANNEL_MAP * map_info ; - unsigned channel_bitmap, channel_decriptions, bytesread ; - int layout_tag ; - - bytesread = psf_binheader_readf (psf, "E444", &layout_tag, &channel_bitmap, &channel_decriptions) ; - - map_info = aiff_caf_of_channel_layout_tag (layout_tag) ; - - psf_log_printf (psf, " Tag : %x\n", layout_tag) ; - if (map_info) - psf_log_printf (psf, " Layout : %s\n", map_info->name) ; - - if (bytesread < chunk_size) - psf_binheader_readf (psf, "j", chunk_size - bytesread) ; - - if (map_info->channel_map != NULL) - { size_t chanmap_size = psf->sf.channels * sizeof (psf->channel_map [0]) ; - - free (psf->channel_map) ; - - if ((psf->channel_map = malloc (chanmap_size)) == NULL) - return SFE_MALLOC_FAILED ; - - memcpy (psf->channel_map, map_info->channel_map, chanmap_size) ; - } ; - - return 0 ; -} /* caf_read_chanmap */ - -/*============================================================================== -*/ - -static int -caf_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) -{ return psf_save_write_chunk (&psf->wchunks, chunk_info) ; -} /* caf_set_chunk */ - -static SF_CHUNK_ITERATOR * -caf_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) -{ return psf_next_chunk_iterator (&psf->rchunks, iterator) ; -} /* caf_next_chunk_iterator */ - -static int -caf_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) -{ int indx ; - - if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0) - return SFE_UNKNOWN_CHUNK ; - - chunk_info->datalen = psf->rchunks.chunks [indx].len ; - - return SFE_NO_ERROR ; -} /* caf_get_chunk_size */ - -static int -caf_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) -{ int indx ; - sf_count_t pos ; - - if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0) - return SFE_UNKNOWN_CHUNK ; - - if (chunk_info->data == NULL) - return SFE_BAD_CHUNK_DATA_PTR ; - - chunk_info->id_size = psf->rchunks.chunks [indx].id_size ; - memcpy (chunk_info->id, psf->rchunks.chunks [indx].id, sizeof (chunk_info->id) / sizeof (*chunk_info->id)) ; - - pos = psf_ftell (psf) ; - psf_fseek (psf, psf->rchunks.chunks [indx].offset, SEEK_SET) ; - psf_fread (chunk_info->data, SF_MIN (chunk_info->datalen, psf->rchunks.chunks [indx].len), 1, psf) ; - psf_fseek (psf, pos, SEEK_SET) ; - - return SFE_NO_ERROR ; -} /* caf_get_chunk_data */ diff --git a/libs/libsndfile/src/cart.c b/libs/libsndfile/src/cart.c deleted file mode 100644 index a56ed60e51..0000000000 --- a/libs/libsndfile/src/cart.c +++ /dev/null @@ -1,101 +0,0 @@ -/* -** Copyright (C) 2012 Chris Roberts -** Copyright (C) 2006-2013 Erik de Castro Lopo -** Copyright (C) 2006 Paul Davis -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include "common.h" - - - -static inline size_t -cart_min_size (const SF_CART_INFO* info) -{ if (info == NULL) - return 0 ; - - return offsetof (SF_CART_INFO, tag_text) + info->tag_text_size ; -} /* cart_min_size */ - -SF_CART_INFO_16K* -cart_var_alloc (void) -{ SF_CART_INFO_16K* thing ; - thing = malloc (sizeof (SF_CART_INFO_16K)) ; - return thing ; -} /* cart_var_alloc */ - -int -cart_var_set (SF_PRIVATE *psf, const SF_CART_INFO * info, size_t datasize) -{ size_t len ; - - if (info == NULL) - return SF_FALSE ; - - if (cart_min_size (info) > datasize) - { psf->error = SFE_BAD_CART_INFO_SIZE ; - return SF_FALSE ; - } ; - - if (datasize >= sizeof (SF_CART_INFO_16K)) - { psf->error = SFE_BAD_CART_INFO_TOO_BIG ; - return SF_FALSE ; - } ; - - if (psf->cart_16k == NULL) - { if ((psf->cart_16k = cart_var_alloc ()) == NULL) - { psf->error = SFE_MALLOC_FAILED ; - return SF_FALSE ; - } ; - } ; - - memcpy (psf->cart_16k, info, offsetof (SF_CART_INFO, tag_text)) ; - psf_strlcpy_crlf (psf->cart_16k->tag_text, info->tag_text, sizeof (psf->cart_16k->tag_text), datasize - offsetof (SF_CART_INFO, tag_text)) ; - - len = strlen (psf->cart_16k->tag_text) ; - - if (len > 0 && psf->cart_16k->tag_text [len - 1] != '\n') - psf_strlcat (psf->cart_16k->tag_text, sizeof (psf->cart_16k->tag_text), "\r\n") ; - - /* Force tag_text_size to be even. */ - len = strlen (psf->cart_16k->tag_text) ; - len += (len & 1) ? 1 : 2 ; - - psf->cart_16k->tag_text_size = len ; - - return SF_TRUE ; -} /* cart_var_set */ - - -int -cart_var_get (SF_PRIVATE *psf, SF_CART_INFO * data, size_t datasize) -{ size_t size ; - if (psf->cart_16k == NULL) - return SF_FALSE ; - - size = SF_MIN (datasize, cart_min_size ((const SF_CART_INFO *) psf->cart_16k)) ; - - memcpy (data, psf->cart_16k, size) ; - - return SF_TRUE ; -} /* cart_var_get */ - - diff --git a/libs/libsndfile/src/chanmap.c b/libs/libsndfile/src/chanmap.c deleted file mode 100644 index 9a9f7f0f16..0000000000 --- a/libs/libsndfile/src/chanmap.c +++ /dev/null @@ -1,262 +0,0 @@ -/* -** Copyright (C) 2009-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* -** Mostly from "Apple Core Audio Format Specification 1.0": -** -** http://developer.apple.com/documentation/MusicAudio/Reference/CAFSpec/CAFSpec.pdf -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#include "sndfile.h" -#include "common.h" -#include "chanmap.h" - - -static const AIFF_CAF_CHANNEL_MAP zero_chan [] = -{ { (0 << 16) | 0, NULL, "Use channel descriptions." }, - { (1 << 16) | 0, NULL, "Use channel bitmap." } -} ; /* zero_chan */ - - -static const int one_chan_mono [1] = { SF_CHANNEL_MAP_MONO } ; - -static const AIFF_CAF_CHANNEL_MAP one_chan [] = -{ { (100 << 16) | 1, one_chan_mono, "mono" } -} ; /* one_chan */ - - -static const int two_channel_stereo [2] = { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT } ; - -static const AIFF_CAF_CHANNEL_MAP two_chan [] = -{ { (101 << 16) | 2, two_channel_stereo, "stereo (L, R)" }, - { (102 << 16) | 2, two_channel_stereo, "stereo headphones (L, R)" }, -#if 0 - { (103 << 16) | 2, NULL, "matrix stereo (Lt, Rt)" }, - { (104 << 16) | 2, NULL, "2 channels (mid, side)" }, - { (105 << 16) | 2, NULL, "coincident mic pair" }, - { (106 << 16) | 2, NULL, "binaural stereo (L, R)" - } -#endif -} ; /* two_chan */ - - -static const int three_channel_mpeg_30a [3] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER } ; -static const int three_channel_mpeg_30b [3] = - { SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT } ; -static const int three_channel_itu_21 [3] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_CENTER } ; -static const int three_channel_dvd_4 [3] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_LFE } ; - -static const AIFF_CAF_CHANNEL_MAP three_chan [] = -{ { (113 << 16) | 3, three_channel_mpeg_30a, "MPEG 3 0 A (L, R, C)" }, - { (114 << 16) | 3, three_channel_mpeg_30b, "MPEG 3 0 B (C, L, R)" }, - { (131 << 16) | 3, three_channel_itu_21, "ITU 2.1 (L, R, Cs)" }, - { (133 << 16) | 3, three_channel_dvd_4, "DVD 4 (L, R, LFE)" } -} ; /* three_chan */ - - -static const int four_channel_ambisonc_b [4] = - { SF_CHANNEL_MAP_AMBISONIC_B_W, SF_CHANNEL_MAP_AMBISONIC_B_X, SF_CHANNEL_MAP_AMBISONIC_B_Y, SF_CHANNEL_MAP_AMBISONIC_B_Z } ; -static const int four_channel_quad [4] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ; -static const int four_channel_mpeg_40a [4] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_REAR_CENTER } ; -static const int four_channel_mpeg_40b [4] = - { SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_CENTER } ; -static const int four_channel_itu_23 [4] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ; -static const int four_channel_dvd_5 [4] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_CENTER } ; -static const int four_channel_dvd_10 [4] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE } ; - -static const AIFF_CAF_CHANNEL_MAP four_chan [] = -{ { (107 << 16) | 4, four_channel_ambisonc_b, "ambisonic B (W, X, Y, Z)" }, - { (108 << 16) | 4, four_channel_quad, "quad (Lfront, Rfront, Lrear, Rrear)" }, - { (115 << 16) | 4, four_channel_mpeg_40a, "MPEG 4.0 A (L, R, C, Cs)" }, - { (116 << 16) | 4, four_channel_mpeg_40b, "MPEG 4.0 B (C, L, R, Cs)" }, - { (132 << 16) | 4, four_channel_itu_23, "ITU 2.3 (L, R, Ls, Rs)" }, - { (134 << 16) | 4, four_channel_dvd_5, "DVD 5 (L, R, LFE, Cs)" }, - { (136 << 16) | 4, four_channel_dvd_10, "DVD 10 (L, R, C, LFE)" } -} ; /* four_chan */ - - -static const int five_channel_pentagonal [5] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_CENTER } ; -static const int five_channel_mpeg_50_a [5] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ; -static const int five_channel_mpeg_50_b [5] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_CENTER } ; -static const int five_channel_mpeg_50_c [5] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ; -static const int five_channel_mpeg_50_d [5] = - { SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ; -static const int five_channel_dvd_6 [5] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ; -static const int five_channel_dvd_11 [5] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_CENTER } ; -static const int five_channel_dvd_18 [5] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_LFE } ; - -static const AIFF_CAF_CHANNEL_MAP five_chan [] = -{ { (109 << 16) | 5, five_channel_pentagonal, "pentagonal (L, R, Lrear, Rrear, C)" }, - { (117 << 16) | 5, five_channel_mpeg_50_a, "MPEG 5.0 A (L, R, C, Ls, Rs)" }, - { (118 << 16) | 5, five_channel_mpeg_50_b, "MPEG 5.0 B (L, R, Ls, Rs, C)" }, - { (119 << 16) | 5, five_channel_mpeg_50_c, "MPEG 5.0 C (L, C, R, Ls, Rs,)" }, - { (120 << 16) | 5, five_channel_mpeg_50_d, "MPEG 5.0 D (C, L, R, Ls, Rs)" }, - { (135 << 16) | 5, five_channel_dvd_6, "DVD 6 (L, R, LFE, Ls, Rs)" }, - { (137 << 16) | 5, five_channel_dvd_11, "DVD 11 (L, R, C, LFE, Cs)" }, - { (138 << 16) | 5, five_channel_dvd_18, "DVD 18 (L, R, Ls, Rs, LFE)" } -} ; /* five_chan */ - - -static const int six_channel_mpeg_51_a [6] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ; -static const int six_channel_mpeg_51_b [6] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE } ; -static const int six_channel_mpeg_51_c [6] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_LFE } ; -static const int six_channel_mpeg_51_d [6] = - { SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_LFE } ; -static const int six_channel_audio_unit_60 [6] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_REAR_CENTER } ; -static const int six_channel_aac_60 [6] = - { SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_REAR_CENTER } ; - -static const AIFF_CAF_CHANNEL_MAP six_chan [] = -{ { (110 << 16) | 6, NULL, "hexagonal (L, R, Lr, Rr, C, Rear)" }, - { (121 << 16) | 6, six_channel_mpeg_51_a, "MPEG 5.1 A (L, R, C, LFE, Ls, Rs)" }, - { (122 << 16) | 6, six_channel_mpeg_51_b, "MPEG 5.1 B (L, R, Ls, Rs, C, LFE)" }, - { (123 << 16) | 6, six_channel_mpeg_51_c, "MPEG 5.1 C (L, C, R, Ls, Rs, LFE)" }, - { (124 << 16) | 6, six_channel_mpeg_51_d, "MPEG 5.1 D (C, L, R, Ls, Rs, LFE)" }, - { (139 << 16) | 6, six_channel_audio_unit_60, "AudioUnit 6.0 (L, R, Ls, Rs, C, Cs)" }, - { (141 << 16) | 6, six_channel_aac_60, "AAC 6.0 (C, L, R, Ls, Rs, Cs)" } -} ; /* six_chan */ - - -static const int six_channel_mpeg_61a [7] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_REAR_CENTER } ; -static const int six_channel_aac_61 [7] = - { SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_REAR_CENTER, SF_CHANNEL_MAP_LFE } ; - -static const AIFF_CAF_CHANNEL_MAP seven_chan [] = -{ { (125 << 16) | 7, six_channel_mpeg_61a, "MPEG 6.1 A (L, R, C, LFE, Ls, Rs, Cs)" }, - { (140 << 16) | 7, NULL, "AudioUnit 7.0 (L, R, Ls, Rs, C, Rls, Rrs)" }, - { (142 << 16) | 7, six_channel_aac_61, "AAC 6.1 (C, L, R, Ls, Rs, Cs, Lfe)" }, - { (143 << 16) | 7, NULL, "AAC 7.0 (C, L, R, Ls, Rs, Rls, Rrs,)" } -} ; /* seven_chan */ - - -static const AIFF_CAF_CHANNEL_MAP eight_chan [] = -{ { (111 << 16) | 8, NULL, - // front left, front right, rear left, rear right, - // front center, rear center, side left, side right - "octagonal (Lf, Rf, Lr, Rr, Cf, Cr, Ls, Rs)" - }, - { (112 << 16) | 8, NULL, - // left, right, rear left, rear right - // top left, top right, top rear left, top rear right - "cube (L, R, Lrear, Rrear, Ltop, Rtop, Ltoprear, Rtoprear)" - }, - { (126 << 16) | 8, NULL, "MPEG 7.1 A (L, R, C, LFE, Ls, Rs, Lc, Rc)" }, - { (127 << 16) | 8, NULL, "MPEG 7.1 B (C, Lc, Rc, L, R, Ls, Rs, LFE)" }, - { (128 << 16) | 8, NULL, "MPEG 7.1 C (L, R, C, LFE, Ls, R, Rls, Rrs)" }, - { (129 << 16) | 8, NULL, "Emagic Default 7.1 (L, R, Ls, Rs, C, LFE, Lc, Rc)" }, - { (130 << 16) | 8, NULL, - // (ITU_5_1 plus a matrix encoded stereo mix) - "SMPTE DTV (L, R, C, LFE, Ls, Rs, Lt, Rt)" - }, - { (144 << 16) | 8, NULL, "AAC octagonal (C, L, R, Ls, Rs, Rls, Rrs, Cs)" } -} ; /* eight_chan */ - - - -#if 0 - -TMH_10_2_std = (145 << 16) | 16, -// L R C Vhc Lsd Rsd Ls Rs Vhl Vhr Lw Rw Csd Cs LFE1 LFE2 - -TMH_10_2_full = (146 << 16) | 21, -// TMH_10_2_std plus: Lc Rc HI VI Haptic - -#endif - - -typedef struct -{ const AIFF_CAF_CHANNEL_MAP * map ; - int len ; -} MAP_MAP ; - -static const MAP_MAP map [] = -{ { zero_chan, ARRAY_LEN (zero_chan) }, - { one_chan, ARRAY_LEN (one_chan) }, - { two_chan, ARRAY_LEN (two_chan) }, - { three_chan, ARRAY_LEN (three_chan) }, - { four_chan, ARRAY_LEN (four_chan) }, - { five_chan, ARRAY_LEN (five_chan) }, - { six_chan, ARRAY_LEN (six_chan) }, - { seven_chan, ARRAY_LEN (seven_chan) }, - { eight_chan, ARRAY_LEN (eight_chan) } -} ; /* map */ - - -int -aiff_caf_find_channel_layout_tag (const int *chan_map, int channels) -{ const AIFF_CAF_CHANNEL_MAP * curr_map ; - unsigned k, len ; - - if (channels < 1 || channels > ARRAY_LEN (map)) - return 0 ; - - curr_map = map [channels].map ; - len = map [channels].len ; - - for (k = 0 ; k < len ; k++) - if (curr_map [k].channel_map != NULL) - if (memcmp (chan_map, curr_map [k].channel_map, channels * sizeof (chan_map [0])) == 0) - return curr_map [k].channel_layout_tag ; - - return 0 ; -} /* aiff_caf_find_channel_layout_tag */ - -const AIFF_CAF_CHANNEL_MAP * -aiff_caf_of_channel_layout_tag (int tag) -{ const AIFF_CAF_CHANNEL_MAP * curr_map ; - unsigned k, len ; - int channels = tag & 0xffff ; - - if (channels < 0 || channels > ARRAY_LEN (map)) - return NULL ; - - curr_map = map [channels].map ; - len = map [channels].len ; - - for (k = 0 ; k < len ; k++) - if (curr_map [k].channel_layout_tag == tag) - return curr_map + k ; - - return NULL ; -} /* aiff_caf_of_channel_layout_tag */ diff --git a/libs/libsndfile/src/chanmap.h b/libs/libsndfile/src/chanmap.h deleted file mode 100644 index 8af409dbac..0000000000 --- a/libs/libsndfile/src/chanmap.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -** Copyright (C) 2009-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -typedef struct -{ /* The tag in the AIFF or CAF file. */ - int channel_layout_tag ; - - /* The equivalent array of SF_CHANNEL_MAP_* entries. */ - const int * channel_map ; - - const char * name ; -} AIFF_CAF_CHANNEL_MAP ; - - -int aiff_caf_find_channel_layout_tag (const int *chan_map, int channels) ; - -const AIFF_CAF_CHANNEL_MAP * aiff_caf_of_channel_layout_tag (int tag) ; diff --git a/libs/libsndfile/src/chunk.c b/libs/libsndfile/src/chunk.c deleted file mode 100644 index b661ce5c2b..0000000000 --- a/libs/libsndfile/src/chunk.c +++ /dev/null @@ -1,255 +0,0 @@ -/* -** Copyright (C) 2008-2012 Erik de Castro Lopo -** Copyright (C) 2012 IOhannes m zmoelnig, IEM -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -static int64_t -hash_of_str (const char * str) -{ int64_t marker = 0 ; - int k ; - - for (k = 0 ; str [k] ; k++) - marker = marker * 0x7f + ((const uint8_t *) str) [k] ; - - return marker ; -} /* hash_of_str */ - -SF_CHUNK_ITERATOR * -psf_get_chunk_iterator (SF_PRIVATE * psf, const char * marker_str) -{ const READ_CHUNKS * pchk = &psf->rchunks ; - int idx ; - - if (marker_str) - idx = psf_find_read_chunk_str (pchk, marker_str) ; - else - idx = pchk->used > 0 ? 0 : -1 ; - - if (idx < 0) - return NULL ; - - if (psf->iterator == NULL) - { psf->iterator = calloc (1, sizeof (SF_CHUNK_ITERATOR)) ; - if (psf->iterator == NULL) - return NULL ; - } ; - - psf->iterator->sndfile = (SNDFILE *) psf ; - - if (marker_str) - { int64_t hash ; - size_t marker_len ; - union - { uint32_t marker ; - char str [5] ; - } u ; - - snprintf (u.str, sizeof (u.str), "%s", marker_str) ; - - marker_len = strlen (marker_str) ; - if (marker_len > 64) - marker_len = 64 ; - - hash = marker_len > 4 ? hash_of_str (marker_str) : u.marker ; - - memcpy (psf->iterator->id, marker_str, marker_len) ; - psf->iterator->id_size = marker_len ; - psf->iterator->hash = hash ; - } - - psf->iterator->current = idx ; - - return psf->iterator ; -} /* psf_get_chunk_iterator */ - -SF_CHUNK_ITERATOR * -psf_next_chunk_iterator (const READ_CHUNKS * pchk , SF_CHUNK_ITERATOR * iterator) -{ int64_t hash = iterator->hash ; - uint32_t k ; - - iterator->current++ ; - - if (hash) - { for (k = iterator->current ; k < pchk->used ; k++) - if (pchk->chunks [k].hash == hash) - { iterator->current = k ; - return iterator ; - } - } - else if (iterator->current < pchk->used) - return iterator ; - - /* No match, clear iterator and return NULL */ - memset (iterator, 0, sizeof (*iterator)) ; - return NULL ; -} /* psf_next_chunk_iterator */ - -static int -psf_store_read_chunk (READ_CHUNKS * pchk, const READ_CHUNK * rchunk) -{ if (pchk->count == 0) - { pchk->used = 0 ; - pchk->count = 20 ; - pchk->chunks = calloc (pchk->count, sizeof (READ_CHUNK)) ; - } - else if (pchk->used > pchk->count) - return SFE_INTERNAL ; - else if (pchk->used == pchk->count) - { READ_CHUNK * old_ptr = pchk->chunks ; - int new_count = 3 * (pchk->count + 1) / 2 ; - - pchk->chunks = realloc (old_ptr, new_count * sizeof (READ_CHUNK)) ; - if (pchk->chunks == NULL) - { pchk->chunks = old_ptr ; - return SFE_MALLOC_FAILED ; - } ; - pchk->count = new_count ; - } ; - - pchk->chunks [pchk->used] = *rchunk ; - - pchk->used ++ ; - - return SFE_NO_ERROR ; -} /* psf_store_read_chunk */ - -int -psf_store_read_chunk_u32 (READ_CHUNKS * pchk, uint32_t marker, sf_count_t offset, uint32_t len) -{ READ_CHUNK rchunk ; - - memset (&rchunk, 0, sizeof (rchunk)) ; - - rchunk.hash = marker ; - rchunk.mark32 = marker ; - rchunk.offset = offset ; - rchunk.len = len ; - - rchunk.id_size = 4 ; - memcpy (rchunk.id, &marker, rchunk.id_size) ; - - return psf_store_read_chunk (pchk, &rchunk) ; -} /* psf_store_read_chunk_u32 */ - -int -psf_find_read_chunk_str (const READ_CHUNKS * pchk, const char * marker_str) -{ int64_t hash ; - uint32_t k ; - union - { uint32_t marker ; - char str [5] ; - } u ; - - snprintf (u.str, sizeof (u.str), "%s", marker_str) ; - - hash = strlen (marker_str) > 4 ? hash_of_str (marker_str) : u.marker ; - - for (k = 0 ; k < pchk->used ; k++) - if (pchk->chunks [k].hash == hash) - return k ; - - return -1 ; -} /* psf_find_read_chunk_str */ - -int -psf_find_read_chunk_m32 (const READ_CHUNKS * pchk, uint32_t marker) -{ uint32_t k ; - - for (k = 0 ; k < pchk->used ; k++) - if (pchk->chunks [k].mark32 == marker) - return k ; - - return -1 ; -} /* psf_find_read_chunk_m32 */ -int -psf_find_read_chunk_iterator (const READ_CHUNKS * pchk, const SF_CHUNK_ITERATOR * marker) -{ if (marker->current < pchk->used) - return marker->current ; - - return -1 ; -} /* psf_find_read_chunk_iterator */ - -int -psf_store_read_chunk_str (READ_CHUNKS * pchk, const char * marker_str, sf_count_t offset, uint32_t len) -{ READ_CHUNK rchunk ; - union - { uint32_t marker ; - char str [5] ; - } u ; - size_t marker_len ; - - memset (&rchunk, 0, sizeof (rchunk)) ; - snprintf (u.str, sizeof (u.str), "%s", marker_str) ; - - marker_len = strlen (marker_str) ; - - rchunk.hash = marker_len > 4 ? hash_of_str (marker_str) : u.marker ; - rchunk.mark32 = u.marker ; - rchunk.offset = offset ; - rchunk.len = len ; - - rchunk.id_size = marker_len > 64 ? 64 : marker_len ; - memcpy (rchunk.id, marker_str, rchunk.id_size) ; - - return psf_store_read_chunk (pchk, &rchunk) ; -} /* psf_store_read_chunk_str */ - -int -psf_save_write_chunk (WRITE_CHUNKS * pchk, const SF_CHUNK_INFO * chunk_info) -{ union - { uint32_t marker ; - char str [5] ; - } u ; - uint32_t len ; - - if (pchk->count == 0) - { pchk->used = 0 ; - pchk->count = 20 ; - pchk->chunks = calloc (pchk->count, sizeof (WRITE_CHUNK)) ; - } - else if (pchk->used >= pchk->count) - { WRITE_CHUNK * old_ptr = pchk->chunks ; - int new_count = 3 * (pchk->count + 1) / 2 ; - - pchk->chunks = realloc (old_ptr, new_count * sizeof (WRITE_CHUNK)) ; - if (pchk->chunks == NULL) - { pchk->chunks = old_ptr ; - return SFE_MALLOC_FAILED ; - } ; - } ; - - len = chunk_info->datalen ; - while (len & 3) len ++ ; - - snprintf (u.str, sizeof (u.str), "%s", chunk_info->id) ; - - pchk->chunks [pchk->used].hash = strlen (chunk_info->id) > 4 ? hash_of_str (chunk_info->id) : u.marker ; - pchk->chunks [pchk->used].mark32 = u.marker ; - pchk->chunks [pchk->used].len = len ; - pchk->chunks [pchk->used].data = psf_memdup (chunk_info->data, chunk_info->datalen) ; - - pchk->used ++ ; - - return SFE_NO_ERROR ; -} /* psf_save_write_chunk */ - diff --git a/libs/libsndfile/src/command.c b/libs/libsndfile/src/command.c deleted file mode 100644 index 6db7315415..0000000000 --- a/libs/libsndfile/src/command.c +++ /dev/null @@ -1,390 +0,0 @@ -/* -** Copyright (C) 2001-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#include "sndfile.h" -#include "common.h" - -static SF_FORMAT_INFO const simple_formats [] = -{ - { SF_FORMAT_AIFF | SF_FORMAT_PCM_16, - "AIFF (Apple/SGI 16 bit PCM)", "aiff" - }, - - { SF_FORMAT_AIFF | SF_FORMAT_FLOAT, - "AIFF (Apple/SGI 32 bit float)", "aifc" - }, - - { SF_FORMAT_AIFF | SF_FORMAT_PCM_S8, - "AIFF (Apple/SGI 8 bit PCM)", "aiff" - }, - - { SF_FORMAT_AU | SF_FORMAT_PCM_16, - "AU (Sun/Next 16 bit PCM)", "au" - }, - - { SF_FORMAT_AU | SF_FORMAT_ULAW, - "AU (Sun/Next 8-bit u-law)", "au" - }, - - { SF_FORMAT_CAF | SF_FORMAT_ALAC_16, - "CAF (Apple 16 bit ALAC)", "caf" - }, - - { SF_FORMAT_CAF | SF_FORMAT_PCM_16, - "CAF (Apple 16 bit PCM)", "caf" - }, - -#if HAVE_EXTERNAL_LIBS - { SF_FORMAT_FLAC | SF_FORMAT_PCM_16, - "FLAC 16 bit", "flac" - }, -#endif - - { SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, - "OKI Dialogic VOX ADPCM", "vox" - }, - -#if HAVE_EXTERNAL_LIBS - { SF_FORMAT_OGG | SF_FORMAT_VORBIS, - "Ogg Vorbis (Xiph Foundation)", "oga" - }, -#endif - - { SF_FORMAT_WAV | SF_FORMAT_PCM_16, - "WAV (Microsoft 16 bit PCM)", "wav" - }, - - { SF_FORMAT_WAV | SF_FORMAT_FLOAT, - "WAV (Microsoft 32 bit float)", "wav" - }, - - { SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, - "WAV (Microsoft 4 bit IMA ADPCM)", "wav" - }, - - { SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, - "WAV (Microsoft 4 bit MS ADPCM)", "wav" - }, - - { SF_FORMAT_WAV | SF_FORMAT_PCM_U8, - "WAV (Microsoft 8 bit PCM)", "wav" - }, - -} ; /* simple_formats */ - -int -psf_get_format_simple_count (void) -{ return (sizeof (simple_formats) / sizeof (SF_FORMAT_INFO)) ; -} /* psf_get_format_simple_count */ - -int -psf_get_format_simple (SF_FORMAT_INFO *data) -{ int indx ; - - if (data->format < 0 || data->format >= (SIGNED_SIZEOF (simple_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO))) - return SFE_BAD_COMMAND_PARAM ; - - indx = data->format ; - memcpy (data, &(simple_formats [indx]), SIGNED_SIZEOF (SF_FORMAT_INFO)) ; - - return 0 ; -} /* psf_get_format_simple */ - -/*============================================================================ -** Major format info. -*/ - -static SF_FORMAT_INFO const major_formats [] = -{ - { SF_FORMAT_AIFF, "AIFF (Apple/SGI)", "aiff" }, - { SF_FORMAT_AU, "AU (Sun/NeXT)", "au" }, - { SF_FORMAT_AVR, "AVR (Audio Visual Research)", "avr" }, - { SF_FORMAT_CAF, "CAF (Apple Core Audio File)", "caf" }, -#if HAVE_EXTERNAL_LIBS - { SF_FORMAT_FLAC, "FLAC (Free Lossless Audio Codec)", "flac" }, -#endif - { SF_FORMAT_HTK, "HTK (HMM Tool Kit)", "htk" }, - { SF_FORMAT_SVX, "IFF (Amiga IFF/SVX8/SV16)", "iff" }, - { SF_FORMAT_MAT4, "MAT4 (GNU Octave 2.0 / Matlab 4.2)", "mat" }, - { SF_FORMAT_MAT5, "MAT5 (GNU Octave 2.1 / Matlab 5.0)", "mat" }, - { SF_FORMAT_MPC2K, "MPC (Akai MPC 2k)", "mpc" }, -#if HAVE_EXTERNAL_LIBS - { SF_FORMAT_OGG, "OGG (OGG Container format)", "oga" }, -#endif - { SF_FORMAT_PAF, "PAF (Ensoniq PARIS)", "paf" }, - { SF_FORMAT_PVF, "PVF (Portable Voice Format)", "pvf" }, - { SF_FORMAT_RAW, "RAW (header-less)", "raw" }, - { SF_FORMAT_RF64, "RF64 (RIFF 64)", "rf64" }, - { SF_FORMAT_SD2, "SD2 (Sound Designer II)", "sd2" }, - { SF_FORMAT_SDS, "SDS (Midi Sample Dump Standard)", "sds" }, - { SF_FORMAT_IRCAM, "SF (Berkeley/IRCAM/CARL)", "sf" }, - { SF_FORMAT_VOC, "VOC (Creative Labs)", "voc" }, - { SF_FORMAT_W64, "W64 (SoundFoundry WAVE 64)", "w64" }, - { SF_FORMAT_WAV, "WAV (Microsoft)", "wav" }, - { SF_FORMAT_NIST, "WAV (NIST Sphere)", "wav" }, - { SF_FORMAT_WAVEX, "WAVEX (Microsoft)", "wav" }, - { SF_FORMAT_WVE, "WVE (Psion Series 3)", "wve" }, - { SF_FORMAT_XI, "XI (FastTracker 2)", "xi" }, - -} ; /* major_formats */ - -int -psf_get_format_major_count (void) -{ return (sizeof (major_formats) / sizeof (SF_FORMAT_INFO)) ; -} /* psf_get_format_major_count */ - -int -psf_get_format_major (SF_FORMAT_INFO *data) -{ int indx ; - - if (data->format < 0 || data->format >= (SIGNED_SIZEOF (major_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO))) - return SFE_BAD_COMMAND_PARAM ; - - indx = data->format ; - memcpy (data, &(major_formats [indx]), SIGNED_SIZEOF (SF_FORMAT_INFO)) ; - - return 0 ; -} /* psf_get_format_major */ - -/*============================================================================ -** Subtype format info. -*/ - -static SF_FORMAT_INFO subtype_formats [] = -{ - { SF_FORMAT_PCM_S8, "Signed 8 bit PCM", NULL }, - { SF_FORMAT_PCM_16, "Signed 16 bit PCM", NULL }, - { SF_FORMAT_PCM_24, "Signed 24 bit PCM", NULL }, - { SF_FORMAT_PCM_32, "Signed 32 bit PCM", NULL }, - - { SF_FORMAT_PCM_U8, "Unsigned 8 bit PCM", NULL }, - - { SF_FORMAT_FLOAT, "32 bit float", NULL }, - { SF_FORMAT_DOUBLE, "64 bit float", NULL }, - - { SF_FORMAT_ULAW, "U-Law", NULL }, - { SF_FORMAT_ALAW, "A-Law", NULL }, - { SF_FORMAT_IMA_ADPCM, "IMA ADPCM", NULL }, - { SF_FORMAT_MS_ADPCM, "Microsoft ADPCM", NULL }, - - { SF_FORMAT_GSM610, "GSM 6.10", NULL }, - - { SF_FORMAT_G721_32, "32kbs G721 ADPCM", NULL }, - { SF_FORMAT_G723_24, "24kbs G723 ADPCM", NULL }, - - { SF_FORMAT_DWVW_12, "12 bit DWVW", NULL }, - { SF_FORMAT_DWVW_16, "16 bit DWVW", NULL }, - { SF_FORMAT_DWVW_24, "24 bit DWVW", NULL }, - { SF_FORMAT_VOX_ADPCM, "VOX ADPCM", "vox" }, - - { SF_FORMAT_DPCM_16, "16 bit DPCM", NULL }, - { SF_FORMAT_DPCM_8, "8 bit DPCM", NULL }, - -#if HAVE_EXTERNAL_LIBS - { SF_FORMAT_VORBIS, "Vorbis", NULL }, -#endif - - { SF_FORMAT_ALAC_16, "16 bit ALAC", NULL }, - { SF_FORMAT_ALAC_20, "20 bit ALAC", NULL }, - { SF_FORMAT_ALAC_24, "24 bit ALAC", NULL }, - { SF_FORMAT_ALAC_32, "32 bit ALAC", NULL }, -} ; /* subtype_formats */ - -int -psf_get_format_subtype_count (void) -{ return (sizeof (subtype_formats) / sizeof (SF_FORMAT_INFO)) ; -} /* psf_get_format_subtype_count */ - -int -psf_get_format_subtype (SF_FORMAT_INFO *data) -{ int indx ; - - if (data->format < 0 || data->format >= (SIGNED_SIZEOF (subtype_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO))) - { data->format = 0 ; - return SFE_BAD_COMMAND_PARAM ; - } ; - - indx = data->format ; - memcpy (data, &(subtype_formats [indx]), sizeof (SF_FORMAT_INFO)) ; - - return 0 ; -} /* psf_get_format_subtype */ - -/*============================================================================== -*/ - -int -psf_get_format_info (SF_FORMAT_INFO *data) -{ int k, format ; - - if (SF_CONTAINER (data->format)) - { format = SF_CONTAINER (data->format) ; - - for (k = 0 ; k < (SIGNED_SIZEOF (major_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO)) ; k++) - { if (format == major_formats [k].format) - { memcpy (data, &(major_formats [k]), sizeof (SF_FORMAT_INFO)) ; - return 0 ; - } ; - } ; - } - else if (SF_CODEC (data->format)) - { format = SF_CODEC (data->format) ; - - for (k = 0 ; k < (SIGNED_SIZEOF (subtype_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO)) ; k++) - { if (format == subtype_formats [k].format) - { memcpy (data, &(subtype_formats [k]), sizeof (SF_FORMAT_INFO)) ; - return 0 ; - } ; - } ; - } ; - - memset (data, 0, sizeof (SF_FORMAT_INFO)) ; - - return SFE_BAD_COMMAND_PARAM ; -} /* psf_get_format_info */ - -/*============================================================================== -*/ - -double -psf_calc_signal_max (SF_PRIVATE *psf, int normalize) -{ BUF_UNION ubuf ; - sf_count_t position ; - double max_val, temp, *data ; - int k, len, readcount, save_state ; - - /* If the file is not seekable, there is nothing we can do. */ - if (! psf->sf.seekable) - { psf->error = SFE_NOT_SEEKABLE ; - return 0.0 ; - } ; - - if (! psf->read_double) - { psf->error = SFE_UNIMPLEMENTED ; - return 0.0 ; - } ; - - save_state = sf_command ((SNDFILE*) psf, SFC_GET_NORM_DOUBLE, NULL, 0) ; - sf_command ((SNDFILE*) psf, SFC_SET_NORM_DOUBLE, NULL, normalize) ; - - /* Brute force. Read the whole file and find the biggest sample. */ - /* Get current position in file */ - position = sf_seek ((SNDFILE*) psf, 0, SEEK_CUR) ; - /* Go to start of file. */ - sf_seek ((SNDFILE*) psf, 0, SEEK_SET) ; - - data = ubuf.dbuf ; - /* Make sure len is an integer multiple of the channel count. */ - len = ARRAY_LEN (ubuf.dbuf) - (ARRAY_LEN (ubuf.dbuf) % psf->sf.channels) ; - - for (readcount = 1, max_val = 0.0 ; readcount > 0 ; /* nothing */) - { readcount = sf_read_double ((SNDFILE*) psf, data, len) ; - for (k = 0 ; k < readcount ; k++) - { temp = fabs (data [k]) ; - max_val = temp > max_val ? temp : max_val ; - } ; - } ; - - /* Return to SNDFILE to original state. */ - sf_seek ((SNDFILE*) psf, position, SEEK_SET) ; - sf_command ((SNDFILE*) psf, SFC_SET_NORM_DOUBLE, NULL, save_state) ; - - return max_val ; -} /* psf_calc_signal_max */ - -int -psf_calc_max_all_channels (SF_PRIVATE *psf, double *peaks, int normalize) -{ BUF_UNION ubuf ; - sf_count_t position ; - double temp, *data ; - int k, len, readcount, save_state ; - int chan ; - - /* If the file is not seekable, there is nothing we can do. */ - if (! psf->sf.seekable) - return (psf->error = SFE_NOT_SEEKABLE) ; - - if (! psf->read_double) - return (psf->error = SFE_UNIMPLEMENTED) ; - - save_state = sf_command ((SNDFILE*) psf, SFC_GET_NORM_DOUBLE, NULL, 0) ; - sf_command ((SNDFILE*) psf, SFC_SET_NORM_DOUBLE, NULL, normalize) ; - - memset (peaks, 0, sizeof (double) * psf->sf.channels) ; - - /* Brute force. Read the whole file and find the biggest sample for each channel. */ - position = sf_seek ((SNDFILE*) psf, 0, SEEK_CUR) ; /* Get current position in file */ - sf_seek ((SNDFILE*) psf, 0, SEEK_SET) ; /* Go to start of file. */ - - len = ARRAY_LEN (ubuf.dbuf) ; - - data = ubuf.dbuf ; - - chan = 0 ; - readcount = len ; - while (readcount > 0) - { readcount = sf_read_double ((SNDFILE*) psf, data, len) ; - for (k = 0 ; k < readcount ; k++) - { temp = fabs (data [k]) ; - peaks [chan] = temp > peaks [chan] ? temp : peaks [chan] ; - chan = (chan + 1) % psf->sf.channels ; - } ; - } ; - - sf_seek ((SNDFILE*) psf, position, SEEK_SET) ; /* Return to original position. */ - - sf_command ((SNDFILE*) psf, SFC_SET_NORM_DOUBLE, NULL, save_state) ; - - return 0 ; -} /* psf_calc_max_all_channels */ - -int -psf_get_signal_max (SF_PRIVATE *psf, double *peak) -{ int k ; - - if (psf->peak_info == NULL) - return SF_FALSE ; - - peak [0] = psf->peak_info->peaks [0].value ; - - for (k = 1 ; k < psf->sf.channels ; k++) - peak [0] = SF_MAX (peak [0], psf->peak_info->peaks [k].value) ; - - return SF_TRUE ; -} /* psf_get_signal_max */ - -int -psf_get_max_all_channels (SF_PRIVATE *psf, double *peaks) -{ int k ; - - if (psf->peak_info == NULL) - return SF_FALSE ; - - for (k = 0 ; k < psf->sf.channels ; k++) - peaks [k] = psf->peak_info->peaks [k].value ; - - return SF_TRUE ; -} /* psf_get_max_all_channels */ - - diff --git a/libs/libsndfile/src/common.c b/libs/libsndfile/src/common.c deleted file mode 100644 index f42bc91575..0000000000 --- a/libs/libsndfile/src/common.c +++ /dev/null @@ -1,1662 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include - -#include -#include - -#ifndef _MSC_VER -#include -#endif -#include -#include -#include -#ifndef _MSC_VER -#include -#endif - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/*----------------------------------------------------------------------------------------------- -** psf_log_printf allows libsndfile internal functions to print to an internal parselog which -** can later be displayed. -** The format specifiers are as for printf but without the field width and other modifiers. -** Printing is performed to the parselog char array of the SF_PRIVATE struct. -** Printing is done in such a way as to guarantee that the log never overflows the end of the -** parselog array. -*/ - -static inline void -log_putchar (SF_PRIVATE *psf, char ch) -{ if (psf->parselog.indx < SIGNED_SIZEOF (psf->parselog.buf) - 1) - { psf->parselog.buf [psf->parselog.indx++] = ch ; - psf->parselog.buf [psf->parselog.indx] = 0 ; - } ; - return ; -} /* log_putchar */ - -void -psf_log_printf (SF_PRIVATE *psf, const char *format, ...) -{ va_list ap ; - unsigned int u ; - int d, tens, shift, width, width_specifier, left_align ; - char c, *strptr, istr [5], lead_char, sign_char ; - - va_start (ap, format) ; - - while ((c = *format++)) - { if (c != '%') - { log_putchar (psf, c) ; - continue ; - } ; - - if (format [0] == '%') /* Handle %% */ - { log_putchar (psf, '%') ; - format ++ ; - continue ; - } ; - - sign_char = 0 ; - left_align = SF_FALSE ; - while (1) - { switch (format [0]) - { case ' ' : - case '+' : - sign_char = format [0] ; - format ++ ; - continue ; - - case '-' : - left_align = SF_TRUE ; - format ++ ; - continue ; - - default : break ; - } ; - - break ; - } ; - - if (format [0] == 0) - break ; - - lead_char = ' ' ; - if (format [0] == '0') - lead_char = '0' ; - - width_specifier = 0 ; - while ((c = *format++) && isdigit (c)) - width_specifier = width_specifier * 10 + (c - '0') ; - - switch (c) - { case 0 : /* NULL character. */ - va_end (ap) ; - return ; - - case 's': /* string */ - strptr = va_arg (ap, char *) ; - if (strptr == NULL) - break ; - width_specifier -= strlen (strptr) ; - if (left_align == SF_FALSE) - while (width_specifier -- > 0) - log_putchar (psf, ' ') ; - while (*strptr) - log_putchar (psf, *strptr++) ; - while (width_specifier -- > 0) - log_putchar (psf, ' ') ; - break ; - - case 'd': /* int */ - d = va_arg (ap, int) ; - - if (d < 0) - { d = -d ; - sign_char = '-' ; - if (lead_char != '0' && left_align == SF_FALSE) - width_specifier -- ; - } ; - - tens = 1 ; - width = 1 ; - while (d / tens >= 10) - { tens *= 10 ; - width ++ ; - } ; - - width_specifier -= width ; - - if (sign_char == ' ') - { log_putchar (psf, ' ') ; - width_specifier -- ; - } ; - - if (left_align == SF_FALSE && lead_char != '0') - { if (sign_char == '+') - width_specifier -- ; - - while (width_specifier -- > 0) - log_putchar (psf, lead_char) ; - } ; - - if (sign_char == '+' || sign_char == '-') - { log_putchar (psf, sign_char) ; - width_specifier -- ; - } ; - - if (left_align == SF_FALSE) - while (width_specifier -- > 0) - log_putchar (psf, lead_char) ; - - while (tens > 0) - { log_putchar (psf, '0' + d / tens) ; - d %= tens ; - tens /= 10 ; - } ; - - while (width_specifier -- > 0) - log_putchar (psf, lead_char) ; - break ; - - case 'D': /* sf_count_t */ - { sf_count_t D, Tens ; - - D = va_arg (ap, sf_count_t) ; - - if (D == 0) - { while (-- width_specifier > 0) - log_putchar (psf, lead_char) ; - log_putchar (psf, '0') ; - break ; - } - if (D < 0) - { log_putchar (psf, '-') ; - D = -D ; - } ; - Tens = 1 ; - width = 1 ; - while (D / Tens >= 10) - { Tens *= 10 ; - width ++ ; - } ; - - while (width_specifier > width) - { log_putchar (psf, lead_char) ; - width_specifier-- ; - } ; - - while (Tens > 0) - { log_putchar (psf, '0' + D / Tens) ; - D %= Tens ; - Tens /= 10 ; - } ; - } ; - break ; - - case 'u': /* unsigned int */ - u = va_arg (ap, unsigned int) ; - - tens = 1 ; - width = 1 ; - while (u / tens >= 10) - { tens *= 10 ; - width ++ ; - } ; - - width_specifier -= width ; - - if (sign_char == ' ') - { log_putchar (psf, ' ') ; - width_specifier -- ; - } ; - - if (left_align == SF_FALSE && lead_char != '0') - { if (sign_char == '+') - width_specifier -- ; - - while (width_specifier -- > 0) - log_putchar (psf, lead_char) ; - } ; - - if (sign_char == '+' || sign_char == '-') - { log_putchar (psf, sign_char) ; - width_specifier -- ; - } ; - - if (left_align == SF_FALSE) - while (width_specifier -- > 0) - log_putchar (psf, lead_char) ; - - while (tens > 0) - { log_putchar (psf, '0' + u / tens) ; - u %= tens ; - tens /= 10 ; - } ; - - while (width_specifier -- > 0) - log_putchar (psf, lead_char) ; - break ; - - case 'c': /* char */ - c = va_arg (ap, int) & 0xFF ; - log_putchar (psf, c) ; - break ; - - case 'x': /* hex */ - case 'X': /* hex */ - d = va_arg (ap, int) ; - - if (d == 0) - { while (--width_specifier > 0) - log_putchar (psf, lead_char) ; - log_putchar (psf, '0') ; - break ; - } ; - shift = 28 ; - width = (width_specifier < 8) ? 8 : width_specifier ; - while (! ((0xF << shift) & d)) - { shift -= 4 ; - width -- ; - } ; - - while (width > 0 && width_specifier > width) - { log_putchar (psf, lead_char) ; - width_specifier-- ; - } ; - - while (shift >= 0) - { c = (d >> shift) & 0xF ; - log_putchar (psf, (c > 9) ? c + 'A' - 10 : c + '0') ; - shift -= 4 ; - } ; - break ; - - case 'M': /* int2str */ - d = va_arg (ap, int) ; - if (CPU_IS_LITTLE_ENDIAN) - { istr [0] = d & 0xFF ; - istr [1] = (d >> 8) & 0xFF ; - istr [2] = (d >> 16) & 0xFF ; - istr [3] = (d >> 24) & 0xFF ; - } - else - { istr [3] = d & 0xFF ; - istr [2] = (d >> 8) & 0xFF ; - istr [1] = (d >> 16) & 0xFF ; - istr [0] = (d >> 24) & 0xFF ; - } ; - istr [4] = 0 ; - strptr = istr ; - while (*strptr) - { c = *strptr++ ; - log_putchar (psf, c) ; - } ; - break ; - - default : - log_putchar (psf, '*') ; - log_putchar (psf, c) ; - log_putchar (psf, '*') ; - break ; - } /* switch */ - } /* while */ - - va_end (ap) ; - return ; -} /* psf_log_printf */ - -/*----------------------------------------------------------------------------------------------- -** ASCII header printf functions. -** Some formats (ie NIST) use ascii text in their headers. -** Format specifiers are the same as the standard printf specifiers (uses vsnprintf). -** If this generates a compile error on any system, the author should be notified -** so an alternative vsnprintf can be provided. -*/ - -void -psf_asciiheader_printf (SF_PRIVATE *psf, const char *format, ...) -{ va_list argptr ; - int maxlen ; - char *start ; - - maxlen = strlen ((char*) psf->header) ; - start = ((char*) psf->header) + maxlen ; - maxlen = sizeof (psf->header) - maxlen ; - - va_start (argptr, format) ; - vsnprintf (start, maxlen, format, argptr) ; - va_end (argptr) ; - - /* Make sure the string is properly terminated. */ - start [maxlen - 1] = 0 ; - - psf->headindex = strlen ((char*) psf->header) ; - - return ; -} /* psf_asciiheader_printf */ - -/*----------------------------------------------------------------------------------------------- -** Binary header writing functions. Returns number of bytes written. -** -** Format specifiers for psf_binheader_writef are as follows -** m - marker - four bytes - no endian manipulation -** -** e - all following numerical values will be little endian -** E - all following numerical values will be big endian -** -** t - all following O types will be truncated to 4 bytes -** T - switch off truncation of all following O types -** -** 1 - single byte value -** 2 - two byte value -** 3 - three byte value -** 4 - four byte value -** 8 - eight byte value (sometimes written as 4 bytes) -** -** s - string preceded by a four byte length -** S - string including null terminator -** f - floating point data -** d - double precision floating point data -** h - 16 binary bytes value -** -** b - binary data (see below) -** z - zero bytes (ses below) -** j - jump forwards or backwards -** -** To write a word followed by an int (both little endian) use: -** psf_binheader_writef ("e24", wordval, longval) ; -** -** To write binary data use: -** psf_binheader_writef ("b", &bindata, sizeof (bindata)) ; -** -** To write N zero bytes use: -** NOTE: due to platform issues (ie x86-64) you should cast the -** argument to size_t or ensure the variable type is size_t. -** psf_binheader_writef ("z", N) ; -*/ - -/* These macros may seem a bit messy but do prevent problems with processors which -** seg. fault when asked to write an int or short to a non-int/short aligned address. -*/ - -static inline void -header_put_byte (SF_PRIVATE *psf, char x) -{ if (psf->headindex < SIGNED_SIZEOF (psf->header) - 1) - psf->header [psf->headindex++] = x ; -} /* header_put_byte */ - -#if (CPU_IS_BIG_ENDIAN == 1) -static inline void -header_put_marker (SF_PRIVATE *psf, int x) -{ if (psf->headindex < SIGNED_SIZEOF (psf->header) - 4) - { psf->header [psf->headindex++] = (x >> 24) ; - psf->header [psf->headindex++] = (x >> 16) ; - psf->header [psf->headindex++] = (x >> 8) ; - psf->header [psf->headindex++] = x ; - } ; -} /* header_put_marker */ - -#elif (CPU_IS_LITTLE_ENDIAN == 1) -static inline void -header_put_marker (SF_PRIVATE *psf, int x) -{ if (psf->headindex < SIGNED_SIZEOF (psf->header) - 4) - { psf->header [psf->headindex++] = x ; - psf->header [psf->headindex++] = (x >> 8) ; - psf->header [psf->headindex++] = (x >> 16) ; - psf->header [psf->headindex++] = (x >> 24) ; - } ; -} /* header_put_marker */ - -#else -# error "Cannot determine endian-ness of processor." -#endif - - -static inline void -header_put_be_short (SF_PRIVATE *psf, int x) -{ if (psf->headindex < SIGNED_SIZEOF (psf->header) - 2) - { psf->header [psf->headindex++] = (x >> 8) ; - psf->header [psf->headindex++] = x ; - } ; -} /* header_put_be_short */ - -static inline void -header_put_le_short (SF_PRIVATE *psf, int x) -{ if (psf->headindex < SIGNED_SIZEOF (psf->header) - 2) - { psf->header [psf->headindex++] = x ; - psf->header [psf->headindex++] = (x >> 8) ; - } ; -} /* header_put_le_short */ - -static inline void -header_put_be_3byte (SF_PRIVATE *psf, int x) -{ if (psf->headindex < SIGNED_SIZEOF (psf->header) - 3) - { psf->header [psf->headindex++] = (x >> 16) ; - psf->header [psf->headindex++] = (x >> 8) ; - psf->header [psf->headindex++] = x ; - } ; -} /* header_put_be_3byte */ - -static inline void -header_put_le_3byte (SF_PRIVATE *psf, int x) -{ if (psf->headindex < SIGNED_SIZEOF (psf->header) - 3) - { psf->header [psf->headindex++] = x ; - psf->header [psf->headindex++] = (x >> 8) ; - psf->header [psf->headindex++] = (x >> 16) ; - } ; -} /* header_put_le_3byte */ - -static inline void -header_put_be_int (SF_PRIVATE *psf, int x) -{ if (psf->headindex < SIGNED_SIZEOF (psf->header) - 4) - { psf->header [psf->headindex++] = (x >> 24) ; - psf->header [psf->headindex++] = (x >> 16) ; - psf->header [psf->headindex++] = (x >> 8) ; - psf->header [psf->headindex++] = x ; - } ; -} /* header_put_be_int */ - -static inline void -header_put_le_int (SF_PRIVATE *psf, int x) -{ if (psf->headindex < SIGNED_SIZEOF (psf->header) - 4) - { psf->header [psf->headindex++] = x ; - psf->header [psf->headindex++] = (x >> 8) ; - psf->header [psf->headindex++] = (x >> 16) ; - psf->header [psf->headindex++] = (x >> 24) ; - } ; -} /* header_put_le_int */ - -#if (SIZEOF_SF_COUNT_T == 4) - -static inline void -header_put_be_8byte (SF_PRIVATE *psf, sf_count_t x) -{ if (psf->headindex < SIGNED_SIZEOF (psf->header) - 8) - { psf->header [psf->headindex++] = 0 ; - psf->header [psf->headindex++] = 0 ; - psf->header [psf->headindex++] = 0 ; - psf->header [psf->headindex++] = 0 ; - psf->header [psf->headindex++] = (x >> 24) ; - psf->header [psf->headindex++] = (x >> 16) ; - psf->header [psf->headindex++] = (x >> 8) ; - psf->header [psf->headindex++] = x ; - } ; -} /* header_put_be_8byte */ - -static inline void -header_put_le_8byte (SF_PRIVATE *psf, sf_count_t x) -{ if (psf->headindex < SIGNED_SIZEOF (psf->header) - 8) - { psf->header [psf->headindex++] = x ; - psf->header [psf->headindex++] = (x >> 8) ; - psf->header [psf->headindex++] = (x >> 16) ; - psf->header [psf->headindex++] = (x >> 24) ; - psf->header [psf->headindex++] = 0 ; - psf->header [psf->headindex++] = 0 ; - psf->header [psf->headindex++] = 0 ; - psf->header [psf->headindex++] = 0 ; - } ; -} /* header_put_le_8byte */ - -#elif (SIZEOF_SF_COUNT_T == 8) - -static inline void -header_put_be_8byte (SF_PRIVATE *psf, sf_count_t x) -{ if (psf->headindex < SIGNED_SIZEOF (psf->header) - 8) - { psf->header [psf->headindex++] = (x >> 56) ; - psf->header [psf->headindex++] = (x >> 48) ; - psf->header [psf->headindex++] = (x >> 40) ; - psf->header [psf->headindex++] = (x >> 32) ; - psf->header [psf->headindex++] = (x >> 24) ; - psf->header [psf->headindex++] = (x >> 16) ; - psf->header [psf->headindex++] = (x >> 8) ; - psf->header [psf->headindex++] = x ; - } ; -} /* header_put_be_8byte */ - -static inline void -header_put_le_8byte (SF_PRIVATE *psf, sf_count_t x) -{ if (psf->headindex < SIGNED_SIZEOF (psf->header) - 8) - { psf->header [psf->headindex++] = x ; - psf->header [psf->headindex++] = (x >> 8) ; - psf->header [psf->headindex++] = (x >> 16) ; - psf->header [psf->headindex++] = (x >> 24) ; - psf->header [psf->headindex++] = (x >> 32) ; - psf->header [psf->headindex++] = (x >> 40) ; - psf->header [psf->headindex++] = (x >> 48) ; - psf->header [psf->headindex++] = (x >> 56) ; - } ; -} /* header_put_le_8byte */ - -#else -#error "SIZEOF_SF_COUNT_T is not defined." -#endif - -int -psf_binheader_writef (SF_PRIVATE *psf, const char *format, ...) -{ va_list argptr ; - sf_count_t countdata ; - unsigned long longdata ; - unsigned int data ; - float floatdata ; - double doubledata ; - void *bindata ; - size_t size ; - char c, *strptr ; - int count = 0, trunc_8to4 ; - - trunc_8to4 = SF_FALSE ; - - va_start (argptr, format) ; - - while ((c = *format++)) - { switch (c) - { case ' ' : /* Do nothing. Just used to space out format string. */ - break ; - - case 'e' : /* All conversions are now from LE to host. */ - psf->rwf_endian = SF_ENDIAN_LITTLE ; - break ; - - case 'E' : /* All conversions are now from BE to host. */ - psf->rwf_endian = SF_ENDIAN_BIG ; - break ; - - case 't' : /* All 8 byte values now get written as 4 bytes. */ - trunc_8to4 = SF_TRUE ; - break ; - - case 'T' : /* All 8 byte values now get written as 8 bytes. */ - trunc_8to4 = SF_FALSE ; - break ; - - case 'm' : - data = va_arg (argptr, unsigned int) ; - header_put_marker (psf, data) ; - count += 4 ; - break ; - - case '1' : - data = va_arg (argptr, unsigned int) ; - header_put_byte (psf, data) ; - count += 1 ; - break ; - - case '2' : - data = va_arg (argptr, unsigned int) ; - if (psf->rwf_endian == SF_ENDIAN_BIG) - { header_put_be_short (psf, data) ; - } - else - { header_put_le_short (psf, data) ; - } ; - count += 2 ; - break ; - - case '3' : /* tribyte */ - data = va_arg (argptr, unsigned int) ; - if (psf->rwf_endian == SF_ENDIAN_BIG) - { header_put_be_3byte (psf, data) ; - } - else - { header_put_le_3byte (psf, data) ; - } ; - count += 3 ; - break ; - - case '4' : - data = va_arg (argptr, unsigned int) ; - if (psf->rwf_endian == SF_ENDIAN_BIG) - { header_put_be_int (psf, data) ; - } - else - { header_put_le_int (psf, data) ; - } ; - count += 4 ; - break ; - - case '8' : - countdata = va_arg (argptr, sf_count_t) ; - if (psf->rwf_endian == SF_ENDIAN_BIG && trunc_8to4 == SF_FALSE) - { header_put_be_8byte (psf, countdata) ; - count += 8 ; - } - else if (psf->rwf_endian == SF_ENDIAN_LITTLE && trunc_8to4 == SF_FALSE) - { header_put_le_8byte (psf, countdata) ; - count += 8 ; - } - else if (psf->rwf_endian == SF_ENDIAN_BIG && trunc_8to4 == SF_TRUE) - { longdata = countdata & 0xFFFFFFFF ; - header_put_be_int (psf, longdata) ; - count += 4 ; - } - else if (psf->rwf_endian == SF_ENDIAN_LITTLE && trunc_8to4 == SF_TRUE) - { longdata = countdata & 0xFFFFFFFF ; - header_put_le_int (psf, longdata) ; - count += 4 ; - } - break ; - - case 'f' : - /* Floats are passed as doubles. Is this always true? */ - floatdata = (float) va_arg (argptr, double) ; - if (psf->rwf_endian == SF_ENDIAN_BIG) - float32_be_write (floatdata, psf->header + psf->headindex) ; - else - float32_le_write (floatdata, psf->header + psf->headindex) ; - psf->headindex += 4 ; - count += 4 ; - break ; - - case 'd' : - doubledata = va_arg (argptr, double) ; - if (psf->rwf_endian == SF_ENDIAN_BIG) - double64_be_write (doubledata, psf->header + psf->headindex) ; - else - double64_le_write (doubledata, psf->header + psf->headindex) ; - psf->headindex += 8 ; - count += 8 ; - break ; - - case 's' : - /* Write a C string (guaranteed to have a zero terminator). */ - strptr = va_arg (argptr, char *) ; - size = strlen (strptr) + 1 ; - size += (size & 1) ; - if (psf->rwf_endian == SF_ENDIAN_BIG) - header_put_be_int (psf, size) ; - else - header_put_le_int (psf, size) ; - memcpy (&(psf->header [psf->headindex]), strptr, size) ; - psf->headindex += size ; - psf->header [psf->headindex - 1] = 0 ; - count += 4 + size ; - break ; - - case 'S' : - /* - ** Write an AIFF style string (no zero terminator but possibly - ** an extra pad byte if the string length is odd). - */ - strptr = va_arg (argptr, char *) ; - size = strlen (strptr) ; - if (psf->rwf_endian == SF_ENDIAN_BIG) - header_put_be_int (psf, size) ; - else - header_put_le_int (psf, size) ; - memcpy (&(psf->header [psf->headindex]), strptr, size + 1) ; - size += (size & 1) ; - psf->headindex += size ; - psf->header [psf->headindex] = 0 ; - count += 4 + size ; - break ; - - case 'b' : - bindata = va_arg (argptr, void *) ; - size = va_arg (argptr, size_t) ; - memcpy (&(psf->header [psf->headindex]), bindata, size) ; - psf->headindex += size ; - count += size ; - break ; - - case 'z' : - size = va_arg (argptr, size_t) ; - count += size ; - while (size) - { psf->header [psf->headindex] = 0 ; - psf->headindex ++ ; - size -- ; - } ; - break ; - - case 'h' : - bindata = va_arg (argptr, void *) ; - memcpy (&(psf->header [psf->headindex]), bindata, 16) ; - psf->headindex += 16 ; - count += 16 ; - break ; - - case 'j' : - size = va_arg (argptr, size_t) ; - psf->headindex += size ; - count = size ; - break ; - - default : - psf_log_printf (psf, "*** Invalid format specifier `%c'\n", c) ; - psf->error = SFE_INTERNAL ; - break ; - } ; - } ; - - va_end (argptr) ; - return count ; -} /* psf_binheader_writef */ - -/*----------------------------------------------------------------------------------------------- -** Binary header reading functions. Returns number of bytes read. -** -** Format specifiers are the same as for header write function above with the following -** additions: -** -** p - jump a given number of position from start of file. -** -** If format is NULL, psf_binheader_readf returns the current offset. -*/ - -#if (CPU_IS_BIG_ENDIAN == 1) -#define GET_MARKER(ptr) ( ((ptr) [0] << 24) | ((ptr) [1] << 16) | \ - ((ptr) [2] << 8) | ((ptr) [3])) - -#elif (CPU_IS_LITTLE_ENDIAN == 1) -#define GET_MARKER(ptr) ( ((ptr) [0]) | ((ptr) [1] << 8) | \ - ((ptr) [2] << 16) | ((ptr) [3] << 24)) - -#else -# error "Cannot determine endian-ness of processor." -#endif - -#define GET_LE_SHORT(ptr) (((ptr) [1] << 8) | ((ptr) [0])) -#define GET_BE_SHORT(ptr) (((ptr) [0] << 8) | ((ptr) [1])) - -#define GET_LE_3BYTE(ptr) ( ((ptr) [2] << 16) | ((ptr) [1] << 8) | ((ptr) [0])) -#define GET_BE_3BYTE(ptr) ( ((ptr) [0] << 16) | ((ptr) [1] << 8) | ((ptr) [2])) - -#define GET_LE_INT(ptr) ( ((ptr) [3] << 24) | ((ptr) [2] << 16) | \ - ((ptr) [1] << 8) | ((ptr) [0])) - -#define GET_BE_INT(ptr) ( ((ptr) [0] << 24) | ((ptr) [1] << 16) | \ - ((ptr) [2] << 8) | ((ptr) [3])) - -#define GET_LE_8BYTE(ptr) ( (((sf_count_t) (ptr) [7]) << 56) | (((sf_count_t) (ptr) [6]) << 48) | \ - (((sf_count_t) (ptr) [5]) << 40) | (((sf_count_t) (ptr) [4]) << 32) | \ - (((sf_count_t) (ptr) [3]) << 24) | (((sf_count_t) (ptr) [2]) << 16) | \ - (((sf_count_t) (ptr) [1]) << 8) | ((ptr) [0])) - -#define GET_BE_8BYTE(ptr) ( (((sf_count_t) (ptr) [0]) << 56) | (((sf_count_t) (ptr) [1]) << 48) | \ - (((sf_count_t) (ptr) [2]) << 40) | (((sf_count_t) (ptr) [3]) << 32) | \ - (((sf_count_t) (ptr) [4]) << 24) | (((sf_count_t) (ptr) [5]) << 16) | \ - (((sf_count_t) (ptr) [6]) << 8) | ((ptr) [7])) - - - -static int -header_read (SF_PRIVATE *psf, void *ptr, int bytes) -{ int count = 0 ; - - if (psf->headindex >= SIGNED_SIZEOF (psf->header)) - { memset (ptr, 0, SIGNED_SIZEOF (psf->header) - psf->headindex) ; - - /* This is the best that we can do. */ - psf_fseek (psf, bytes, SEEK_CUR) ; - return bytes ; - } ; - - if (psf->headindex + bytes > SIGNED_SIZEOF (psf->header)) - { int most ; - - most = SIGNED_SIZEOF (psf->header) - psf->headindex ; - psf_fread (psf->header + psf->headend, 1, most, psf) ; - memset ((char *) ptr + most, 0, bytes - most) ; - - psf_fseek (psf, bytes - most, SEEK_CUR) ; - return bytes ; - } ; - - if (psf->headindex + bytes > psf->headend) - { count = psf_fread (psf->header + psf->headend, 1, bytes - (psf->headend - psf->headindex), psf) ; - if (count != bytes - (int) (psf->headend - psf->headindex)) - { psf_log_printf (psf, "Error : psf_fread returned short count.\n") ; - return 0 ; - } ; - psf->headend += count ; - } ; - - memcpy (ptr, psf->header + psf->headindex, bytes) ; - psf->headindex += bytes ; - - return bytes ; -} /* header_read */ - -static void -header_seek (SF_PRIVATE *psf, sf_count_t position, int whence) -{ - - switch (whence) - { case SEEK_SET : - if (position > SIGNED_SIZEOF (psf->header)) - { /* Too much header to cache so just seek instead. */ - psf_fseek (psf, position, whence) ; - return ; - } ; - if (position > psf->headend) - psf->headend += psf_fread (psf->header + psf->headend, 1, position - psf->headend, psf) ; - psf->headindex = position ; - break ; - - case SEEK_CUR : - if (psf->headindex + position < 0) - break ; - - if (psf->headindex >= SIGNED_SIZEOF (psf->header)) - { psf_fseek (psf, position, whence) ; - return ; - } ; - - if (psf->headindex + position <= psf->headend) - { psf->headindex += position ; - break ; - } ; - - if (psf->headindex + position > SIGNED_SIZEOF (psf->header)) - { /* Need to jump this without caching it. */ - psf->headindex = psf->headend ; - psf_fseek (psf, position, SEEK_CUR) ; - break ; - } ; - - psf->headend += psf_fread (psf->header + psf->headend, 1, position - (psf->headend - psf->headindex), psf) ; - psf->headindex = psf->headend ; - break ; - - case SEEK_END : - default : - psf_log_printf (psf, "Bad whence param in header_seek().\n") ; - break ; - } ; - - return ; -} /* header_seek */ - -static int -header_gets (SF_PRIVATE *psf, char *ptr, int bufsize) -{ - int k ; - - for (k = 0 ; k < bufsize - 1 ; k++) - { if (psf->headindex < psf->headend) - { ptr [k] = psf->header [psf->headindex] ; - psf->headindex ++ ; - } - else - { psf->headend += psf_fread (psf->header + psf->headend, 1, 1, psf) ; - ptr [k] = psf->header [psf->headindex] ; - psf->headindex = psf->headend ; - } ; - - if (ptr [k] == '\n') - break ; - } ; - - ptr [k] = 0 ; - - return k ; -} /* header_gets */ - -int -psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...) -{ va_list argptr ; - sf_count_t *countptr, countdata ; - unsigned char *ucptr, sixteen_bytes [16] ; - unsigned int *intptr, intdata ; - unsigned short *shortptr ; - char *charptr ; - float *floatptr ; - double *doubleptr ; - char c ; - int byte_count = 0, count ; - - if (! format) - return psf_ftell (psf) ; - - va_start (argptr, format) ; - - while ((c = *format++)) - { switch (c) - { case 'e' : /* All conversions are now from LE to host. */ - psf->rwf_endian = SF_ENDIAN_LITTLE ; - break ; - - case 'E' : /* All conversions are now from BE to host. */ - psf->rwf_endian = SF_ENDIAN_BIG ; - break ; - - case 'm' : - intptr = va_arg (argptr, unsigned int*) ; - ucptr = (unsigned char*) intptr ; - byte_count += header_read (psf, ucptr, sizeof (int)) ; - *intptr = GET_MARKER (ucptr) ; - break ; - - case 'h' : - intptr = va_arg (argptr, unsigned int*) ; - ucptr = (unsigned char*) intptr ; - byte_count += header_read (psf, sixteen_bytes, sizeof (sixteen_bytes)) ; - { int k ; - intdata = 0 ; - for (k = 0 ; k < 16 ; k++) - intdata ^= sixteen_bytes [k] << k ; - } - *intptr = intdata ; - break ; - - case '1' : - charptr = va_arg (argptr, char*) ; - *charptr = 0 ; - byte_count += header_read (psf, charptr, sizeof (char)) ; - break ; - - case '2' : - shortptr = va_arg (argptr, unsigned short*) ; - *shortptr = 0 ; - ucptr = (unsigned char*) shortptr ; - byte_count += header_read (psf, ucptr, sizeof (short)) ; - if (psf->rwf_endian == SF_ENDIAN_BIG) - *shortptr = GET_BE_SHORT (ucptr) ; - else - *shortptr = GET_LE_SHORT (ucptr) ; - break ; - - case '3' : - intptr = va_arg (argptr, unsigned int*) ; - *intptr = 0 ; - byte_count += header_read (psf, sixteen_bytes, 3) ; - if (psf->rwf_endian == SF_ENDIAN_BIG) - *intptr = GET_BE_3BYTE (sixteen_bytes) ; - else - *intptr = GET_LE_3BYTE (sixteen_bytes) ; - break ; - - case '4' : - intptr = va_arg (argptr, unsigned int*) ; - *intptr = 0 ; - ucptr = (unsigned char*) intptr ; - byte_count += header_read (psf, ucptr, sizeof (int)) ; - if (psf->rwf_endian == SF_ENDIAN_BIG) - *intptr = GET_BE_INT (ucptr) ; - else - *intptr = GET_LE_INT (ucptr) ; - break ; - - case '8' : - countptr = va_arg (argptr, sf_count_t *) ; - *countptr = 0 ; - byte_count += header_read (psf, sixteen_bytes, 8) ; - if (psf->rwf_endian == SF_ENDIAN_BIG) - countdata = GET_BE_8BYTE (sixteen_bytes) ; - else - countdata = GET_LE_8BYTE (sixteen_bytes) ; - *countptr = countdata ; - break ; - - case 'f' : /* Float conversion */ - floatptr = va_arg (argptr, float *) ; - *floatptr = 0.0 ; - byte_count += header_read (psf, floatptr, sizeof (float)) ; - if (psf->rwf_endian == SF_ENDIAN_BIG) - *floatptr = float32_be_read ((unsigned char*) floatptr) ; - else - *floatptr = float32_le_read ((unsigned char*) floatptr) ; - break ; - - case 'd' : /* double conversion */ - doubleptr = va_arg (argptr, double *) ; - *doubleptr = 0.0 ; - byte_count += header_read (psf, doubleptr, sizeof (double)) ; - if (psf->rwf_endian == SF_ENDIAN_BIG) - *doubleptr = double64_be_read ((unsigned char*) doubleptr) ; - else - *doubleptr = double64_le_read ((unsigned char*) doubleptr) ; - break ; - - case 's' : - psf_log_printf (psf, "Format conversion 's' not implemented yet.\n") ; - /* - strptr = va_arg (argptr, char *) ; - size = strlen (strptr) + 1 ; - size += (size & 1) ; - longdata = H2LE_32 (size) ; - get_int (psf, longdata) ; - memcpy (&(psf->header [psf->headindex]), strptr, size) ; - psf->headindex += size ; - */ - break ; - - case 'b' : - charptr = va_arg (argptr, char*) ; - count = va_arg (argptr, size_t) ; - if (count > 0) - byte_count += header_read (psf, charptr, count) ; - break ; - - case 'G' : - charptr = va_arg (argptr, char*) ; - count = va_arg (argptr, size_t) ; - if (count > 0) - byte_count += header_gets (psf, charptr, count) ; - break ; - - case 'z' : - psf_log_printf (psf, "Format conversion 'z' not implemented yet.\n") ; - /* - size = va_arg (argptr, size_t) ; - while (size) - { psf->header [psf->headindex] = 0 ; - psf->headindex ++ ; - size -- ; - } ; - */ - break ; - - case 'p' : - /* Get the seek position first. */ - count = va_arg (argptr, size_t) ; - header_seek (psf, count, SEEK_SET) ; - byte_count = count ; - break ; - - case 'j' : - /* Get the seek position first. */ - count = va_arg (argptr, size_t) ; - header_seek (psf, count, SEEK_CUR) ; - byte_count += count ; - break ; - - default : - psf_log_printf (psf, "*** Invalid format specifier `%c'\n", c) ; - psf->error = SFE_INTERNAL ; - break ; - } ; - } ; - - va_end (argptr) ; - - return byte_count ; -} /* psf_binheader_readf */ - -/*----------------------------------------------------------------------------------------------- -*/ - -sf_count_t -psf_default_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t samples_from_start) -{ sf_count_t position, retval ; - - if (! (psf->blockwidth && psf->dataoffset >= 0)) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - if (! psf->sf.seekable) - { psf->error = SFE_NOT_SEEKABLE ; - return PSF_SEEK_ERROR ; - } ; - - position = psf->dataoffset + psf->blockwidth * samples_from_start ; - - if ((retval = psf_fseek (psf, position, SEEK_SET)) != position) - { psf->error = SFE_SEEK_FAILED ; - return PSF_SEEK_ERROR ; - } ; - - return samples_from_start ; -} /* psf_default_seek */ - -/*----------------------------------------------------------------------------------------------- -*/ - -void -psf_hexdump (const void *ptr, int len) -{ const char *data ; - char ascii [17] ; - int k, m ; - - if ((data = ptr) == NULL) - return ; - if (len <= 0) - return ; - - puts ("") ; - for (k = 0 ; k < len ; k += 16) - { memset (ascii, ' ', sizeof (ascii)) ; - - printf ("%08X: ", k) ; - for (m = 0 ; m < 16 && k + m < len ; m++) - { printf (m == 8 ? " %02X " : "%02X ", data [k + m] & 0xFF) ; - ascii [m] = psf_isprint (data [k + m]) ? data [k + m] : '.' ; - } ; - - if (m <= 8) printf (" ") ; - for ( ; m < 16 ; m++) printf (" ") ; - - ascii [16] = 0 ; - printf (" %s\n", ascii) ; - } ; - - puts ("") ; -} /* psf_hexdump */ - -void -psf_log_SF_INFO (SF_PRIVATE *psf) -{ psf_log_printf (psf, "---------------------------------\n") ; - - psf_log_printf (psf, " Sample rate : %d\n", psf->sf.samplerate) ; - if (psf->sf.frames == SF_COUNT_MAX) - psf_log_printf (psf, " Frames : unknown\n") ; - else - psf_log_printf (psf, " Frames : %D\n", psf->sf.frames) ; - psf_log_printf (psf, " Channels : %d\n", psf->sf.channels) ; - - psf_log_printf (psf, " Format : 0x%X\n", psf->sf.format) ; - psf_log_printf (psf, " Sections : %d\n", psf->sf.sections) ; - psf_log_printf (psf, " Seekable : %s\n", psf->sf.seekable ? "TRUE" : "FALSE") ; - - psf_log_printf (psf, "---------------------------------\n") ; -} /* psf_dump_SFINFO */ - -/*======================================================================================== -*/ - -void* -psf_memset (void *s, int c, sf_count_t len) -{ char *ptr ; - int setcount ; - - ptr = (char *) s ; - - while (len > 0) - { setcount = (len > 0x10000000) ? 0x10000000 : (int) len ; - - memset (ptr, c, setcount) ; - - ptr += setcount ; - len -= setcount ; - } ; - - return s ; -} /* psf_memset */ - -SF_INSTRUMENT * -psf_instrument_alloc (void) -{ SF_INSTRUMENT *instr ; - - instr = calloc (1, sizeof (SF_INSTRUMENT)) ; - - if (instr == NULL) - return NULL ; - - /* Set non-zero default values. */ - instr->basenote = -1 ; - instr->velocity_lo = -1 ; - instr->velocity_hi = -1 ; - instr->key_lo = -1 ; - instr->key_hi = -1 ; - - return instr ; -} /* psf_instrument_alloc */ - -void -psf_sanitize_string (char * cptr, int len) -{ - do - { - len -- ; - cptr [len] = psf_isprint (cptr [len]) ? cptr [len] : '.' ; - } - while (len > 0) ; -} /* psf_sanitize_string */ - -void -psf_get_date_str (char *str, int maxlen) -{ time_t current ; - struct tm timedata, *tmptr ; - - time (¤t) ; - -#if defined (HAVE_GMTIME_R) - /* If the re-entrant version is available, use it. */ - tmptr = gmtime_r (¤t, &timedata) ; -#elif defined (HAVE_GMTIME) - /* Otherwise use the standard one and copy the data to local storage. */ - tmptr = gmtime (¤t) ; - memcpy (&timedata, tmptr, sizeof (timedata)) ; -#else - tmptr = NULL ; -#endif - - if (tmptr) - snprintf (str, maxlen, "%4d-%02d-%02d %02d:%02d:%02d UTC", - 1900 + timedata.tm_year, timedata.tm_mon, timedata.tm_mday, - timedata.tm_hour, timedata.tm_min, timedata.tm_sec) ; - else - snprintf (str, maxlen, "Unknown date") ; - - return ; -} /* psf_get_date_str */ - -int -subformat_to_bytewidth (int format) -{ - switch (format) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_S8 : - return 1 ; - case SF_FORMAT_PCM_16 : - return 2 ; - case SF_FORMAT_PCM_24 : - return 3 ; - case SF_FORMAT_PCM_32 : - case SF_FORMAT_FLOAT : - return 4 ; - case SF_FORMAT_DOUBLE : - return 8 ; - } ; - - return 0 ; -} /* subformat_to_bytewidth */ - -int -s_bitwidth_to_subformat (int bits) -{ static int array [] = - { SF_FORMAT_PCM_S8, SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32 - } ; - - if (bits < 8 || bits > 32) - return 0 ; - - return array [((bits + 7) / 8) - 1] ; -} /* bitwidth_to_subformat */ - -int -u_bitwidth_to_subformat (int bits) -{ static int array [] = - { SF_FORMAT_PCM_U8, SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32 - } ; - - if (bits < 8 || bits > 32) - return 0 ; - - return array [((bits + 7) / 8) - 1] ; -} /* bitwidth_to_subformat */ - -/* -** psf_rand_int32 : Not crypto quality, but more than adequate for things -** like stream serial numbers in Ogg files or the unique_id field of the -** SF_PRIVATE struct. -*/ - -int32_t -psf_rand_int32 (void) -{ static int32_t value = -1 ; - int k, count ; - - if (value == -1) - { -#if HAVE_GETTIMEOFDAY - struct timeval tv ; - gettimeofday (&tv, NULL) ; - value = tv.tv_sec + tv.tv_usec ; -#else - value = time (NULL) ; -#endif - } ; - - count = 4 + (value & 7) ; - for (k = 0 ; k < count ; k++) - value = 11117 * value + 211231 ; - - return value ; -} /* psf_rand_int32 */ - -void -append_snprintf (char * dest, size_t maxlen, const char * fmt, ...) -{ size_t len = strlen (dest) ; - - if (len < maxlen) - { va_list ap ; - - va_start (ap, fmt) ; - vsnprintf (dest + len, maxlen - len, fmt, ap) ; - va_end (ap) ; - } ; - - return ; -} /* append_snprintf */ - - -void -psf_strlcpy_crlf (char *dest, const char *src, size_t destmax, size_t srcmax) -{ /* Must be minus 2 so it can still expand a single trailing '\n' or '\r'. */ - char * destend = dest + destmax - 2 ; - const char * srcend = src + srcmax ; - - while (dest < destend && src < srcend) - { if ((src [0] == '\r' && src [1] == '\n') || (src [0] == '\n' && src [1] == '\r')) - { *dest++ = '\r' ; - *dest++ = '\n' ; - src += 2 ; - continue ; - } ; - - if (src [0] == '\r') - { *dest++ = '\r' ; - *dest++ = '\n' ; - src += 1 ; - continue ; - } ; - - if (src [0] == '\n') - { *dest++ = '\r' ; - *dest++ = '\n' ; - src += 1 ; - continue ; - } ; - - *dest++ = *src++ ; - } ; - - /* Make sure dest is terminated. */ - *dest = 0 ; -} /* psf_strlcpy_crlf */ - -sf_count_t -psf_decode_frame_count (SF_PRIVATE *psf) -{ sf_count_t count, readlen, total = 0 ; - BUF_UNION ubuf ; - - /* If we're reading from a pipe or the file is too long, just return SF_COUNT_MAX. */ - if (psf_is_pipe (psf) || psf->datalength > 0x1000000) - return SF_COUNT_MAX ; - - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - - readlen = ARRAY_LEN (ubuf.ibuf) / psf->sf.channels ; - readlen *= psf->sf.channels ; - - while ((count = psf->read_int (psf, ubuf.ibuf, readlen)) > 0) - total += count ; - - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - - return total / psf->sf.channels ; -} /* psf_decode_frame_count */ - -/*============================================================================== -*/ - -#define CASE_NAME(x) case x : return #x ; break ; - -const char * -str_of_major_format (int format) -{ switch (SF_CONTAINER (format)) - { CASE_NAME (SF_FORMAT_WAV) ; - CASE_NAME (SF_FORMAT_AIFF) ; - CASE_NAME (SF_FORMAT_AU) ; - CASE_NAME (SF_FORMAT_RAW) ; - CASE_NAME (SF_FORMAT_PAF) ; - CASE_NAME (SF_FORMAT_SVX) ; - CASE_NAME (SF_FORMAT_NIST) ; - CASE_NAME (SF_FORMAT_VOC) ; - CASE_NAME (SF_FORMAT_IRCAM) ; - CASE_NAME (SF_FORMAT_W64) ; - CASE_NAME (SF_FORMAT_MAT4) ; - CASE_NAME (SF_FORMAT_MAT5) ; - CASE_NAME (SF_FORMAT_PVF) ; - CASE_NAME (SF_FORMAT_XI) ; - CASE_NAME (SF_FORMAT_HTK) ; - CASE_NAME (SF_FORMAT_SDS) ; - CASE_NAME (SF_FORMAT_AVR) ; - CASE_NAME (SF_FORMAT_WAVEX) ; - CASE_NAME (SF_FORMAT_SD2) ; - CASE_NAME (SF_FORMAT_FLAC) ; - CASE_NAME (SF_FORMAT_CAF) ; - CASE_NAME (SF_FORMAT_WVE) ; - CASE_NAME (SF_FORMAT_OGG) ; - default : - break ; - } ; - - return "BAD_MAJOR_FORMAT" ; -} /* str_of_major_format */ - -const char * -str_of_minor_format (int format) -{ switch (SF_CODEC (format)) - { CASE_NAME (SF_FORMAT_PCM_S8) ; - CASE_NAME (SF_FORMAT_PCM_16) ; - CASE_NAME (SF_FORMAT_PCM_24) ; - CASE_NAME (SF_FORMAT_PCM_32) ; - CASE_NAME (SF_FORMAT_PCM_U8) ; - CASE_NAME (SF_FORMAT_FLOAT) ; - CASE_NAME (SF_FORMAT_DOUBLE) ; - CASE_NAME (SF_FORMAT_ULAW) ; - CASE_NAME (SF_FORMAT_ALAW) ; - CASE_NAME (SF_FORMAT_IMA_ADPCM) ; - CASE_NAME (SF_FORMAT_MS_ADPCM) ; - CASE_NAME (SF_FORMAT_GSM610) ; - CASE_NAME (SF_FORMAT_VOX_ADPCM) ; - CASE_NAME (SF_FORMAT_G721_32) ; - CASE_NAME (SF_FORMAT_G723_24) ; - CASE_NAME (SF_FORMAT_G723_40) ; - CASE_NAME (SF_FORMAT_DWVW_12) ; - CASE_NAME (SF_FORMAT_DWVW_16) ; - CASE_NAME (SF_FORMAT_DWVW_24) ; - CASE_NAME (SF_FORMAT_DWVW_N) ; - CASE_NAME (SF_FORMAT_DPCM_8) ; - CASE_NAME (SF_FORMAT_DPCM_16) ; - CASE_NAME (SF_FORMAT_VORBIS) ; - default : - break ; - } ; - - return "BAD_MINOR_FORMAT" ; -} /* str_of_minor_format */ - -const char * -str_of_open_mode (int mode) -{ switch (mode) - { CASE_NAME (SFM_READ) ; - CASE_NAME (SFM_WRITE) ; - CASE_NAME (SFM_RDWR) ; - - default : - break ; - } ; - - return "BAD_MODE" ; -} /* str_of_open_mode */ - -const char * -str_of_endianness (int end) -{ switch (end) - { CASE_NAME (SF_ENDIAN_BIG) ; - CASE_NAME (SF_ENDIAN_LITTLE) ; - CASE_NAME (SF_ENDIAN_CPU) ; - default : - break ; - } ; - - /* Zero length string for SF_ENDIAN_FILE. */ - return "" ; -} /* str_of_endianness */ - -/*============================================================================== -*/ - -void -psf_f2s_array (const float *src, short *dest, int count, int normalize) -{ float normfact ; - - normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; - while (--count >= 0) - dest [count] = lrintf (src [count] * normfact) ; - - return ; -} /* psf_f2s_array */ - -void -psf_f2s_clip_array (const float *src, short *dest, int count, int normalize) -{ float normfact, scaled_value ; - - normfact = normalize ? (1.0 * 0x8000) : 1.0 ; - - while (--count >= 0) - { scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF)) - { dest [count] = 0x7FFF ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000)) - { dest [count] = 0x8000 ; - continue ; - } ; - - dest [count] = lrintf (scaled_value) ; - } ; - - return ; -} /* psf_f2s_clip_array */ - -void -psf_d2s_array (const double *src, short *dest, int count, int normalize) -{ double normfact ; - - normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; - while (--count >= 0) - dest [count] = lrint (src [count] * normfact) ; - - return ; -} /* psf_f2s_array */ - -void -psf_d2s_clip_array (const double *src, short *dest, int count, int normalize) -{ double normfact, scaled_value ; - - normfact = normalize ? (1.0 * 0x8000) : 1.0 ; - - while (--count >= 0) - { scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF)) - { dest [count] = 0x7FFF ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000)) - { dest [count] = 0x8000 ; - continue ; - } ; - - dest [count] = lrint (scaled_value) ; - } ; - - return ; -} /* psf_d2s_clip_array */ - - -void -psf_f2i_array (const float *src, int *dest, int count, int normalize) -{ float normfact ; - - normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ; - while (--count >= 0) - dest [count] = lrintf (src [count] * normfact) ; - - return ; -} /* psf_f2i_array */ - -void -psf_f2i_clip_array (const float *src, int *dest, int count, int normalize) -{ float normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x10000000) : 1.0 ; - - while (--count >= 0) - { scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { dest [count] = 0x7FFFFFFF ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { dest [count] = 0x80000000 ; - continue ; - } ; - - dest [count] = lrintf (scaled_value) ; - } ; - - return ; -} /* psf_f2i_clip_array */ - -void -psf_d2i_array (const double *src, int *dest, int count, int normalize) -{ double normfact ; - - normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ; - while (--count >= 0) - dest [count] = lrint (src [count] * normfact) ; - - return ; -} /* psf_f2i_array */ - -void -psf_d2i_clip_array (const double *src, int *dest, int count, int normalize) -{ double normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x10000000) : 1.0 ; - - while (--count >= 0) - { scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { dest [count] = 0x7FFFFFFF ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { dest [count] = 0x80000000 ; - continue ; - } ; - - dest [count] = lrint (scaled_value) ; - } ; - - return ; -} /* psf_d2i_clip_array */ - -FILE * -psf_open_tmpfile (char * fname, size_t fnamelen) -{ const char * tmpdir ; - FILE * file ; - - if (OS_IS_WIN32) - tmpdir = getenv ("TEMP") ; - else - { tmpdir = getenv ("TMPDIR") ; - tmpdir = tmpdir == NULL ? "/tmp" : tmpdir ; - } ; - -// if (tmpdir && access (tmpdir, R_OK | W_OK | X_OK) == 0) - { snprintf (fname, fnamelen, "%s/%x%x-alac.tmp", tmpdir, psf_rand_int32 (), psf_rand_int32 ()) ; - if ((file = fopen (fname, "wb+")) != NULL) - return file ; - } ; - - snprintf (fname, fnamelen, "%x%x-alac.tmp", psf_rand_int32 (), psf_rand_int32 ()) ; - if ((file = fopen (fname, "wb+")) != NULL) - return file ; - - memset (fname, 0, fnamelen) ; - return NULL ; -} /* psf_open_tmpfile */ diff --git a/libs/libsndfile/src/common.h b/libs/libsndfile/src/common.h deleted file mode 100644 index 4d61619804..0000000000 --- a/libs/libsndfile/src/common.h +++ /dev/null @@ -1,1044 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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 SNDFILE_COMMON_H -#define SNDFILE_COMMON_H - -#include "sfconfig.h" - -#include -#include - -#if HAVE_STDINT_H -#include -#elif HAVE_INTTYPES_H -#include -#endif - -#ifndef SNDFILE_H -#include "sndfile.h" -#endif - -#ifdef __cplusplus -#error "This code is not designed to be compiled with a C++ compiler." -#endif - -#if (SIZEOF_LONG == 8) -# define SF_PLATFORM_S64(x) x##l -#elif (SIZEOF_LONG_LONG == 8) -# define SF_PLATFORM_S64(x) x##ll -#elif COMPILER_IS_GCC -# define SF_PLATFORM_S64(x) x##ll -#elif OS_IS_WIN32 -# define SF_PLATFORM_S64(x) x##I64 -#else -# error "Don't know how to define a 64 bit integer constant." -#endif - - - -/* -** Inspiration : http://sourcefrog.net/weblog/software/languages/C/unused.html -*/ -#ifdef UNUSED -#elif defined (__GNUC__) -# define UNUSED(x) UNUSED_ ## x __attribute__ ((unused)) -#elif defined (__LCLINT__) -# define UNUSED(x) /*@unused@*/ x -#else -# define UNUSED(x) x -#endif - -#ifdef __GNUC__ -# define WARN_UNUSED __attribute__ ((warn_unused_result)) -#else -# define WARN_UNUSED -#endif - -#define SF_BUFFER_LEN (8192) -#define SF_FILENAME_LEN (512) -#define SF_SYSERR_LEN (256) -#define SF_MAX_STRINGS (32) -#define SF_HEADER_LEN (12292) -#define SF_PARSELOG_LEN (2048) - -#define PSF_SEEK_ERROR ((sf_count_t) -1) - -#define BITWIDTH2BYTES(x) (((x) + 7) / 8) - -/* For some reason sizeof returns an unsigned value which causes -** a warning when that value is added or subtracted from a signed -** value. Use SIGNED_SIZEOF instead. -*/ -#define SIGNED_SIZEOF(x) ((int) sizeof (x)) - -#define ARRAY_LEN(x) ((int) (sizeof (x) / sizeof ((x) [0]))) - -#define NOT(x) (! (x)) - -#if (COMPILER_IS_GCC == 1) -#define SF_MAX(x, y) ({ \ - typeof (x) sf_max_x1 = (x) ; \ - typeof (y) sf_max_y1 = (y) ; \ - (void) (&sf_max_x1 == &sf_max_y1) ; \ - sf_max_x1 > sf_max_y1 ? sf_max_x1 : sf_max_y1 ; }) - -#define SF_MIN(x, y) ({ \ - typeof (x) sf_min_x2 = (x) ; \ - typeof (y) sf_min_y2 = (y) ; \ - (void) (&sf_min_x2 == &sf_min_y2) ; \ - sf_min_x2 < sf_min_y2 ? sf_min_x2 : sf_min_y2 ; }) -#else -#define SF_MAX(a, b) ((a) > (b) ? (a) : (b)) -#define SF_MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif - - -#define COMPILE_TIME_ASSERT(e) (sizeof (struct { int : - !! (e) ; })) - - -#define SF_MAX_CHANNELS 256 - - -/* -* Macros for spliting the format file of SF_INFO into container type, -** codec type and endian-ness. -*/ -#define SF_CONTAINER(x) ((x) & SF_FORMAT_TYPEMASK) -#define SF_CODEC(x) ((x) & SF_FORMAT_SUBMASK) -#define SF_ENDIAN(x) ((x) & SF_FORMAT_ENDMASK) - -enum -{ /* PEAK chunk location. */ - SF_PEAK_START = 42, - SF_PEAK_END = 43, - - /* PEAK chunk location. */ - SF_SCALE_MAX = 52, - SF_SCALE_MIN = 53, - - /* str_flags values. */ - SF_STR_ALLOW_START = 0x0100, - SF_STR_ALLOW_END = 0x0200, - - /* Location of strings. */ - SF_STR_LOCATE_START = 0x0400, - SF_STR_LOCATE_END = 0x0800, - - SFD_TYPEMASK = 0x0FFFFFFF -} ; - -#define SFM_MASK (SFM_READ | SFM_WRITE | SFM_RDWR) -#define SFM_UNMASK (~SFM_MASK) - -/*--------------------------------------------------------------------------------------- -** Formats that may be supported at some time in the future. -** When support is finalised, these values move to src/sndfile.h. -*/ - -enum -{ /* Work in progress. */ - SF_FORMAT_SPEEX = 0x5000000, - SF_FORMAT_OGGFLAC = 0x5000001, - - /* Formats supported read only. */ - SF_FORMAT_TXW = 0x4030000, /* Yamaha TX16 sampler file */ - SF_FORMAT_DWD = 0x4040000, /* DiamondWare Digirized */ - - /* Following are detected but not supported. */ - SF_FORMAT_REX = 0x40A0000, /* Propellorheads Rex/Rcy */ - SF_FORMAT_REX2 = 0x40D0000, /* Propellorheads Rex2 */ - SF_FORMAT_KRZ = 0x40E0000, /* Kurzweil sampler file */ - SF_FORMAT_WMA = 0x4100000, /* Windows Media Audio. */ - SF_FORMAT_SHN = 0x4110000, /* Shorten. */ - - /* Unsupported encodings. */ - SF_FORMAT_SVX_FIB = 0x1020, /* SVX Fibonacci Delta encoding. */ - SF_FORMAT_SVX_EXP = 0x1021, /* SVX Exponential Delta encoding. */ - - SF_FORMAT_PCM_N = 0x1030 -} ; - -/*--------------------------------------------------------------------------------------- -*/ - -typedef struct -{ unsigned kuki_offset ; - unsigned pakt_offset ; - - unsigned bits_per_sample ; - unsigned frames_per_packet ; - - int64_t packets ; - int64_t valid_frames ; - int32_t priming_frames ; - int32_t remainder_frames ; -} ALAC_DECODER_INFO ; - -/*--------------------------------------------------------------------------------------- -** PEAK_CHUNK - This chunk type is common to both AIFF and WAVE files although their -** endian encodings are different. -*/ - -typedef struct -{ double value ; /* signed value of peak */ - sf_count_t position ; /* the sample frame for the peak */ -} PEAK_POS ; - -typedef struct -{ /* libsndfile internal : write a PEAK chunk at the start or end of the file? */ - int peak_loc ; - - /* WAV/AIFF */ - unsigned int version ; /* version of the PEAK chunk */ - unsigned int timestamp ; /* secs since 1/1/1970 */ - - /* CAF */ - unsigned int edit_number ; - - /* the per channel peak info */ - PEAK_POS peaks [] ; -} PEAK_INFO ; - -static inline PEAK_INFO * -peak_info_calloc (int channels) -{ return calloc (1, sizeof (PEAK_INFO) + channels * sizeof (PEAK_POS)) ; -} /* peak_info_calloc */ - -typedef struct -{ int type ; - int flags ; - size_t offset ; -} STR_DATA ; - -typedef struct -{ int64_t hash ; - char id [64] ; - unsigned id_size ; - uint32_t mark32 ; - sf_count_t offset ; - uint32_t len ; -} READ_CHUNK ; - -typedef struct -{ int64_t hash ; - uint32_t mark32 ; - uint32_t len ; - void *data ; -} WRITE_CHUNK ; - -typedef struct -{ uint32_t count ; - uint32_t used ; - READ_CHUNK *chunks ; -} READ_CHUNKS ; -typedef struct -{ uint32_t count ; - uint32_t used ; - WRITE_CHUNK *chunks ; -} WRITE_CHUNKS ; - -struct SF_CHUNK_ITERATOR -{ uint32_t current ; - int64_t hash ; - char id [64] ; - unsigned id_size ; - SNDFILE *sndfile ; -} ; - -static inline size_t -make_size_t (int x) -{ return (size_t) x ; -} /* size_t_of_int */ - -typedef SF_BROADCAST_INFO_VAR (16 * 1024) SF_BROADCAST_INFO_16K ; - -typedef SF_CART_INFO_VAR (16 * 1024) SF_CART_INFO_16K ; - -#if SIZEOF_WCHAR_T == 2 -typedef wchar_t sfwchar_t ; -#else -typedef int16_t sfwchar_t ; -#endif - - -static inline void * -psf_memdup (const void *src, size_t n) -{ void * mem = calloc (1, n & 3 ? n + 4 - (n & 3) : n) ; - return memcpy (mem, src, n) ; -} /* psf_memdup */ - -/* -** This version of isprint specifically ignores any locale info. Its used for -** determining which characters can be printed in things like hexdumps. -*/ -static inline int -psf_isprint (int ch) -{ return (ch >= ' ' && ch <= '~') ; -} /* psf_isprint */ - -/*======================================================================================= -** SF_PRIVATE stuct - a pointer to this struct is passed back to the caller of the -** sf_open_XXXX functions. The caller however has no knowledge of the struct's -** contents. -*/ - -typedef struct -{ - union - { char c [SF_FILENAME_LEN] ; - sfwchar_t wc [SF_FILENAME_LEN] ; - } path ; - - union - { char c [SF_FILENAME_LEN] ; - sfwchar_t wc [SF_FILENAME_LEN] ; - } dir ; - - union - { char c [SF_FILENAME_LEN / 4] ; - sfwchar_t wc [SF_FILENAME_LEN / 4] ; - } name ; - -#if USE_WINDOWS_API - /* - ** These fields can only be used in src/file_io.c. - ** They are basically the same as a windows file HANDLE. - */ - void *handle, *hsaved ; - - int use_wchar ; -#else - /* These fields can only be used in src/file_io.c. */ - int filedes, savedes ; -#endif - - int do_not_close_descriptor ; - int mode ; /* Open mode : SFM_READ, SFM_WRITE or SFM_RDWR. */ -} PSF_FILE ; - - - -typedef union -{ double dbuf [SF_BUFFER_LEN / sizeof (double)] ; -#if (defined (SIZEOF_INT64_T) && (SIZEOF_INT64_T == 8)) - int64_t lbuf [SF_BUFFER_LEN / sizeof (int64_t)] ; -#else - long lbuf [SF_BUFFER_LEN / sizeof (double)] ; -#endif - float fbuf [SF_BUFFER_LEN / sizeof (float)] ; - int ibuf [SF_BUFFER_LEN / sizeof (int)] ; - short sbuf [SF_BUFFER_LEN / sizeof (short)] ; - char cbuf [SF_BUFFER_LEN / sizeof (char)] ; - signed char scbuf [SF_BUFFER_LEN / sizeof (signed char)] ; - unsigned char ucbuf [SF_BUFFER_LEN / sizeof (signed char)] ; -} BUF_UNION ; - - - -typedef struct sf_private_tag -{ - /* Canary in a coal mine. */ - union - { /* Place a double here to encourage double alignment. */ - double d [2] ; - char c [16] ; - } canary ; - - PSF_FILE file, rsrc ; - - char syserr [SF_SYSERR_LEN] ; - - /* parselog and indx should only be changed within the logging functions - ** of common.c - */ - struct - { char buf [SF_PARSELOG_LEN] ; - int indx ; - } parselog ; - - unsigned char header [SF_HEADER_LEN] ; /* Must be unsigned */ - int rwf_endian ; /* Header endian-ness flag. */ - - /* Storage and housekeeping data for adding/reading strings from - ** sound files. - */ - struct - { STR_DATA data [SF_MAX_STRINGS] ; - char *storage ; - size_t storage_len ; - size_t storage_used ; - uint32_t flags ; - } strings ; - - /* Guard value. If this changes the buffers above have overflowed. */ - int Magick ; - - unsigned unique_id ; - - /* Index variables for maintaining parselog and header above. */ - int headindex, headend ; - int has_text ; - - int error ; - - int endian ; /* File endianness : SF_ENDIAN_LITTLE or SF_ENDIAN_BIG. */ - int data_endswap ; /* Need to endswap data? */ - - /* - ** Maximum float value for calculating the multiplier for - ** float/double to short/int conversions. - */ - int float_int_mult ; - float float_max ; - - int scale_int_float ; - - /* Vairables for handling pipes. */ - int is_pipe ; /* True if file is a pipe. */ - sf_count_t pipeoffset ; /* Number of bytes read from a pipe. */ - - /* True if clipping must be performed on float->int conversions. */ - int add_clipping ; - - SF_INFO sf ; - - int have_written ; /* Has a single write been done to the file? */ - PEAK_INFO *peak_info ; - - /* Loop Info */ - SF_LOOP_INFO *loop_info ; - SF_INSTRUMENT *instrument ; - - /* Broadcast (EBU) Info */ - SF_BROADCAST_INFO_16K *broadcast_16k ; - - /* Cart (AES46) Info */ - SF_CART_INFO_16K *cart_16k ; - - /* Channel map data (if present) : an array of ints. */ - int *channel_map ; - - sf_count_t filelength ; /* Overall length of (embedded) file. */ - sf_count_t fileoffset ; /* Offset in number of bytes from beginning of file. */ - - sf_count_t rsrclength ; /* Length of the resource fork (if it exists). */ - - sf_count_t dataoffset ; /* Offset in number of bytes from beginning of file. */ - sf_count_t datalength ; /* Length in bytes of the audio data. */ - sf_count_t dataend ; /* Offset to file tailer. */ - - int blockwidth ; /* Size in bytes of one set of interleaved samples. */ - int bytewidth ; /* Size in bytes of one sample (one channel). */ - - void *dither ; - void *interleave ; - - int last_op ; /* Last operation; either SFM_READ or SFM_WRITE */ - sf_count_t read_current ; - sf_count_t write_current ; - - void *container_data ; /* This is a pointer to dynamically allocated file - ** container format specific data. - */ - - void *codec_data ; /* This is a pointer to dynamically allocated file - ** codec format specific data. - */ - - SF_DITHER_INFO write_dither ; - SF_DITHER_INFO read_dither ; - - int norm_double ; - int norm_float ; - - int auto_header ; - - int ieee_replace ; - - /* A set of file specific function pointers */ - sf_count_t (*read_short) (struct sf_private_tag*, short *ptr, sf_count_t len) ; - sf_count_t (*read_int) (struct sf_private_tag*, int *ptr, sf_count_t len) ; - sf_count_t (*read_float) (struct sf_private_tag*, float *ptr, sf_count_t len) ; - sf_count_t (*read_double) (struct sf_private_tag*, double *ptr, sf_count_t len) ; - - sf_count_t (*write_short) (struct sf_private_tag*, const short *ptr, sf_count_t len) ; - sf_count_t (*write_int) (struct sf_private_tag*, const int *ptr, sf_count_t len) ; - sf_count_t (*write_float) (struct sf_private_tag*, const float *ptr, sf_count_t len) ; - sf_count_t (*write_double) (struct sf_private_tag*, const double *ptr, sf_count_t len) ; - - sf_count_t (*seek) (struct sf_private_tag*, int mode, sf_count_t samples_from_start) ; - int (*write_header) (struct sf_private_tag*, int calc_length) ; - int (*command) (struct sf_private_tag*, int command, void *data, int datasize) ; - int (*byterate) (struct sf_private_tag*) ; - - /* - ** Separate close functions for the codec and the container. - ** The codec close function is always called first. - */ - int (*codec_close) (struct sf_private_tag*) ; - int (*container_close) (struct sf_private_tag*) ; - - char *format_desc ; - - /* Virtual I/O functions. */ - int virtual_io ; - SF_VIRTUAL_IO vio ; - void *vio_user_data ; - - /* Chunk get/set. */ - SF_CHUNK_ITERATOR *iterator ; - - READ_CHUNKS rchunks ; - WRITE_CHUNKS wchunks ; - - int (*set_chunk) (struct sf_private_tag*, const SF_CHUNK_INFO * chunk_info) ; - SF_CHUNK_ITERATOR * (*next_chunk_iterator) (struct sf_private_tag*, SF_CHUNK_ITERATOR * iterator) ; - int (*get_chunk_size) (struct sf_private_tag*, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; - int (*get_chunk_data) (struct sf_private_tag*, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; -} SF_PRIVATE ; - - - -enum -{ SFE_NO_ERROR = SF_ERR_NO_ERROR, - SFE_BAD_OPEN_FORMAT = SF_ERR_UNRECOGNISED_FORMAT, - SFE_SYSTEM = SF_ERR_SYSTEM, - SFE_MALFORMED_FILE = SF_ERR_MALFORMED_FILE, - SFE_UNSUPPORTED_ENCODING = SF_ERR_UNSUPPORTED_ENCODING, - - SFE_ZERO_MAJOR_FORMAT, - SFE_ZERO_MINOR_FORMAT, - SFE_BAD_FILE, - SFE_BAD_FILE_READ, - SFE_OPEN_FAILED, - SFE_BAD_SNDFILE_PTR, - SFE_BAD_SF_INFO_PTR, - SFE_BAD_SF_INCOMPLETE, - SFE_BAD_FILE_PTR, - SFE_BAD_INT_PTR, - SFE_BAD_STAT_SIZE, - SFE_NO_TEMP_DIR, - SFE_MALLOC_FAILED, - SFE_UNIMPLEMENTED, - SFE_BAD_READ_ALIGN, - SFE_BAD_WRITE_ALIGN, - SFE_UNKNOWN_FORMAT, - SFE_NOT_READMODE, - SFE_NOT_WRITEMODE, - SFE_BAD_MODE_RW, - SFE_BAD_SF_INFO, - SFE_BAD_OFFSET, - SFE_NO_EMBED_SUPPORT, - SFE_NO_EMBEDDED_RDWR, - SFE_NO_PIPE_WRITE, - - SFE_INTERNAL, - SFE_BAD_COMMAND_PARAM, - SFE_BAD_ENDIAN, - SFE_CHANNEL_COUNT_ZERO, - SFE_CHANNEL_COUNT, - - SFE_BAD_VIRTUAL_IO, - - SFE_INTERLEAVE_MODE, - SFE_INTERLEAVE_SEEK, - SFE_INTERLEAVE_READ, - - SFE_BAD_SEEK, - SFE_NOT_SEEKABLE, - SFE_AMBIGUOUS_SEEK, - SFE_WRONG_SEEK, - SFE_SEEK_FAILED, - - SFE_BAD_OPEN_MODE, - SFE_OPEN_PIPE_RDWR, - SFE_RDWR_POSITION, - SFE_RDWR_BAD_HEADER, - SFE_CMD_HAS_DATA, - SFE_BAD_BROADCAST_INFO_SIZE, - SFE_BAD_BROADCAST_INFO_TOO_BIG, - SFE_BAD_CART_INFO_SIZE, - SFE_BAD_CART_INFO_TOO_BIG, - - SFE_STR_NO_SUPPORT, - SFE_STR_NOT_WRITE, - SFE_STR_MAX_DATA, - SFE_STR_MAX_COUNT, - SFE_STR_BAD_TYPE, - SFE_STR_NO_ADD_END, - SFE_STR_BAD_STRING, - SFE_STR_WEIRD, - - SFE_WAV_NO_RIFF, - SFE_WAV_NO_WAVE, - SFE_WAV_NO_FMT, - SFE_WAV_BAD_FMT, - SFE_WAV_FMT_SHORT, - SFE_WAV_BAD_FACT, - SFE_WAV_BAD_PEAK, - SFE_WAV_PEAK_B4_FMT, - SFE_WAV_BAD_FORMAT, - SFE_WAV_BAD_BLOCKALIGN, - SFE_WAV_NO_DATA, - SFE_WAV_BAD_LIST, - SFE_WAV_ADPCM_NOT4BIT, - SFE_WAV_ADPCM_CHANNELS, - SFE_WAV_GSM610_FORMAT, - SFE_WAV_UNKNOWN_CHUNK, - SFE_WAV_WVPK_DATA, - - SFE_AIFF_NO_FORM, - SFE_AIFF_AIFF_NO_FORM, - SFE_AIFF_COMM_NO_FORM, - SFE_AIFF_SSND_NO_COMM, - SFE_AIFF_UNKNOWN_CHUNK, - SFE_AIFF_COMM_CHUNK_SIZE, - SFE_AIFF_BAD_COMM_CHUNK, - SFE_AIFF_PEAK_B4_COMM, - SFE_AIFF_BAD_PEAK, - SFE_AIFF_NO_SSND, - SFE_AIFF_NO_DATA, - SFE_AIFF_RW_SSND_NOT_LAST, - - SFE_AU_UNKNOWN_FORMAT, - SFE_AU_NO_DOTSND, - SFE_AU_EMBED_BAD_LEN, - - SFE_RAW_READ_BAD_SPEC, - SFE_RAW_BAD_BITWIDTH, - SFE_RAW_BAD_FORMAT, - - SFE_PAF_NO_MARKER, - SFE_PAF_VERSION, - SFE_PAF_UNKNOWN_FORMAT, - SFE_PAF_SHORT_HEADER, - SFE_PAF_BAD_CHANNELS, - - SFE_SVX_NO_FORM, - SFE_SVX_NO_BODY, - SFE_SVX_NO_DATA, - SFE_SVX_BAD_COMP, - SFE_SVX_BAD_NAME_LENGTH, - - SFE_NIST_BAD_HEADER, - SFE_NIST_CRLF_CONVERISON, - SFE_NIST_BAD_ENCODING, - - SFE_VOC_NO_CREATIVE, - SFE_VOC_BAD_FORMAT, - SFE_VOC_BAD_VERSION, - SFE_VOC_BAD_MARKER, - SFE_VOC_BAD_SECTIONS, - SFE_VOC_MULTI_SAMPLERATE, - SFE_VOC_MULTI_SECTION, - SFE_VOC_MULTI_PARAM, - SFE_VOC_SECTION_COUNT, - SFE_VOC_NO_PIPE, - - SFE_IRCAM_NO_MARKER, - SFE_IRCAM_BAD_CHANNELS, - SFE_IRCAM_UNKNOWN_FORMAT, - - SFE_W64_64_BIT, - SFE_W64_NO_RIFF, - SFE_W64_NO_WAVE, - SFE_W64_NO_DATA, - SFE_W64_ADPCM_NOT4BIT, - SFE_W64_ADPCM_CHANNELS, - SFE_W64_GSM610_FORMAT, - - SFE_MAT4_BAD_NAME, - SFE_MAT4_NO_SAMPLERATE, - - SFE_MAT5_BAD_ENDIAN, - SFE_MAT5_NO_BLOCK, - SFE_MAT5_SAMPLE_RATE, - - SFE_PVF_NO_PVF1, - SFE_PVF_BAD_HEADER, - SFE_PVF_BAD_BITWIDTH, - - SFE_DWVW_BAD_BITWIDTH, - SFE_G72X_NOT_MONO, - - SFE_XI_BAD_HEADER, - SFE_XI_EXCESS_SAMPLES, - SFE_XI_NO_PIPE, - - SFE_HTK_NO_PIPE, - - SFE_SDS_NOT_SDS, - SFE_SDS_BAD_BIT_WIDTH, - - SFE_SD2_FD_DISALLOWED, - SFE_SD2_BAD_DATA_OFFSET, - SFE_SD2_BAD_MAP_OFFSET, - SFE_SD2_BAD_DATA_LENGTH, - SFE_SD2_BAD_MAP_LENGTH, - SFE_SD2_BAD_RSRC, - SFE_SD2_BAD_SAMPLE_SIZE, - - SFE_FLAC_BAD_HEADER, - SFE_FLAC_NEW_DECODER, - SFE_FLAC_INIT_DECODER, - SFE_FLAC_LOST_SYNC, - SFE_FLAC_BAD_SAMPLE_RATE, - SFE_FLAC_UNKOWN_ERROR, - - SFE_WVE_NOT_WVE, - SFE_WVE_NO_PIPE, - - SFE_VORBIS_ENCODER_BUG, - - SFE_RF64_NOT_RF64, - SFE_BAD_CHUNK_PTR, - SFE_UNKNOWN_CHUNK, - SFE_BAD_CHUNK_FORMAT, - SFE_BAD_CHUNK_MARKER, - SFE_BAD_CHUNK_DATA_PTR, - - SFE_ALAC_FAIL_TMPFILE, - - SFE_MAX_ERROR /* This must be last in list. */ -} ; - -int subformat_to_bytewidth (int format) ; -int s_bitwidth_to_subformat (int bits) ; -int u_bitwidth_to_subformat (int bits) ; - -/* Functions for reading and writing floats and doubles on processors -** with non-IEEE floats/doubles. -*/ -float float32_be_read (const unsigned char *cptr) ; -float float32_le_read (const unsigned char *cptr) ; -void float32_be_write (float in, unsigned char *out) ; -void float32_le_write (float in, unsigned char *out) ; - -double double64_be_read (const unsigned char *cptr) ; -double double64_le_read (const unsigned char *cptr) ; -void double64_be_write (double in, unsigned char *out) ; -void double64_le_write (double in, unsigned char *out) ; - -/* Functions for writing to the internal logging buffer. */ - -void psf_log_printf (SF_PRIVATE *psf, const char *format, ...) ; -void psf_log_SF_INFO (SF_PRIVATE *psf) ; - -int32_t psf_rand_int32 (void) ; - -void append_snprintf (char * dest, size_t maxlen, const char * fmt, ...) ; -void psf_strlcpy_crlf (char *dest, const char *src, size_t destmax, size_t srcmax) ; - -sf_count_t psf_decode_frame_count (SF_PRIVATE *psf) ; - -/* Functions used when writing file headers. */ - -int psf_binheader_writef (SF_PRIVATE *psf, const char *format, ...) ; -void psf_asciiheader_printf (SF_PRIVATE *psf, const char *format, ...) ; - -/* Functions used when reading file headers. */ - -int psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...) ; - -/* Functions used in the write function for updating the peak chunk. */ - -void peak_update_short (SF_PRIVATE *psf, short *ptr, size_t items) ; -void peak_update_int (SF_PRIVATE *psf, int *ptr, size_t items) ; -void peak_update_double (SF_PRIVATE *psf, double *ptr, size_t items) ; - -/* Functions defined in command.c. */ - -int psf_get_format_simple_count (void) ; -int psf_get_format_simple (SF_FORMAT_INFO *data) ; - -int psf_get_format_info (SF_FORMAT_INFO *data) ; - -int psf_get_format_major_count (void) ; -int psf_get_format_major (SF_FORMAT_INFO *data) ; - -int psf_get_format_subtype_count (void) ; -int psf_get_format_subtype (SF_FORMAT_INFO *data) ; - -void psf_generate_format_desc (SF_PRIVATE *psf) ; - -double psf_calc_signal_max (SF_PRIVATE *psf, int normalize) ; -int psf_calc_max_all_channels (SF_PRIVATE *psf, double *peaks, int normalize) ; - -int psf_get_signal_max (SF_PRIVATE *psf, double *peak) ; -int psf_get_max_all_channels (SF_PRIVATE *psf, double *peaks) ; - -/* Functions in strings.c. */ - -const char* psf_get_string (SF_PRIVATE *psf, int str_type) ; -int psf_set_string (SF_PRIVATE *psf, int str_type, const char *str) ; -int psf_store_string (SF_PRIVATE *psf, int str_type, const char *str) ; -int psf_location_string_count (const SF_PRIVATE * psf, int location) ; - -/* Default seek function. Use for PCM and float encoded data. */ -sf_count_t psf_default_seek (SF_PRIVATE *psf, int mode, sf_count_t samples_from_start) ; - -int macos_guess_file_type (SF_PRIVATE *psf, const char *filename) ; - -/*------------------------------------------------------------------------------------ -** File I/O functions which will allow access to large files (> 2 Gig) on -** some 32 bit OSes. Implementation in file_io.c. -*/ - -int psf_fopen (SF_PRIVATE *psf) ; -int psf_set_stdio (SF_PRIVATE *psf) ; -int psf_file_valid (SF_PRIVATE *psf) ; -void psf_set_file (SF_PRIVATE *psf, int fd) ; -void psf_init_files (SF_PRIVATE *psf) ; -void psf_use_rsrc (SF_PRIVATE *psf, int on_off) ; - -SNDFILE * psf_open_file (SF_PRIVATE *psf, SF_INFO *sfinfo) ; - -sf_count_t psf_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence) ; -sf_count_t psf_fread (void *ptr, sf_count_t bytes, sf_count_t count, SF_PRIVATE *psf) ; -sf_count_t psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t count, SF_PRIVATE *psf) ; -sf_count_t psf_fgets (char *buffer, sf_count_t bufsize, SF_PRIVATE *psf) ; -sf_count_t psf_ftell (SF_PRIVATE *psf) ; -sf_count_t psf_get_filelen (SF_PRIVATE *psf) ; - -void psf_fsync (SF_PRIVATE *psf) ; - -int psf_is_pipe (SF_PRIVATE *psf) ; - -int psf_ftruncate (SF_PRIVATE *psf, sf_count_t len) ; -int psf_fclose (SF_PRIVATE *psf) ; - -/* Open and close the resource fork of a file. */ -int psf_open_rsrc (SF_PRIVATE *psf) ; -int psf_close_rsrc (SF_PRIVATE *psf) ; - -/* -void psf_fclearerr (SF_PRIVATE *psf) ; -int psf_ferror (SF_PRIVATE *psf) ; -*/ - -/*------------------------------------------------------------------------------------ -** Functions for reading and writing different file formats. -*/ - -int aiff_open (SF_PRIVATE *psf) ; -int au_open (SF_PRIVATE *psf) ; -int avr_open (SF_PRIVATE *psf) ; -int htk_open (SF_PRIVATE *psf) ; -int ircam_open (SF_PRIVATE *psf) ; -int mat4_open (SF_PRIVATE *psf) ; -int mat5_open (SF_PRIVATE *psf) ; -int nist_open (SF_PRIVATE *psf) ; -int paf_open (SF_PRIVATE *psf) ; -int pvf_open (SF_PRIVATE *psf) ; -int raw_open (SF_PRIVATE *psf) ; -int sd2_open (SF_PRIVATE *psf) ; -int sds_open (SF_PRIVATE *psf) ; -int svx_open (SF_PRIVATE *psf) ; -int voc_open (SF_PRIVATE *psf) ; -int w64_open (SF_PRIVATE *psf) ; -int wav_open (SF_PRIVATE *psf) ; -int xi_open (SF_PRIVATE *psf) ; -int flac_open (SF_PRIVATE *psf) ; -int caf_open (SF_PRIVATE *psf) ; -int mpc2k_open (SF_PRIVATE *psf) ; -int rf64_open (SF_PRIVATE *psf) ; - -int ogg_vorbis_open (SF_PRIVATE *psf) ; -int ogg_speex_open (SF_PRIVATE *psf) ; -int ogg_pcm_open (SF_PRIVATE *psf) ; -int ogg_opus_open (SF_PRIVATE *psf) ; -int ogg_open (SF_PRIVATE *psf) ; - - -/* In progress. Do not currently work. */ - -int mpeg_open (SF_PRIVATE *psf) ; -int rx2_open (SF_PRIVATE *psf) ; -int txw_open (SF_PRIVATE *psf) ; -int wve_open (SF_PRIVATE *psf) ; -int dwd_open (SF_PRIVATE *psf) ; - -int macbinary3_open (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------------ -** Init functions for a number of common data encodings. -*/ - -int pcm_init (SF_PRIVATE *psf) ; -int ulaw_init (SF_PRIVATE *psf) ; -int alaw_init (SF_PRIVATE *psf) ; -int float32_init (SF_PRIVATE *psf) ; -int double64_init (SF_PRIVATE *psf) ; -int dwvw_init (SF_PRIVATE *psf, int bitwidth) ; -int gsm610_init (SF_PRIVATE *psf) ; -int vox_adpcm_init (SF_PRIVATE *psf) ; -int flac_init (SF_PRIVATE *psf) ; -int g72x_init (SF_PRIVATE * psf) ; -int alac_init (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info) ; - -int dither_init (SF_PRIVATE *psf, int mode) ; - -int wav_w64_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ; -int wav_w64_msadpcm_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ; - -int aiff_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ; - -int interleave_init (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------------ -** Chunk logging functions. -*/ - -SF_CHUNK_ITERATOR * psf_get_chunk_iterator (SF_PRIVATE * psf, const char * marker_str) ; -SF_CHUNK_ITERATOR * psf_next_chunk_iterator (const READ_CHUNKS * pchk , SF_CHUNK_ITERATOR *iterator) ; -int psf_store_read_chunk_u32 (READ_CHUNKS * pchk, uint32_t marker, sf_count_t offset, uint32_t len) ; -int psf_store_read_chunk_str (READ_CHUNKS * pchk, const char * marker, sf_count_t offset, uint32_t len) ; -int psf_save_write_chunk (WRITE_CHUNKS * pchk, const SF_CHUNK_INFO * chunk_info) ; -int psf_find_read_chunk_str (const READ_CHUNKS * pchk, const char * marker) ; -int psf_find_read_chunk_m32 (const READ_CHUNKS * pchk, uint32_t marker) ; -int psf_find_read_chunk_iterator (const READ_CHUNKS * pchk, const SF_CHUNK_ITERATOR * marker) ; - -int psf_find_write_chunk (WRITE_CHUNKS * pchk, const char * marker) ; - -static inline int -fourcc_to_marker (const SF_CHUNK_INFO * chunk_info) -{ const unsigned char * cptr ; - - if (chunk_info->id_size != 4) - return 0 ; - - cptr = (const unsigned char *) chunk_info->id ; - return (cptr [3] << 24) + (cptr [2] << 16) + (cptr [1] << 8) + cptr [0] ; -} /* fourcc_to_marker */ - -/*------------------------------------------------------------------------------------ -** Functions that work like OpenBSD's strlcpy/strlcat to replace strncpy/strncat. -** -** See : http://www.gratisoft.us/todd/papers/strlcpy.html -** -** These functions are available on *BSD, but are not avaialble everywhere so we -** implement them here. -** -** The argument order has been changed to that of strncpy/strncat to cause -** compiler errors if code is carelessly converted from one to the other. -*/ - -static inline void -psf_strlcat (char *dest, size_t n, const char *src) -{ strncat (dest, src, n - strlen (dest) - 1) ; - dest [n - 1] = 0 ; -} /* psf_strlcat */ - -static inline void -psf_strlcpy (char *dest, size_t n, const char *src) -{ strncpy (dest, src, n - 1) ; - dest [n - 1] = 0 ; -} /* psf_strlcpy */ - -/*------------------------------------------------------------------------------------ -** Other helper functions. -*/ - -void *psf_memset (void *s, int c, sf_count_t n) ; - -SF_INSTRUMENT * psf_instrument_alloc (void) ; - -void psf_sanitize_string (char * cptr, int len) ; - -/* Generate the current date as a string. */ -void psf_get_date_str (char *str, int maxlen) ; - -SF_BROADCAST_INFO_16K * broadcast_var_alloc (void) ; -int broadcast_var_set (SF_PRIVATE *psf, const SF_BROADCAST_INFO * data, size_t datasize) ; -int broadcast_var_get (SF_PRIVATE *psf, SF_BROADCAST_INFO * data, size_t datasize) ; - - -SF_CART_INFO_16K * cart_var_alloc (void) ; -int cart_var_set (SF_PRIVATE *psf, const SF_CART_INFO * date, size_t datasize) ; -int cart_var_get (SF_PRIVATE *psf, SF_CART_INFO * data, size_t datasize) ; - -typedef struct -{ int channels ; - int endianness ; -} AUDIO_DETECT ; - -int audio_detect (SF_PRIVATE * psf, AUDIO_DETECT *ad, const unsigned char * data, int datalen) ; -int id3_skip (SF_PRIVATE * psf) ; - -void alac_get_desc_chunk_items (int subformat, uint32_t *fmt_flags, uint32_t *frames_per_packet) ; - -FILE * psf_open_tmpfile (char * fname, size_t fnamelen) ; - -/*------------------------------------------------------------------------------------ -** Helper/debug functions. -*/ - -void psf_hexdump (const void *ptr, int len) ; - -const char * str_of_major_format (int format) ; -const char * str_of_minor_format (int format) ; -const char * str_of_open_mode (int mode) ; -const char * str_of_endianness (int end) ; - -/*------------------------------------------------------------------------------------ -** Extra commands for sf_command(). Not for public use yet. -*/ - -enum -{ SFC_TEST_AIFF_ADD_INST_CHUNK = 0x2000, - SFC_TEST_WAV_ADD_INFO_CHUNK = 0x2010 -} ; - -/* -** Maybe, one day, make these functions or something like them, public. -** -** Buffer to buffer dithering. Pointer in and out are allowed to point -** to the same buffer for in-place dithering. -*/ - -#if 0 -int sf_dither_short (const SF_DITHER_INFO *dither, const short *in, short *out, int count) ; -int sf_dither_int (const SF_DITHER_INFO *dither, const int *in, int *out, int count) ; -int sf_dither_float (const SF_DITHER_INFO *dither, const float *in, float *out, int count) ; -int sf_dither_double (const SF_DITHER_INFO *dither, const double *in, double *out, int count) ; -#endif - -/*------------------------------------------------------------------------------------ -** Data conversion functions. -*/ - -static inline short -psf_short_of_int (int x) -{ return (x >> 16) ; -} - -void psf_f2s_array (const float *src, short *dest, int count, int normalize) ; -void psf_f2s_clip_array (const float *src, short *dest, int count, int normalize) ; - -void psf_d2s_array (const double *src, short *dest, int count, int normalize) ; -void psf_d2s_clip_array (const double *src, short *dest, int count, int normalize) ; - -void psf_f2i_array (const float *src, int *dest, int count, int normalize) ; -void psf_f2i_clip_array (const float *src, int *dest, int count, int normalize) ; - -void psf_d2i_array (const double *src, int *dest, int count, int normalize) ; -void psf_d2i_clip_array (const double *src, int *dest, int count, int normalize) ; - -#endif /* SNDFILE_COMMON_H */ - diff --git a/libs/libsndfile/src/create_symbols_file.py b/libs/libsndfile/src/create_symbols_file.py deleted file mode 100755 index 15b1ccaf4b..0000000000 --- a/libs/libsndfile/src/create_symbols_file.py +++ /dev/null @@ -1,182 +0,0 @@ -#!/usr/bin/python - -# Copyright (C) 2003-2012 Erik de Castro Lopo -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# * Neither the author nor the names of any contributors may be used -# to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -import re, sys - -#---------------------------------------------------------------- -# These are all of the public functions exported from libsndfile. -# -# Its important not to change the order they are listed in or -# the ordinal values in the second column. - -ALL_SYMBOLS = ( - ( "sf_command", 1 ), - ( "sf_open", 2 ), - ( "sf_close", 3 ), - ( "sf_seek", 4 ), - ( "sf_error", 7 ), - ( "sf_perror", 8 ), - ( "sf_error_str", 9 ), - ( "sf_error_number", 10 ), - ( "sf_format_check", 11 ), - ( "sf_read_raw", 16 ), - ( "sf_readf_short", 17 ), - ( "sf_readf_int", 18 ), - ( "sf_readf_float", 19 ), - ( "sf_readf_double", 20 ), - ( "sf_read_short", 21 ), - ( "sf_read_int", 22 ), - ( "sf_read_float", 23 ), - ( "sf_read_double", 24 ), - ( "sf_write_raw", 32 ), - ( "sf_writef_short", 33 ), - ( "sf_writef_int", 34 ), - ( "sf_writef_float", 35 ), - ( "sf_writef_double", 36 ), - ( "sf_write_short", 37 ), - ( "sf_write_int", 38 ), - ( "sf_write_float", 39 ), - ( "sf_write_double", 40 ), - ( "sf_strerror", 50 ), - ( "sf_get_string", 60 ), - ( "sf_set_string", 61 ), - ( "sf_version_string", 68 ), - ( "sf_open_fd", 70 ), - ( "sf_wchar_open", 71 ), - ( "sf_open_virtual", 80 ), - ( "sf_write_sync", 90 ), - ( "sf_set_chunk", 100 ), - ( "sf_get_chunk_size", 101 ), - ( "sf_get_chunk_data", 102 ), - ( "sf_get_chunk_iterator", 103 ), - ( "sf_next_chunk_iterator", 104 ), - ( "sf_current_byterate", 110 ) - ) - -#------------------------------------------------------------------------------- - -def linux_symbols (progname, version): - print ("# Auto-generated by %s\n" %progname) - print ("libsndfile.so.%s" % version) - print ("{") - print (" global:") - for name, ordinal in ALL_SYMBOLS: - if name == "sf_wchar_open": - continue - print (" %s ;" % name) - print (" local:") - print (" * ;") - print ("} ;") - sys.stdout.write ("\n") - return - -def darwin_symbols (progname, version): - print ("# Auto-generated by %s\n" %progname) - for name, ordinal in ALL_SYMBOLS: - if name == "sf_wchar_open": - continue - print ("_%s" % name) - sys.stdout.write ("\n") - return - -def win32_symbols (progname, version, name): - print ("; Auto-generated by %s\n" %progname) - print ("LIBRARY %s-%s.dll" % (name, re.sub ("\..*", "", version))) - print ("EXPORTS\n") - for name, ordinal in ALL_SYMBOLS: - print ("%-20s @%s" % (name, ordinal)) - sys.stdout.write ("\n") - return - -def os2_symbols (progname, version, name): - print ("; Auto-generated by %s\n" %progname) - print ("LIBRARY %s%s" % (name, re.sub ("\..*", "", version))) - print ("INITINSTANCE TERMINSTANCE") - print ("CODE PRELOAD MOVEABLE DISCARDABLE") - print ("DATA PRELOAD MOVEABLE MULTIPLE NONSHARED") - print ("EXPORTS\n") - for name, ordinal in ALL_SYMBOLS: - if name == "sf_wchar_open": - continue - print ("_%-20s @%s" % (name, ordinal)) - sys.stdout.write ("\n") - return - -def plain_symbols (progname, version, name): - for name, ordinal in ALL_SYMBOLS: - print (name) - -def no_symbols (os_name): - sys.stdout.write ("\n") - print ("No known way of restricting exported symbols on '%s'." % os_name) - print ("If you know a way, please contact the author.") - sys.stdout.write ("\n") - return - -#------------------------------------------------------------------------------- - -progname = re.sub (".*[\\/]", "", sys.argv [0]) - -if len (sys.argv) != 3: - sys.stdout.write ("\n") - print ("Usage : %s ." % progname) - sys.stdout.write ("\n") - print (" Currently supported values for target OS are:") - print (" linux") - print (" darwin (ie MacOSX)") - print (" win32 (ie wintendo)") - print (" cygwin (Cygwin on wintendo)") - print (" os2 (OS/2)") - print (" plain (plain list of symbols)") - sys.stdout.write ("\n") - sys.exit (1) - -os_name = sys.argv [1] -version = re.sub ("\.[a-z0-9]+$", "", sys.argv [2]) - -if os_name == "linux" or os_name == "gnu" or os_name == "binutils": - linux_symbols (progname, version) -elif os_name == "darwin": - darwin_symbols (progname, version) -elif os_name == "win32": - win32_symbols (progname, version, "libsndfile") -elif os_name == "cygwin": - win32_symbols (progname, version, "cygsndfile") -elif os_name == "os2": - os2_symbols (progname, version, "sndfile") -elif os_name == "static": - plain_symbols (progname, version, "") -else: - no_symbols (os_name) - -sys.exit (0) - diff --git a/libs/libsndfile/src/cygsndfile.def b/libs/libsndfile/src/cygsndfile.def deleted file mode 100644 index 510aa8e229..0000000000 --- a/libs/libsndfile/src/cygsndfile.def +++ /dev/null @@ -1,39 +0,0 @@ -; Auto-generated by create_symbols_file.py - -LIBRARY cygsndfile-1.dll -EXPORTS - -sf_command @1 -sf_open @2 -sf_close @3 -sf_seek @4 -sf_error @7 -sf_perror @8 -sf_error_str @9 -sf_error_number @10 -sf_format_check @11 -sf_read_raw @16 -sf_readf_short @17 -sf_readf_int @18 -sf_readf_float @19 -sf_readf_double @20 -sf_read_short @21 -sf_read_int @22 -sf_read_float @23 -sf_read_double @24 -sf_write_raw @32 -sf_writef_short @33 -sf_writef_int @34 -sf_writef_float @35 -sf_writef_double @36 -sf_write_short @37 -sf_write_int @38 -sf_write_float @39 -sf_write_double @40 -sf_strerror @50 -sf_get_string @60 -sf_set_string @61 -sf_open_fd @70 -sf_open_virtual @80 -sf_write_sync @90 - diff --git a/libs/libsndfile/src/dither.c b/libs/libsndfile/src/dither.c deleted file mode 100644 index d149bc1b68..0000000000 --- a/libs/libsndfile/src/dither.c +++ /dev/null @@ -1,534 +0,0 @@ -/* -** Copyright (C) 2003-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/*============================================================================ -** Rule number 1 is to only apply dither when going from a larger bitwidth -** to a smaller bitwidth. This can happen on both read and write. -** -** Need to apply dither on all conversions marked X below. -** -** Dither on write: -** -** Input -** | short int float double -** --------+----------------------------------------------- -** O 8 bit | X X X X -** u 16 bit | none X X X -** t 24 bit | none X X X -** p 32 bit | none none X X -** u float | none none none none -** t double | none none none none -** -** Dither on read: -** -** Input -** O | 8 bit 16 bit 24 bit 32 bit float double -** u --------+------------------------------------------------- -** t short | none none X X X X -** p int | none none none X X X -** u float | none none none none none none -** t double | none none none none none none -*/ - -#define SFE_DITHER_BAD_PTR 666 -#define SFE_DITHER_BAD_TYPE 667 - -typedef struct -{ int read_short_dither_bits, read_int_dither_bits ; - int write_short_dither_bits, write_int_dither_bits ; - double read_float_dither_scale, read_double_dither_bits ; - double write_float_dither_scale, write_double_dither_bits ; - - sf_count_t (*read_short) (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; - sf_count_t (*read_int) (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; - sf_count_t (*read_float) (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; - sf_count_t (*read_double) (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - - sf_count_t (*write_short) (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; - sf_count_t (*write_int) (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; - sf_count_t (*write_float) (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; - sf_count_t (*write_double) (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - - double buffer [SF_BUFFER_LEN / sizeof (double)] ; -} DITHER_DATA ; - -static sf_count_t dither_read_short (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t dither_read_int (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; - -static sf_count_t dither_write_short (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t dither_write_int (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t dither_write_float (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t dither_write_double (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -int -dither_init (SF_PRIVATE *psf, int mode) -{ DITHER_DATA *pdither ; - - pdither = psf->dither ; /* This may be NULL. */ - - /* Turn off dither on read. */ - if (mode == SFM_READ && psf->read_dither.type == SFD_NO_DITHER) - { if (pdither == NULL) - return 0 ; /* Dither is already off, so just return. */ - - if (pdither->read_short) - psf->read_short = pdither->read_short ; - if (pdither->read_int) - psf->read_int = pdither->read_int ; - if (pdither->read_float) - psf->read_float = pdither->read_float ; - if (pdither->read_double) - psf->read_double = pdither->read_double ; - return 0 ; - } ; - - /* Turn off dither on write. */ - if (mode == SFM_WRITE && psf->write_dither.type == SFD_NO_DITHER) - { if (pdither == NULL) - return 0 ; /* Dither is already off, so just return. */ - - if (pdither->write_short) - psf->write_short = pdither->write_short ; - if (pdither->write_int) - psf->write_int = pdither->write_int ; - if (pdither->write_float) - psf->write_float = pdither->write_float ; - if (pdither->write_double) - psf->write_double = pdither->write_double ; - return 0 ; - } ; - - /* Turn on dither on read if asked. */ - if (mode == SFM_READ && psf->read_dither.type != 0) - { if (pdither == NULL) - pdither = psf->dither = calloc (1, sizeof (DITHER_DATA)) ; - if (pdither == NULL) - return SFE_MALLOC_FAILED ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_DOUBLE : - case SF_FORMAT_FLOAT : - pdither->read_int = psf->read_int ; - psf->read_int = dither_read_int ; - break ; - - case SF_FORMAT_PCM_32 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_S8 : - case SF_FORMAT_PCM_U8 : - pdither->read_short = psf->read_short ; - psf->read_short = dither_read_short ; - break ; - - default : break ; - } ; - } ; - - /* Turn on dither on write if asked. */ - if (mode == SFM_WRITE && psf->write_dither.type != 0) - { if (pdither == NULL) - pdither = psf->dither = calloc (1, sizeof (DITHER_DATA)) ; - if (pdither == NULL) - return SFE_MALLOC_FAILED ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_DOUBLE : - case SF_FORMAT_FLOAT : - pdither->write_int = psf->write_int ; - psf->write_int = dither_write_int ; - break ; - - case SF_FORMAT_PCM_32 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_S8 : - case SF_FORMAT_PCM_U8 : - break ; - - default : break ; - } ; - - pdither->write_short = psf->write_short ; - psf->write_short = dither_write_short ; - - pdither->write_int = psf->write_int ; - psf->write_int = dither_write_int ; - - pdither->write_float = psf->write_float ; - psf->write_float = dither_write_float ; - - pdither->write_double = psf->write_double ; - psf->write_double = dither_write_double ; - } ; - - return 0 ; -} /* dither_init */ - -/*============================================================================== -*/ - -static void dither_short (const short *in, short *out, int frames, int channels) ; -static void dither_int (const int *in, int *out, int frames, int channels) ; - -static void dither_float (const float *in, float *out, int frames, int channels) ; -static void dither_double (const double *in, double *out, int frames, int channels) ; - -static sf_count_t -dither_read_short (SF_PRIVATE * UNUSED (psf), short * UNUSED (ptr), sf_count_t len) -{ - return len ; -} /* dither_read_short */ - -static sf_count_t -dither_read_int (SF_PRIVATE * UNUSED (psf), int * UNUSED (ptr), sf_count_t len) -{ - return len ; -} /* dither_read_int */ - -/*------------------------------------------------------------------------------ -*/ - -static sf_count_t -dither_write_short (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ DITHER_DATA *pdither ; - int bufferlen, writecount, thiswrite ; - sf_count_t total = 0 ; - - if ((pdither = psf->dither) == NULL) - { psf->error = SFE_DITHER_BAD_PTR ; - return 0 ; - } ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_S8 : - case SF_FORMAT_PCM_U8 : - case SF_FORMAT_DPCM_8 : - break ; - - default : - return pdither->write_short (psf, ptr, len) ; - } ; - - bufferlen = sizeof (pdither->buffer) / sizeof (short) ; - - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : (int) len ; - writecount /= psf->sf.channels ; - writecount *= psf->sf.channels ; - - dither_short (ptr, (short*) pdither->buffer, writecount / psf->sf.channels, psf->sf.channels) ; - - thiswrite = pdither->write_short (psf, (short*) pdither->buffer, writecount) ; - total += thiswrite ; - len -= thiswrite ; - if (thiswrite < writecount) - break ; - } ; - - return total ; -} /* dither_write_short */ - -static sf_count_t -dither_write_int (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ DITHER_DATA *pdither ; - int bufferlen, writecount, thiswrite ; - sf_count_t total = 0 ; - - if ((pdither = psf->dither) == NULL) - { psf->error = SFE_DITHER_BAD_PTR ; - return 0 ; - } ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_S8 : - case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - break ; - - case SF_FORMAT_DPCM_8 : - case SF_FORMAT_DPCM_16 : - break ; - - default : - return pdither->write_int (psf, ptr, len) ; - } ; - - - bufferlen = sizeof (pdither->buffer) / sizeof (int) ; - - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : (int) len ; - writecount /= psf->sf.channels ; - writecount *= psf->sf.channels ; - - dither_int (ptr, (int*) pdither->buffer, writecount / psf->sf.channels, psf->sf.channels) ; - - thiswrite = pdither->write_int (psf, (int*) pdither->buffer, writecount) ; - total += thiswrite ; - len -= thiswrite ; - if (thiswrite < writecount) - break ; - } ; - - return total ; -} /* dither_write_int */ - -static sf_count_t -dither_write_float (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ DITHER_DATA *pdither ; - int bufferlen, writecount, thiswrite ; - sf_count_t total = 0 ; - - if ((pdither = psf->dither) == NULL) - { psf->error = SFE_DITHER_BAD_PTR ; - return 0 ; - } ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_S8 : - case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - break ; - - case SF_FORMAT_DPCM_8 : - case SF_FORMAT_DPCM_16 : - break ; - - default : - return pdither->write_float (psf, ptr, len) ; - } ; - - bufferlen = sizeof (pdither->buffer) / sizeof (float) ; - - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : (float) len ; - writecount /= psf->sf.channels ; - writecount *= psf->sf.channels ; - - dither_float (ptr, (float*) pdither->buffer, writecount / psf->sf.channels, psf->sf.channels) ; - - thiswrite = pdither->write_float (psf, (float*) pdither->buffer, writecount) ; - total += thiswrite ; - len -= thiswrite ; - if (thiswrite < writecount) - break ; - } ; - - return total ; -} /* dither_write_float */ - -static sf_count_t -dither_write_double (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ DITHER_DATA *pdither ; - int bufferlen, writecount, thiswrite ; - sf_count_t total = 0 ; - - if ((pdither = psf->dither) == NULL) - { psf->error = SFE_DITHER_BAD_PTR ; - return 0 ; - } ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_S8 : - case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - break ; - - case SF_FORMAT_DPCM_8 : - case SF_FORMAT_DPCM_16 : - break ; - - default : - return pdither->write_double (psf, ptr, len) ; - } ; - - - bufferlen = sizeof (pdither->buffer) / sizeof (double) ; - - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : (double) len ; - writecount /= psf->sf.channels ; - writecount *= psf->sf.channels ; - - dither_double (ptr, (double*) pdither->buffer, writecount / psf->sf.channels, psf->sf.channels) ; - - thiswrite = pdither->write_double (psf, (double*) pdither->buffer, writecount) ; - total += thiswrite ; - len -= thiswrite ; - if (thiswrite < writecount) - break ; - } ; - - return total ; -} /* dither_write_double */ - -/*============================================================================== -*/ - -static void -dither_short (const short *in, short *out, int frames, int channels) -{ int ch, k ; - - for (ch = 0 ; ch < channels ; ch++) - for (k = ch ; k < channels * frames ; k += channels) - out [k] = in [k] ; - -} /* dither_short */ - -static void -dither_int (const int *in, int *out, int frames, int channels) -{ int ch, k ; - - for (ch = 0 ; ch < channels ; ch++) - for (k = ch ; k < channels * frames ; k += channels) - out [k] = in [k] ; - -} /* dither_int */ - -static void -dither_float (const float *in, float *out, int frames, int channels) -{ int ch, k ; - - for (ch = 0 ; ch < channels ; ch++) - for (k = ch ; k < channels * frames ; k += channels) - out [k] = in [k] ; - -} /* dither_float */ - -static void -dither_double (const double *in, double *out, int frames, int channels) -{ int ch, k ; - - for (ch = 0 ; ch < channels ; ch++) - for (k = ch ; k < channels * frames ; k += channels) - out [k] = in [k] ; - -} /* dither_double */ - -/*============================================================================== -*/ -#if 0 - -/* -** Not made public because this (maybe) requires storage of state information. -** -** Also maybe need separate state info for each channel!!!! -*/ - -int -DO_NOT_USE_sf_dither_short (const SF_DITHER_INFO *dither, const short *in, short *out, int frames, int channels) -{ int ch, k ; - - if (! dither) - return SFE_DITHER_BAD_PTR ; - - switch (dither->type & SFD_TYPEMASK) - { case SFD_WHITE : - case SFD_TRIANGULAR_PDF : - for (ch = 0 ; ch < channels ; ch++) - for (k = ch ; k < channels * frames ; k += channels) - out [k] = in [k] ; - break ; - - default : - return SFE_DITHER_BAD_TYPE ; - } ; - - return 0 ; -} /* DO_NOT_USE_sf_dither_short */ - -int -DO_NOT_USE_sf_dither_int (const SF_DITHER_INFO *dither, const int *in, int *out, int frames, int channels) -{ int ch, k ; - - if (! dither) - return SFE_DITHER_BAD_PTR ; - - switch (dither->type & SFD_TYPEMASK) - { case SFD_WHITE : - case SFD_TRIANGULAR_PDF : - for (ch = 0 ; ch < channels ; ch++) - for (k = ch ; k < channels * frames ; k += channels) - out [k] = in [k] ; - break ; - - default : - return SFE_DITHER_BAD_TYPE ; - } ; - - return 0 ; -} /* DO_NOT_USE_sf_dither_int */ - -int -DO_NOT_USE_sf_dither_float (const SF_DITHER_INFO *dither, const float *in, float *out, int frames, int channels) -{ int ch, k ; - - if (! dither) - return SFE_DITHER_BAD_PTR ; - - switch (dither->type & SFD_TYPEMASK) - { case SFD_WHITE : - case SFD_TRIANGULAR_PDF : - for (ch = 0 ; ch < channels ; ch++) - for (k = ch ; k < channels * frames ; k += channels) - out [k] = in [k] ; - break ; - - default : - return SFE_DITHER_BAD_TYPE ; - } ; - - return 0 ; -} /* DO_NOT_USE_sf_dither_float */ - -int -DO_NOT_USE_sf_dither_double (const SF_DITHER_INFO *dither, const double *in, double *out, int frames, int channels) -{ int ch, k ; - - if (! dither) - return SFE_DITHER_BAD_PTR ; - - switch (dither->type & SFD_TYPEMASK) - { case SFD_WHITE : - case SFD_TRIANGULAR_PDF : - for (ch = 0 ; ch < channels ; ch++) - for (k = ch ; k < channels * frames ; k += channels) - out [k] = in [k] ; - break ; - - default : - return SFE_DITHER_BAD_TYPE ; - } ; - - return 0 ; -} /* DO_NOT_USE_sf_dither_double */ - -#endif - diff --git a/libs/libsndfile/src/double64.c b/libs/libsndfile/src/double64.c deleted file mode 100644 index ce60699e61..0000000000 --- a/libs/libsndfile/src/double64.c +++ /dev/null @@ -1,1058 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#if CPU_IS_LITTLE_ENDIAN - #define DOUBLE64_READ double64_le_read - #define DOUBLE64_WRITE double64_le_write -#elif CPU_IS_BIG_ENDIAN - #define DOUBLE64_READ double64_be_read - #define DOUBLE64_WRITE double64_be_write -#endif - -/* A 32 number which will not overflow when multiplied by sizeof (double). */ -#define SENSIBLE_LEN (0x8000000) - -/*-------------------------------------------------------------------------------------------- -** Processor floating point capabilities. double64_get_capability () returns one of the -** latter three values. -*/ - -enum -{ DOUBLE_UNKNOWN = 0x00, - DOUBLE_CAN_RW_LE = 0x23, - DOUBLE_CAN_RW_BE = 0x34, - DOUBLE_BROKEN_LE = 0x45, - DOUBLE_BROKEN_BE = 0x56 -} ; - -/*-------------------------------------------------------------------------------------------- -** Prototypes for private functions. -*/ - -static sf_count_t host_read_d2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t host_read_d2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t host_read_d2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t host_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t host_write_s2d (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t host_write_i2d (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t host_write_f2d (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t host_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static void double64_peak_update (SF_PRIVATE *psf, const double *buffer, int count, sf_count_t indx) ; - -static int double64_get_capability (SF_PRIVATE *psf) ; - -static sf_count_t replace_read_d2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t replace_read_d2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t replace_read_d2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t replace_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t replace_write_s2d (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t replace_write_i2d (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t replace_write_f2d (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t replace_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static void d2bd_read (double *buffer, int count) ; -static void bd2d_write (double *buffer, int count) ; - -/*-------------------------------------------------------------------------------------------- -** Exported functions. -*/ - -int -double64_init (SF_PRIVATE *psf) -{ static int double64_caps ; - - double64_caps = double64_get_capability (psf) ; - - psf->blockwidth = sizeof (double) * psf->sf.channels ; - - if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) - { switch (psf->endian + double64_caps) - { case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_BE) : - psf->data_endswap = SF_FALSE ; - psf->read_short = host_read_d2s ; - psf->read_int = host_read_d2i ; - psf->read_float = host_read_d2f ; - psf->read_double = host_read_d ; - break ; - - case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_LE) : - psf->data_endswap = SF_FALSE ; - psf->read_short = host_read_d2s ; - psf->read_int = host_read_d2i ; - psf->read_float = host_read_d2f ; - psf->read_double = host_read_d ; - break ; - - case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_LE) : - psf->data_endswap = SF_TRUE ; - psf->read_short = host_read_d2s ; - psf->read_int = host_read_d2i ; - psf->read_float = host_read_d2f ; - psf->read_double = host_read_d ; - break ; - - case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_BE) : - psf->data_endswap = SF_TRUE ; - psf->read_short = host_read_d2s ; - psf->read_int = host_read_d2i ; - psf->read_float = host_read_d2f ; - psf->read_double = host_read_d ; - break ; - - /* When the CPU is not IEEE compatible. */ - case (SF_ENDIAN_BIG + DOUBLE_BROKEN_BE) : - psf->data_endswap = SF_FALSE ; - psf->read_short = replace_read_d2s ; - psf->read_int = replace_read_d2i ; - psf->read_float = replace_read_d2f ; - psf->read_double = replace_read_d ; - break ; - - case (SF_ENDIAN_LITTLE + DOUBLE_BROKEN_LE) : - psf->data_endswap = SF_FALSE ; - psf->read_short = replace_read_d2s ; - psf->read_int = replace_read_d2i ; - psf->read_float = replace_read_d2f ; - psf->read_double = replace_read_d ; - break ; - - case (SF_ENDIAN_BIG + DOUBLE_BROKEN_LE) : - psf->data_endswap = SF_TRUE ; - psf->read_short = replace_read_d2s ; - psf->read_int = replace_read_d2i ; - psf->read_float = replace_read_d2f ; - psf->read_double = replace_read_d ; - break ; - - case (SF_ENDIAN_LITTLE + DOUBLE_BROKEN_BE) : - psf->data_endswap = SF_TRUE ; - psf->read_short = replace_read_d2s ; - psf->read_int = replace_read_d2i ; - psf->read_float = replace_read_d2f ; - psf->read_double = replace_read_d ; - break ; - - default : break ; - } ; - } ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { switch (psf->endian + double64_caps) - { case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_LE) : - psf->data_endswap = SF_FALSE ; - psf->write_short = host_write_s2d ; - psf->write_int = host_write_i2d ; - psf->write_float = host_write_f2d ; - psf->write_double = host_write_d ; - break ; - - case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_BE) : - psf->data_endswap = SF_FALSE ; - psf->write_short = host_write_s2d ; - psf->write_int = host_write_i2d ; - psf->write_float = host_write_f2d ; - psf->write_double = host_write_d ; - break ; - - case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_LE) : - psf->data_endswap = SF_TRUE ; - psf->write_short = host_write_s2d ; - psf->write_int = host_write_i2d ; - psf->write_float = host_write_f2d ; - psf->write_double = host_write_d ; - break ; - - case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_BE) : - psf->data_endswap = SF_TRUE ; - psf->write_short = host_write_s2d ; - psf->write_int = host_write_i2d ; - psf->write_float = host_write_f2d ; - psf->write_double = host_write_d ; - break ; - - /* When the CPU is not IEEE compatible. */ - case (SF_ENDIAN_LITTLE + DOUBLE_BROKEN_LE) : - psf->data_endswap = SF_FALSE ; - psf->write_short = replace_write_s2d ; - psf->write_int = replace_write_i2d ; - psf->write_float = replace_write_f2d ; - psf->write_double = replace_write_d ; - break ; - - case (SF_ENDIAN_BIG + DOUBLE_BROKEN_BE) : - psf->data_endswap = SF_FALSE ; - psf->write_short = replace_write_s2d ; - psf->write_int = replace_write_i2d ; - psf->write_float = replace_write_f2d ; - psf->write_double = replace_write_d ; - break ; - - case (SF_ENDIAN_BIG + DOUBLE_BROKEN_LE) : - psf->data_endswap = SF_TRUE ; - psf->write_short = replace_write_s2d ; - psf->write_int = replace_write_i2d ; - psf->write_float = replace_write_f2d ; - psf->write_double = replace_write_d ; - break ; - - case (SF_ENDIAN_LITTLE + DOUBLE_BROKEN_BE) : - psf->data_endswap = SF_TRUE ; - psf->write_short = replace_write_s2d ; - psf->write_int = replace_write_i2d ; - psf->write_float = replace_write_f2d ; - psf->write_double = replace_write_d ; - break ; - - default : break ; - } ; - } ; - - if (psf->filelength > psf->dataoffset) - { psf->datalength = (psf->dataend > 0) ? psf->dataend - psf->dataoffset : - psf->filelength - psf->dataoffset ; - } - else - psf->datalength = 0 ; - - psf->sf.frames = psf->datalength / psf->blockwidth ; - - return 0 ; -} /* double64_init */ - -/*---------------------------------------------------------------------------- -** From : http://www.hpcf.cam.ac.uk/fp_formats.html -** -** 64 bit double precision layout (big endian) -** Sign bit 0 -** Exponent bits 1-11 -** Mantissa bits 12-63 -** Exponent Offset 1023 -** -** double single -** -** +INF 7FF0000000000000 7F800000 -** -INF FFF0000000000000 FF800000 -** NaN 7FF0000000000001 7F800001 -** to to -** 7FFFFFFFFFFFFFFF 7FFFFFFF -** and and -** FFF0000000000001 FF800001 -** to to -** FFFFFFFFFFFFFFFF FFFFFFFF -** +OVER 7FEFFFFFFFFFFFFF 7F7FFFFF -** -OVER FFEFFFFFFFFFFFFF FF7FFFFF -** +UNDER 0010000000000000 00800000 -** -UNDER 8010000000000000 80800000 -*/ - -double -double64_be_read (const unsigned char *cptr) -{ int exponent, negative, upper, lower ; - double dvalue ; - - negative = (cptr [0] & 0x80) ? 1 : 0 ; - exponent = ((cptr [0] & 0x7F) << 4) | ((cptr [1] >> 4) & 0xF) ; - - /* Might not have a 64 bit long, so load the mantissa into a double. */ - upper = (((cptr [1] & 0xF) << 24) | (cptr [2] << 16) | (cptr [3] << 8) | cptr [4]) ; - lower = (cptr [5] << 16) | (cptr [6] << 8) | cptr [7] ; - - if (exponent == 0 && upper == 0 && lower == 0) - return 0.0 ; - - dvalue = upper + lower / ((double) 0x1000000) ; - dvalue += 0x10000000 ; - - exponent = exponent - 0x3FF ; - - dvalue = dvalue / ((double) 0x10000000) ; - - if (negative) - dvalue *= -1 ; - - if (exponent > 0) - dvalue *= pow (2.0, exponent) ; - else if (exponent < 0) - dvalue /= pow (2.0, abs (exponent)) ; - - return dvalue ; -} /* double64_be_read */ - -double -double64_le_read (const unsigned char *cptr) -{ int exponent, negative, upper, lower ; - double dvalue ; - - negative = (cptr [7] & 0x80) ? 1 : 0 ; - exponent = ((cptr [7] & 0x7F) << 4) | ((cptr [6] >> 4) & 0xF) ; - - /* Might not have a 64 bit long, so load the mantissa into a double. */ - upper = ((cptr [6] & 0xF) << 24) | (cptr [5] << 16) | (cptr [4] << 8) | cptr [3] ; - lower = (cptr [2] << 16) | (cptr [1] << 8) | cptr [0] ; - - if (exponent == 0 && upper == 0 && lower == 0) - return 0.0 ; - - dvalue = upper + lower / ((double) 0x1000000) ; - dvalue += 0x10000000 ; - - exponent = exponent - 0x3FF ; - - dvalue = dvalue / ((double) 0x10000000) ; - - if (negative) - dvalue *= -1 ; - - if (exponent > 0) - dvalue *= pow (2.0, exponent) ; - else if (exponent < 0) - dvalue /= pow (2.0, abs (exponent)) ; - - return dvalue ; -} /* double64_le_read */ - -void -double64_be_write (double in, unsigned char *out) -{ int exponent, mantissa ; - - memset (out, 0, sizeof (double)) ; - - if (fabs (in) < 1e-30) - return ; - - if (in < 0.0) - { in *= -1.0 ; - out [0] |= 0x80 ; - } ; - - in = frexp (in, &exponent) ; - - exponent += 1022 ; - - out [0] |= (exponent >> 4) & 0x7F ; - out [1] |= (exponent << 4) & 0xF0 ; - - in *= 0x20000000 ; - mantissa = lrint (floor (in)) ; - - out [1] |= (mantissa >> 24) & 0xF ; - out [2] = (mantissa >> 16) & 0xFF ; - out [3] = (mantissa >> 8) & 0xFF ; - out [4] = mantissa & 0xFF ; - - in = fmod (in, 1.0) ; - in *= 0x1000000 ; - mantissa = lrint (floor (in)) ; - - out [5] = (mantissa >> 16) & 0xFF ; - out [6] = (mantissa >> 8) & 0xFF ; - out [7] = mantissa & 0xFF ; - - return ; -} /* double64_be_write */ - -void -double64_le_write (double in, unsigned char *out) -{ int exponent, mantissa ; - - memset (out, 0, sizeof (double)) ; - - if (fabs (in) < 1e-30) - return ; - - if (in < 0.0) - { in *= -1.0 ; - out [7] |= 0x80 ; - } ; - - in = frexp (in, &exponent) ; - - exponent += 1022 ; - - out [7] |= (exponent >> 4) & 0x7F ; - out [6] |= (exponent << 4) & 0xF0 ; - - in *= 0x20000000 ; - mantissa = lrint (floor (in)) ; - - out [6] |= (mantissa >> 24) & 0xF ; - out [5] = (mantissa >> 16) & 0xFF ; - out [4] = (mantissa >> 8) & 0xFF ; - out [3] = mantissa & 0xFF ; - - in = fmod (in, 1.0) ; - in *= 0x1000000 ; - mantissa = lrint (floor (in)) ; - - out [2] = (mantissa >> 16) & 0xFF ; - out [1] = (mantissa >> 8) & 0xFF ; - out [0] = mantissa & 0xFF ; - - return ; -} /* double64_le_write */ - -/*============================================================================================== -** Private functions. -*/ - -static void -double64_peak_update (SF_PRIVATE *psf, const double *buffer, int count, sf_count_t indx) -{ int chan ; - int k, position ; - float fmaxval ; - - for (chan = 0 ; chan < psf->sf.channels ; chan++) - { fmaxval = fabs (buffer [chan]) ; - position = 0 ; - for (k = chan ; k < count ; k += psf->sf.channels) - if (fmaxval < fabs (buffer [k])) - { fmaxval = fabs (buffer [k]) ; - position = k ; - } ; - - if (fmaxval > psf->peak_info->peaks [chan].value) - { psf->peak_info->peaks [chan].value = fmaxval ; - psf->peak_info->peaks [chan].position = psf->write_current + indx + (position / psf->sf.channels) ; - } ; - } ; - - return ; -} /* double64_peak_update */ - -static int -double64_get_capability (SF_PRIVATE *psf) -{ union - { double d ; - unsigned char c [8] ; - } data ; - - data.d = 1.234567890123456789 ; /* Some abitrary value. */ - - if (! psf->ieee_replace) - { /* If this test is true ints and floats are compatible and little endian. */ - if (data.c [0] == 0xfb && data.c [1] == 0x59 && data.c [2] == 0x8c && data.c [3] == 0x42 && - data.c [4] == 0xca && data.c [5] == 0xc0 && data.c [6] == 0xf3 && data.c [7] == 0x3f) - return DOUBLE_CAN_RW_LE ; - - /* If this test is true ints and floats are compatible and big endian. */ - if (data.c [0] == 0x3f && data.c [1] == 0xf3 && data.c [2] == 0xc0 && data.c [3] == 0xca && - data.c [4] == 0x42 && data.c [5] == 0x8c && data.c [6] == 0x59 && data.c [7] == 0xfb) - return DOUBLE_CAN_RW_BE ; - } ; - - /* Doubles are broken. Don't expect reading or writing to be fast. */ - psf_log_printf (psf, "Using IEEE replacement code for double.\n") ; - - return (CPU_IS_LITTLE_ENDIAN) ? DOUBLE_BROKEN_LE : DOUBLE_BROKEN_BE ; -} /* double64_get_capability */ - -/*======================================================================================= -*/ - -static void -d2s_array (const double *src, int count, short *dest, double scale) -{ while (--count >= 0) - { dest [count] = lrint (scale * src [count]) ; - } ; -} /* d2s_array */ - -static void -d2s_clip_array (const double *src, int count, short *dest, double scale) -{ while (--count >= 0) - { double tmp = scale * src [count] ; - - if (CPU_CLIPS_POSITIVE == 0 && tmp > 32767.0) - dest [count] = SHRT_MAX ; - else if (CPU_CLIPS_NEGATIVE == 0 && tmp < -32768.0) - dest [count] = SHRT_MIN ; - else - dest [count] = lrint (tmp) ; - } ; -} /* d2s_clip_array */ - -static void -d2i_array (const double *src, int count, int *dest, double scale) -{ while (--count >= 0) - { dest [count] = lrint (scale * src [count]) ; - } ; -} /* d2i_array */ - -static void -d2i_clip_array (const double *src, int count, int *dest, double scale) -{ while (--count >= 0) - { float tmp = scale * src [count] ; - - if (CPU_CLIPS_POSITIVE == 0 && tmp > (1.0 * INT_MAX)) - dest [count] = INT_MAX ; - else if (CPU_CLIPS_NEGATIVE == 0 && tmp < (-1.0 * INT_MAX)) - dest [count] = INT_MIN ; - else - dest [count] = lrint (tmp) ; - } ; -} /* d2i_clip_array */ - -static inline void -d2f_array (const double *src, int count, float *dest) -{ while (--count >= 0) - { dest [count] = src [count] ; - } ; -} /* d2f_array */ - -static inline void -s2d_array (const short *src, double *dest, int count, double scale) -{ while (--count >= 0) - { dest [count] = scale * src [count] ; - } ; -} /* s2d_array */ - -static inline void -i2d_array (const int *src, double *dest, int count, double scale) -{ while (--count >= 0) - { dest [count] = scale * src [count] ; - } ; -} /* i2d_array */ - -static inline void -f2d_array (const float *src, double *dest, int count) -{ while (--count >= 0) - { dest [count] = src [count] ; - } ; -} /* f2d_array */ - -/*---------------------------------------------------------------------------------------------- -*/ - -static sf_count_t -host_read_d2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const double *, int, short *, double) ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double scale ; - - convert = (psf->add_clipping) ? d2s_clip_array : d2s_array ; - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - - if (psf->data_endswap == SF_TRUE) - endswap_double_array (ubuf.dbuf, readcount) ; - - convert (ubuf.dbuf, readcount, ptr + total, scale) ; - total += readcount ; - len -= readcount ; - if (readcount < bufferlen) - break ; - } ; - - return total ; -} /* host_read_d2s */ - -static sf_count_t -host_read_d2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const double *, int, int *, double) ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double scale ; - - convert = (psf->add_clipping) ? d2i_clip_array : d2i_array ; - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFFFFFF / psf->float_max ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - - if (psf->data_endswap == SF_TRUE) - endswap_double_array (ubuf.dbuf, bufferlen) ; - - convert (ubuf.dbuf, readcount, ptr + total, scale) ; - total += readcount ; - len -= readcount ; - if (readcount < bufferlen) - break ; - } ; - - return total ; -} /* host_read_d2i */ - -static sf_count_t -host_read_d2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - - if (psf->data_endswap == SF_TRUE) - endswap_double_array (ubuf.dbuf, bufferlen) ; - - d2f_array (ubuf.dbuf, readcount, ptr + total) ; - total += readcount ; - len -= readcount ; - if (readcount < bufferlen) - break ; - } ; - - return total ; -} /* host_read_d2f */ - -static sf_count_t -host_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ int bufferlen ; - sf_count_t readcount, total = 0 ; - - readcount = psf_fread (ptr, sizeof (double), len, psf) ; - - if (psf->data_endswap != SF_TRUE) - return readcount ; - - /* If the read length was sensible, endswap output in one go. */ - if (readcount < SENSIBLE_LEN) - { endswap_double_array (ptr, readcount) ; - return readcount ; - } ; - - bufferlen = SENSIBLE_LEN ; - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - - endswap_double_array (ptr + total, bufferlen) ; - - total += bufferlen ; - len -= bufferlen ; - } ; - - return total ; -} /* host_read_d */ - -static sf_count_t -host_write_s2d (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - double scale ; - - scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ; - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - - s2d_array (ptr + total, ubuf.dbuf, bufferlen, scale) ; - - if (psf->peak_info) - double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ; - - if (psf->data_endswap == SF_TRUE) - endswap_double_array (ubuf.dbuf, bufferlen) ; - - writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* host_write_s2d */ - -static sf_count_t -host_write_i2d (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - double scale ; - - scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ; - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - i2d_array (ptr + total, ubuf.dbuf, bufferlen, scale) ; - - if (psf->peak_info) - double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ; - - if (psf->data_endswap == SF_TRUE) - endswap_double_array (ubuf.dbuf, bufferlen) ; - - writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* host_write_i2d */ - -static sf_count_t -host_write_f2d (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - f2d_array (ptr + total, ubuf.dbuf, bufferlen) ; - - if (psf->peak_info) - double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ; - - if (psf->data_endswap == SF_TRUE) - endswap_double_array (ubuf.dbuf, bufferlen) ; - - writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* host_write_f2d */ - -static sf_count_t -host_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - if (psf->peak_info) - double64_peak_update (psf, ptr, len, 0) ; - - if (psf->data_endswap != SF_TRUE) - return psf_fwrite (ptr, sizeof (double), len, psf) ; - - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - - endswap_double_copy (ubuf.dbuf, ptr + total, bufferlen) ; - - writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* host_write_d */ - -/*======================================================================================= -*/ - -static sf_count_t -replace_read_d2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double scale ; - - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - - if (psf->data_endswap == SF_TRUE) - endswap_double_array (ubuf.dbuf, bufferlen) ; - - d2bd_read (ubuf.dbuf, bufferlen) ; - - d2s_array (ubuf.dbuf, readcount, ptr + total, scale) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* replace_read_d2s */ - -static sf_count_t -replace_read_d2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double scale ; - - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFFFFFF / psf->float_max ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - - if (psf->data_endswap == SF_TRUE) - endswap_double_array (ubuf.dbuf, bufferlen) ; - - d2bd_read (ubuf.dbuf, bufferlen) ; - - d2i_array (ubuf.dbuf, readcount, ptr + total, scale) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* replace_read_d2i */ - -static sf_count_t -replace_read_d2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - - if (psf->data_endswap == SF_TRUE) - endswap_double_array (ubuf.dbuf, bufferlen) ; - - d2bd_read (ubuf.dbuf, bufferlen) ; - - memcpy (ptr + total, ubuf.dbuf, bufferlen * sizeof (double)) ; - - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* replace_read_d2f */ - -static sf_count_t -replace_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - /* FIXME : This is probably nowhere near optimal. */ - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - - if (psf->data_endswap == SF_TRUE) - endswap_double_array (ubuf.dbuf, readcount) ; - - d2bd_read (ubuf.dbuf, readcount) ; - - memcpy (ptr + total, ubuf.dbuf, readcount * sizeof (double)) ; - - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* replace_read_d */ - -static sf_count_t -replace_write_s2d (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - double scale ; - - scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ; - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - s2d_array (ptr + total, ubuf.dbuf, bufferlen, scale) ; - - if (psf->peak_info) - double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ; - - bd2d_write (ubuf.dbuf, bufferlen) ; - - if (psf->data_endswap == SF_TRUE) - endswap_double_array (ubuf.dbuf, bufferlen) ; - - writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* replace_write_s2d */ - -static sf_count_t -replace_write_i2d (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - double scale ; - - scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ; - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - i2d_array (ptr + total, ubuf.dbuf, bufferlen, scale) ; - - if (psf->peak_info) - double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ; - - bd2d_write (ubuf.dbuf, bufferlen) ; - - if (psf->data_endswap == SF_TRUE) - endswap_double_array (ubuf.dbuf, bufferlen) ; - - writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* replace_write_i2d */ - -static sf_count_t -replace_write_f2d (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - f2d_array (ptr + total, ubuf.dbuf, bufferlen) ; - - bd2d_write (ubuf.dbuf, bufferlen) ; - - if (psf->data_endswap == SF_TRUE) - endswap_double_array (ubuf.dbuf, bufferlen) ; - - writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* replace_write_f2d */ - -static sf_count_t -replace_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - /* FIXME : This is probably nowhere near optimal. */ - if (psf->peak_info) - double64_peak_update (psf, ptr, len, 0) ; - - bufferlen = ARRAY_LEN (ubuf.dbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - - memcpy (ubuf.dbuf, ptr + total, bufferlen * sizeof (double)) ; - - bd2d_write (ubuf.dbuf, bufferlen) ; - - if (psf->data_endswap == SF_TRUE) - endswap_double_array (ubuf.dbuf, bufferlen) ; - - writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* replace_write_d */ - -/*---------------------------------------------------------------------------------------------- -*/ - -static void -d2bd_read (double *buffer, int count) -{ while (--count >= 0) - { buffer [count] = DOUBLE64_READ ((unsigned char *) (buffer + count)) ; - } ; -} /* d2bd_read */ - -static void -bd2d_write (double *buffer, int count) -{ while (--count >= 0) - { DOUBLE64_WRITE (buffer [count], (unsigned char*) (buffer + count)) ; - } ; -} /* bd2d_write */ - diff --git a/libs/libsndfile/src/dwd.c b/libs/libsndfile/src/dwd.c deleted file mode 100644 index af4d9f0e41..0000000000 --- a/libs/libsndfile/src/dwd.c +++ /dev/null @@ -1,201 +0,0 @@ -/* -** Copyright (C) 2002-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#if (ENABLE_EXPERIMENTAL_CODE == 0) - -int -dwd_open (SF_PRIVATE *psf) -{ if (psf) - return SFE_UNIMPLEMENTED ; - return 0 ; -} /* dwd_open */ - -#else - -/*------------------------------------------------------------------------------ -** Macros to handle big/little endian issues. -*/ - -#define SFE_DWD_NO_DWD 1666 -#define SFE_DWD_BAND_BIT_WIDTH 1667 -#define SFE_DWD_COMPRESSION 1668 - -#define DWD_IDENTIFIER "DiamondWare Digitized\n\0\x1a" -#define DWD_IDENTIFIER_LEN 24 - -#define DWD_HEADER_LEN 57 - -/*------------------------------------------------------------------------------ -** Typedefs. -*/ - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int dwd_read_header (SF_PRIVATE *psf) ; - -static int dwd_close (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -dwd_open (SF_PRIVATE *psf) -{ int error = 0 ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = dwd_read_header (psf))) - return error ; - } ; - - if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_DWD) - return SFE_BAD_OPEN_FORMAT ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { - /*-psf->endian = SF_ENDIAN (psf->sf.format) ; - if (CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_CPU) - psf->endian = SF_ENDIAN_LITTLE ; - else if (psf->endian != SF_ENDIAN_LITTLE) - psf->endian = SF_ENDIAN_BIG ; - - if (! (encoding = dwd_write_header (psf, SF_FALSE))) - return psf->error ; - - psf->write_header = dwd_write_header ; - -*/ - } ; - - psf->container_close = dwd_close ; - - /*-psf->blockwidth = psf->bytewidth * psf->sf.channels ;-*/ - - return error ; -} /* dwd_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -dwd_close (SF_PRIVATE * UNUSED (psf)) -{ - return 0 ; -} /* dwd_close */ - -/* This struct contains all the fields of interest om the DWD header, but does not -** do so in the same order and layout as the actual file, header. -** No assumptions are made about the packing of this struct. -*/ -typedef struct -{ unsigned char major, minor, compression, channels, bitwidth ; - unsigned short srate, maxval ; - unsigned int id, datalen, frames, offset ; -} DWD_HEADER ; - -static int -dwd_read_header (SF_PRIVATE *psf) -{ BUF_UNION ubuf ; - DWD_HEADER dwdh ; - - memset (ubuf.cbuf, 0, sizeof (ubuf.cbuf)) ; - /* Set position to start of file to begin reading header. */ - psf_binheader_readf (psf, "pb", 0, ubuf.cbuf, DWD_IDENTIFIER_LEN) ; - - if (memcmp (ubuf.cbuf, DWD_IDENTIFIER, DWD_IDENTIFIER_LEN) != 0) - return SFE_DWD_NO_DWD ; - - psf_log_printf (psf, "Read only : DiamondWare Digitized (.dwd)\n", ubuf.cbuf) ; - - psf_binheader_readf (psf, "11", &dwdh.major, &dwdh.minor) ; - psf_binheader_readf (psf, "e4j1", &dwdh.id, 1, &dwdh.compression) ; - psf_binheader_readf (psf, "e211", &dwdh.srate, &dwdh.channels, &dwdh.bitwidth) ; - psf_binheader_readf (psf, "e24", &dwdh.maxval, &dwdh.datalen) ; - psf_binheader_readf (psf, "e44", &dwdh.frames, &dwdh.offset) ; - - psf_log_printf (psf, " Version Major : %d\n Version Minor : %d\n Unique ID : %08X\n", - dwdh.major, dwdh.minor, dwdh.id) ; - psf_log_printf (psf, " Compression : %d => ", dwdh.compression) ; - - if (dwdh.compression != 0) - { psf_log_printf (psf, "Unsupported compression\n") ; - return SFE_DWD_COMPRESSION ; - } - else - psf_log_printf (psf, "None\n") ; - - psf_log_printf (psf, " Sample Rate : %d\n Channels : %d\n" - " Bit Width : %d\n", - dwdh.srate, dwdh.channels, dwdh.bitwidth) ; - - switch (dwdh.bitwidth) - { case 8 : - psf->sf.format = SF_FORMAT_DWD | SF_FORMAT_PCM_S8 ; - psf->bytewidth = 1 ; - break ; - - case 16 : - psf->sf.format = SF_FORMAT_DWD | SF_FORMAT_PCM_16 ; - psf->bytewidth = 2 ; - break ; - - default : - psf_log_printf (psf, "*** Bad bit width %d\n", dwdh.bitwidth) ; - return SFE_DWD_BAND_BIT_WIDTH ; - } ; - - if (psf->filelength != dwdh.offset + dwdh.datalen) - { psf_log_printf (psf, " Data Length : %d (should be %D)\n", dwdh.datalen, psf->filelength - dwdh.offset) ; - dwdh.datalen = (unsigned int) (psf->filelength - dwdh.offset) ; - } - else - psf_log_printf (psf, " Data Length : %d\n", dwdh.datalen) ; - - psf_log_printf (psf, " Max Value : %d\n", dwdh.maxval) ; - psf_log_printf (psf, " Frames : %d\n", dwdh.frames) ; - psf_log_printf (psf, " Data Offset : %d\n", dwdh.offset) ; - - psf->datalength = dwdh.datalen ; - psf->dataoffset = dwdh.offset ; - - psf->endian = SF_ENDIAN_LITTLE ; - - psf->sf.samplerate = dwdh.srate ; - psf->sf.channels = dwdh.channels ; - psf->sf.sections = 1 ; - - return pcm_init (psf) ; -} /* dwd_read_header */ - -/*------------------------------------------------------------------------------ -*/ - -#endif - diff --git a/libs/libsndfile/src/dwvw.c b/libs/libsndfile/src/dwvw.c deleted file mode 100644 index ddf86f63d5..0000000000 --- a/libs/libsndfile/src/dwvw.c +++ /dev/null @@ -1,674 +0,0 @@ -/* -** Copyright (C) 2002-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/*=========================================================================== -** Delta Word Variable Width -** -** This decoder and encoder were implemented using information found in this -** document : http://home.swbell.net/rubywand/R011SNDFMTS.TXT -** -** According to the document, the algorithm "was invented 1991 by Magnus -** Lidstrom and is copyright 1993 by NuEdge Development". -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -typedef struct -{ int bit_width, dwm_maxsize, max_delta, span ; - int samplecount ; - int bit_count, bits, last_delta_width, last_sample ; - struct - { int index, end ; - unsigned char buffer [256] ; - } b ; -} DWVW_PRIVATE ; - -/*============================================================================================ -*/ - -static sf_count_t dwvw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t dwvw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t dwvw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t dwvw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t dwvw_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t dwvw_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t dwvw_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t dwvw_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static sf_count_t dwvw_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; -static int dwvw_close (SF_PRIVATE *psf) ; -static int dwvw_byterate (SF_PRIVATE *psf) ; - -static int dwvw_decode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int *ptr, int len) ; -static int dwvw_decode_load_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int bit_count) ; - -static int dwvw_encode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, const int *ptr, int len) ; -static void dwvw_encode_store_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int data, int new_bits) ; -static void dwvw_read_reset (DWVW_PRIVATE *pdwvw) ; - -/*============================================================================================ -** DWVW initialisation function. -*/ - -int -dwvw_init (SF_PRIVATE *psf, int bitwidth) -{ DWVW_PRIVATE *pdwvw ; - - if (psf->codec_data != NULL) - { psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ; - return SFE_INTERNAL ; - } ; - - if (bitwidth > 24) - return SFE_DWVW_BAD_BITWIDTH ; - - if (psf->file.mode == SFM_RDWR) - return SFE_BAD_MODE_RW ; - - if ((pdwvw = calloc (1, sizeof (DWVW_PRIVATE))) == NULL) - return SFE_MALLOC_FAILED ; - - psf->codec_data = (void*) pdwvw ; - pdwvw->bit_width = bitwidth ; - dwvw_read_reset (pdwvw) ; - - if (psf->file.mode == SFM_READ) - { psf->read_short = dwvw_read_s ; - psf->read_int = dwvw_read_i ; - psf->read_float = dwvw_read_f ; - psf->read_double = dwvw_read_d ; - } ; - - if (psf->file.mode == SFM_WRITE) - { psf->write_short = dwvw_write_s ; - psf->write_int = dwvw_write_i ; - psf->write_float = dwvw_write_f ; - psf->write_double = dwvw_write_d ; - } ; - - psf->codec_close = dwvw_close ; - psf->seek = dwvw_seek ; - psf->byterate = dwvw_byterate ; - - if (psf->file.mode == SFM_READ) - { psf->sf.frames = psf_decode_frame_count (psf) ; - dwvw_read_reset (pdwvw) ; - } ; - - return 0 ; -} /* dwvw_init */ - -/*-------------------------------------------------------------------------------------------- -*/ - -static int -dwvw_close (SF_PRIVATE *psf) -{ DWVW_PRIVATE *pdwvw ; - - if (psf->codec_data == NULL) - return 0 ; - pdwvw = (DWVW_PRIVATE*) psf->codec_data ; - - if (psf->file.mode == SFM_WRITE) - { static int last_values [12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ; - - /* Write 8 zero samples to fully flush output. */ - dwvw_encode_data (psf, pdwvw, last_values, 12) ; - - /* Write the last buffer worth of data to disk. */ - psf_fwrite (pdwvw->b.buffer, 1, pdwvw->b.index, psf) ; - - if (psf->write_header) - psf->write_header (psf, SF_TRUE) ; - } ; - - return 0 ; -} /* dwvw_close */ - -static sf_count_t -dwvw_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset) -{ DWVW_PRIVATE *pdwvw ; - - if (! psf->codec_data) - { psf->error = SFE_INTERNAL ; - return PSF_SEEK_ERROR ; - } ; - - pdwvw = (DWVW_PRIVATE*) psf->codec_data ; - - if (offset == 0) - { psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - dwvw_read_reset (pdwvw) ; - return 0 ; - } ; - - psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; -} /* dwvw_seek */ - -static int -dwvw_byterate (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_READ) - return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ; - - return -1 ; -} /* dwvw_byterate */ - -/*============================================================================== -*/ - -static sf_count_t -dwvw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ DWVW_PRIVATE *pdwvw ; - BUF_UNION ubuf ; - int *iptr ; - int k, bufferlen, readcount = 0, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pdwvw = (DWVW_PRIVATE*) psf->codec_data ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = dwvw_decode_data (psf, pdwvw, iptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = iptr [k] >> 16 ; - - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - - return total ; -} /* dwvw_read_s */ - -static sf_count_t -dwvw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ DWVW_PRIVATE *pdwvw ; - int readcount, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pdwvw = (DWVW_PRIVATE*) psf->codec_data ; - - while (len > 0) - { readcount = (len > 0x10000000) ? 0x10000000 : (int) len ; - - count = dwvw_decode_data (psf, pdwvw, ptr, readcount) ; - - total += count ; - len -= count ; - - if (count != readcount) - break ; - } ; - - return total ; -} /* dwvw_read_i */ - -static sf_count_t -dwvw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ DWVW_PRIVATE *pdwvw ; - BUF_UNION ubuf ; - int *iptr ; - int k, bufferlen, readcount = 0, count ; - sf_count_t total = 0 ; - float normfact ; - - if (! psf->codec_data) - return 0 ; - pdwvw = (DWVW_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = dwvw_decode_data (psf, pdwvw, iptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * (float) (iptr [k]) ; - - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - - return total ; -} /* dwvw_read_f */ - -static sf_count_t -dwvw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ DWVW_PRIVATE *pdwvw ; - BUF_UNION ubuf ; - int *iptr ; - int k, bufferlen, readcount = 0, count ; - sf_count_t total = 0 ; - double normfact ; - - if (! psf->codec_data) - return 0 ; - pdwvw = (DWVW_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = dwvw_decode_data (psf, pdwvw, iptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * (double) (iptr [k]) ; - - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - - return total ; -} /* dwvw_read_d */ - -static int -dwvw_decode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int *ptr, int len) -{ int count ; - int delta_width_modifier, delta_width, delta_negative, delta, sample ; - - /* Restore state from last decode call. */ - delta_width = pdwvw->last_delta_width ; - sample = pdwvw->last_sample ; - - for (count = 0 ; count < len ; count++) - { /* If bit_count parameter is zero get the delta_width_modifier. */ - delta_width_modifier = dwvw_decode_load_bits (psf, pdwvw, -1) ; - - /* Check for end of input bit stream. Break loop if end. */ - if (delta_width_modifier < 0 || (pdwvw->b.end == 0 && count == 0)) - break ; - - if (delta_width_modifier && dwvw_decode_load_bits (psf, pdwvw, 1)) - delta_width_modifier = - delta_width_modifier ; - - /* Calculate the current word width. */ - delta_width = (delta_width + delta_width_modifier + pdwvw->bit_width) % pdwvw->bit_width ; - - /* Load the delta. */ - delta = 0 ; - if (delta_width) - { delta = dwvw_decode_load_bits (psf, pdwvw, delta_width - 1) | (1 << (delta_width - 1)) ; - delta_negative = dwvw_decode_load_bits (psf, pdwvw, 1) ; - if (delta == pdwvw->max_delta - 1) - delta += dwvw_decode_load_bits (psf, pdwvw, 1) ; - if (delta_negative) - delta = -delta ; - } ; - - /* Calculate the sample */ - sample += delta ; - - if (sample >= pdwvw->max_delta) - sample -= pdwvw->span ; - else if (sample < - pdwvw->max_delta) - sample += pdwvw->span ; - - /* Store the sample justifying to the most significant bit. */ - ptr [count] = sample << (32 - pdwvw->bit_width) ; - - if (pdwvw->b.end == 0 && pdwvw->bit_count == 0) - break ; - } ; - - pdwvw->last_delta_width = delta_width ; - pdwvw->last_sample = sample ; - - pdwvw->samplecount += count ; - - return count ; -} /* dwvw_decode_data */ - -static int -dwvw_decode_load_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int bit_count) -{ int output = 0, get_dwm = SF_FALSE ; - - /* - ** Depending on the value of parameter bit_count, either get the - ** required number of bits (ie bit_count > 0) or the - ** delta_width_modifier (otherwise). - */ - - if (bit_count < 0) - { get_dwm = SF_TRUE ; - /* modify bit_count to ensure we have enought bits for finding dwm. */ - bit_count = pdwvw->dwm_maxsize ; - } ; - - /* Load bits in bit reseviour. */ - while (pdwvw->bit_count < bit_count) - { if (pdwvw->b.index >= pdwvw->b.end) - { pdwvw->b.end = psf_fread (pdwvw->b.buffer, 1, sizeof (pdwvw->b.buffer), psf) ; - pdwvw->b.index = 0 ; - } ; - - /* Check for end of input stream. */ - if (bit_count < 8 && pdwvw->b.end == 0) - return -1 ; - - pdwvw->bits = (pdwvw->bits << 8) ; - - if (pdwvw->b.index < pdwvw->b.end) - { pdwvw->bits |= pdwvw->b.buffer [pdwvw->b.index] ; - pdwvw->b.index ++ ; - } ; - pdwvw->bit_count += 8 ; - } ; - - /* If asked to get bits do so. */ - if (! get_dwm) - { output = (pdwvw->bits >> (pdwvw->bit_count - bit_count)) & ((1 << bit_count) - 1) ; - pdwvw->bit_count -= bit_count ; - return output ; - } ; - - /* Otherwise must have been asked to get delta_width_modifier. */ - while (output < (pdwvw->dwm_maxsize)) - { pdwvw->bit_count -= 1 ; - if (pdwvw->bits & (1 << pdwvw->bit_count)) - break ; - output += 1 ; - } ; - - return output ; -} /* dwvw_decode_load_bits */ - -static void -dwvw_read_reset (DWVW_PRIVATE *pdwvw) -{ int bitwidth = pdwvw->bit_width ; - - memset (pdwvw, 0, sizeof (DWVW_PRIVATE)) ; - - pdwvw->bit_width = bitwidth ; - pdwvw->dwm_maxsize = bitwidth / 2 ; - pdwvw->max_delta = 1 << (bitwidth - 1) ; - pdwvw->span = 1 << bitwidth ; -} /* dwvw_read_reset */ - -static void -dwvw_encode_store_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int data, int new_bits) -{ int byte ; - - /* Shift the bits into the resevoir. */ - pdwvw->bits = (pdwvw->bits << new_bits) | (data & ((1 << new_bits) - 1)) ; - pdwvw->bit_count += new_bits ; - - /* Transfer bit to buffer. */ - while (pdwvw->bit_count >= 8) - { byte = pdwvw->bits >> (pdwvw->bit_count - 8) ; - pdwvw->bit_count -= 8 ; - pdwvw->b.buffer [pdwvw->b.index] = byte & 0xFF ; - pdwvw->b.index ++ ; - } ; - - if (pdwvw->b.index > SIGNED_SIZEOF (pdwvw->b.buffer) - 4) - { psf_fwrite (pdwvw->b.buffer, 1, pdwvw->b.index, psf) ; - pdwvw->b.index = 0 ; - } ; - - return ; -} /* dwvw_encode_store_bits */ - -#if 0 -/* Debigging routine. */ -static void -dump_bits (DWVW_PRIVATE *pdwvw) -{ int k, mask ; - - for (k = 0 ; k < 10 && k < pdwvw->b.index ; k++) - { mask = 0x80 ; - while (mask) - { putchar (mask & pdwvw->b.buffer [k] ? '1' : '0') ; - mask >>= 1 ; - } ; - putchar (' ') ; - } - - for (k = pdwvw->bit_count - 1 ; k >= 0 ; k --) - putchar (pdwvw->bits & (1 << k) ? '1' : '0') ; - - putchar ('\n') ; -} /* dump_bits */ -#endif - -#define HIGHEST_BIT(x, count) \ - { int y = x ; \ - (count) = 0 ; \ - while (y) \ - { (count) ++ ; \ - y >>= 1 ; \ - } ; \ - } ; - -static int -dwvw_encode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, const int *ptr, int len) -{ int count ; - int delta_width_modifier, delta, delta_negative, delta_width, extra_bit ; - - for (count = 0 ; count < len ; count++) - { delta = (ptr [count] >> (32 - pdwvw->bit_width)) - pdwvw->last_sample ; - - /* Calculate extra_bit if needed. */ - extra_bit = -1 ; - delta_negative = 0 ; - if (delta < -pdwvw->max_delta) - delta = pdwvw->max_delta + (delta % pdwvw->max_delta) ; - else if (delta == -pdwvw->max_delta) - { extra_bit = 1 ; - delta_negative = 1 ; - delta = pdwvw->max_delta - 1 ; - } - else if (delta > pdwvw->max_delta) - { delta_negative = 1 ; - delta = pdwvw->span - delta ; - delta = abs (delta) ; - } - else if (delta == pdwvw->max_delta) - { extra_bit = 1 ; - delta = pdwvw->max_delta - 1 ; - } - else if (delta < 0) - { delta_negative = 1 ; - delta = abs (delta) ; - } ; - - if (delta == pdwvw->max_delta - 1 && extra_bit == -1) - extra_bit = 0 ; - - /* Find width in bits of delta */ - HIGHEST_BIT (delta, delta_width) ; - - /* Calculate the delta_width_modifier */ - delta_width_modifier = (delta_width - pdwvw->last_delta_width) % pdwvw->bit_width ; - if (delta_width_modifier > pdwvw->dwm_maxsize) - delta_width_modifier -= pdwvw->bit_width ; - if (delta_width_modifier < -pdwvw->dwm_maxsize) - delta_width_modifier += pdwvw->bit_width ; - - /* Write delta_width_modifier zeros, followed by terminating '1'. */ - dwvw_encode_store_bits (psf, pdwvw, 0, abs (delta_width_modifier)) ; - if (abs (delta_width_modifier) != pdwvw->dwm_maxsize) - dwvw_encode_store_bits (psf, pdwvw, 1, 1) ; - - /* Write delta_width_modifier sign. */ - if (delta_width_modifier < 0) - dwvw_encode_store_bits (psf, pdwvw, 1, 1) ; - if (delta_width_modifier > 0) - dwvw_encode_store_bits (psf, pdwvw, 0, 1) ; - - /* Write delta and delta sign bit. */ - if (delta_width) - { dwvw_encode_store_bits (psf, pdwvw, delta, abs (delta_width) - 1) ; - dwvw_encode_store_bits (psf, pdwvw, (delta_negative ? 1 : 0), 1) ; - } ; - - /* Write extra bit!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ - if (extra_bit >= 0) - dwvw_encode_store_bits (psf, pdwvw, extra_bit, 1) ; - - pdwvw->last_sample = ptr [count] >> (32 - pdwvw->bit_width) ; - pdwvw->last_delta_width = delta_width ; - } ; - - pdwvw->samplecount += count ; - - return count ; -} /* dwvw_encode_data */ - -static sf_count_t -dwvw_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ DWVW_PRIVATE *pdwvw ; - BUF_UNION ubuf ; - int *iptr ; - int k, bufferlen, writecount = 0, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pdwvw = (DWVW_PRIVATE*) psf->codec_data ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - iptr [k] = ptr [total + k] << 16 ; - count = dwvw_encode_data (psf, pdwvw, iptr, writecount) ; - - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - - return total ; -} /* dwvw_write_s */ - -static sf_count_t -dwvw_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ DWVW_PRIVATE *pdwvw ; - int writecount, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pdwvw = (DWVW_PRIVATE*) psf->codec_data ; - - while (len > 0) - { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; - - count = dwvw_encode_data (psf, pdwvw, ptr, writecount) ; - - total += count ; - len -= count ; - - if (count != writecount) - break ; - } ; - - return total ; -} /* dwvw_write_i */ - -static sf_count_t -dwvw_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ DWVW_PRIVATE *pdwvw ; - BUF_UNION ubuf ; - int *iptr ; - int k, bufferlen, writecount = 0, count ; - sf_count_t total = 0 ; - float normfact ; - - if (! psf->codec_data) - return 0 ; - pdwvw = (DWVW_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : 1.0 ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - iptr [k] = lrintf (normfact * ptr [total + k]) ; - count = dwvw_encode_data (psf, pdwvw, iptr, writecount) ; - - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - - return total ; -} /* dwvw_write_f */ - -static sf_count_t -dwvw_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ DWVW_PRIVATE *pdwvw ; - BUF_UNION ubuf ; - int *iptr ; - int k, bufferlen, writecount = 0, count ; - sf_count_t total = 0 ; - double normfact ; - - if (! psf->codec_data) - return 0 ; - pdwvw = (DWVW_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : 1.0 ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - iptr [k] = lrint (normfact * ptr [total + k]) ; - count = dwvw_encode_data (psf, pdwvw, iptr, writecount) ; - - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - - return total ; -} /* dwvw_write_d */ - diff --git a/libs/libsndfile/src/file_io.c b/libs/libsndfile/src/file_io.c deleted file mode 100644 index 26d3d6d6ae..0000000000 --- a/libs/libsndfile/src/file_io.c +++ /dev/null @@ -1,1550 +0,0 @@ -/* -** Copyright (C) 2002-2013 Erik de Castro Lopo -** Copyright (C) 2003 Ross Bencina -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* -** The file is split into three sections as follows: -** - The top section (USE_WINDOWS_API == 0) for Linux, Unix and MacOSX -** systems (including Cygwin). -** - The middle section (USE_WINDOWS_API == 1) for microsoft windows -** (including MinGW) using the native windows API. -** - A legacy windows section which attempted to work around grevious -** bugs in microsoft's POSIX implementation. -*/ - -/* -** The header file sfconfig.h MUST be included before the others to ensure -** that large file support is enabled correctly on Unix systems. -*/ - -#include "sfconfig.h" - -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if (HAVE_DECL_S_IRGRP == 0) -#include -#endif - -#include -#include -#include -#include - -#include "sndfile.h" -#include "common.h" - -#define SENSIBLE_SIZE (0x40000000) - -/* -** Neat solution to the Win32/OS2 binary file flage requirement. -** If O_BINARY isn't already defined by the inclusion of the system -** headers, set it to zero. -*/ -#ifndef O_BINARY -#define O_BINARY 0 -#endif - -static void psf_log_syserr (SF_PRIVATE *psf, int error) ; - -#if (USE_WINDOWS_API == 0) - -/*------------------------------------------------------------------------------ -** Win32 stuff at the bottom of the file. Unix and other sensible OSes here. -*/ - -static int psf_close_fd (int fd) ; -static int psf_open_fd (PSF_FILE * pfile) ; -static sf_count_t psf_get_filelen_fd (int fd) ; - -int -psf_fopen (SF_PRIVATE *psf) -{ - psf->error = 0 ; - psf->file.filedes = psf_open_fd (&psf->file) ; - - if (psf->file.filedes == - SFE_BAD_OPEN_MODE) - { psf->error = SFE_BAD_OPEN_MODE ; - psf->file.filedes = -1 ; - return psf->error ; - } ; - - if (psf->file.filedes == -1) - psf_log_syserr (psf, errno) ; - - return psf->error ; -} /* psf_fopen */ - -int -psf_fclose (SF_PRIVATE *psf) -{ int retval ; - - if (psf->virtual_io) - return 0 ; - - if (psf->file.do_not_close_descriptor) - { psf->file.filedes = -1 ; - return 0 ; - } ; - - if ((retval = psf_close_fd (psf->file.filedes)) == -1) - psf_log_syserr (psf, errno) ; - - psf->file.filedes = -1 ; - - return retval ; -} /* psf_fclose */ - -int -psf_open_rsrc (SF_PRIVATE *psf) -{ - if (psf->rsrc.filedes > 0) - return 0 ; - - /* Test for MacOSX style resource fork on HPFS or HPFS+ filesystems. */ - snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s/..namedfork/rsrc", psf->file.path.c) ; - psf->error = SFE_NO_ERROR ; - if ((psf->rsrc.filedes = psf_open_fd (&psf->rsrc)) >= 0) - { psf->rsrclength = psf_get_filelen_fd (psf->rsrc.filedes) ; - if (psf->rsrclength > 0 || (psf->rsrc.mode & SFM_WRITE)) - return SFE_NO_ERROR ; - psf_close_fd (psf->rsrc.filedes) ; - psf->rsrc.filedes = -1 ; - } ; - - if (psf->rsrc.filedes == - SFE_BAD_OPEN_MODE) - { psf->error = SFE_BAD_OPEN_MODE ; - return psf->error ; - } ; - - /* - ** Now try for a resource fork stored as a separate file in the same - ** directory, but preceded with a dot underscore. - */ - snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s._%s", psf->file.dir.c, psf->file.name.c) ; - psf->error = SFE_NO_ERROR ; - if ((psf->rsrc.filedes = psf_open_fd (&psf->rsrc)) >= 0) - { psf->rsrclength = psf_get_filelen_fd (psf->rsrc.filedes) ; - return SFE_NO_ERROR ; - } ; - - /* - ** Now try for a resource fork stored in a separate file in the - ** .AppleDouble/ directory. - */ - snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s.AppleDouble/%s", psf->file.dir.c, psf->file.name.c) ; - psf->error = SFE_NO_ERROR ; - if ((psf->rsrc.filedes = psf_open_fd (&psf->rsrc)) >= 0) - { psf->rsrclength = psf_get_filelen_fd (psf->rsrc.filedes) ; - return SFE_NO_ERROR ; - } ; - - /* No resource file found. */ - if (psf->rsrc.filedes == -1) - psf_log_syserr (psf, errno) ; - - psf->rsrc.filedes = -1 ; - - return psf->error ; -} /* psf_open_rsrc */ - -sf_count_t -psf_get_filelen (SF_PRIVATE *psf) -{ sf_count_t filelen ; - - if (psf->virtual_io) - return psf->vio.get_filelen (psf->vio_user_data) ; - - filelen = psf_get_filelen_fd (psf->file.filedes) ; - - if (filelen == -1) - { psf_log_syserr (psf, errno) ; - return (sf_count_t) -1 ; - } ; - - if (filelen == -SFE_BAD_STAT_SIZE) - { psf->error = SFE_BAD_STAT_SIZE ; - return (sf_count_t) -1 ; - } ; - - switch (psf->file.mode) - { case SFM_WRITE : - filelen = filelen - psf->fileoffset ; - break ; - - case SFM_READ : - if (psf->fileoffset > 0 && psf->filelength > 0) - filelen = psf->filelength ; - break ; - - case SFM_RDWR : - /* - ** Cannot open embedded files SFM_RDWR so we don't need to - ** subtract psf->fileoffset. We already have the answer we - ** need. - */ - break ; - - default : - /* Shouldn't be here, so return error. */ - filelen = -1 ; - } ; - - return filelen ; -} /* psf_get_filelen */ - -int -psf_close_rsrc (SF_PRIVATE *psf) -{ psf_close_fd (psf->rsrc.filedes) ; - psf->rsrc.filedes = -1 ; - return 0 ; -} /* psf_close_rsrc */ - -int -psf_set_stdio (SF_PRIVATE *psf) -{ int error = 0 ; - - switch (psf->file.mode) - { case SFM_RDWR : - error = SFE_OPEN_PIPE_RDWR ; - break ; - - case SFM_READ : - psf->file.filedes = 0 ; - break ; - - case SFM_WRITE : - psf->file.filedes = 1 ; - break ; - - default : - error = SFE_BAD_OPEN_MODE ; - break ; - } ; - psf->filelength = 0 ; - - return error ; -} /* psf_set_stdio */ - -void -psf_set_file (SF_PRIVATE *psf, int fd) -{ psf->file.filedes = fd ; -} /* psf_set_file */ - -int -psf_file_valid (SF_PRIVATE *psf) -{ return (psf->file.filedes >= 0) ? SF_TRUE : SF_FALSE ; -} /* psf_set_file */ - -sf_count_t -psf_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence) -{ sf_count_t current_pos, new_position ; - - if (psf->virtual_io) - return psf->vio.seek (offset, whence, psf->vio_user_data) ; - - current_pos = psf_ftell (psf) ; - - switch (whence) - { case SEEK_SET : - offset += psf->fileoffset ; - break ; - - case SEEK_END : - if (psf->file.mode == SFM_WRITE) - { new_position = lseek (psf->file.filedes, offset, whence) ; - - if (new_position < 0) - psf_log_syserr (psf, errno) ; - - return new_position - psf->fileoffset ; - } ; - - /* Transform SEEK_END into a SEEK_SET, ie find the file - ** length add the requested offset (should be <= 0) to - ** get the offset wrt the start of file. - */ - whence = SEEK_SET ; - offset = lseek (psf->file.filedes, 0, SEEK_END) + offset ; - break ; - - case SEEK_CUR : - /* Translate a SEEK_CUR into a SEEK_SET. */ - offset += current_pos ; - whence = SEEK_SET ; - break ; - - default : - /* We really should not be here. */ - psf_log_printf (psf, "psf_fseek : whence is %d *****.\n", whence) ; - return 0 ; - } ; - - if (current_pos != offset) - new_position = lseek (psf->file.filedes, offset, whence) ; - else - new_position = offset ; - - if (new_position < 0) - psf_log_syserr (psf, errno) ; - - new_position -= psf->fileoffset ; - - return new_position ; -} /* psf_fseek */ - -sf_count_t -psf_fread (void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf) -{ sf_count_t total = 0 ; - ssize_t count ; - - if (psf->virtual_io) - return psf->vio.read (ptr, bytes*items, psf->vio_user_data) / bytes ; - - items *= bytes ; - - /* Do this check after the multiplication above. */ - if (items <= 0) - return 0 ; - - while (items > 0) - { /* Break the read down to a sensible size. */ - count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : (ssize_t) items ; - - count = read (psf->file.filedes, ((char*) ptr) + total, (size_t) count) ; - - if (count == -1) - { if (errno == EINTR) - continue ; - - psf_log_syserr (psf, errno) ; - break ; - } ; - - if (count == 0) - break ; - - total += count ; - items -= count ; - } ; - - if (psf->is_pipe) - psf->pipeoffset += total ; - - return total / bytes ; -} /* psf_fread */ - -sf_count_t -psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf) -{ sf_count_t total = 0 ; - ssize_t count ; - - if (psf->virtual_io) - return psf->vio.write (ptr, bytes*items, psf->vio_user_data) / bytes ; - - items *= bytes ; - - /* Do this check after the multiplication above. */ - if (items <= 0) - return 0 ; - - while (items > 0) - { /* Break the writes down to a sensible size. */ - count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : items ; - - count = write (psf->file.filedes, ((const char*) ptr) + total, count) ; - - if (count == -1) - { if (errno == EINTR) - continue ; - - psf_log_syserr (psf, errno) ; - break ; - } ; - - if (count == 0) - break ; - - total += count ; - items -= count ; - } ; - - if (psf->is_pipe) - psf->pipeoffset += total ; - - return total / bytes ; -} /* psf_fwrite */ - -sf_count_t -psf_ftell (SF_PRIVATE *psf) -{ sf_count_t pos ; - - if (psf->virtual_io) - return psf->vio.tell (psf->vio_user_data) ; - - if (psf->is_pipe) - return psf->pipeoffset ; - - pos = lseek (psf->file.filedes, 0, SEEK_CUR) ; - - if (pos == ((sf_count_t) -1)) - { psf_log_syserr (psf, errno) ; - return -1 ; - } ; - - return pos - psf->fileoffset ; -} /* psf_ftell */ - -static int -psf_close_fd (int fd) -{ int retval ; - - if (fd < 0) - return 0 ; - - while ((retval = close (fd)) == -1 && errno == EINTR) - /* Do nothing. */ ; - - return retval ; -} /* psf_close_fd */ - -sf_count_t -psf_fgets (char *buffer, sf_count_t bufsize, SF_PRIVATE *psf) -{ sf_count_t k = 0 ; - sf_count_t count ; - - while (k < bufsize - 1) - { count = read (psf->file.filedes, &(buffer [k]), 1) ; - - if (count == -1) - { if (errno == EINTR) - continue ; - - psf_log_syserr (psf, errno) ; - break ; - } ; - - if (count == 0 || buffer [k++] == '\n') - break ; - } ; - - buffer [k] = 0 ; - - return k ; -} /* psf_fgets */ - -int -psf_is_pipe (SF_PRIVATE *psf) -{ struct stat statbuf ; - - if (psf->virtual_io) - return SF_FALSE ; - - if (fstat (psf->file.filedes, &statbuf) == -1) - { psf_log_syserr (psf, errno) ; - /* Default to maximum safety. */ - return SF_TRUE ; - } ; - - if (S_ISFIFO (statbuf.st_mode) || S_ISSOCK (statbuf.st_mode)) - return SF_TRUE ; - - return SF_FALSE ; -} /* psf_is_pipe */ - -static sf_count_t -psf_get_filelen_fd (int fd) -{ -#if (SIZEOF_OFF_T == 4 && SIZEOF_SF_COUNT_T == 8 && HAVE_FSTAT64) - struct stat64 statbuf ; - - if (fstat64 (fd, &statbuf) == -1) - return (sf_count_t) -1 ; - - return statbuf.st_size ; -#else - struct stat statbuf ; - - if (fstat (fd, &statbuf) == -1) - return (sf_count_t) -1 ; - - return statbuf.st_size ; -#endif -} /* psf_get_filelen_fd */ - -int -psf_ftruncate (SF_PRIVATE *psf, sf_count_t len) -{ int retval ; - - /* Returns 0 on success, non-zero on failure. */ - if (len < 0) - return -1 ; - - if ((sizeof (off_t) < sizeof (sf_count_t)) && len > 0x7FFFFFFF) - return -1 ; - - retval = ftruncate (psf->file.filedes, len) ; - - if (retval == -1) - psf_log_syserr (psf, errno) ; - - return retval ; -} /* psf_ftruncate */ - -void -psf_init_files (SF_PRIVATE *psf) -{ psf->file.filedes = -1 ; - psf->rsrc.filedes = -1 ; - psf->file.savedes = -1 ; -} /* psf_init_files */ - -void -psf_use_rsrc (SF_PRIVATE *psf, int on_off) -{ - if (on_off) - { if (psf->file.filedes != psf->rsrc.filedes) - { psf->file.savedes = psf->file.filedes ; - psf->file.filedes = psf->rsrc.filedes ; - } ; - } - else if (psf->file.filedes == psf->rsrc.filedes) - psf->file.filedes = psf->file.savedes ; - - return ; -} /* psf_use_rsrc */ - -static int -psf_open_fd (PSF_FILE * pfile) -{ int fd, oflag, mode ; - - /* - ** Sanity check. If everything is OK, this test and the printfs will - ** be optimised out. This is meant to catch the problems caused by - ** "sfconfig.h" being included after . - */ - if (sizeof (sf_count_t) != 8) - { puts ("\n\n*** Fatal error : sizeof (sf_count_t) != 8") ; - puts ("*** This means that libsndfile was not configured correctly.\n") ; - exit (1) ; - } ; - - switch (pfile->mode) - { case SFM_READ : - oflag = O_RDONLY | O_BINARY ; - mode = 0 ; - break ; - - case SFM_WRITE : - oflag = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ; - mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ; - break ; - - case SFM_RDWR : - oflag = O_RDWR | O_CREAT | O_BINARY ; - mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ; - break ; - - default : - return - SFE_BAD_OPEN_MODE ; - break ; - } ; - - if (mode == 0) - fd = open (pfile->path.c, oflag) ; - else - fd = open (pfile->path.c, oflag, mode) ; - - return fd ; -} /* psf_open_fd */ - -static void -psf_log_syserr (SF_PRIVATE *psf, int error) -{ - /* Only log an error if no error has been set yet. */ - if (psf->error == 0) - { psf->error = SFE_SYSTEM ; - snprintf (psf->syserr, sizeof (psf->syserr), "System error : %s.", strerror (error)) ; - } ; - - return ; -} /* psf_log_syserr */ - -void -psf_fsync (SF_PRIVATE *psf) -{ -#if HAVE_FSYNC - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - fsync (psf->file.filedes) ; -#else - psf = NULL ; -#endif -} /* psf_fsync */ - -#elif USE_WINDOWS_API - -/* Win32 file i/o functions implemented using native Win32 API */ - -#include -#include - -static int psf_close_handle (HANDLE handle) ; -static HANDLE psf_open_handle (PSF_FILE * pfile) ; -static sf_count_t psf_get_filelen_handle (HANDLE handle) ; - -/* USE_WINDOWS_API */ int -psf_fopen (SF_PRIVATE *psf) -{ - psf->error = 0 ; - psf->file.handle = psf_open_handle (&psf->file) ; - - if (psf->file.handle == NULL) - psf_log_syserr (psf, GetLastError ()) ; - - return psf->error ; -} /* psf_fopen */ - -/* USE_WINDOWS_API */ int -psf_fclose (SF_PRIVATE *psf) -{ int retval ; - - if (psf->virtual_io) - return 0 ; - - if (psf->file.do_not_close_descriptor) - { psf->file.handle = NULL ; - return 0 ; - } ; - - if ((retval = psf_close_handle (psf->file.handle)) == -1) - psf_log_syserr (psf, GetLastError ()) ; - - psf->file.handle = NULL ; - - return retval ; -} /* psf_fclose */ - -/* USE_WINDOWS_API */ int -psf_open_rsrc (SF_PRIVATE *psf) -{ - if (psf->rsrc.handle != NULL) - return 0 ; - - /* Test for MacOSX style resource fork on HPFS or HPFS+ filesystems. */ - snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s/rsrc", psf->file.path.c) ; - psf->error = SFE_NO_ERROR ; - if ((psf->rsrc.handle = psf_open_handle (&psf->rsrc)) != NULL) - { psf->rsrclength = psf_get_filelen_handle (psf->rsrc.handle) ; - return SFE_NO_ERROR ; - } ; - - /* - ** Now try for a resource fork stored as a separate file in the same - ** directory, but preceded with a dot underscore. - */ - snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s._%s", psf->file.dir.c, psf->file.name.c) ; - psf->error = SFE_NO_ERROR ; - if ((psf->rsrc.handle = psf_open_handle (&psf->rsrc)) != NULL) - { psf->rsrclength = psf_get_filelen_handle (psf->rsrc.handle) ; - return SFE_NO_ERROR ; - } ; - - /* - ** Now try for a resource fork stored in a separate file in the - ** .AppleDouble/ directory. - */ - snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s.AppleDouble/%s", psf->file.dir.c, psf->file.name.c) ; - psf->error = SFE_NO_ERROR ; - if ((psf->rsrc.handle = psf_open_handle (&psf->rsrc)) != NULL) - { psf->rsrclength = psf_get_filelen_handle (psf->rsrc.handle) ; - return SFE_NO_ERROR ; - } ; - - /* No resource file found. */ - if (psf->rsrc.handle == NULL) - psf_log_syserr (psf, GetLastError ()) ; - - psf->rsrc.handle = NULL ; - - return psf->error ; -} /* psf_open_rsrc */ - -/* USE_WINDOWS_API */ sf_count_t -psf_get_filelen (SF_PRIVATE *psf) -{ sf_count_t filelen ; - - if (psf->virtual_io) - return psf->vio.get_filelen (psf->vio_user_data) ; - - filelen = psf_get_filelen_handle (psf->file.handle) ; - - if (filelen == -1) - { psf_log_syserr (psf, errno) ; - return (sf_count_t) -1 ; - } ; - - if (filelen == -SFE_BAD_STAT_SIZE) - { psf->error = SFE_BAD_STAT_SIZE ; - return (sf_count_t) -1 ; - } ; - - switch (psf->file.mode) - { case SFM_WRITE : - filelen = filelen - psf->fileoffset ; - break ; - - case SFM_READ : - if (psf->fileoffset > 0 && psf->filelength > 0) - filelen = psf->filelength ; - break ; - - case SFM_RDWR : - /* - ** Cannot open embedded files SFM_RDWR so we don't need to - ** subtract psf->fileoffset. We already have the answer we - ** need. - */ - break ; - - default : - /* Shouldn't be here, so return error. */ - filelen = -1 ; - } ; - - return filelen ; -} /* psf_get_filelen */ - -/* USE_WINDOWS_API */ void -psf_init_files (SF_PRIVATE *psf) -{ psf->file.handle = NULL ; - psf->rsrc.handle = NULL ; - psf->file.hsaved = NULL ; -} /* psf_init_files */ - -/* USE_WINDOWS_API */ void -psf_use_rsrc (SF_PRIVATE *psf, int on_off) -{ - if (on_off) - { if (psf->file.handle != psf->rsrc.handle) - { psf->file.hsaved = psf->file.handle ; - psf->file.handle = psf->rsrc.handle ; - } ; - } - else if (psf->file.handle == psf->rsrc.handle) - psf->file.handle = psf->file.hsaved ; - - return ; -} /* psf_use_rsrc */ - -/* USE_WINDOWS_API */ static HANDLE -psf_open_handle (PSF_FILE * pfile) -{ DWORD dwDesiredAccess ; - DWORD dwShareMode ; - DWORD dwCreationDistribution ; - HANDLE handle ; - - switch (pfile->mode) - { case SFM_READ : - dwDesiredAccess = GENERIC_READ ; - dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE ; - dwCreationDistribution = OPEN_EXISTING ; - break ; - - case SFM_WRITE : - dwDesiredAccess = GENERIC_WRITE ; - dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE ; - dwCreationDistribution = CREATE_ALWAYS ; - break ; - - case SFM_RDWR : - dwDesiredAccess = GENERIC_READ | GENERIC_WRITE ; - dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE ; - dwCreationDistribution = OPEN_ALWAYS ; - break ; - - default : - return NULL ; - } ; - - if (pfile->use_wchar) - handle = CreateFileW ( - pfile->path.wc, /* pointer to name of the file */ - dwDesiredAccess, /* access (read-write) mode */ - dwShareMode, /* share mode */ - 0, /* pointer to security attributes */ - dwCreationDistribution, /* how to create */ - FILE_ATTRIBUTE_NORMAL, /* file attributes (could use FILE_FLAG_SEQUENTIAL_SCAN) */ - NULL /* handle to file with attributes to copy */ - ) ; - else - handle = CreateFile ( - pfile->path.c, /* pointer to name of the file */ - dwDesiredAccess, /* access (read-write) mode */ - dwShareMode, /* share mode */ - 0, /* pointer to security attributes */ - dwCreationDistribution, /* how to create */ - FILE_ATTRIBUTE_NORMAL, /* file attributes (could use FILE_FLAG_SEQUENTIAL_SCAN) */ - NULL /* handle to file with attributes to copy */ - ) ; - - if (handle == INVALID_HANDLE_VALUE) - return NULL ; - - return handle ; -} /* psf_open_handle */ - -/* USE_WINDOWS_API */ static void -psf_log_syserr (SF_PRIVATE *psf, int error) -{ LPVOID lpMsgBuf ; - - /* Only log an error if no error has been set yet. */ - if (psf->error == 0) - { psf->error = SFE_SYSTEM ; - - FormatMessage ( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - error, - MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &lpMsgBuf, - 0, - NULL - ) ; - - snprintf (psf->syserr, sizeof (psf->syserr), "System error : %s", (char*) lpMsgBuf) ; - LocalFree (lpMsgBuf) ; - } ; - - return ; -} /* psf_log_syserr */ - - -/* USE_WINDOWS_API */ int -psf_close_rsrc (SF_PRIVATE *psf) -{ psf_close_handle (psf->rsrc.handle) ; - psf->rsrc.handle = NULL ; - return 0 ; -} /* psf_close_rsrc */ - - -/* USE_WINDOWS_API */ int -psf_set_stdio (SF_PRIVATE *psf) -{ HANDLE handle = NULL ; - int error = 0 ; - - switch (psf->file.mode) - { case SFM_RDWR : - error = SFE_OPEN_PIPE_RDWR ; - break ; - - case SFM_READ : - handle = GetStdHandle (STD_INPUT_HANDLE) ; - psf->file.do_not_close_descriptor = 1 ; - break ; - - case SFM_WRITE : - handle = GetStdHandle (STD_OUTPUT_HANDLE) ; - psf->file.do_not_close_descriptor = 1 ; - break ; - - default : - error = SFE_BAD_OPEN_MODE ; - break ; - } ; - - psf->file.handle = handle ; - psf->filelength = 0 ; - - return error ; -} /* psf_set_stdio */ - -/* USE_WINDOWS_API */ void -psf_set_file (SF_PRIVATE *psf, int fd) -{ HANDLE handle ; - intptr_t osfhandle ; - - osfhandle = _get_osfhandle (fd) ; - handle = (HANDLE) osfhandle ; - - psf->file.handle = handle ; -} /* psf_set_file */ - -/* USE_WINDOWS_API */ int -psf_file_valid (SF_PRIVATE *psf) -{ if (psf->file.handle == NULL) - return SF_FALSE ; - if (psf->file.handle == INVALID_HANDLE_VALUE) - return SF_FALSE ; - return SF_TRUE ; -} /* psf_set_file */ - -/* USE_WINDOWS_API */ sf_count_t -psf_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence) -{ sf_count_t new_position ; - LONG lDistanceToMove, lDistanceToMoveHigh ; - DWORD dwMoveMethod ; - DWORD dwResult, dwError ; - - if (psf->virtual_io) - return psf->vio.seek (offset, whence, psf->vio_user_data) ; - - switch (whence) - { case SEEK_SET : - offset += psf->fileoffset ; - dwMoveMethod = FILE_BEGIN ; - break ; - - case SEEK_END : - dwMoveMethod = FILE_END ; - break ; - - default : - dwMoveMethod = FILE_CURRENT ; - break ; - } ; - - lDistanceToMove = (DWORD) (offset & 0xFFFFFFFF) ; - lDistanceToMoveHigh = (DWORD) ((offset >> 32) & 0xFFFFFFFF) ; - - dwResult = SetFilePointer (psf->file.handle, lDistanceToMove, &lDistanceToMoveHigh, dwMoveMethod) ; - - if (dwResult == 0xFFFFFFFF) - dwError = GetLastError () ; - else - dwError = NO_ERROR ; - - if (dwError != NO_ERROR) - { psf_log_syserr (psf, dwError) ; - return -1 ; - } ; - - new_position = (dwResult + ((__int64) lDistanceToMoveHigh << 32)) - psf->fileoffset ; - - return new_position ; -} /* psf_fseek */ - -/* USE_WINDOWS_API */ sf_count_t -psf_fread (void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf) -{ sf_count_t total = 0 ; - ssize_t count ; - DWORD dwNumberOfBytesRead ; - - if (psf->virtual_io) - return psf->vio.read (ptr, bytes*items, psf->vio_user_data) / bytes ; - - items *= bytes ; - - /* Do this check after the multiplication above. */ - if (items <= 0) - return 0 ; - - while (items > 0) - { /* Break the writes down to a sensible size. */ - count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : (ssize_t) items ; - - if (ReadFile (psf->file.handle, ((char*) ptr) + total, count, &dwNumberOfBytesRead, 0) == 0) - { psf_log_syserr (psf, GetLastError ()) ; - break ; - } - else - count = dwNumberOfBytesRead ; - - if (count == 0) - break ; - - total += count ; - items -= count ; - } ; - - if (psf->is_pipe) - psf->pipeoffset += total ; - - return total / bytes ; -} /* psf_fread */ - -/* USE_WINDOWS_API */ sf_count_t -psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf) -{ sf_count_t total = 0 ; - ssize_t count ; - DWORD dwNumberOfBytesWritten ; - - if (psf->virtual_io) - return psf->vio.write (ptr, bytes * items, psf->vio_user_data) / bytes ; - - items *= bytes ; - - /* Do this check after the multiplication above. */ - if (items <= 0) - return 0 ; - - while (items > 0) - { /* Break the writes down to a sensible size. */ - count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : (ssize_t) items ; - - if (WriteFile (psf->file.handle, ((const char*) ptr) + total, count, &dwNumberOfBytesWritten, 0) == 0) - { psf_log_syserr (psf, GetLastError ()) ; - break ; - } - else - count = dwNumberOfBytesWritten ; - - if (count == 0) - break ; - - total += count ; - items -= count ; - } ; - - if (psf->is_pipe) - psf->pipeoffset += total ; - - return total / bytes ; -} /* psf_fwrite */ - -/* USE_WINDOWS_API */ sf_count_t -psf_ftell (SF_PRIVATE *psf) -{ sf_count_t pos ; - LONG lDistanceToMoveLow, lDistanceToMoveHigh ; - DWORD dwResult, dwError ; - - if (psf->virtual_io) - return psf->vio.tell (psf->vio_user_data) ; - - if (psf->is_pipe) - return psf->pipeoffset ; - - lDistanceToMoveLow = 0 ; - lDistanceToMoveHigh = 0 ; - - dwResult = SetFilePointer (psf->file.handle, lDistanceToMoveLow, &lDistanceToMoveHigh, FILE_CURRENT) ; - - if (dwResult == 0xFFFFFFFF) - dwError = GetLastError () ; - else - dwError = NO_ERROR ; - - if (dwError != NO_ERROR) - { psf_log_syserr (psf, dwError) ; - return -1 ; - } ; - - pos = (dwResult + ((__int64) lDistanceToMoveHigh << 32)) ; - - return pos - psf->fileoffset ; -} /* psf_ftell */ - -/* USE_WINDOWS_API */ static int -psf_close_handle (HANDLE handle) -{ if (handle == NULL) - return 0 ; - - if (CloseHandle (handle) == 0) - return -1 ; - - return 0 ; -} /* psf_close_handle */ - -/* USE_WINDOWS_API */ sf_count_t -psf_fgets (char *buffer, sf_count_t bufsize, SF_PRIVATE *psf) -{ sf_count_t k = 0 ; - sf_count_t count ; - DWORD dwNumberOfBytesRead ; - - while (k < bufsize - 1) - { if (ReadFile (psf->file.handle, &(buffer [k]), 1, &dwNumberOfBytesRead, 0) == 0) - { psf_log_syserr (psf, GetLastError ()) ; - break ; - } - else - { count = dwNumberOfBytesRead ; - /* note that we only check for '\n' not other line endings such as CRLF */ - if (count == 0 || buffer [k++] == '\n') - break ; - } ; - } ; - - buffer [k] = 0 ; - - return k ; -} /* psf_fgets */ - -/* USE_WINDOWS_API */ int -psf_is_pipe (SF_PRIVATE *psf) -{ - if (psf->virtual_io) - return SF_FALSE ; - - if (GetFileType (psf->file.handle) == FILE_TYPE_DISK) - return SF_FALSE ; - - /* Default to maximum safety. */ - return SF_TRUE ; -} /* psf_is_pipe */ - -/* USE_WINDOWS_API */ sf_count_t -psf_get_filelen_handle (HANDLE handle) -{ sf_count_t filelen ; - DWORD dwFileSizeLow, dwFileSizeHigh, dwError = NO_ERROR ; - - dwFileSizeLow = GetFileSize (handle, &dwFileSizeHigh) ; - - if (dwFileSizeLow == 0xFFFFFFFF) - dwError = GetLastError () ; - - if (dwError != NO_ERROR) - return (sf_count_t) -1 ; - - filelen = dwFileSizeLow + ((__int64) dwFileSizeHigh << 32) ; - - return filelen ; -} /* psf_get_filelen_handle */ - -/* USE_WINDOWS_API */ void -psf_fsync (SF_PRIVATE *psf) -{ FlushFileBuffers (psf->file.handle) ; -} /* psf_fsync */ - - -/* USE_WINDOWS_API */ int -psf_ftruncate (SF_PRIVATE *psf, sf_count_t len) -{ int retval = 0 ; - LONG lDistanceToMoveLow, lDistanceToMoveHigh ; - DWORD dwResult, dwError = NO_ERROR ; - - /* This implementation trashes the current file position. - ** should it save and restore it? what if the current position is past - ** the new end of file? - */ - - /* Returns 0 on success, non-zero on failure. */ - if (len < 0) - return 1 ; - - lDistanceToMoveLow = (DWORD) (len & 0xFFFFFFFF) ; - lDistanceToMoveHigh = (DWORD) ((len >> 32) & 0xFFFFFFFF) ; - - dwResult = SetFilePointer (psf->file.handle, lDistanceToMoveLow, &lDistanceToMoveHigh, FILE_BEGIN) ; - - if (dwResult == 0xFFFFFFFF) - dwError = GetLastError () ; - - if (dwError != NO_ERROR) - { retval = -1 ; - psf_log_syserr (psf, dwError) ; - } - else - { /* Note: when SetEndOfFile is used to extend a file, the contents of the - ** new portion of the file is undefined. This is unlike chsize(), - ** which guarantees that the new portion of the file will be zeroed. - ** Not sure if this is important or not. - */ - if (SetEndOfFile (psf->file.handle) == 0) - { retval = -1 ; - psf_log_syserr (psf, GetLastError ()) ; - } ; - } ; - - return retval ; -} /* psf_ftruncate */ - - -#else -/* Win32 file i/o functions implemented using Unix-style file i/o API */ - -/* Win32 has a 64 file offset seek function: -** -** __int64 _lseeki64 (int handle, __int64 offset, int origin) ; -** -** It also has a 64 bit fstat function: -** -** int fstati64 (int, struct _stati64) ; -** -** but the fscking thing doesn't work!!!!! The file size parameter returned -** by this function is only valid up until more data is written at the end of -** the file. That makes this function completely 100% useless. -*/ - -#include -#include - -/* Win32 */ int -psf_fopen (SF_PRIVATE *psf, const char *pathname, int open_mode) -{ int oflag, mode ; - - switch (open_mode) - { case SFM_READ : - oflag = O_RDONLY | O_BINARY ; - mode = 0 ; - break ; - - case SFM_WRITE : - oflag = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ; - mode = S_IRUSR | S_IWUSR | S_IRGRP ; - break ; - - case SFM_RDWR : - oflag = O_RDWR | O_CREAT | O_BINARY ; - mode = S_IRUSR | S_IWUSR | S_IRGRP ; - break ; - - default : - psf->error = SFE_BAD_OPEN_MODE ; - return -1 ; - break ; - } ; - - if (mode == 0) - psf->file.filedes = open (pathname, oflag) ; - else - psf->file.filedes = open (pathname, oflag, mode) ; - - if (psf->file.filedes == -1) - psf_log_syserr (psf, errno) ; - - return psf->file.filedes ; -} /* psf_fopen */ - -/* Win32 */ sf_count_t -psf_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence) -{ sf_count_t new_position ; - - if (psf->virtual_io) - return psf->vio.seek (offset, whence, psf->vio_user_data) ; - - switch (whence) - { case SEEK_SET : - offset += psf->fileoffset ; - break ; - - case SEEK_END : - if (psf->file.mode == SFM_WRITE) - { new_position = _lseeki64 (psf->file.filedes, offset, whence) ; - - if (new_position < 0) - psf_log_syserr (psf, errno) ; - - return new_position - psf->fileoffset ; - } ; - - /* Transform SEEK_END into a SEEK_SET, ie find the file - ** length add the requested offset (should be <= 0) to - ** get the offset wrt the start of file. - */ - whence = SEEK_SET ; - offset = _lseeki64 (psf->file.filedes, 0, SEEK_END) + offset ; - break ; - - default : - /* No need to do anything about SEEK_CUR. */ - break ; - } ; - - /* - ** Bypass weird Win32-ism if necessary. - ** _lseeki64() returns an "invalid parameter" error if called with the - ** offset == 0 and whence == SEEK_CUR. - *** Use the _telli64() function instead. - */ - if (offset == 0 && whence == SEEK_CUR) - new_position = _telli64 (psf->file.filedes) ; - else - new_position = _lseeki64 (psf->file.filedes, offset, whence) ; - - if (new_position < 0) - psf_log_syserr (psf, errno) ; - - new_position -= psf->fileoffset ; - - return new_position ; -} /* psf_fseek */ - -/* Win32 */ sf_count_t -psf_fread (void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf) -{ sf_count_t total = 0 ; - ssize_t count ; - - if (psf->virtual_io) - return psf->vio.read (ptr, bytes*items, psf->vio_user_data) / bytes ; - - items *= bytes ; - - /* Do this check after the multiplication above. */ - if (items <= 0) - return 0 ; - - while (items > 0) - { /* Break the writes down to a sensible size. */ - count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : (ssize_t) items ; - - count = read (psf->file.filedes, ((char*) ptr) + total, (size_t) count) ; - - if (count == -1) - { if (errno == EINTR) - continue ; - - psf_log_syserr (psf, errno) ; - break ; - } ; - - if (count == 0) - break ; - - total += count ; - items -= count ; - } ; - - return total / bytes ; -} /* psf_fread */ - -/* Win32 */ sf_count_t -psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf) -{ sf_count_t total = 0 ; - ssize_t count ; - - if (psf->virtual_io) - return psf->vio.write (ptr, bytes*items, psf->vio_user_data) / bytes ; - - items *= bytes ; - - /* Do this check after the multiplication above. */ - if (items <= 0) - return 0 ; - - while (items > 0) - { /* Break the writes down to a sensible size. */ - count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : items ; - - count = write (psf->file.filedes, ((const char*) ptr) + total, count) ; - - if (count == -1) - { if (errno == EINTR) - continue ; - - psf_log_syserr (psf, errno) ; - break ; - } ; - - if (count == 0) - break ; - - total += count ; - items -= count ; - } ; - - return total / bytes ; -} /* psf_fwrite */ - -/* Win32 */ sf_count_t -psf_ftell (SF_PRIVATE *psf) -{ sf_count_t pos ; - - if (psf->virtual_io) - return psf->vio.tell (psf->vio_user_data) ; - - pos = _telli64 (psf->file.filedes) ; - - if (pos == ((sf_count_t) -1)) - { psf_log_syserr (psf, errno) ; - return -1 ; - } ; - - return pos - psf->fileoffset ; -} /* psf_ftell */ - -/* Win32 */ int -psf_fclose (SF_PRIVATE *psf) -{ int retval ; - - while ((retval = close (psf->file.filedes)) == -1 && errno == EINTR) - /* Do nothing. */ ; - - if (retval == -1) - psf_log_syserr (psf, errno) ; - - psf->file.filedes = -1 ; - - return retval ; -} /* psf_fclose */ - -/* Win32 */ sf_count_t -psf_fgets (char *buffer, sf_count_t bufsize, SF_PRIVATE *psf) -{ sf_count_t k = 0 ; - sf_count_t count ; - - while (k < bufsize - 1) - { count = read (psf->file.filedes, &(buffer [k]), 1) ; - - if (count == -1) - { if (errno == EINTR) - continue ; - - psf_log_syserr (psf, errno) ; - break ; - } ; - - if (count == 0 || buffer [k++] == '\n') - break ; - } ; - - buffer [k] = 0 ; - - return k ; -} /* psf_fgets */ - -/* Win32 */ int -psf_is_pipe (SF_PRIVATE *psf) -{ struct stat statbuf ; - - if (psf->virtual_io) - return SF_FALSE ; - - /* Not sure if this works. */ - if (fstat (psf->file.filedes, &statbuf) == -1) - { psf_log_syserr (psf, errno) ; - /* Default to maximum safety. */ - return SF_TRUE ; - } ; - - /* These macros are defined in Win32/unistd.h. */ - if (S_ISFIFO (statbuf.st_mode) || S_ISSOCK (statbuf.st_mode)) - return SF_TRUE ; - - return SF_FALSE ; -} /* psf_checkpipe */ - -/* Win32 */ sf_count_t -psf_get_filelen (SF_PRIVATE *psf) -{ -#if 0 - /* - ** Windoze is SOOOOO FUCKED!!!!!!! - ** This code should work but doesn't. Why? - ** Code below does work. - */ - struct _stati64 statbuf ; - - if (_fstati64 (psf->file.filedes, &statbuf)) - { psf_log_syserr (psf, errno) ; - return (sf_count_t) -1 ; - } ; - - return statbuf.st_size ; -#else - sf_count_t current, filelen ; - - if (psf->virtual_io) - return psf->vio.get_filelen (psf->vio_user_data) ; - - if ((current = _telli64 (psf->file.filedes)) < 0) - { psf_log_syserr (psf, errno) ; - return (sf_count_t) -1 ; - } ; - - /* - ** Lets face it, windoze if FUBAR!!! - ** - ** For some reason, I have to call _lseeki64() TWICE to get to the - ** end of the file. - ** - ** This might have been avoided if windows had implemented the POSIX - ** standard function fsync() but NO, that would have been too easy. - ** - ** I am VERY close to saying that windoze will no longer be supported - ** by libsndfile and changing the license to GPL at the same time. - */ - - _lseeki64 (psf->file.filedes, 0, SEEK_END) ; - - if ((filelen = _lseeki64 (psf->file.filedes, 0, SEEK_END)) < 0) - { psf_log_syserr (psf, errno) ; - return (sf_count_t) -1 ; - } ; - - if (filelen > current) - _lseeki64 (psf->file.filedes, current, SEEK_SET) ; - - switch (psf->file.mode) - { case SFM_WRITE : - filelen = filelen - psf->fileoffset ; - break ; - - case SFM_READ : - if (psf->fileoffset > 0 && psf->filelength > 0) - filelen = psf->filelength ; - break ; - - case SFM_RDWR : - /* - ** Cannot open embedded files SFM_RDWR so we don't need to - ** subtract psf->fileoffset. We already have the answer we - ** need. - */ - break ; - - default : - filelen = 0 ; - } ; - - return filelen ; -#endif -} /* psf_get_filelen */ - -/* Win32 */ int -psf_ftruncate (SF_PRIVATE *psf, sf_count_t len) -{ int retval ; - - /* Returns 0 on success, non-zero on failure. */ - if (len < 0) - return 1 ; - - /* The global village idiots at micorsoft decided to implement - ** nearly all the required 64 bit file offset functions except - ** for one, truncate. The fscking morons! - ** - ** This is not 64 bit file offset clean. Somone needs to clean - ** this up. - */ - if (len > 0x7FFFFFFF) - return -1 ; - - retval = chsize (psf->file.filedes, len) ; - - if (retval == -1) - psf_log_syserr (psf, errno) ; - - return retval ; -} /* psf_ftruncate */ - - -static void -psf_log_syserr (SF_PRIVATE *psf, int error) -{ - /* Only log an error if no error has been set yet. */ - if (psf->error == 0) - { psf->error = SFE_SYSTEM ; - snprintf (psf->syserr, sizeof (psf->syserr), "System error : %s", strerror (error)) ; - } ; - - return ; -} /* psf_log_syserr */ - -#endif - diff --git a/libs/libsndfile/src/flac.c b/libs/libsndfile/src/flac.c deleted file mode 100644 index bb74e94bc0..0000000000 --- a/libs/libsndfile/src/flac.c +++ /dev/null @@ -1,1385 +0,0 @@ -/* -** Copyright (C) 2004-2013 Erik de Castro Lopo -** Copyright (C) 2004 Tobias Gehrig -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#include - -#include "sndfile.h" -#include "common.h" - -#if HAVE_EXTERNAL_LIBS - -#include -#include -#include - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -#define FLAC_DEFAULT_COMPRESSION_LEVEL 5 - -#define ENC_BUFFER_SIZE 8192 - -typedef enum -{ PFLAC_PCM_SHORT = 50, - PFLAC_PCM_INT = 51, - PFLAC_PCM_FLOAT = 52, - PFLAC_PCM_DOUBLE = 53 -} PFLAC_PCM ; - -typedef struct -{ - FLAC__StreamDecoder *fsd ; - FLAC__StreamEncoder *fse ; - - PFLAC_PCM pcmtype ; - void* ptr ; - unsigned pos, len, remain ; - - FLAC__StreamMetadata *metadata ; - - const FLAC__int32 * const * wbuffer ; - FLAC__int32 * rbuffer [FLAC__MAX_CHANNELS] ; - - FLAC__int32* encbuffer ; - unsigned bufferpos ; - - const FLAC__Frame *frame ; - FLAC__bool bufferbackup ; - - unsigned compression ; -} FLAC_PRIVATE ; - -typedef struct -{ const char *tag ; - int type ; -} FLAC_TAG ; - -static sf_count_t flac_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; -static int flac_byterate (SF_PRIVATE *psf) ; -static int flac_close (SF_PRIVATE *psf) ; - -static int flac_enc_init (SF_PRIVATE *psf) ; -static int flac_read_header (SF_PRIVATE *psf) ; - -static sf_count_t flac_read_flac2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t flac_read_flac2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t flac_read_flac2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t flac_read_flac2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t flac_write_s2flac (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t flac_write_i2flac (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t flac_write_f2flac (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t flac_write_d2flac (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static void f2flac8_array (const float *src, FLAC__int32 *dest, int count, int normalize) ; -static void f2flac16_array (const float *src, FLAC__int32 *dest, int count, int normalize) ; -static void f2flac24_array (const float *src, FLAC__int32 *dest, int count, int normalize) ; -static void f2flac8_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize) ; -static void f2flac16_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize) ; -static void f2flac24_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize) ; -static void d2flac8_array (const double *src, FLAC__int32 *dest, int count, int normalize) ; -static void d2flac16_array (const double *src, FLAC__int32 *dest, int count, int normalize) ; -static void d2flac24_array (const double *src, FLAC__int32 *dest, int count, int normalize) ; -static void d2flac8_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize) ; -static void d2flac16_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize) ; -static void d2flac24_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize) ; - -static int flac_command (SF_PRIVATE *psf, int command, void *data, int datasize) ; - -/* Decoder Callbacks */ -static FLAC__StreamDecoderReadStatus sf_flac_read_callback (const FLAC__StreamDecoder *decoder, FLAC__byte buffer [], size_t *bytes, void *client_data) ; -static FLAC__StreamDecoderSeekStatus sf_flac_seek_callback (const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) ; -static FLAC__StreamDecoderTellStatus sf_flac_tell_callback (const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) ; -static FLAC__StreamDecoderLengthStatus sf_flac_length_callback (const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) ; -static FLAC__bool sf_flac_eof_callback (const FLAC__StreamDecoder *decoder, void *client_data) ; -static FLAC__StreamDecoderWriteStatus sf_flac_write_callback (const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer [], void *client_data) ; -static void sf_flac_meta_callback (const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) ; -static void sf_flac_error_callback (const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) ; - -/* Encoder Callbacks */ -static FLAC__StreamEncoderSeekStatus sf_flac_enc_seek_callback (const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) ; -static FLAC__StreamEncoderTellStatus sf_flac_enc_tell_callback (const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) ; -static FLAC__StreamEncoderWriteStatus sf_flac_enc_write_callback (const FLAC__StreamEncoder *encoder, const FLAC__byte buffer [], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) ; - -static void -s2flac8_array (const short *src, FLAC__int32 *dest, int count) -{ while (--count >= 0) - dest [count] = src [count] >> 8 ; -} /* s2flac8_array */ - -static void -s2flac16_array (const short *src, FLAC__int32 *dest, int count) -{ while (--count >= 0) - dest [count] = src [count] ; -} /* s2flac16_array */ - -static void -s2flac24_array (const short *src, FLAC__int32 *dest, int count) -{ while (--count >= 0) - dest [count] = src [count] << 8 ; -} /* s2flac24_array */ - -static void -i2flac8_array (const int *src, FLAC__int32 *dest, int count) -{ while (--count >= 0) - dest [count] = src [count] >> 24 ; -} /* i2flac8_array */ - -static void -i2flac16_array (const int *src, FLAC__int32 *dest, int count) -{ - while (--count >= 0) - dest [count] = src [count] >> 16 ; -} /* i2flac16_array */ - -static void -i2flac24_array (const int *src, FLAC__int32 *dest, int count) -{ while (--count >= 0) - dest [count] = src [count] >> 8 ; -} /* i2flac24_array */ - -static sf_count_t -flac_buffer_copy (SF_PRIVATE *psf) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - const FLAC__Frame *frame = pflac->frame ; - const FLAC__int32* const *buffer = pflac->wbuffer ; - unsigned i = 0, j, offset ; - - /* - ** frame->header.blocksize is variable and we're using a constant blocksize - ** of FLAC__MAX_BLOCK_SIZE. - ** Check our assumptions here. - */ - if (frame->header.blocksize > FLAC__MAX_BLOCK_SIZE) - { psf_log_printf (psf, "Ooops : frame->header.blocksize (%d) > FLAC__MAX_BLOCK_SIZE (%d)\n", __func__, __LINE__, frame->header.blocksize, FLAC__MAX_BLOCK_SIZE) ; - psf->error = SFE_INTERNAL ; - return 0 ; - } ; - - if (pflac->ptr == NULL) - { /* - ** Not sure why this code is here and not elsewhere. - ** Removing it causes valgrind errors. - */ - pflac->bufferbackup = SF_TRUE ; - for (i = 0 ; i < frame->header.channels ; i++) - { - if (pflac->rbuffer [i] == NULL) - pflac->rbuffer [i] = calloc (FLAC__MAX_BLOCK_SIZE, sizeof (FLAC__int32)) ; - - memcpy (pflac->rbuffer [i], buffer [i], frame->header.blocksize * sizeof (FLAC__int32)) ; - } ; - pflac->wbuffer = (const FLAC__int32* const*) pflac->rbuffer ; - - return 0 ; - } ; - - switch (pflac->pcmtype) - { case PFLAC_PCM_SHORT : - { short *retpcm = (short*) pflac->ptr ; - int shift = 16 - frame->header.bits_per_sample ; - if (shift < 0) - { shift = abs (shift) ; - for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++) - { offset = pflac->pos + i * frame->header.channels ; - - if (pflac->bufferpos >= frame->header.blocksize) - break ; - - for (j = 0 ; j < frame->header.channels ; j++) - retpcm [offset + j] = buffer [j][pflac->bufferpos] >> shift ; - pflac->remain -= frame->header.channels ; - pflac->bufferpos++ ; - } - } - else - { for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++) - { offset = pflac->pos + i * frame->header.channels ; - - if (pflac->bufferpos >= frame->header.blocksize) - break ; - - for (j = 0 ; j < frame->header.channels ; j++) - retpcm [offset + j] = (buffer [j][pflac->bufferpos]) << shift ; - - pflac->remain -= frame->header.channels ; - pflac->bufferpos++ ; - } ; - } ; - } ; - break ; - - case PFLAC_PCM_INT : - { int *retpcm = (int*) pflac->ptr ; - int shift = 32 - frame->header.bits_per_sample ; - for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++) - { offset = pflac->pos + i * frame->header.channels ; - - if (pflac->bufferpos >= frame->header.blocksize) - break ; - - for (j = 0 ; j < frame->header.channels ; j++) - retpcm [offset + j] = buffer [j][pflac->bufferpos] << shift ; - pflac->remain -= frame->header.channels ; - pflac->bufferpos++ ; - } ; - } ; - break ; - - case PFLAC_PCM_FLOAT : - { float *retpcm = (float*) pflac->ptr ; - float norm = (psf->norm_float == SF_TRUE) ? 1.0 / (1 << (frame->header.bits_per_sample - 1)) : 1.0 ; - - for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++) - { offset = pflac->pos + i * frame->header.channels ; - - if (pflac->bufferpos >= frame->header.blocksize) - break ; - - for (j = 0 ; j < frame->header.channels ; j++) - retpcm [offset + j] = buffer [j][pflac->bufferpos] * norm ; - pflac->remain -= frame->header.channels ; - pflac->bufferpos++ ; - } ; - } ; - break ; - - case PFLAC_PCM_DOUBLE : - { double *retpcm = (double*) pflac->ptr ; - double norm = (psf->norm_double == SF_TRUE) ? 1.0 / (1 << (frame->header.bits_per_sample - 1)) : 1.0 ; - - for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++) - { offset = pflac->pos + i * frame->header.channels ; - - if (pflac->bufferpos >= frame->header.blocksize) - break ; - - for (j = 0 ; j < frame->header.channels ; j++) - retpcm [offset + j] = buffer [j][pflac->bufferpos] * norm ; - pflac->remain -= frame->header.channels ; - pflac->bufferpos++ ; - } ; - } ; - break ; - - default : - return 0 ; - } ; - - offset = i * frame->header.channels ; - pflac->pos += i * frame->header.channels ; - - return offset ; -} /* flac_buffer_copy */ - - -static FLAC__StreamDecoderReadStatus -sf_flac_read_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__byte buffer [], size_t *bytes, void *client_data) -{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; - - *bytes = psf_fread (buffer, 1, *bytes, psf) ; - if (*bytes > 0 && psf->error == 0) - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE ; - - return FLAC__STREAM_DECODER_READ_STATUS_ABORT ; -} /* sf_flac_read_callback */ - -static FLAC__StreamDecoderSeekStatus -sf_flac_seek_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__uint64 absolute_byte_offset, void *client_data) -{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; - - psf_fseek (psf, absolute_byte_offset, SEEK_SET) ; - if (psf->error) - return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR ; - - return FLAC__STREAM_DECODER_SEEK_STATUS_OK ; -} /* sf_flac_seek_callback */ - -static FLAC__StreamDecoderTellStatus -sf_flac_tell_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__uint64 *absolute_byte_offset, void *client_data) -{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; - - *absolute_byte_offset = psf_ftell (psf) ; - if (psf->error) - return FLAC__STREAM_DECODER_TELL_STATUS_ERROR ; - - return FLAC__STREAM_DECODER_TELL_STATUS_OK ; -} /* sf_flac_tell_callback */ - -static FLAC__StreamDecoderLengthStatus -sf_flac_length_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__uint64 *stream_length, void *client_data) -{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; - - if ((*stream_length = psf->filelength) == 0) - return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR ; - - return FLAC__STREAM_DECODER_LENGTH_STATUS_OK ; -} /* sf_flac_length_callback */ - -static FLAC__bool -sf_flac_eof_callback (const FLAC__StreamDecoder *UNUSED (decoder), void *client_data) -{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; - - if (psf_ftell (psf) == psf->filelength) - return SF_TRUE ; - - return SF_FALSE ; -} /* sf_flac_eof_callback */ - -static FLAC__StreamDecoderWriteStatus -sf_flac_write_callback (const FLAC__StreamDecoder * UNUSED (decoder), const FLAC__Frame *frame, const FLAC__int32 * const buffer [], void *client_data) -{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; - FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - - pflac->frame = frame ; - pflac->bufferpos = 0 ; - - pflac->bufferbackup = SF_FALSE ; - pflac->wbuffer = buffer ; - - flac_buffer_copy (psf) ; - - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE ; -} /* sf_flac_write_callback */ - -static void -sf_flac_meta_get_vorbiscomments (SF_PRIVATE *psf, const FLAC__StreamMetadata *metadata) -{ FLAC_TAG tags [] = - { { "title", SF_STR_TITLE }, - { "copyright", SF_STR_COPYRIGHT }, - { "software", SF_STR_SOFTWARE }, - { "artist", SF_STR_ARTIST }, - { "comment", SF_STR_COMMENT }, - { "date", SF_STR_DATE }, - { "album", SF_STR_ALBUM }, - { "license", SF_STR_LICENSE }, - { "tracknumber", SF_STR_TRACKNUMBER }, - { "genre", SF_STR_GENRE } - } ; - - const char *value, *cptr ; - int k, tag_num ; - - for (k = 0 ; k < ARRAY_LEN (tags) ; k++) - { tag_num = FLAC__metadata_object_vorbiscomment_find_entry_from (metadata, 0, tags [k].tag) ; - - if (tag_num < 0) - continue ; - - value = (const char*) metadata->data.vorbis_comment.comments [tag_num].entry ; - if ((cptr = strchr (value, '=')) != NULL) - value = cptr + 1 ; - - psf_log_printf (psf, " %-10s : %s\n", tags [k].tag, value) ; - psf_store_string (psf, tags [k].type, value) ; - } ; - - return ; -} /* sf_flac_meta_get_vorbiscomments */ - -static void -sf_flac_meta_callback (const FLAC__StreamDecoder * UNUSED (decoder), const FLAC__StreamMetadata *metadata, void *client_data) -{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; - int bitwidth = 0 ; - - switch (metadata->type) - { case FLAC__METADATA_TYPE_STREAMINFO : - psf->sf.channels = metadata->data.stream_info.channels ; - psf->sf.samplerate = metadata->data.stream_info.sample_rate ; - psf->sf.frames = metadata->data.stream_info.total_samples ; - - psf_log_printf (psf, "FLAC Stream Metadata\n Channels : %d\n Sample rate : %d\n", psf->sf.channels, psf->sf.samplerate) ; - - if (psf->sf.frames == 0) - { psf_log_printf (psf, " Frames : 0 (bumping to SF_COUNT_MAX)\n") ; - psf->sf.frames = SF_COUNT_MAX ; - } - else - psf_log_printf (psf, " Frames : %D\n", psf->sf.frames) ; - - switch (metadata->data.stream_info.bits_per_sample) - { case 8 : - psf->sf.format |= SF_FORMAT_PCM_S8 ; - bitwidth = 8 ; - break ; - case 16 : - psf->sf.format |= SF_FORMAT_PCM_16 ; - bitwidth = 16 ; - break ; - case 24 : - psf->sf.format |= SF_FORMAT_PCM_24 ; - bitwidth = 24 ; - break ; - default : - psf_log_printf (psf, "sf_flac_meta_callback : bits_per_sample %d not yet implemented.\n", metadata->data.stream_info.bits_per_sample) ; - break ; - } ; - - if (bitwidth > 0) - psf_log_printf (psf, " Bit width : %d\n", bitwidth) ; - break ; - - case FLAC__METADATA_TYPE_VORBIS_COMMENT : - psf_log_printf (psf, "Vorbis Comment Metadata\n") ; - sf_flac_meta_get_vorbiscomments (psf, metadata) ; - break ; - - case FLAC__METADATA_TYPE_PADDING : - psf_log_printf (psf, "Padding Metadata\n") ; - break ; - - case FLAC__METADATA_TYPE_APPLICATION : - psf_log_printf (psf, "Application Metadata\n") ; - break ; - - case FLAC__METADATA_TYPE_SEEKTABLE : - psf_log_printf (psf, "Seektable Metadata\n") ; - break ; - - case FLAC__METADATA_TYPE_CUESHEET : - psf_log_printf (psf, "Cuesheet Metadata\n") ; - break ; - - case FLAC__METADATA_TYPE_PICTURE : - psf_log_printf (psf, "Picture Metadata\n") ; - break ; - - case FLAC__METADATA_TYPE_UNDEFINED : - psf_log_printf (psf, "Undefined Metadata\n") ; - break ; - - default : - psf_log_printf (psf, "sf_flac_meta_callback : metadata-type %d not yet implemented.\n", metadata->type) ; - break ; - } ; - - return ; -} /* sf_flac_meta_callback */ - -static void -sf_flac_error_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__StreamDecoderErrorStatus status, void *client_data) -{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; - - psf_log_printf (psf, "ERROR : %s\n", FLAC__StreamDecoderErrorStatusString [status]) ; - - switch (status) - { case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC : - psf->error = SFE_FLAC_LOST_SYNC ; - break ; - case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER : - psf->error = SFE_FLAC_BAD_HEADER ; - break ; - default : - psf->error = SFE_FLAC_UNKOWN_ERROR ; - break ; - } ; - - return ; -} /* sf_flac_error_callback */ - -static FLAC__StreamEncoderSeekStatus -sf_flac_enc_seek_callback (const FLAC__StreamEncoder * UNUSED (encoder), FLAC__uint64 absolute_byte_offset, void *client_data) -{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; - - psf_fseek (psf, absolute_byte_offset, SEEK_SET) ; - if (psf->error) - return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR ; - - return FLAC__STREAM_ENCODER_SEEK_STATUS_OK ; -} /* sf_flac_enc_seek_callback */ - -static FLAC__StreamEncoderTellStatus -sf_flac_enc_tell_callback (const FLAC__StreamEncoder *UNUSED (encoder), FLAC__uint64 *absolute_byte_offset, void *client_data) -{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; - - *absolute_byte_offset = psf_ftell (psf) ; - if (psf->error) - return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR ; - - return FLAC__STREAM_ENCODER_TELL_STATUS_OK ; -} /* sf_flac_enc_tell_callback */ - -static FLAC__StreamEncoderWriteStatus -sf_flac_enc_write_callback (const FLAC__StreamEncoder * UNUSED (encoder), const FLAC__byte buffer [], size_t bytes, unsigned UNUSED (samples), unsigned UNUSED (current_frame), void *client_data) -{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; - - if (psf_fwrite (buffer, 1, bytes, psf) == (sf_count_t) bytes && psf->error == 0) - return FLAC__STREAM_ENCODER_WRITE_STATUS_OK ; - - return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR ; -} /* sf_flac_enc_write_callback */ - -static void -flac_write_strings (SF_PRIVATE *psf, FLAC_PRIVATE* pflac) -{ FLAC__StreamMetadata_VorbisComment_Entry entry ; - int k, string_count = 0 ; - - for (k = 0 ; k < SF_MAX_STRINGS ; k++) - { if (psf->strings.data [k].type != 0) - string_count ++ ; - } ; - - if (string_count == 0) - return ; - - if (pflac->metadata == NULL && (pflac->metadata = FLAC__metadata_object_new (FLAC__METADATA_TYPE_VORBIS_COMMENT)) == NULL) - { psf_log_printf (psf, "FLAC__metadata_object_new returned NULL\n") ; - return ; - } ; - - for (k = 0 ; k < SF_MAX_STRINGS && psf->strings.data [k].type != 0 ; k++) - { const char * key, * value ; - - switch (psf->strings.data [k].type) - { case SF_STR_SOFTWARE : - key = "software" ; - break ; - case SF_STR_TITLE : - key = "title" ; - break ; - case SF_STR_COPYRIGHT : - key = "copyright" ; - break ; - case SF_STR_ARTIST : - key = "artist" ; - break ; - case SF_STR_COMMENT : - key = "comment" ; - break ; - case SF_STR_DATE : - key = "date" ; - break ; - case SF_STR_ALBUM : - key = "album" ; - break ; - case SF_STR_LICENSE : - key = "license" ; - break ; - case SF_STR_TRACKNUMBER : - key = "tracknumber" ; - break ; - case SF_STR_GENRE : - key = "genre" ; - break ; - default : - continue ; - } ; - - value = psf->strings.storage + psf->strings.data [k].offset ; - - FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair (&entry, key, value) ; - FLAC__metadata_object_vorbiscomment_append_comment (pflac->metadata, entry, /* copy */ SF_FALSE) ; - } ; - - if (! FLAC__stream_encoder_set_metadata (pflac->fse, &pflac->metadata, 1)) - { printf ("%s %d : fail\n", __func__, __LINE__) ; - return ; - } ; - - return ; -} /* flac_write_strings */ - -static int -flac_write_header (SF_PRIVATE *psf, int UNUSED (calc_length)) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - int err ; - - flac_write_strings (psf, pflac) ; - - if ((err = FLAC__stream_encoder_init_stream (pflac->fse, sf_flac_enc_write_callback, sf_flac_enc_seek_callback, sf_flac_enc_tell_callback, NULL, psf)) != FLAC__STREAM_DECODER_INIT_STATUS_OK) - { psf_log_printf (psf, "Error : FLAC encoder init returned error : %s\n", FLAC__StreamEncoderInitStatusString [err]) ; - return SFE_FLAC_INIT_DECODER ; - } ; - - if (psf->error == 0) - psf->dataoffset = psf_ftell (psf) ; - pflac->encbuffer = calloc (ENC_BUFFER_SIZE, sizeof (FLAC__int32)) ; - - return psf->error ; -} /* flac_write_header */ - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -flac_open (SF_PRIVATE *psf) -{ int subformat ; - int error = 0 ; - - FLAC_PRIVATE* pflac = calloc (1, sizeof (FLAC_PRIVATE)) ; - psf->codec_data = pflac ; - - /* Set the default value here. Over-ridden later if necessary. */ - pflac->compression = FLAC_DEFAULT_COMPRESSION_LEVEL ; - - - if (psf->file.mode == SFM_RDWR) - return SFE_BAD_MODE_RW ; - - if (psf->file.mode == SFM_READ) - { if ((error = flac_read_header (psf))) - return error ; - } ; - - subformat = SF_CODEC (psf->sf.format) ; - - if (psf->file.mode == SFM_WRITE) - { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_FLAC) - return SFE_BAD_OPEN_FORMAT ; - - psf->endian = SF_ENDIAN_BIG ; - psf->sf.seekable = 0 ; - - psf->strings.flags = SF_STR_ALLOW_START ; - - if ((error = flac_enc_init (psf))) - return error ; - - psf->write_header = flac_write_header ; - } ; - - psf->datalength = psf->filelength ; - psf->dataoffset = 0 ; - - psf->container_close = flac_close ; - psf->seek = flac_seek ; - psf->byterate = flac_byterate ; - - psf->command = flac_command ; - - switch (subformat) - { case SF_FORMAT_PCM_S8 : /* 8-bit FLAC. */ - case SF_FORMAT_PCM_16 : /* 16-bit FLAC. */ - case SF_FORMAT_PCM_24 : /* 24-bit FLAC. */ - error = flac_init (psf) ; - break ; - - default : return SFE_UNIMPLEMENTED ; - } ; - - return error ; -} /* flac_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -flac_close (SF_PRIVATE *psf) -{ FLAC_PRIVATE* pflac ; - int k ; - - if ((pflac = (FLAC_PRIVATE*) psf->codec_data) == NULL) - return 0 ; - - if (pflac->metadata != NULL) - FLAC__metadata_object_delete (pflac->metadata) ; - - if (psf->file.mode == SFM_WRITE) - { FLAC__stream_encoder_finish (pflac->fse) ; - FLAC__stream_encoder_delete (pflac->fse) ; - - if (pflac->encbuffer) - free (pflac->encbuffer) ; - } ; - - if (psf->file.mode == SFM_READ) - { FLAC__stream_decoder_finish (pflac->fsd) ; - FLAC__stream_decoder_delete (pflac->fsd) ; - } ; - - for (k = 0 ; k < ARRAY_LEN (pflac->rbuffer) ; k++) - free (pflac->rbuffer [k]) ; - - free (pflac) ; - psf->codec_data = NULL ; - - return 0 ; -} /* flac_close */ - -static int -flac_enc_init (SF_PRIVATE *psf) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - unsigned bps ; - - /* To cite the flac FAQ at - ** http://flac.sourceforge.net/faq.html#general__samples - ** "FLAC supports linear sample rates from 1Hz - 655350Hz in 1Hz - ** increments." - */ - if (psf->sf.samplerate < 1 || psf->sf.samplerate > 655350) - { psf_log_printf (psf, "flac sample rate out of range.\n", psf->sf.samplerate) ; - return SFE_FLAC_BAD_SAMPLE_RATE ; - } ; - - psf_fseek (psf, 0, SEEK_SET) ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_S8 : - bps = 8 ; - break ; - case SF_FORMAT_PCM_16 : - bps = 16 ; - break ; - case SF_FORMAT_PCM_24 : - bps = 24 ; - break ; - - default : - bps = 0 ; - break ; - } ; - - if (pflac->fse) - FLAC__stream_encoder_delete (pflac->fse) ; - if ((pflac->fse = FLAC__stream_encoder_new ()) == NULL) - return SFE_FLAC_NEW_DECODER ; - - if (! FLAC__stream_encoder_set_channels (pflac->fse, psf->sf.channels)) - { psf_log_printf (psf, "FLAC__stream_encoder_set_channels (%d) return false.\n", psf->sf.channels) ; - return SFE_FLAC_INIT_DECODER ; - } ; - - if (! FLAC__stream_encoder_set_sample_rate (pflac->fse, psf->sf.samplerate)) - { psf_log_printf (psf, "FLAC__stream_encoder_set_sample_rate (%d) returned false.\n", psf->sf.samplerate) ; - return SFE_FLAC_BAD_SAMPLE_RATE ; - } ; - - if (! FLAC__stream_encoder_set_bits_per_sample (pflac->fse, bps)) - { psf_log_printf (psf, "FLAC__stream_encoder_set_bits_per_sample (%d) return false.\n", bps) ; - return SFE_FLAC_INIT_DECODER ; - } ; - - if (! FLAC__stream_encoder_set_compression_level (pflac->fse, pflac->compression)) - { psf_log_printf (psf, "FLAC__stream_encoder_set_compression_level (%d) return false.\n", pflac->compression) ; - return SFE_FLAC_INIT_DECODER ; - } ; - - return 0 ; -} /* flac_enc_init */ - -static int -flac_read_header (SF_PRIVATE *psf) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - - psf_fseek (psf, 0, SEEK_SET) ; - if (pflac->fsd) - FLAC__stream_decoder_delete (pflac->fsd) ; - if ((pflac->fsd = FLAC__stream_decoder_new ()) == NULL) - return SFE_FLAC_NEW_DECODER ; - - FLAC__stream_decoder_set_metadata_respond_all (pflac->fsd) ; - - if (FLAC__stream_decoder_init_stream (pflac->fsd, sf_flac_read_callback, sf_flac_seek_callback, sf_flac_tell_callback, sf_flac_length_callback, sf_flac_eof_callback, sf_flac_write_callback, sf_flac_meta_callback, sf_flac_error_callback, psf) != FLAC__STREAM_DECODER_INIT_STATUS_OK) - return SFE_FLAC_INIT_DECODER ; - - FLAC__stream_decoder_process_until_end_of_metadata (pflac->fsd) ; - - psf_log_printf (psf, "End\n") ; - - if (psf->error == 0) - { FLAC__uint64 position ; - - FLAC__stream_decoder_get_decode_position (pflac->fsd, &position) ; - psf->dataoffset = position ; - } ; - - return psf->error ; -} /* flac_read_header */ - -static int -flac_command (SF_PRIVATE * psf, int command, void * data, int datasize) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - double quality ; - - switch (command) - { case SFC_SET_COMPRESSION_LEVEL : - if (data == NULL || datasize != sizeof (double)) - return SF_FALSE ; - - if (psf->have_written) - return SF_FALSE ; - - /* FLAC compression level is in the range [0, 8] while libsndfile takes - ** values in the range [0.0, 1.0]. Massage the libsndfile value here. - */ - quality = (*((double *) data)) * 8.0 ; - /* Clip range. */ - pflac->compression = lrint (SF_MAX (0.0, SF_MIN (8.0, quality))) ; - - psf_log_printf (psf, "%s : Setting SFC_SET_COMPRESSION_LEVEL to %u.\n", __func__, pflac->compression) ; - - if (flac_enc_init (psf)) - return SF_FALSE ; - - return SF_TRUE ; - - default : - return SF_FALSE ; - } ; - - return SF_FALSE ; -} /* flac_command */ - -int -flac_init (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_RDWR) - return SFE_BAD_MODE_RW ; - - if (psf->file.mode == SFM_READ) - { psf->read_short = flac_read_flac2s ; - psf->read_int = flac_read_flac2i ; - psf->read_float = flac_read_flac2f ; - psf->read_double = flac_read_flac2d ; - } ; - - if (psf->file.mode == SFM_WRITE) - { psf->write_short = flac_write_s2flac ; - psf->write_int = flac_write_i2flac ; - psf->write_float = flac_write_f2flac ; - psf->write_double = flac_write_d2flac ; - } ; - - if (psf->filelength > psf->dataoffset) - psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : psf->filelength - psf->dataoffset ; - else - psf->datalength = 0 ; - - return 0 ; -} /* flac_init */ - -static unsigned -flac_read_loop (SF_PRIVATE *psf, unsigned len) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - - pflac->pos = 0 ; - pflac->len = len ; - pflac->remain = len ; - if (pflac->frame != NULL && pflac->bufferpos < pflac->frame->header.blocksize) - flac_buffer_copy (psf) ; - - while (pflac->pos < pflac->len) - { if (FLAC__stream_decoder_process_single (pflac->fsd) == 0) - break ; - if (FLAC__stream_decoder_get_state (pflac->fsd) >= FLAC__STREAM_DECODER_END_OF_STREAM) - break ; - } ; - - pflac->ptr = NULL ; - - return pflac->pos ; -} /* flac_read_loop */ - -static sf_count_t -flac_read_flac2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - sf_count_t total = 0, current ; - unsigned readlen ; - - pflac->pcmtype = PFLAC_PCM_SHORT ; - - while (total < len) - { pflac->ptr = ptr + total ; - readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ; - current = flac_read_loop (psf, readlen) ; - if (current == 0) - break ; - total += current ; - } ; - - return total ; -} /* flac_read_flac2s */ - -static sf_count_t -flac_read_flac2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - sf_count_t total = 0, current ; - unsigned readlen ; - - pflac->pcmtype = PFLAC_PCM_INT ; - - while (total < len) - { pflac->ptr = ptr + total ; - readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ; - current = flac_read_loop (psf, readlen) ; - if (current == 0) - break ; - total += current ; - } ; - - return total ; -} /* flac_read_flac2i */ - -static sf_count_t -flac_read_flac2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - sf_count_t total = 0, current ; - unsigned readlen ; - - pflac->pcmtype = PFLAC_PCM_FLOAT ; - - while (total < len) - { pflac->ptr = ptr + total ; - readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ; - current = flac_read_loop (psf, readlen) ; - if (current == 0) - break ; - total += current ; - } ; - - return total ; -} /* flac_read_flac2f */ - -static sf_count_t -flac_read_flac2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - sf_count_t total = 0, current ; - unsigned readlen ; - - pflac->pcmtype = PFLAC_PCM_DOUBLE ; - - while (total < len) - { pflac->ptr = ptr + total ; - readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ; - current = flac_read_loop (psf, readlen) ; - if (current == 0) - break ; - total += current ; - } ; - - return total ; -} /* flac_read_flac2d */ - -static sf_count_t -flac_write_s2flac (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - void (*convert) (const short *, FLAC__int32 *, int) ; - int bufferlen, writecount, thiswrite ; - sf_count_t total = 0 ; - FLAC__int32* buffer = pflac->encbuffer ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_S8 : - convert = s2flac8_array ; - break ; - case SF_FORMAT_PCM_16 : - convert = s2flac16_array ; - break ; - case SF_FORMAT_PCM_24 : - convert = s2flac24_array ; - break ; - default : - return -1 ; - } ; - - bufferlen = ENC_BUFFER_SIZE / (sizeof (FLAC__int32) * psf->sf.channels) ; - bufferlen *= psf->sf.channels ; - - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : (int) len ; - convert (ptr + total, buffer, writecount) ; - if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount / psf->sf.channels)) - thiswrite = writecount ; - else - break ; - total += thiswrite ; - if (thiswrite < writecount) - break ; - - len -= thiswrite ; - } ; - - return total ; -} /* flac_write_s2flac */ - -static sf_count_t -flac_write_i2flac (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - void (*convert) (const int *, FLAC__int32 *, int) ; - int bufferlen, writecount, thiswrite ; - sf_count_t total = 0 ; - FLAC__int32* buffer = pflac->encbuffer ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_S8 : - convert = i2flac8_array ; - break ; - case SF_FORMAT_PCM_16 : - convert = i2flac16_array ; - break ; - case SF_FORMAT_PCM_24 : - convert = i2flac24_array ; - break ; - default : - return -1 ; - } ; - - bufferlen = ENC_BUFFER_SIZE / (sizeof (FLAC__int32) * psf->sf.channels) ; - bufferlen *= psf->sf.channels ; - - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : (int) len ; - convert (ptr + total, buffer, writecount) ; - if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount / psf->sf.channels)) - thiswrite = writecount ; - else - break ; - total += thiswrite ; - if (thiswrite < writecount) - break ; - - len -= thiswrite ; - } ; - - return total ; -} /* flac_write_i2flac */ - -static sf_count_t -flac_write_f2flac (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - void (*convert) (const float *, FLAC__int32 *, int, int) ; - int bufferlen, writecount, thiswrite ; - sf_count_t total = 0 ; - FLAC__int32* buffer = pflac->encbuffer ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_S8 : - convert = (psf->add_clipping) ? f2flac8_clip_array : f2flac8_array ; - break ; - case SF_FORMAT_PCM_16 : - convert = (psf->add_clipping) ? f2flac16_clip_array : f2flac16_array ; - break ; - case SF_FORMAT_PCM_24 : - convert = (psf->add_clipping) ? f2flac24_clip_array : f2flac24_array ; - break ; - default : - return -1 ; - } ; - - bufferlen = ENC_BUFFER_SIZE / (sizeof (FLAC__int32) * psf->sf.channels) ; - bufferlen *= psf->sf.channels ; - - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : (int) len ; - convert (ptr + total, buffer, writecount, psf->norm_float) ; - if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount / psf->sf.channels)) - thiswrite = writecount ; - else - break ; - total += thiswrite ; - if (thiswrite < writecount) - break ; - - len -= thiswrite ; - } ; - - return total ; -} /* flac_write_f2flac */ - -static void -f2flac8_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize) -{ float normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x10) : 1.0 ; - - while (--count >= 0) - { scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7F)) - { dest [count] = 0x7F ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10)) - { dest [count] = 0x80 ; - continue ; - } ; - dest [count] = lrintf (scaled_value) ; - } ; - - return ; -} /* f2flac8_clip_array */ - -static void -f2flac16_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize) -{ float normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x1000) : 1.0 ; - - while (--count >= 0) - { scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF)) - { dest [count] = 0x7FFF ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000)) - { dest [count] = 0x8000 ; - continue ; - } ; - dest [count] = lrintf (scaled_value) ; - } ; -} /* f2flac16_clip_array */ - -static void -f2flac24_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize) -{ float normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x100000) : 1.0 ; - - while (--count >= 0) - { scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFF)) - { dest [count] = 0x7FFFFF ; - continue ; - } ; - - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x100000)) - { dest [count] = 0x800000 ; - continue ; - } - dest [count] = lrintf (scaled_value) ; - } ; - - return ; -} /* f2flac24_clip_array */ - -static void -f2flac8_array (const float *src, FLAC__int32 *dest, int count, int normalize) -{ float normfact = normalize ? (1.0 * 0x7F) : 1.0 ; - - while (--count >= 0) - dest [count] = lrintf (src [count] * normfact) ; -} /* f2flac8_array */ - -static void -f2flac16_array (const float *src, FLAC__int32 *dest, int count, int normalize) -{ float normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; - - while (--count >= 0) - dest [count] = lrintf (src [count] * normfact) ; -} /* f2flac16_array */ - -static void -f2flac24_array (const float *src, FLAC__int32 *dest, int count, int normalize) -{ float normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ; - - while (--count >= 0) - dest [count] = lrintf (src [count] * normfact) ; -} /* f2flac24_array */ - -static sf_count_t -flac_write_d2flac (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - void (*convert) (const double *, FLAC__int32 *, int, int) ; - int bufferlen, writecount, thiswrite ; - sf_count_t total = 0 ; - FLAC__int32* buffer = pflac->encbuffer ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_S8 : - convert = (psf->add_clipping) ? d2flac8_clip_array : d2flac8_array ; - break ; - case SF_FORMAT_PCM_16 : - convert = (psf->add_clipping) ? d2flac16_clip_array : d2flac16_array ; - break ; - case SF_FORMAT_PCM_24 : - convert = (psf->add_clipping) ? d2flac24_clip_array : d2flac24_array ; - break ; - default : - return -1 ; - } ; - - bufferlen = ENC_BUFFER_SIZE / (sizeof (FLAC__int32) * psf->sf.channels) ; - bufferlen *= psf->sf.channels ; - - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : (int) len ; - convert (ptr + total, buffer, writecount, psf->norm_double) ; - if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount / psf->sf.channels)) - thiswrite = writecount ; - else - break ; - total += thiswrite ; - if (thiswrite < writecount) - break ; - - len -= thiswrite ; - } ; - - return total ; -} /* flac_write_d2flac */ - -static void -d2flac8_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize) -{ double normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x10) : 1.0 ; - - while (--count >= 0) - { scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7F)) - { dest [count] = 0x7F ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10)) - { dest [count] = 0x80 ; - continue ; - } ; - dest [count] = lrint (scaled_value) ; - } ; - - return ; -} /* d2flac8_clip_array */ - -static void -d2flac16_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize) -{ double normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x1000) : 1.0 ; - - while (--count >= 0) - { scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF)) - { dest [count] = 0x7FFF ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000)) - { dest [count] = 0x8000 ; - continue ; - } ; - dest [count] = lrint (scaled_value) ; - } ; - - return ; -} /* d2flac16_clip_array */ - -static void -d2flac24_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize) -{ double normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x100000) : 1.0 ; - - while (--count >= 0) - { scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFF)) - { dest [count] = 0x7FFFFF ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x100000)) - { dest [count] = 0x800000 ; - continue ; - } ; - dest [count] = lrint (scaled_value) ; - } ; - - return ; -} /* d2flac24_clip_array */ - -static void -d2flac8_array (const double *src, FLAC__int32 *dest, int count, int normalize) -{ double normfact = normalize ? (1.0 * 0x7F) : 1.0 ; - - while (--count >= 0) - dest [count] = lrint (src [count] * normfact) ; -} /* d2flac8_array */ - -static void -d2flac16_array (const double *src, FLAC__int32 *dest, int count, int normalize) -{ double normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; - - while (--count >= 0) - dest [count] = lrint (src [count] * normfact) ; -} /* d2flac16_array */ - -static void -d2flac24_array (const double *src, FLAC__int32 *dest, int count, int normalize) -{ double normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ; - - while (--count >= 0) - dest [count] = lrint (src [count] * normfact) ; -} /* d2flac24_array */ - -static sf_count_t -flac_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset) -{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; - - if (pflac == NULL) - return 0 ; - - if (psf->dataoffset < 0) - { psf->error = SFE_BAD_SEEK ; - return ((sf_count_t) -1) ; - } ; - - pflac->frame = NULL ; - - if (psf->file.mode == SFM_READ) - { FLAC__uint64 position ; - - if (FLAC__stream_decoder_seek_absolute (pflac->fsd, offset)) - { FLAC__stream_decoder_get_decode_position (pflac->fsd, &position) ; - return offset ; - } ; - - if (offset == psf->sf.frames) - { /* - ** If we've been asked to seek to the very end of the file, libFLAC - ** will return an error. However, we know the length of the file so - ** instead of returning an error, we can return the offset. - */ - return offset ; - } ; - - psf->error = SFE_BAD_SEEK ; - return ((sf_count_t) -1) ; - } ; - - /* Seeking in write mode not yet supported. */ - psf->error = SFE_BAD_SEEK ; - - return ((sf_count_t) -1) ; -} /* flac_seek */ - -static int -flac_byterate (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_READ) - return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ; - - return -1 ; -} /* flac_byterate */ - - -#else /* HAVE_EXTERNAL_LIBS */ - -int -flac_open (SF_PRIVATE *psf) -{ - psf_log_printf (psf, "This version of libsndfile was compiled without FLAC support.\n") ; - return SFE_UNIMPLEMENTED ; -} /* flac_open */ - -#endif diff --git a/libs/libsndfile/src/float32.c b/libs/libsndfile/src/float32.c deleted file mode 100644 index 89bcf6b754..0000000000 --- a/libs/libsndfile/src/float32.c +++ /dev/null @@ -1,1012 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#if CPU_IS_LITTLE_ENDIAN - #define FLOAT32_READ float32_le_read - #define FLOAT32_WRITE float32_le_write -#elif CPU_IS_BIG_ENDIAN - #define FLOAT32_READ float32_be_read - #define FLOAT32_WRITE float32_be_write -#endif - -/*-------------------------------------------------------------------------------------------- -** Processor floating point capabilities. float32_get_capability () returns one of the -** latter four values. -*/ - -enum -{ FLOAT_UNKNOWN = 0x00, - FLOAT_CAN_RW_LE = 0x12, - FLOAT_CAN_RW_BE = 0x23, - FLOAT_BROKEN_LE = 0x34, - FLOAT_BROKEN_BE = 0x45 -} ; - -/*-------------------------------------------------------------------------------------------- -** Prototypes for private functions. -*/ - -static sf_count_t host_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t host_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t host_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t host_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t host_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t host_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t host_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t host_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static void float32_peak_update (SF_PRIVATE *psf, const float *buffer, int count, sf_count_t indx) ; - -static sf_count_t replace_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t replace_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t replace_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t replace_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t replace_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t replace_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t replace_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t replace_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static void bf2f_array (float *buffer, int count) ; -static void f2bf_array (float *buffer, int count) ; - -static int float32_get_capability (SF_PRIVATE *psf) ; - -/*-------------------------------------------------------------------------------------------- -** Exported functions. -*/ - -int -float32_init (SF_PRIVATE *psf) -{ static int float_caps ; - - float_caps = float32_get_capability (psf) ; - - psf->blockwidth = sizeof (float) * psf->sf.channels ; - - if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) - { switch (psf->endian + float_caps) - { case (SF_ENDIAN_BIG + FLOAT_CAN_RW_BE) : - psf->data_endswap = SF_FALSE ; - psf->read_short = host_read_f2s ; - psf->read_int = host_read_f2i ; - psf->read_float = host_read_f ; - psf->read_double = host_read_f2d ; - break ; - - case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_LE) : - psf->data_endswap = SF_FALSE ; - psf->read_short = host_read_f2s ; - psf->read_int = host_read_f2i ; - psf->read_float = host_read_f ; - psf->read_double = host_read_f2d ; - break ; - - case (SF_ENDIAN_BIG + FLOAT_CAN_RW_LE) : - psf->data_endswap = SF_TRUE ; - psf->read_short = host_read_f2s ; - psf->read_int = host_read_f2i ; - psf->read_float = host_read_f ; - psf->read_double = host_read_f2d ; - break ; - - case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_BE) : - psf->data_endswap = SF_TRUE ; - psf->read_short = host_read_f2s ; - psf->read_int = host_read_f2i ; - psf->read_float = host_read_f ; - psf->read_double = host_read_f2d ; - break ; - - /* When the CPU is not IEEE compatible. */ - case (SF_ENDIAN_BIG + FLOAT_BROKEN_LE) : - psf->data_endswap = SF_TRUE ; - psf->read_short = replace_read_f2s ; - psf->read_int = replace_read_f2i ; - psf->read_float = replace_read_f ; - psf->read_double = replace_read_f2d ; - break ; - - case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_LE) : - psf->data_endswap = SF_FALSE ; - psf->read_short = replace_read_f2s ; - psf->read_int = replace_read_f2i ; - psf->read_float = replace_read_f ; - psf->read_double = replace_read_f2d ; - break ; - - case (SF_ENDIAN_BIG + FLOAT_BROKEN_BE) : - psf->data_endswap = SF_FALSE ; - psf->read_short = replace_read_f2s ; - psf->read_int = replace_read_f2i ; - psf->read_float = replace_read_f ; - psf->read_double = replace_read_f2d ; - break ; - - case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_BE) : - psf->data_endswap = SF_TRUE ; - psf->read_short = replace_read_f2s ; - psf->read_int = replace_read_f2i ; - psf->read_float = replace_read_f ; - psf->read_double = replace_read_f2d ; - break ; - - default : break ; - } ; - } ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { switch (psf->endian + float_caps) - { case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_LE) : - psf->data_endswap = SF_FALSE ; - psf->write_short = host_write_s2f ; - psf->write_int = host_write_i2f ; - psf->write_float = host_write_f ; - psf->write_double = host_write_d2f ; - break ; - - case (SF_ENDIAN_BIG + FLOAT_CAN_RW_BE) : - psf->data_endswap = SF_FALSE ; - psf->write_short = host_write_s2f ; - psf->write_int = host_write_i2f ; - psf->write_float = host_write_f ; - psf->write_double = host_write_d2f ; - break ; - - case (SF_ENDIAN_BIG + FLOAT_CAN_RW_LE) : - psf->data_endswap = SF_TRUE ; - psf->write_short = host_write_s2f ; - psf->write_int = host_write_i2f ; - psf->write_float = host_write_f ; - psf->write_double = host_write_d2f ; - break ; - - case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_BE) : - psf->data_endswap = SF_TRUE ; - psf->write_short = host_write_s2f ; - psf->write_int = host_write_i2f ; - psf->write_float = host_write_f ; - psf->write_double = host_write_d2f ; - break ; - - /* When the CPU is not IEEE compatible. */ - case (SF_ENDIAN_BIG + FLOAT_BROKEN_LE) : - psf->data_endswap = SF_TRUE ; - psf->write_short = replace_write_s2f ; - psf->write_int = replace_write_i2f ; - psf->write_float = replace_write_f ; - psf->write_double = replace_write_d2f ; - break ; - - case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_LE) : - psf->data_endswap = SF_FALSE ; - psf->write_short = replace_write_s2f ; - psf->write_int = replace_write_i2f ; - psf->write_float = replace_write_f ; - psf->write_double = replace_write_d2f ; - break ; - - case (SF_ENDIAN_BIG + FLOAT_BROKEN_BE) : - psf->data_endswap = SF_FALSE ; - psf->write_short = replace_write_s2f ; - psf->write_int = replace_write_i2f ; - psf->write_float = replace_write_f ; - psf->write_double = replace_write_d2f ; - break ; - - case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_BE) : - psf->data_endswap = SF_TRUE ; - psf->write_short = replace_write_s2f ; - psf->write_int = replace_write_i2f ; - psf->write_float = replace_write_f ; - psf->write_double = replace_write_d2f ; - break ; - - default : break ; - } ; - } ; - - if (psf->filelength > psf->dataoffset) - { psf->datalength = (psf->dataend > 0) ? psf->dataend - psf->dataoffset : - psf->filelength - psf->dataoffset ; - } - else - psf->datalength = 0 ; - - psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ; - - return 0 ; -} /* float32_init */ - -float -float32_be_read (const unsigned char *cptr) -{ int exponent, mantissa, negative ; - float fvalue ; - - negative = cptr [0] & 0x80 ; - exponent = ((cptr [0] & 0x7F) << 1) | ((cptr [1] & 0x80) ? 1 : 0) ; - mantissa = ((cptr [1] & 0x7F) << 16) | (cptr [2] << 8) | (cptr [3]) ; - - if (! (exponent || mantissa)) - return 0.0 ; - - mantissa |= 0x800000 ; - exponent = exponent ? exponent - 127 : 0 ; - - fvalue = mantissa ? ((float) mantissa) / ((float) 0x800000) : 0.0 ; - - if (negative) - fvalue *= -1 ; - - if (exponent > 0) - fvalue *= pow (2.0, exponent) ; - else if (exponent < 0) - fvalue /= pow (2.0, abs (exponent)) ; - - return fvalue ; -} /* float32_be_read */ - -float -float32_le_read (const unsigned char *cptr) -{ int exponent, mantissa, negative ; - float fvalue ; - - negative = cptr [3] & 0x80 ; - exponent = ((cptr [3] & 0x7F) << 1) | ((cptr [2] & 0x80) ? 1 : 0) ; - mantissa = ((cptr [2] & 0x7F) << 16) | (cptr [1] << 8) | (cptr [0]) ; - - if (! (exponent || mantissa)) - return 0.0 ; - - mantissa |= 0x800000 ; - exponent = exponent ? exponent - 127 : 0 ; - - fvalue = mantissa ? ((float) mantissa) / ((float) 0x800000) : 0.0 ; - - if (negative) - fvalue *= -1 ; - - if (exponent > 0) - fvalue *= pow (2.0, exponent) ; - else if (exponent < 0) - fvalue /= pow (2.0, abs (exponent)) ; - - return fvalue ; -} /* float32_le_read */ - -void -float32_le_write (float in, unsigned char *out) -{ int exponent, mantissa, negative = 0 ; - - memset (out, 0, sizeof (int)) ; - - if (fabs (in) < 1e-30) - return ; - - if (in < 0.0) - { in *= -1.0 ; - negative = 1 ; - } ; - - in = frexp (in, &exponent) ; - - exponent += 126 ; - - in *= (float) 0x1000000 ; - mantissa = (((int) in) & 0x7FFFFF) ; - - if (negative) - out [3] |= 0x80 ; - - if (exponent & 0x01) - out [2] |= 0x80 ; - - out [0] = mantissa & 0xFF ; - out [1] = (mantissa >> 8) & 0xFF ; - out [2] |= (mantissa >> 16) & 0x7F ; - out [3] |= (exponent >> 1) & 0x7F ; - - return ; -} /* float32_le_write */ - -void -float32_be_write (float in, unsigned char *out) -{ int exponent, mantissa, negative = 0 ; - - memset (out, 0, sizeof (int)) ; - - if (fabs (in) < 1e-30) - return ; - - if (in < 0.0) - { in *= -1.0 ; - negative = 1 ; - } ; - - in = frexp (in, &exponent) ; - - exponent += 126 ; - - in *= (float) 0x1000000 ; - mantissa = (((int) in) & 0x7FFFFF) ; - - if (negative) - out [0] |= 0x80 ; - - if (exponent & 0x01) - out [1] |= 0x80 ; - - out [3] = mantissa & 0xFF ; - out [2] = (mantissa >> 8) & 0xFF ; - out [1] |= (mantissa >> 16) & 0x7F ; - out [0] |= (exponent >> 1) & 0x7F ; - - return ; -} /* float32_be_write */ - -/*============================================================================================== -** Private functions. -*/ - -static void -float32_peak_update (SF_PRIVATE *psf, const float *buffer, int count, sf_count_t indx) -{ int chan ; - int k, position ; - float fmaxval ; - - for (chan = 0 ; chan < psf->sf.channels ; chan++) - { fmaxval = fabs (buffer [chan]) ; - position = 0 ; - for (k = chan ; k < count ; k += psf->sf.channels) - if (fmaxval < fabs (buffer [k])) - { fmaxval = fabs (buffer [k]) ; - position = k ; - } ; - - if (fmaxval > psf->peak_info->peaks [chan].value) - { psf->peak_info->peaks [chan].value = fmaxval ; - psf->peak_info->peaks [chan].position = psf->write_current + indx + (position / psf->sf.channels) ; - } ; - } ; - - return ; -} /* float32_peak_update */ - -static int -float32_get_capability (SF_PRIVATE *psf) -{ union - { float f ; - int i ; - unsigned char c [4] ; - } data ; - - data.f = (float) 1.23456789 ; /* Some abitrary value. */ - - if (! psf->ieee_replace) - { /* If this test is true ints and floats are compatible and little endian. */ - if (data.c [0] == 0x52 && data.c [1] == 0x06 && data.c [2] == 0x9e && data.c [3] == 0x3f) - return FLOAT_CAN_RW_LE ; - - /* If this test is true ints and floats are compatible and big endian. */ - if (data.c [3] == 0x52 && data.c [2] == 0x06 && data.c [1] == 0x9e && data.c [0] == 0x3f) - return FLOAT_CAN_RW_BE ; - } ; - - /* Floats are broken. Don't expect reading or writing to be fast. */ - psf_log_printf (psf, "Using IEEE replacement code for float.\n") ; - - return (CPU_IS_LITTLE_ENDIAN) ? FLOAT_BROKEN_LE : FLOAT_BROKEN_BE ; -} /* float32_get_capability */ - -/*======================================================================================= -*/ - -static void -f2s_array (const float *src, int count, short *dest, float scale) -{ - while (--count >= 0) - { dest [count] = lrintf (scale * src [count]) ; - } ; -} /* f2s_array */ - -static void -f2s_clip_array (const float *src, int count, short *dest, float scale) -{ while (--count >= 0) - { float tmp = scale * src [count] ; - - if (CPU_CLIPS_POSITIVE == 0 && tmp > 32767.0) - dest [count] = SHRT_MAX ; - else if (CPU_CLIPS_NEGATIVE == 0 && tmp < -32768.0) - dest [count] = SHRT_MIN ; - else - dest [count] = lrintf (tmp) ; - } ; -} /* f2s_clip_array */ - -static inline void -f2i_array (const float *src, int count, int *dest, float scale) -{ while (--count >= 0) - { dest [count] = lrintf (scale * src [count]) ; - } ; -} /* f2i_array */ - -static inline void -f2i_clip_array (const float *src, int count, int *dest, float scale) -{ while (--count >= 0) - { float tmp = scale * src [count] ; - - if (CPU_CLIPS_POSITIVE == 0 && tmp > (1.0 * INT_MAX)) - dest [count] = INT_MAX ; - else if (CPU_CLIPS_NEGATIVE == 0 && tmp < (-1.0 * INT_MAX)) - dest [count] = INT_MIN ; - else - dest [count] = lrintf (tmp) ; - } ; -} /* f2i_clip_array */ - -static inline void -f2d_array (const float *src, int count, double *dest) -{ while (--count >= 0) - { dest [count] = src [count] ; - } ; -} /* f2d_array */ - -static inline void -s2f_array (const short *src, float *dest, int count, float scale) -{ while (--count >= 0) - { dest [count] = scale * src [count] ; - } ; -} /* s2f_array */ - -static inline void -i2f_array (const int *src, float *dest, int count, float scale) -{ while (--count >= 0) - { dest [count] = scale * src [count] ; - } ; -} /* i2f_array */ - -static inline void -d2f_array (const double *src, float *dest, int count) -{ while (--count >= 0) - { dest [count] = src [count] ; - } ; -} /* d2f_array */ - -/*---------------------------------------------------------------------------------------------- -*/ - -static sf_count_t -host_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const float *, int, short *, float) ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float scale ; - - convert = (psf->add_clipping) ? f2s_clip_array : f2s_array ; - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; - -/* Fix me : Need lef2s_array */ - if (psf->data_endswap == SF_TRUE) - endswap_int_array (ubuf.ibuf, bufferlen) ; - - convert (ubuf.fbuf, readcount, ptr + total, scale) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* host_read_f2s */ - -static sf_count_t -host_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const float *, int, int *, float) ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float scale ; - - convert = (psf->add_clipping) ? f2i_clip_array : f2i_array ; - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFFFFFF / psf->float_max ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; - - if (psf->data_endswap == SF_TRUE) - endswap_int_array (ubuf.ibuf, bufferlen) ; - - convert (ubuf.fbuf, readcount, ptr + total, scale) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* host_read_f2i */ - -static sf_count_t -host_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - if (psf->data_endswap != SF_TRUE) - return psf_fread (ptr, sizeof (float), len, psf) ; - - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; - - endswap_int_copy ((int*) (ptr + total), ubuf.ibuf, readcount) ; - - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* host_read_f */ - -static sf_count_t -host_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; - - if (psf->data_endswap == SF_TRUE) - endswap_int_array (ubuf.ibuf, bufferlen) ; - -/* Fix me : Need lef2d_array */ - f2d_array (ubuf.fbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* host_read_f2d */ - -static sf_count_t -host_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - float scale ; - -/* Erik */ - scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ; - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - s2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ; - - if (psf->peak_info) - float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ; - - if (psf->data_endswap == SF_TRUE) - endswap_int_array (ubuf.ibuf, bufferlen) ; - - writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* host_write_s2f */ - -static sf_count_t -host_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - float scale ; - - scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ; - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - i2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ; - - if (psf->peak_info) - float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ; - - if (psf->data_endswap == SF_TRUE) - endswap_int_array (ubuf.ibuf, bufferlen) ; - - writecount = psf_fwrite (ubuf.fbuf, sizeof (float) , bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* host_write_i2f */ - -static sf_count_t -host_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - if (psf->peak_info) - float32_peak_update (psf, ptr, len, 0) ; - - if (psf->data_endswap != SF_TRUE) - return psf_fwrite (ptr, sizeof (float), len, psf) ; - - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - - endswap_int_copy (ubuf.ibuf, (const int*) (ptr + total), bufferlen) ; - - writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* host_write_f */ - -static sf_count_t -host_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - - d2f_array (ptr + total, ubuf.fbuf, bufferlen) ; - - if (psf->peak_info) - float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ; - - if (psf->data_endswap == SF_TRUE) - endswap_int_array (ubuf.ibuf, bufferlen) ; - - writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* host_write_d2f */ - -/*======================================================================================= -*/ - -static sf_count_t -replace_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float scale ; - - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; - - if (psf->data_endswap == SF_TRUE) - endswap_int_array (ubuf.ibuf, bufferlen) ; - - bf2f_array (ubuf.fbuf, bufferlen) ; - - f2s_array (ubuf.fbuf, readcount, ptr + total, scale) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* replace_read_f2s */ - -static sf_count_t -replace_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float scale ; - - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; - - if (psf->data_endswap == SF_TRUE) - endswap_int_array (ubuf.ibuf, bufferlen) ; - - bf2f_array (ubuf.fbuf, bufferlen) ; - - f2i_array (ubuf.fbuf, readcount, ptr + total, scale) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* replace_read_f2i */ - -static sf_count_t -replace_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - /* FIX THIS */ - - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; - - if (psf->data_endswap == SF_TRUE) - endswap_int_array (ubuf.ibuf, bufferlen) ; - - bf2f_array (ubuf.fbuf, bufferlen) ; - - memcpy (ptr + total, ubuf.fbuf, bufferlen * sizeof (float)) ; - - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* replace_read_f */ - -static sf_count_t -replace_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; - - if (psf->data_endswap == SF_TRUE) - endswap_int_array (ubuf.ibuf, bufferlen) ; - - bf2f_array (ubuf.fbuf, bufferlen) ; - - f2d_array (ubuf.fbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* replace_read_f2d */ - -static sf_count_t -replace_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - float scale ; - - scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ; - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - s2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ; - - if (psf->peak_info) - float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ; - - f2bf_array (ubuf.fbuf, bufferlen) ; - - if (psf->data_endswap == SF_TRUE) - endswap_int_array (ubuf.ibuf, bufferlen) ; - - writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* replace_write_s2f */ - -static sf_count_t -replace_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - float scale ; - - scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ; - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - i2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ; - - if (psf->peak_info) - float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ; - - f2bf_array (ubuf.fbuf, bufferlen) ; - - if (psf->data_endswap == SF_TRUE) - endswap_int_array (ubuf.ibuf, bufferlen) ; - - writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* replace_write_i2f */ - -static sf_count_t -replace_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - /* FIX THIS */ - if (psf->peak_info) - float32_peak_update (psf, ptr, len, 0) ; - - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - - memcpy (ubuf.fbuf, ptr + total, bufferlen * sizeof (float)) ; - - f2bf_array (ubuf.fbuf, bufferlen) ; - - if (psf->data_endswap == SF_TRUE) - endswap_int_array (ubuf.ibuf, bufferlen) ; - - writecount = psf_fwrite (ubuf.fbuf, sizeof (float) , bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* replace_write_f */ - -static sf_count_t -replace_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.fbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - d2f_array (ptr + total, ubuf.fbuf, bufferlen) ; - - if (psf->peak_info) - float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ; - - f2bf_array (ubuf.fbuf, bufferlen) ; - - if (psf->data_endswap == SF_TRUE) - endswap_int_array (ubuf.ibuf, bufferlen) ; - - writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* replace_write_d2f */ - -/*---------------------------------------------------------------------------------------------- -*/ - -static void -bf2f_array (float *buffer, int count) -{ while (--count >= 0) - { buffer [count] = FLOAT32_READ ((unsigned char *) (buffer + count)) ; - } ; -} /* bf2f_array */ - -static void -f2bf_array (float *buffer, int count) -{ while (--count >= 0) - { FLOAT32_WRITE (buffer [count], (unsigned char*) (buffer + count)) ; - } ; -} /* f2bf_array */ - diff --git a/libs/libsndfile/src/float_cast.h b/libs/libsndfile/src/float_cast.h deleted file mode 100644 index 98c7de74b1..0000000000 --- a/libs/libsndfile/src/float_cast.h +++ /dev/null @@ -1,273 +0,0 @@ -/* -** Copyright (C) 2001-2004 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* Version 1.4 */ - -#ifndef FLOAT_CAST_HEADER -#define FLOAT_CAST_HEADER - -/*============================================================================ -** On Intel Pentium processors (especially PIII and probably P4), converting -** from float to int is very slow. To meet the C specs, the code produced by -** most C compilers targeting Pentium needs to change the FPU rounding mode -** before the float to int conversion is performed. -** -** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It -** is this flushing of the pipeline which is so slow. -** -** Fortunately the ISO C99 specifications define the functions lrint, lrintf, -** llrint and llrintf which fix this problem as a side effect. -** -** On Unix-like systems, the configure process should have detected the -** presence of these functions. If they weren't found we have to replace them -** here with a standard C cast. -*/ - -/* -** The C99 prototypes for lrint and lrintf are as follows: -** -** long int lrintf (float x) ; -** long int lrint (double x) ; -*/ - -#include "sfconfig.h" - -/* -** The presence of the required functions are detected during the configure -** process and the values HAVE_LRINT and HAVE_LRINTF are set accordingly in -** the sfconfig.h file. -*/ - -#define HAVE_LRINT_REPLACEMENT 0 - -#if (HAVE_LRINT && HAVE_LRINTF) - - /* - ** These defines enable functionality introduced with the 1999 ISO C - ** standard. They must be defined before the inclusion of math.h to - ** engage them. If optimisation is enabled, these functions will be - ** inlined. With optimisation switched off, you have to link in the - ** maths library using -lm. - */ - - #define _ISOC9X_SOURCE 1 - #define _ISOC99_SOURCE 1 - - #define __USE_ISOC9X 1 - #define __USE_ISOC99 1 - - #include - -#elif (defined (__CYGWIN__)) - - #include - - #undef HAVE_LRINT_REPLACEMENT - #define HAVE_LRINT_REPLACEMENT 1 - - #undef lrint - #undef lrintf - - #define lrint double2int - #define lrintf float2int - - /* - ** The native CYGWIN lrint and lrintf functions are buggy: - ** http://sourceware.org/ml/cygwin/2005-06/msg00153.html - ** http://sourceware.org/ml/cygwin/2005-09/msg00047.html - ** and slow. - ** These functions (pulled from the Public Domain MinGW math.h header) - ** replace the native versions. - */ - - static inline long double2int (double in) - { long retval ; - - __asm__ __volatile__ - ( "fistpl %0" - : "=m" (retval) - : "t" (in) - : "st" - ) ; - - return retval ; - } /* double2int */ - - static inline long float2int (float in) - { long retval ; - - __asm__ __volatile__ - ( "fistpl %0" - : "=m" (retval) - : "t" (in) - : "st" - ) ; - - return retval ; - } /* float2int */ - -#elif (defined (WIN32) || defined (_WIN32)) && !defined(_WIN64) - - #undef HAVE_LRINT_REPLACEMENT - #define HAVE_LRINT_REPLACEMENT 1 - - #include - - /* - ** Win32 doesn't seem to have these functions. - ** Therefore implement inline versions of these functions here. - */ - - __inline long int - lrint (double flt) - { int intgr ; - - _asm - { fld flt - fistp intgr - } ; - - return intgr ; - } - - __inline long int - lrintf (float flt) - { int intgr ; - - _asm - { fld flt - fistp intgr - } ; - - return intgr ; - } - -#elif defined(_WIN64) -#if (_MSC_VER < 1800) - __inline long int lrint(double x) - { - return (long int) (x); - } - __inline long int lrintf(float x) - { - return (long int) (x); - } -#endif -#elif (defined (__MWERKS__) && defined (macintosh)) - - /* This MacOS 9 solution was provided by Stephane Letz */ - - #undef HAVE_LRINT_REPLACEMENT - #define HAVE_LRINT_REPLACEMENT 1 - #include - - #undef lrint - #undef lrintf - - #define lrint double2int - #define lrintf float2int - - inline int - float2int (register float in) - { long res [2] ; - - asm - { fctiw in, in - stfd in, res - } - return res [1] ; - } /* float2int */ - - inline int - double2int (register double in) - { long res [2] ; - - asm - { fctiw in, in - stfd in, res - } - return res [1] ; - } /* double2int */ - -#elif (defined (__MACH__) && defined (__APPLE__)) - - /* For Apple MacOSX. */ - - #undef HAVE_LRINT_REPLACEMENT - #define HAVE_LRINT_REPLACEMENT 1 - #include - - #undef lrint - #undef lrintf - - #define lrint double2int - #define lrintf float2int - - inline static long - float2int (register float in) - { int res [2] ; - - __asm__ __volatile__ - ( "fctiw %1, %1\n\t" - "stfd %1, %0" - : "=m" (res) /* Output */ - : "f" (in) /* Input */ - : "memory" - ) ; - - return res [1] ; - } /* lrintf */ - - inline static long - double2int (register double in) - { int res [2] ; - - __asm__ __volatile__ - ( "fctiw %1, %1\n\t" - "stfd %1, %0" - : "=m" (res) /* Output */ - : "f" (in) /* Input */ - : "memory" - ) ; - - return res [1] ; - } /* lrint */ - -#else - #ifndef __sgi - #warning "Don't have the functions lrint() and lrintf()." - #warning "Replacing these functions with a standard C cast." - #endif - - #include - - #define lrint(dbl) ((long) (dbl)) - #define lrintf(flt) ((long) (flt)) - -#endif - - -#endif /* FLOAT_CAST_HEADER */ - -/* -** Do not edit or modify anything in this comment block. -** The arch-tag line is a file identity tag for the GNU Arch -** revision control system. -** -** arch-tag: 42db1693-ff61-4051-bac1-e4d24c4e30b7 -*/ diff --git a/libs/libsndfile/src/g72x.c b/libs/libsndfile/src/g72x.c deleted file mode 100644 index fec5d3f336..0000000000 --- a/libs/libsndfile/src/g72x.c +++ /dev/null @@ -1,608 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" -#include "G72x/g72x.h" - -/* This struct is private to the G72x code. */ -struct g72x_state ; -typedef struct g72x_state G72x_STATE ; - -typedef struct -{ /* Private data. Don't mess with it. */ - struct g72x_state * private ; - - /* Public data. Read only. */ - int blocksize, samplesperblock, bytesperblock ; - - /* Public data. Read and write. */ - int blocks_total, block_curr, sample_curr ; - unsigned char block [G72x_BLOCK_SIZE] ; - short samples [G72x_BLOCK_SIZE] ; -} G72x_PRIVATE ; - -static int psf_g72x_decode_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x) ; -static int psf_g72x_encode_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x) ; - -static sf_count_t g72x_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t g72x_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t g72x_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t g72x_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t g72x_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t g72x_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t g72x_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t g72x_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static sf_count_t g72x_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; - -static int g72x_close (SF_PRIVATE *psf) ; - - -/*============================================================================================ -** WAV G721 Reader initialisation function. -*/ - -int -g72x_init (SF_PRIVATE * psf) -{ G72x_PRIVATE *pg72x ; - int bitspersample, bytesperblock, codec ; - - if (psf->codec_data != NULL) - { psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ; - return SFE_INTERNAL ; - } ; - - psf->sf.seekable = SF_FALSE ; - - if (psf->sf.channels != 1) - return SFE_G72X_NOT_MONO ; - - if ((pg72x = calloc (1, sizeof (G72x_PRIVATE))) == NULL) - return SFE_MALLOC_FAILED ; - - psf->codec_data = (void*) pg72x ; - - pg72x->block_curr = 0 ; - pg72x->sample_curr = 0 ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_G721_32 : - codec = G721_32_BITS_PER_SAMPLE ; - bytesperblock = G721_32_BYTES_PER_BLOCK ; - bitspersample = G721_32_BITS_PER_SAMPLE ; - break ; - - case SF_FORMAT_G723_24: - codec = G723_24_BITS_PER_SAMPLE ; - bytesperblock = G723_24_BYTES_PER_BLOCK ; - bitspersample = G723_24_BITS_PER_SAMPLE ; - break ; - - case SF_FORMAT_G723_40: - codec = G723_40_BITS_PER_SAMPLE ; - bytesperblock = G723_40_BYTES_PER_BLOCK ; - bitspersample = G723_40_BITS_PER_SAMPLE ; - break ; - - default : return SFE_UNIMPLEMENTED ; - } ; - - psf->filelength = psf_get_filelen (psf) ; - if (psf->filelength < psf->dataoffset) - psf->filelength = psf->dataoffset ; - - psf->datalength = psf->filelength - psf->dataoffset ; - if (psf->dataend > 0) - psf->datalength -= psf->filelength - psf->dataend ; - - if (psf->file.mode == SFM_READ) - { pg72x->private = g72x_reader_init (codec, &(pg72x->blocksize), &(pg72x->samplesperblock)) ; - if (pg72x->private == NULL) - return SFE_MALLOC_FAILED ; - - pg72x->bytesperblock = bytesperblock ; - - psf->read_short = g72x_read_s ; - psf->read_int = g72x_read_i ; - psf->read_float = g72x_read_f ; - psf->read_double = g72x_read_d ; - - psf->seek = g72x_seek ; - - if (psf->datalength % pg72x->blocksize) - { psf_log_printf (psf, "*** Odd psf->datalength (%D) should be a multiple of %d\n", psf->datalength, pg72x->blocksize) ; - pg72x->blocks_total = (psf->datalength / pg72x->blocksize) + 1 ; - } - else - pg72x->blocks_total = psf->datalength / pg72x->blocksize ; - - psf->sf.frames = pg72x->blocks_total * pg72x->samplesperblock ; - - psf_g72x_decode_block (psf, pg72x) ; - } - else if (psf->file.mode == SFM_WRITE) - { pg72x->private = g72x_writer_init (codec, &(pg72x->blocksize), &(pg72x->samplesperblock)) ; - if (pg72x->private == NULL) - return SFE_MALLOC_FAILED ; - - pg72x->bytesperblock = bytesperblock ; - - psf->write_short = g72x_write_s ; - psf->write_int = g72x_write_i ; - psf->write_float = g72x_write_f ; - psf->write_double = g72x_write_d ; - - if (psf->datalength % pg72x->blocksize) - pg72x->blocks_total = (psf->datalength / pg72x->blocksize) + 1 ; - else - pg72x->blocks_total = psf->datalength / pg72x->blocksize ; - - if (psf->datalength > 0) - psf->sf.frames = (8 * psf->datalength) / bitspersample ; - - if ((psf->sf.frames * bitspersample) / 8 != psf->datalength) - psf_log_printf (psf, "*** Warning : weird psf->datalength.\n") ; - } ; - - psf->codec_close = g72x_close ; - - return 0 ; -} /* g72x_init */ - -/*============================================================================================ -** G721 Read Functions. -*/ - -static int -psf_g72x_decode_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x) -{ int k ; - - pg72x->block_curr ++ ; - pg72x->sample_curr = 0 ; - - if (pg72x->block_curr > pg72x->blocks_total) - { memset (pg72x->samples, 0, G72x_BLOCK_SIZE * sizeof (short)) ; - return 1 ; - } ; - - if ((k = psf_fread (pg72x->block, 1, pg72x->bytesperblock, psf)) != pg72x->bytesperblock) - psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pg72x->bytesperblock) ; - - pg72x->blocksize = k ; - g72x_decode_block (pg72x->private, pg72x->block, pg72x->samples) ; - - return 1 ; -} /* psf_g72x_decode_block */ - -static int -g72x_read_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x, short *ptr, int len) -{ int count, total = 0, indx = 0 ; - - while (indx < len) - { if (pg72x->block_curr > pg72x->blocks_total) - { memset (&(ptr [indx]), 0, (len - indx) * sizeof (short)) ; - return total ; - } ; - - if (pg72x->sample_curr >= pg72x->samplesperblock) - psf_g72x_decode_block (psf, pg72x) ; - - count = pg72x->samplesperblock - pg72x->sample_curr ; - count = (len - indx > count) ? count : len - indx ; - - memcpy (&(ptr [indx]), &(pg72x->samples [pg72x->sample_curr]), count * sizeof (short)) ; - indx += count ; - pg72x->sample_curr += count ; - total = indx ; - } ; - - return total ; -} /* g72x_read_block */ - -static sf_count_t -g72x_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ G72x_PRIVATE *pg72x ; - int readcount, count ; - sf_count_t total = 0 ; - - if (psf->codec_data == NULL) - return 0 ; - pg72x = (G72x_PRIVATE*) psf->codec_data ; - - while (len > 0) - { readcount = (len > 0x10000000) ? 0x10000000 : (int) len ; - - count = g72x_read_block (psf, pg72x, ptr, readcount) ; - - total += count ; - len -= count ; - - if (count != readcount) - break ; - } ; - - return total ; -} /* g72x_read_s */ - -static sf_count_t -g72x_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - G72x_PRIVATE *pg72x ; - short *sptr ; - int k, bufferlen, readcount = 0, count ; - sf_count_t total = 0 ; - - if (psf->codec_data == NULL) - return 0 ; - pg72x = (G72x_PRIVATE*) psf->codec_data ; - - sptr = ubuf.sbuf ; - bufferlen = SF_BUFFER_LEN / sizeof (short) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = g72x_read_block (psf, pg72x, sptr, readcount) ; - - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = sptr [k] << 16 ; - - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - - return total ; -} /* g72x_read_i */ - -static sf_count_t -g72x_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - G72x_PRIVATE *pg72x ; - short *sptr ; - int k, bufferlen, readcount = 0, count ; - sf_count_t total = 0 ; - float normfact ; - - if (psf->codec_data == NULL) - return 0 ; - pg72x = (G72x_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = SF_BUFFER_LEN / sizeof (short) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = g72x_read_block (psf, pg72x, sptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * sptr [k] ; - - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - - return total ; -} /* g72x_read_f */ - -static sf_count_t -g72x_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - G72x_PRIVATE *pg72x ; - short *sptr ; - int k, bufferlen, readcount = 0, count ; - sf_count_t total = 0 ; - double normfact ; - - if (psf->codec_data == NULL) - return 0 ; - pg72x = (G72x_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = SF_BUFFER_LEN / sizeof (short) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = g72x_read_block (psf, pg72x, sptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * (double) (sptr [k]) ; - - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - - return total ; -} /* g72x_read_d */ - -static sf_count_t -g72x_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t UNUSED (offset)) -{ - psf_log_printf (psf, "seek unsupported\n") ; - - /* No simple solution. To do properly, would need to seek - ** to start of file and decode everything up to seek position. - ** Maybe implement SEEK_SET to 0 only? - */ - return 0 ; - -/* -** G72x_PRIVATE *pg72x ; -** int newblock, newsample, sample_curr ; -** -** if (psf->codec_data == NULL) -** return 0 ; -** pg72x = (G72x_PRIVATE*) psf->codec_data ; -** -** if (! (psf->datalength && psf->dataoffset)) -** { psf->error = SFE_BAD_SEEK ; -** return PSF_SEEK_ERROR ; -** } ; -** -** sample_curr = (8 * psf->datalength) / G721_32_BITS_PER_SAMPLE ; -** -** switch (whence) -** { case SEEK_SET : -** if (offset < 0 || offset > sample_curr) -** { psf->error = SFE_BAD_SEEK ; -** return PSF_SEEK_ERROR ; -** } ; -** newblock = offset / pg72x->samplesperblock ; -** newsample = offset % pg72x->samplesperblock ; -** break ; -** -** case SEEK_CUR : -** if (psf->current + offset < 0 || psf->current + offset > sample_curr) -** { psf->error = SFE_BAD_SEEK ; -** return PSF_SEEK_ERROR ; -** } ; -** newblock = (8 * (psf->current + offset)) / pg72x->samplesperblock ; -** newsample = (8 * (psf->current + offset)) % pg72x->samplesperblock ; -** break ; -** -** case SEEK_END : -** if (offset > 0 || sample_curr + offset < 0) -** { psf->error = SFE_BAD_SEEK ; -** return PSF_SEEK_ERROR ; -** } ; -** newblock = (sample_curr + offset) / pg72x->samplesperblock ; -** newsample = (sample_curr + offset) % pg72x->samplesperblock ; -** break ; -** -** default : -** psf->error = SFE_BAD_SEEK ; -** return PSF_SEEK_ERROR ; -** } ; -** -** if (psf->file.mode == SFM_READ) -** { psf_fseek (psf, psf->dataoffset + newblock * pg72x->blocksize, SEEK_SET) ; -** pg72x->block_curr = newblock ; -** psf_g72x_decode_block (psf, pg72x) ; -** pg72x->sample_curr = newsample ; -** } -** else -** { /+* What to do about write??? *+/ -** psf->error = SFE_BAD_SEEK ; -** return PSF_SEEK_ERROR ; -** } ; -** -** psf->current = newblock * pg72x->samplesperblock + newsample ; -** return psf->current ; -** -*/ -} /* g72x_seek */ - -/*========================================================================================== -** G72x Write Functions. -*/ - -static int -psf_g72x_encode_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x) -{ int k ; - - /* Encode the samples. */ - g72x_encode_block (pg72x->private, pg72x->samples, pg72x->block) ; - - /* Write the block to disk. */ - if ((k = psf_fwrite (pg72x->block, 1, pg72x->blocksize, psf)) != pg72x->blocksize) - psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pg72x->blocksize) ; - - pg72x->sample_curr = 0 ; - pg72x->block_curr ++ ; - - /* Set samples to zero for next block. */ - memset (pg72x->samples, 0, G72x_BLOCK_SIZE * sizeof (short)) ; - - return 1 ; -} /* psf_g72x_encode_block */ - -static int -g72x_write_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x, const short *ptr, int len) -{ int count, total = 0, indx = 0 ; - - while (indx < len) - { count = pg72x->samplesperblock - pg72x->sample_curr ; - - if (count > len - indx) - count = len - indx ; - - memcpy (&(pg72x->samples [pg72x->sample_curr]), &(ptr [indx]), count * sizeof (short)) ; - indx += count ; - pg72x->sample_curr += count ; - total = indx ; - - if (pg72x->sample_curr >= pg72x->samplesperblock) - psf_g72x_encode_block (psf, pg72x) ; - } ; - - return total ; -} /* g72x_write_block */ - -static sf_count_t -g72x_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ G72x_PRIVATE *pg72x ; - int writecount, count ; - sf_count_t total = 0 ; - - if (psf->codec_data == NULL) - return 0 ; - pg72x = (G72x_PRIVATE*) psf->codec_data ; - - while (len > 0) - { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; - - count = g72x_write_block (psf, pg72x, ptr, writecount) ; - - total += count ; - len -= count ; - if (count != writecount) - break ; - } ; - - return total ; -} /* g72x_write_s */ - -static sf_count_t -g72x_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - G72x_PRIVATE *pg72x ; - short *sptr ; - int k, bufferlen, writecount = 0, count ; - sf_count_t total = 0 ; - - if (psf->codec_data == NULL) - return 0 ; - pg72x = (G72x_PRIVATE*) psf->codec_data ; - - sptr = ubuf.sbuf ; - bufferlen = SF_BUFFER_LEN / sizeof (short) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = ptr [total + k] >> 16 ; - count = g72x_write_block (psf, pg72x, sptr, writecount) ; - - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - return total ; -} /* g72x_write_i */ - -static sf_count_t -g72x_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - G72x_PRIVATE *pg72x ; - short *sptr ; - int k, bufferlen, writecount = 0, count ; - sf_count_t total = 0 ; - float normfact ; - - if (psf->codec_data == NULL) - return 0 ; - pg72x = (G72x_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x8000) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = SF_BUFFER_LEN / sizeof (short) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = lrintf (normfact * ptr [total + k]) ; - count = g72x_write_block (psf, pg72x, sptr, writecount) ; - - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - - return total ; -} /* g72x_write_f */ - -static sf_count_t -g72x_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - G72x_PRIVATE *pg72x ; - short *sptr ; - int k, bufferlen, writecount = 0, count ; - sf_count_t total = 0 ; - double normfact ; - - if (psf->codec_data == NULL) - return 0 ; - pg72x = (G72x_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x8000) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = SF_BUFFER_LEN / sizeof (short) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = lrint (normfact * ptr [total + k]) ; - count = g72x_write_block (psf, pg72x, sptr, writecount) ; - - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - - return total ; -} /* g72x_write_d */ - -static int -g72x_close (SF_PRIVATE *psf) -{ G72x_PRIVATE *pg72x ; - - pg72x = (G72x_PRIVATE*) psf->codec_data ; - - if (psf->file.mode == SFM_WRITE) - { /* If a block has been partially assembled, write it out - ** as the final block. - */ - - if (pg72x->sample_curr && pg72x->sample_curr < G72x_BLOCK_SIZE) - psf_g72x_encode_block (psf, pg72x) ; - - if (psf->write_header) - psf->write_header (psf, SF_FALSE) ; - } ; - - /* Only free the pointer allocated by g72x_(reader|writer)_init. */ - free (pg72x->private) ; - - return 0 ; -} /* g72x_close */ - diff --git a/libs/libsndfile/src/gsm610.c b/libs/libsndfile/src/gsm610.c deleted file mode 100644 index 0d2800d92b..0000000000 --- a/libs/libsndfile/src/gsm610.c +++ /dev/null @@ -1,627 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" -#include "wav_w64.h" -#include "GSM610/gsm.h" - -#define GSM610_BLOCKSIZE 33 -#define GSM610_SAMPLES 160 - -typedef struct gsm610_tag -{ int blocks ; - int blockcount, samplecount ; - int samplesperblock, blocksize ; - - int (*decode_block) (SF_PRIVATE *psf, struct gsm610_tag *pgsm610) ; - int (*encode_block) (SF_PRIVATE *psf, struct gsm610_tag *pgsm610) ; - - short samples [WAV_W64_GSM610_SAMPLES] ; - unsigned char block [WAV_W64_GSM610_BLOCKSIZE] ; - - /* Damn I hate typedef-ed pointers; yes, gsm is a pointer type. */ - gsm gsm_data ; -} GSM610_PRIVATE ; - -static sf_count_t gsm610_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t gsm610_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t gsm610_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t gsm610_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t gsm610_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t gsm610_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t gsm610_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t gsm610_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static int gsm610_read_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len) ; -static int gsm610_write_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, const short *ptr, int len) ; - -static int gsm610_decode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ; -static int gsm610_encode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ; - -static int gsm610_wav_decode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ; -static int gsm610_wav_encode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ; - -static sf_count_t gsm610_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; - -static int gsm610_close (SF_PRIVATE *psf) ; - -/*============================================================================================ -** WAV GSM610 initialisation function. -*/ - -int -gsm610_init (SF_PRIVATE *psf) -{ GSM610_PRIVATE *pgsm610 ; - int true_flag = 1 ; - - if (psf->codec_data != NULL) - { psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ; - return SFE_INTERNAL ; - } ; - - if (psf->file.mode == SFM_RDWR) - return SFE_BAD_MODE_RW ; - - psf->sf.seekable = SF_FALSE ; - - if ((pgsm610 = calloc (1, sizeof (GSM610_PRIVATE))) == NULL) - return SFE_MALLOC_FAILED ; - - psf->codec_data = pgsm610 ; - - memset (pgsm610, 0, sizeof (GSM610_PRIVATE)) ; - -/*============================================================ - -Need separate gsm_data structs for encode and decode. - -============================================================*/ - - if ((pgsm610->gsm_data = gsm_create ()) == NULL) - return SFE_MALLOC_FAILED ; - - switch (SF_CONTAINER (psf->sf.format)) - { case SF_FORMAT_WAV : - case SF_FORMAT_WAVEX : - case SF_FORMAT_W64 : - gsm_option (pgsm610->gsm_data, GSM_OPT_WAV49, &true_flag) ; - - pgsm610->encode_block = gsm610_wav_encode_block ; - pgsm610->decode_block = gsm610_wav_decode_block ; - - pgsm610->samplesperblock = WAV_W64_GSM610_SAMPLES ; - pgsm610->blocksize = WAV_W64_GSM610_BLOCKSIZE ; - break ; - - case SF_FORMAT_AIFF : - case SF_FORMAT_RAW : - pgsm610->encode_block = gsm610_encode_block ; - pgsm610->decode_block = gsm610_decode_block ; - - pgsm610->samplesperblock = GSM610_SAMPLES ; - pgsm610->blocksize = GSM610_BLOCKSIZE ; - break ; - - default : - return SFE_INTERNAL ; - break ; - } ; - - if (psf->file.mode == SFM_READ) - { if (psf->datalength % pgsm610->blocksize == 0) - pgsm610->blocks = psf->datalength / pgsm610->blocksize ; - else if (psf->datalength % pgsm610->blocksize == 1 && pgsm610->blocksize == GSM610_BLOCKSIZE) - { /* - ** Weird AIFF specific case. - ** AIFF chunks must be at an even offset from the start of file and - ** GSM610_BLOCKSIZE is odd which can result in an odd length SSND - ** chunk. The SSND chunk then gets padded on write which means that - ** when it is read the datalength is too big by 1. - */ - pgsm610->blocks = psf->datalength / pgsm610->blocksize ; - } - else - { psf_log_printf (psf, "*** Warning : data chunk seems to be truncated.\n") ; - pgsm610->blocks = psf->datalength / pgsm610->blocksize + 1 ; - } ; - - psf->sf.frames = pgsm610->samplesperblock * pgsm610->blocks ; - - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - - pgsm610->decode_block (psf, pgsm610) ; /* Read first block. */ - - psf->read_short = gsm610_read_s ; - psf->read_int = gsm610_read_i ; - psf->read_float = gsm610_read_f ; - psf->read_double = gsm610_read_d ; - } ; - - if (psf->file.mode == SFM_WRITE) - { pgsm610->blockcount = 0 ; - pgsm610->samplecount = 0 ; - - psf->write_short = gsm610_write_s ; - psf->write_int = gsm610_write_i ; - psf->write_float = gsm610_write_f ; - psf->write_double = gsm610_write_d ; - } ; - - psf->codec_close = gsm610_close ; - - psf->seek = gsm610_seek ; - - psf->filelength = psf_get_filelen (psf) ; - psf->datalength = psf->filelength - psf->dataoffset ; - - return 0 ; -} /* gsm610_init */ - -/*============================================================================================ -** GSM 6.10 Read Functions. -*/ - -static int -gsm610_wav_decode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) -{ int k ; - - pgsm610->blockcount ++ ; - pgsm610->samplecount = 0 ; - - if (pgsm610->blockcount > pgsm610->blocks) - { memset (pgsm610->samples, 0, sizeof (pgsm610->samples)) ; - return 1 ; - } ; - - if ((k = psf_fread (pgsm610->block, 1, WAV_W64_GSM610_BLOCKSIZE, psf)) != WAV_W64_GSM610_BLOCKSIZE) - psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, WAV_W64_GSM610_BLOCKSIZE) ; - - if (gsm_decode (pgsm610->gsm_data, pgsm610->block, pgsm610->samples) < 0) - { psf_log_printf (psf, "Error from WAV gsm_decode() on frame : %d\n", pgsm610->blockcount) ; - return 0 ; - } ; - - if (gsm_decode (pgsm610->gsm_data, pgsm610->block + (WAV_W64_GSM610_BLOCKSIZE + 1) / 2, pgsm610->samples + WAV_W64_GSM610_SAMPLES / 2) < 0) - { psf_log_printf (psf, "Error from WAV gsm_decode() on frame : %d.5\n", pgsm610->blockcount) ; - return 0 ; - } ; - - return 1 ; -} /* gsm610_wav_decode_block */ - -static int -gsm610_decode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) -{ int k ; - - pgsm610->blockcount ++ ; - pgsm610->samplecount = 0 ; - - if (pgsm610->blockcount > pgsm610->blocks) - { memset (pgsm610->samples, 0, sizeof (pgsm610->samples)) ; - return 1 ; - } ; - - if ((k = psf_fread (pgsm610->block, 1, GSM610_BLOCKSIZE, psf)) != GSM610_BLOCKSIZE) - psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, GSM610_BLOCKSIZE) ; - - if (gsm_decode (pgsm610->gsm_data, pgsm610->block, pgsm610->samples) < 0) - { psf_log_printf (psf, "Error from standard gsm_decode() on frame : %d\n", pgsm610->blockcount) ; - return 0 ; - } ; - - return 1 ; -} /* gsm610_decode_block */ - -static int -gsm610_read_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len) -{ int count, total = 0, indx = 0 ; - - while (indx < len) - { if (pgsm610->blockcount >= pgsm610->blocks && pgsm610->samplecount >= pgsm610->samplesperblock) - { memset (ptr + indx, 0, (len - indx) * sizeof (short)) ; - return total ; - } ; - - if (pgsm610->samplecount >= pgsm610->samplesperblock) - pgsm610->decode_block (psf, pgsm610) ; - - count = pgsm610->samplesperblock - pgsm610->samplecount ; - count = (len - indx > count) ? count : len - indx ; - - memcpy (&(ptr [indx]), &(pgsm610->samples [pgsm610->samplecount]), count * sizeof (short)) ; - indx += count ; - pgsm610->samplecount += count ; - total = indx ; - } ; - - return total ; -} /* gsm610_read_block */ - -static sf_count_t -gsm610_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ GSM610_PRIVATE *pgsm610 ; - int readcount, count ; - sf_count_t total = 0 ; - - if (psf->codec_data == NULL) - return 0 ; - pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; - - while (len > 0) - { readcount = (len > 0x10000000) ? 0x1000000 : (int) len ; - - count = gsm610_read_block (psf, pgsm610, ptr, readcount) ; - - total += count ; - len -= count ; - - if (count != readcount) - break ; - } ; - - return total ; -} /* gsm610_read_s */ - -static sf_count_t -gsm610_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ GSM610_PRIVATE *pgsm610 ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, readcount = 0, count ; - sf_count_t total = 0 ; - - if (psf->codec_data == NULL) - return 0 ; - pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = gsm610_read_block (psf, pgsm610, sptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = sptr [k] << 16 ; - - total += count ; - len -= readcount ; - } ; - return total ; -} /* gsm610_read_i */ - -static sf_count_t -gsm610_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ GSM610_PRIVATE *pgsm610 ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, readcount = 0, count ; - sf_count_t total = 0 ; - float normfact ; - - if (psf->codec_data == NULL) - return 0 ; - pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = gsm610_read_block (psf, pgsm610, sptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * sptr [k] ; - - total += count ; - len -= readcount ; - } ; - return total ; -} /* gsm610_read_f */ - -static sf_count_t -gsm610_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ GSM610_PRIVATE *pgsm610 ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, readcount = 0, count ; - sf_count_t total = 0 ; - double normfact ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; - - if (psf->codec_data == NULL) - return 0 ; - pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = gsm610_read_block (psf, pgsm610, sptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * sptr [k] ; - - total += count ; - len -= readcount ; - } ; - return total ; -} /* gsm610_read_d */ - -static sf_count_t -gsm610_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset) -{ GSM610_PRIVATE *pgsm610 ; - int newblock, newsample ; - - if (psf->codec_data == NULL) - return 0 ; - pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; - - if (psf->dataoffset < 0) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - if (offset == 0) - { int true_flag = 1 ; - - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - pgsm610->blockcount = 0 ; - - gsm_init (pgsm610->gsm_data) ; - if ((SF_CONTAINER (psf->sf.format)) == SF_FORMAT_WAV || - (SF_CONTAINER (psf->sf.format)) == SF_FORMAT_W64) - gsm_option (pgsm610->gsm_data, GSM_OPT_WAV49, &true_flag) ; - - pgsm610->decode_block (psf, pgsm610) ; - pgsm610->samplecount = 0 ; - return 0 ; - } ; - - if (offset < 0 || offset > pgsm610->blocks * pgsm610->samplesperblock) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - newblock = offset / pgsm610->samplesperblock ; - newsample = offset % pgsm610->samplesperblock ; - - if (psf->file.mode == SFM_READ) - { if (psf->read_current != newblock * pgsm610->samplesperblock + newsample) - { psf_fseek (psf, psf->dataoffset + newblock * pgsm610->samplesperblock, SEEK_SET) ; - pgsm610->blockcount = newblock ; - pgsm610->decode_block (psf, pgsm610) ; - pgsm610->samplecount = newsample ; - } ; - - return newblock * pgsm610->samplesperblock + newsample ; - } ; - - /* What to do about write??? */ - psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; -} /* gsm610_seek */ - -/*========================================================================================== -** GSM 6.10 Write Functions. -*/ - -static int -gsm610_encode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) -{ int k ; - - /* Encode the samples. */ - gsm_encode (pgsm610->gsm_data, pgsm610->samples, pgsm610->block) ; - - /* Write the block to disk. */ - if ((k = psf_fwrite (pgsm610->block, 1, GSM610_BLOCKSIZE, psf)) != GSM610_BLOCKSIZE) - psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, GSM610_BLOCKSIZE) ; - - pgsm610->samplecount = 0 ; - pgsm610->blockcount ++ ; - - /* Set samples to zero for next block. */ - memset (pgsm610->samples, 0, sizeof (pgsm610->samples)) ; - - return 1 ; -} /* gsm610_encode_block */ - -static int -gsm610_wav_encode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) -{ int k ; - - /* Encode the samples. */ - gsm_encode (pgsm610->gsm_data, pgsm610->samples, pgsm610->block) ; - gsm_encode (pgsm610->gsm_data, pgsm610->samples+WAV_W64_GSM610_SAMPLES / 2, pgsm610->block+WAV_W64_GSM610_BLOCKSIZE / 2) ; - - /* Write the block to disk. */ - if ((k = psf_fwrite (pgsm610->block, 1, WAV_W64_GSM610_BLOCKSIZE, psf)) != WAV_W64_GSM610_BLOCKSIZE) - psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, WAV_W64_GSM610_BLOCKSIZE) ; - - pgsm610->samplecount = 0 ; - pgsm610->blockcount ++ ; - - /* Set samples to zero for next block. */ - memset (pgsm610->samples, 0, sizeof (pgsm610->samples)) ; - - return 1 ; -} /* gsm610_wav_encode_block */ - -static int -gsm610_write_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, const short *ptr, int len) -{ int count, total = 0, indx = 0 ; - - while (indx < len) - { count = pgsm610->samplesperblock - pgsm610->samplecount ; - - if (count > len - indx) - count = len - indx ; - - memcpy (&(pgsm610->samples [pgsm610->samplecount]), &(ptr [indx]), count * sizeof (short)) ; - indx += count ; - pgsm610->samplecount += count ; - total = indx ; - - if (pgsm610->samplecount >= pgsm610->samplesperblock) - pgsm610->encode_block (psf, pgsm610) ; - } ; - - return total ; -} /* gsm610_write_block */ - -static sf_count_t -gsm610_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ GSM610_PRIVATE *pgsm610 ; - int writecount, count ; - sf_count_t total = 0 ; - - if (psf->codec_data == NULL) - return 0 ; - pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; - - while (len > 0) - { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; - - count = gsm610_write_block (psf, pgsm610, ptr, writecount) ; - - total += count ; - len -= count ; - - if (count != writecount) - break ; - } ; - - return total ; -} /* gsm610_write_s */ - -static sf_count_t -gsm610_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ GSM610_PRIVATE *pgsm610 ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, writecount = 0, count ; - sf_count_t total = 0 ; - - if (psf->codec_data == NULL) - return 0 ; - pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = ptr [total + k] >> 16 ; - count = gsm610_write_block (psf, pgsm610, sptr, writecount) ; - - total += count ; - len -= writecount ; - } ; - return total ; -} /* gsm610_write_i */ - -static sf_count_t -gsm610_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ GSM610_PRIVATE *pgsm610 ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, writecount = 0, count ; - sf_count_t total = 0 ; - float normfact ; - - if (psf->codec_data == NULL) - return 0 ; - pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = lrintf (normfact * ptr [total + k]) ; - count = gsm610_write_block (psf, pgsm610, sptr, writecount) ; - - total += count ; - len -= writecount ; - } ; - return total ; -} /* gsm610_write_f */ - -static sf_count_t -gsm610_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ GSM610_PRIVATE *pgsm610 ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, writecount = 0, count ; - sf_count_t total = 0 ; - double normfact ; - - if (psf->codec_data == NULL) - return 0 ; - pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = lrint (normfact * ptr [total + k]) ; - count = gsm610_write_block (psf, pgsm610, sptr, writecount) ; - - total += count ; - len -= writecount ; - } ; - return total ; -} /* gsm610_write_d */ - -static int -gsm610_close (SF_PRIVATE *psf) -{ GSM610_PRIVATE *pgsm610 ; - - if (psf->codec_data == NULL) - return 0 ; - - pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; - - if (psf->file.mode == SFM_WRITE) - { /* If a block has been partially assembled, write it out - ** as the final block. - */ - - if (pgsm610->samplecount && pgsm610->samplecount < pgsm610->samplesperblock) - pgsm610->encode_block (psf, pgsm610) ; - } ; - - if (pgsm610->gsm_data) - gsm_destroy (pgsm610->gsm_data) ; - - return 0 ; -} /* gsm610_close */ - diff --git a/libs/libsndfile/src/htk.c b/libs/libsndfile/src/htk.c deleted file mode 100644 index 25390f1dc1..0000000000 --- a/libs/libsndfile/src/htk.c +++ /dev/null @@ -1,226 +0,0 @@ -/* -** Copyright (C) 2002-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/*------------------------------------------------------------------------------ -** Macros to handle big/little endian issues. -*/ - -#define SFE_HTK_BAD_FILE_LEN 1666 -#define SFE_HTK_NOT_WAVEFORM 1667 - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int htk_close (SF_PRIVATE *psf) ; - -static int htk_write_header (SF_PRIVATE *psf, int calc_length) ; -static int htk_read_header (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -htk_open (SF_PRIVATE *psf) -{ int subformat ; - int error = 0 ; - - if (psf->is_pipe) - return SFE_HTK_NO_PIPE ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = htk_read_header (psf))) - return error ; - } ; - - subformat = SF_CODEC (psf->sf.format) ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_HTK) - return SFE_BAD_OPEN_FORMAT ; - - psf->endian = SF_ENDIAN_BIG ; - - if (htk_write_header (psf, SF_FALSE)) - return psf->error ; - - psf->write_header = htk_write_header ; - } ; - - psf->container_close = htk_close ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - switch (subformat) - { case SF_FORMAT_PCM_16 : /* 16-bit linear PCM. */ - error = pcm_init (psf) ; - break ; - - default : break ; - } ; - - return error ; -} /* htk_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -htk_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - htk_write_header (psf, SF_TRUE) ; - - return 0 ; -} /* htk_close */ - -static int -htk_write_header (SF_PRIVATE *psf, int calc_length) -{ sf_count_t current ; - int sample_count, sample_period ; - - current = psf_ftell (psf) ; - - if (calc_length) - psf->filelength = psf_get_filelen (psf) ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - psf_fseek (psf, 0, SEEK_SET) ; - - if (psf->filelength > 12) - sample_count = (psf->filelength - 12) / 2 ; - else - sample_count = 0 ; - - sample_period = 10000000 / psf->sf.samplerate ; - - psf_binheader_writef (psf, "E444", sample_count, sample_period, 0x20000) ; - - /* Header construction complete so write it out. */ - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - psf->dataoffset = psf->headindex ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* htk_write_header */ - -/* -** Found the following info in a comment block within Bill Schottstaedt's -** sndlib library. -** -** HTK format files consist of a contiguous sequence of samples preceded by a -** header. Each sample is a vector of either 2-byte integers or 4-byte floats. -** 2-byte integers are used for compressed forms as described below and for -** vector quantised data as described later in section 5.11. HTK format data -** files can also be used to store speech waveforms as described in section 5.8. -** -** The HTK file format header is 12 bytes long and contains the following data -** nSamples -- number of samples in file (4-byte integer) -** sampPeriod -- sample period in 100ns units (4-byte integer) -** sampSize -- number of bytes per sample (2-byte integer) -** parmKind -- a code indicating the sample kind (2-byte integer) -** -** The parameter kind consists of a 6 bit code representing the basic -** parameter kind plus additional bits for each of the possible qualifiers. -** The basic parameter kind codes are -** -** 0 WAVEFORM sampled waveform -** 1 LPC linear prediction filter coefficients -** 2 LPREFC linear prediction reflection coefficients -** 3 LPCEPSTRA LPC cepstral coefficients -** 4 LPDELCEP LPC cepstra plus delta coefficients -** 5 IREFC LPC reflection coef in 16 bit integer format -** 6 MFCC mel-frequency cepstral coefficients -** 7 FBANK log mel-filter bank channel outputs -** 8 MELSPEC linear mel-filter bank channel outputs -** 9 USER user defined sample kind -** 10 DISCRETE vector quantised data -** -** and the bit-encoding for the qualifiers (in octal) is -** _E 000100 has energy -** _N 000200 absolute energy suppressed -** _D 000400 has delta coefficients -** _A 001000 has acceleration coefficients -** _C 002000 is compressed -** _Z 004000 has zero mean static coef. -** _K 010000 has CRC checksum -** _O 020000 has 0'th cepstral coef. -*/ - -static int -htk_read_header (SF_PRIVATE *psf) -{ int sample_count, sample_period, marker ; - - psf_binheader_readf (psf, "pE444", 0, &sample_count, &sample_period, &marker) ; - - if (2 * sample_count + 12 != psf->filelength) - return SFE_HTK_BAD_FILE_LEN ; - - if (marker != 0x20000) - return SFE_HTK_NOT_WAVEFORM ; - - psf->sf.channels = 1 ; - - if (sample_period > 0) - { psf->sf.samplerate = 10000000 / sample_period ; - psf_log_printf (psf, "HTK Waveform file\n Sample Count : %d\n Sample Period : %d => %d Hz\n", - sample_count, sample_period, psf->sf.samplerate) ; - } - else - { psf->sf.samplerate = 16000 ; - psf_log_printf (psf, "HTK Waveform file\n Sample Count : %d\n Sample Period : %d (should be > 0) => Guessed sample rate %d Hz\n", - sample_count, sample_period, psf->sf.samplerate) ; - } ; - - psf->sf.format = SF_FORMAT_HTK | SF_FORMAT_PCM_16 ; - psf->bytewidth = 2 ; - - /* HTK always has a 12 byte header. */ - psf->dataoffset = 12 ; - psf->endian = SF_ENDIAN_BIG ; - - psf->datalength = psf->filelength - psf->dataoffset ; - - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - - if (! psf->sf.frames && psf->blockwidth) - psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; - - return 0 ; -} /* htk_read_header */ - diff --git a/libs/libsndfile/src/id3.c b/libs/libsndfile/src/id3.c deleted file mode 100644 index 2fd0a0b971..0000000000 --- a/libs/libsndfile/src/id3.c +++ /dev/null @@ -1,57 +0,0 @@ -/* -** Copyright (C) 2010-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -int -id3_skip (SF_PRIVATE * psf) -{ unsigned char buf [10] ; - - memset (buf, 0, sizeof (buf)) ; - psf_binheader_readf (psf, "pb", 0, buf, 10) ; - - if (buf [0] == 'I' && buf [1] == 'D' && buf [2] == '3') - { int offset = buf [6] & 0x7f ; - offset = (offset << 7) | (buf [7] & 0x7f) ; - offset = (offset << 7) | (buf [8] & 0x7f) ; - offset = (offset << 7) | (buf [9] & 0x7f) ; - - psf_log_printf (psf, "ID3 length : %d\n--------------------\n", offset) ; - - /* Never want to jump backwards in a file. */ - if (offset < 0) - return 0 ; - - /* Calculate new file offset and position ourselves there. */ - psf->fileoffset += offset + 10 ; - psf_binheader_readf (psf, "p", psf->fileoffset) ; - - return 1 ; - } ; - - return 0 ; -} /* id3_skip */ diff --git a/libs/libsndfile/src/ima_adpcm.c b/libs/libsndfile/src/ima_adpcm.c deleted file mode 100644 index 0ba4513758..0000000000 --- a/libs/libsndfile/src/ima_adpcm.c +++ /dev/null @@ -1,948 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -typedef struct IMA_ADPCM_PRIVATE_tag -{ int (*decode_block) (SF_PRIVATE *psf, struct IMA_ADPCM_PRIVATE_tag *pima) ; - int (*encode_block) (SF_PRIVATE *psf, struct IMA_ADPCM_PRIVATE_tag *pima) ; - - int channels, blocksize, samplesperblock, blocks ; - int blockcount, samplecount ; - int previous [2] ; - int stepindx [2] ; - unsigned char *block ; - short *samples ; - short data [] ; /* ISO C99 struct flexible array. */ -} IMA_ADPCM_PRIVATE ; - -/*============================================================================================ -** Predefined IMA ADPCM data. -*/ - -static int ima_indx_adjust [16] = -{ -1, -1, -1, -1, /* +0 - +3, decrease the step size */ - +2, +4, +6, +8, /* +4 - +7, increase the step size */ - -1, -1, -1, -1, /* -0 - -3, decrease the step size */ - +2, +4, +6, +8, /* -4 - -7, increase the step size */ -} ; - -static int ima_step_size [89] = -{ 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, - 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, - 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, - 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, - 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, - 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, - 32767 -} ; - -static int ima_reader_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ; -static int ima_writer_init (SF_PRIVATE *psf, int blockalign) ; - -static int ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len) ; -static int ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, const short *ptr, int len) ; - -static sf_count_t ima_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t ima_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t ima_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t ima_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t ima_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t ima_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t ima_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t ima_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static sf_count_t ima_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; - -static int ima_close (SF_PRIVATE *psf) ; - -static int wav_w64_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ; -static int wav_w64_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ; - -/*-static int aiff_ima_reader_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ;-*/ -static int aiff_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ; -static int aiff_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ; - - -static inline int -clamp_ima_step_index (int indx) -{ if (indx < 0) - return 0 ; - if (indx >= ARRAY_LEN (ima_step_size)) - return ARRAY_LEN (ima_step_size) - 1 ; - - return indx ; -} /* clamp_ima_step_index */ - -/*============================================================================================ -** IMA ADPCM Reader initialisation function. -*/ - -int -wav_w64_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) -{ int error ; - - if (psf->codec_data != NULL) - { psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ; - return SFE_INTERNAL ; - } ; - - if (psf->file.mode == SFM_RDWR) - return SFE_BAD_MODE_RW ; - - if (psf->file.mode == SFM_READ) - if ((error = ima_reader_init (psf, blockalign, samplesperblock))) - return error ; - - if (psf->file.mode == SFM_WRITE) - if ((error = ima_writer_init (psf, blockalign))) - return error ; - - psf->codec_close = ima_close ; - psf->seek = ima_seek ; - - return 0 ; -} /* wav_w64_ima_init */ - -int -aiff_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) -{ int error ; - - if (psf->file.mode == SFM_RDWR) - return SFE_BAD_MODE_RW ; - - if (psf->file.mode == SFM_READ) - if ((error = ima_reader_init (psf, blockalign, samplesperblock))) - return error ; - - if (psf->file.mode == SFM_WRITE) - if ((error = ima_writer_init (psf, blockalign))) - return error ; - - psf->codec_close = ima_close ; - - return 0 ; -} /* aiff_ima_init */ - -static int -ima_close (SF_PRIVATE *psf) -{ IMA_ADPCM_PRIVATE *pima ; - - pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; - - if (psf->file.mode == SFM_WRITE) - { /* If a block has been partially assembled, write it out - ** as the final block. - */ - if (pima->samplecount && pima->samplecount < pima->samplesperblock) - pima->encode_block (psf, pima) ; - - psf->sf.frames = pima->samplesperblock * pima->blockcount / psf->sf.channels ; - } ; - - return 0 ; -} /* ima_close */ - -/*============================================================================================ -** IMA ADPCM Read Functions. -*/ - -static int -ima_reader_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) -{ IMA_ADPCM_PRIVATE *pima ; - int pimasize, count ; - - if (psf->file.mode != SFM_READ) - return SFE_BAD_MODE_RW ; - - pimasize = sizeof (IMA_ADPCM_PRIVATE) + blockalign * psf->sf.channels + 3 * psf->sf.channels * samplesperblock ; - - if (! (pima = calloc (1, pimasize))) - return SFE_MALLOC_FAILED ; - - psf->codec_data = (void*) pima ; - - pima->samples = pima->data ; - pima->block = (unsigned char*) (pima->data + samplesperblock * psf->sf.channels) ; - - pima->channels = psf->sf.channels ; - pima->blocksize = blockalign ; - pima->samplesperblock = samplesperblock ; - - psf->filelength = psf_get_filelen (psf) ; - psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : - psf->filelength - psf->dataoffset ; - - if (pima->blocksize == 0) - { psf_log_printf (psf, "*** Error : pima->blocksize should not be zero.\n") ; - return SFE_INTERNAL ; - } ; - - if (psf->datalength % pima->blocksize) - pima->blocks = psf->datalength / pima->blocksize + 1 ; - else - pima->blocks = psf->datalength / pima->blocksize ; - - switch (SF_CONTAINER (psf->sf.format)) - { case SF_FORMAT_WAV : - case SF_FORMAT_W64 : - count = 2 * (pima->blocksize - 4 * pima->channels) / pima->channels + 1 ; - - if (pima->samplesperblock != count) - { psf_log_printf (psf, "*** Error : samplesperblock should be %d.\n", count) ; - return SFE_INTERNAL ; - } ; - - pima->decode_block = wav_w64_ima_decode_block ; - - psf->sf.frames = pima->samplesperblock * pima->blocks ; - break ; - - case SF_FORMAT_AIFF : - psf_log_printf (psf, "still need to check block count\n") ; - pima->decode_block = aiff_ima_decode_block ; - psf->sf.frames = pima->samplesperblock * pima->blocks / pima->channels ; - break ; - - default : - psf_log_printf (psf, "ima_reader_init: bad psf->sf.format\n") ; - return SFE_INTERNAL ; - } ; - - pima->decode_block (psf, pima) ; /* Read first block. */ - - psf->read_short = ima_read_s ; - psf->read_int = ima_read_i ; - psf->read_float = ima_read_f ; - psf->read_double = ima_read_d ; - - return 0 ; -} /* ima_reader_init */ - -static int -aiff_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) -{ unsigned char *blockdata ; - int chan, k, diff, bytecode, predictor ; - short step, stepindx, *sampledata ; - -static int count = 0 ; -count ++ ; - - pima->blockcount += pima->channels ; - pima->samplecount = 0 ; - - if (pima->blockcount > pima->blocks) - { memset (pima->samples, 0, pima->samplesperblock * pima->channels * sizeof (short)) ; - return 1 ; - } ; - - if ((k = psf_fread (pima->block, 1, pima->blocksize * pima->channels, psf)) != pima->blocksize * pima->channels) - psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pima->blocksize) ; - - /* Read and check the block header. */ - for (chan = 0 ; chan < pima->channels ; chan++) - { blockdata = pima->block + chan * 34 ; - sampledata = pima->samples + chan ; - - predictor = (blockdata [0] << 8) | (blockdata [1] & 0x80) ; - - stepindx = blockdata [1] & 0x7F ; - stepindx = clamp_ima_step_index (stepindx) ; - - /* - ** Pull apart the packed 4 bit samples and store them in their - ** correct sample positions. - */ - for (k = 0 ; k < pima->blocksize - 2 ; k++) - { bytecode = blockdata [k + 2] ; - sampledata [pima->channels * (2 * k + 0)] = bytecode & 0xF ; - sampledata [pima->channels * (2 * k + 1)] = (bytecode >> 4) & 0xF ; - } ; - - /* Decode the encoded 4 bit samples. */ - for (k = 0 ; k < pima->samplesperblock ; k ++) - { step = ima_step_size [stepindx] ; - - bytecode = pima->samples [pima->channels * k + chan] ; - - stepindx += ima_indx_adjust [bytecode] ; - stepindx = clamp_ima_step_index (stepindx) ; - - diff = step >> 3 ; - if (bytecode & 1) diff += step >> 2 ; - if (bytecode & 2) diff += step >> 1 ; - if (bytecode & 4) diff += step ; - if (bytecode & 8) diff = -diff ; - - predictor += diff ; - if (predictor < -32768) - predictor = -32768 ; - else if (predictor > 32767) - predictor = 32767 ; - - pima->samples [pima->channels * k + chan] = predictor ; - } ; - } ; - - return 1 ; -} /* aiff_ima_decode_block */ - -static int -aiff_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) -{ int chan, k, step, diff, vpdiff, blockindx, indx ; - short bytecode, mask ; - - /* Encode the block header. */ - for (chan = 0 ; chan < pima->channels ; chan ++) - { blockindx = chan * pima->blocksize ; - - pima->block [blockindx] = (pima->samples [chan] >> 8) & 0xFF ; - pima->block [blockindx + 1] = (pima->samples [chan] & 0x80) + (pima->stepindx [chan] & 0x7F) ; - - pima->previous [chan] = pima->samples [chan] ; - } ; - - /* Encode second and later samples for every block as a 4 bit value. */ - for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++) - { chan = (pima->channels > 1) ? (k % 2) : 0 ; - - diff = pima->samples [k] - pima->previous [chan] ; - - bytecode = 0 ; - step = ima_step_size [pima->stepindx [chan]] ; - vpdiff = step >> 3 ; - if (diff < 0) - { bytecode = 8 ; - diff = -diff ; - } ; - mask = 4 ; - while (mask) - { if (diff >= step) - { bytecode |= mask ; - diff -= step ; - vpdiff += step ; - } ; - step >>= 1 ; - mask >>= 1 ; - } ; - - if (bytecode & 8) - pima->previous [chan] -= vpdiff ; - else - pima->previous [chan] += vpdiff ; - - if (pima->previous [chan] > 32767) - pima->previous [chan] = 32767 ; - else if (pima->previous [chan] < -32768) - pima->previous [chan] = -32768 ; - - pima->stepindx [chan] += ima_indx_adjust [bytecode] ; - - pima->stepindx [chan] = clamp_ima_step_index (pima->stepindx [chan]) ; - pima->samples [k] = bytecode ; - } ; - - /* Pack the 4 bit encoded samples. */ - - for (chan = 0 ; chan < pima->channels ; chan ++) - { for (indx = pima->channels ; indx < pima->channels * pima->samplesperblock ; indx += 2 * pima->channels) - { blockindx = chan * pima->blocksize + 2 + indx / 2 ; - - pima->block [blockindx] = pima->samples [indx] & 0x0F ; - pima->block [blockindx] |= (pima->samples [indx + chan] << 4) & 0xF0 ; - } ; - } ; - - /* Write the block to disk. */ - - if ((k = psf_fwrite (pima->block, 1, pima->channels * pima->blocksize, psf)) != pima->channels * pima->blocksize) - psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pima->channels * pima->blocksize) ; - - memset (pima->samples, 0, pima->channels * pima->samplesperblock * sizeof (short)) ; - pima->samplecount = 0 ; - pima->blockcount ++ ; - - return 1 ; -} /* aiff_ima_encode_block */ - -static int -wav_w64_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) -{ int chan, k, predictor, blockindx, indx, indxstart, diff ; - short step, bytecode, stepindx [2] ; - - pima->blockcount ++ ; - pima->samplecount = 0 ; - - if (pima->blockcount > pima->blocks) - { memset (pima->samples, 0, pima->samplesperblock * pima->channels * sizeof (short)) ; - return 1 ; - } ; - - if ((k = psf_fread (pima->block, 1, pima->blocksize, psf)) != pima->blocksize) - psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pima->blocksize) ; - - /* Read and check the block header. */ - - for (chan = 0 ; chan < pima->channels ; chan++) - { predictor = pima->block [chan*4] | (pima->block [chan*4+1] << 8) ; - if (predictor & 0x8000) - predictor -= 0x10000 ; - - stepindx [chan] = pima->block [chan*4+2] ; - stepindx [chan] = clamp_ima_step_index (stepindx [chan]) ; - - - if (pima->block [chan*4+3] != 0) - psf_log_printf (psf, "IMA ADPCM synchronisation error.\n") ; - - pima->samples [chan] = predictor ; - } ; - - /* - ** Pull apart the packed 4 bit samples and store them in their - ** correct sample positions. - */ - - blockindx = 4 * pima->channels ; - - indxstart = pima->channels ; - while (blockindx < pima->blocksize) - { for (chan = 0 ; chan < pima->channels ; chan++) - { indx = indxstart + chan ; - for (k = 0 ; k < 4 ; k++) - { bytecode = pima->block [blockindx++] ; - pima->samples [indx] = bytecode & 0x0F ; - indx += pima->channels ; - pima->samples [indx] = (bytecode >> 4) & 0x0F ; - indx += pima->channels ; - } ; - } ; - indxstart += 8 * pima->channels ; - } ; - - /* Decode the encoded 4 bit samples. */ - - for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++) - { chan = (pima->channels > 1) ? (k % 2) : 0 ; - - bytecode = pima->samples [k] & 0xF ; - - step = ima_step_size [stepindx [chan]] ; - predictor = pima->samples [k - pima->channels] ; - - diff = step >> 3 ; - if (bytecode & 1) - diff += step >> 2 ; - if (bytecode & 2) - diff += step >> 1 ; - if (bytecode & 4) - diff += step ; - if (bytecode & 8) - diff = -diff ; - - predictor += diff ; - - if (predictor > 32767) - predictor = 32767 ; - else if (predictor < -32768) - predictor = -32768 ; - - stepindx [chan] += ima_indx_adjust [bytecode] ; - stepindx [chan] = clamp_ima_step_index (stepindx [chan]) ; - - pima->samples [k] = predictor ; - } ; - - return 1 ; -} /* wav_w64_ima_decode_block */ - -static int -wav_w64_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) -{ int chan, k, step, diff, vpdiff, blockindx, indx, indxstart ; - short bytecode, mask ; - - /* Encode the block header. */ - for (chan = 0 ; chan < pima->channels ; chan++) - { pima->block [chan*4] = pima->samples [chan] & 0xFF ; - pima->block [chan*4+1] = (pima->samples [chan] >> 8) & 0xFF ; - - pima->block [chan*4+2] = pima->stepindx [chan] ; - pima->block [chan*4+3] = 0 ; - - pima->previous [chan] = pima->samples [chan] ; - } ; - - /* Encode the samples as 4 bit. */ - - for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++) - { chan = (pima->channels > 1) ? (k % 2) : 0 ; - - diff = pima->samples [k] - pima->previous [chan] ; - - bytecode = 0 ; - step = ima_step_size [pima->stepindx [chan]] ; - vpdiff = step >> 3 ; - if (diff < 0) - { bytecode = 8 ; - diff = -diff ; - } ; - mask = 4 ; - while (mask) - { if (diff >= step) - { bytecode |= mask ; - diff -= step ; - vpdiff += step ; - } ; - step >>= 1 ; - mask >>= 1 ; - } ; - - if (bytecode & 8) - pima->previous [chan] -= vpdiff ; - else - pima->previous [chan] += vpdiff ; - - if (pima->previous [chan] > 32767) - pima->previous [chan] = 32767 ; - else if (pima->previous [chan] < -32768) - pima->previous [chan] = -32768 ; - - pima->stepindx [chan] += ima_indx_adjust [bytecode] ; - pima->stepindx [chan] = clamp_ima_step_index (pima->stepindx [chan]) ; - - pima->samples [k] = bytecode ; - } ; - - /* Pack the 4 bit encoded samples. */ - - blockindx = 4 * pima->channels ; - - indxstart = pima->channels ; - while (blockindx < pima->blocksize) - { for (chan = 0 ; chan < pima->channels ; chan++) - { indx = indxstart + chan ; - for (k = 0 ; k < 4 ; k++) - { pima->block [blockindx] = pima->samples [indx] & 0x0F ; - indx += pima->channels ; - pima->block [blockindx] |= (pima->samples [indx] << 4) & 0xF0 ; - indx += pima->channels ; - blockindx ++ ; - } ; - } ; - indxstart += 8 * pima->channels ; - } ; - - /* Write the block to disk. */ - - if ((k = psf_fwrite (pima->block, 1, pima->blocksize, psf)) != pima->blocksize) - psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pima->blocksize) ; - - memset (pima->samples, 0, pima->samplesperblock * sizeof (short)) ; - pima->samplecount = 0 ; - pima->blockcount ++ ; - - return 1 ; -} /* wav_w64_ima_encode_block */ - -static int -ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len) -{ int count, total = 0, indx = 0 ; - - while (indx < len) - { if (pima->blockcount >= pima->blocks && pima->samplecount >= pima->samplesperblock) - { memset (&(ptr [indx]), 0, (size_t) ((len - indx) * sizeof (short))) ; - return total ; - } ; - - if (pima->samplecount >= pima->samplesperblock) - pima->decode_block (psf, pima) ; - - count = (pima->samplesperblock - pima->samplecount) * pima->channels ; - count = (len - indx > count) ? count : len - indx ; - - memcpy (&(ptr [indx]), &(pima->samples [pima->samplecount * pima->channels]), count * sizeof (short)) ; - indx += count ; - pima->samplecount += count / pima->channels ; - total = indx ; - } ; - - return total ; -} /* ima_read_block */ - -static sf_count_t -ima_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ IMA_ADPCM_PRIVATE *pima ; - int readcount, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; - - while (len > 0) - { readcount = (len > 0x10000000) ? 0x10000000 : (int) len ; - - count = ima_read_block (psf, pima, ptr, readcount) ; - - total += count ; - len -= count ; - if (count != readcount) - break ; - } ; - - return total ; -} /* ima_read_s */ - -static sf_count_t -ima_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ IMA_ADPCM_PRIVATE *pima ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : (int) len ; - count = ima_read_block (psf, pima, sptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = ((int) sptr [k]) << 16 ; - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - - return total ; -} /* ima_read_i */ - -static sf_count_t -ima_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ IMA_ADPCM_PRIVATE *pima ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - float normfact ; - - if (! psf->codec_data) - return 0 ; - pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : (int) len ; - count = ima_read_block (psf, pima, sptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * (float) (sptr [k]) ; - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - - return total ; -} /* ima_read_f */ - -static sf_count_t -ima_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ IMA_ADPCM_PRIVATE *pima ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - double normfact ; - - if (! psf->codec_data) - return 0 ; - pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : (int) len ; - count = ima_read_block (psf, pima, sptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * (double) (sptr [k]) ; - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - - return total ; -} /* ima_read_d */ - -static sf_count_t -ima_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) -{ IMA_ADPCM_PRIVATE *pima ; - int newblock, newsample ; - - if (! psf->codec_data) - return 0 ; - pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; - - if (psf->datalength < 0 || psf->dataoffset < 0) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - if (offset == 0) - { psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - pima->blockcount = 0 ; - pima->decode_block (psf, pima) ; - pima->samplecount = 0 ; - return 0 ; - } ; - - if (offset < 0 || offset > pima->blocks * pima->samplesperblock) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - newblock = offset / pima->samplesperblock ; - newsample = offset % pima->samplesperblock ; - - if (mode == SFM_READ) - { psf_fseek (psf, psf->dataoffset + newblock * pima->blocksize, SEEK_SET) ; - pima->blockcount = newblock ; - pima->decode_block (psf, pima) ; - pima->samplecount = newsample ; - } - else - { /* What to do about write??? */ - psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - return newblock * pima->samplesperblock + newsample ; -} /* ima_seek */ - -/*========================================================================================== -** IMA ADPCM Write Functions. -*/ - -static int -ima_writer_init (SF_PRIVATE *psf, int blockalign) -{ IMA_ADPCM_PRIVATE *pima ; - int samplesperblock ; - unsigned int pimasize ; - - if (psf->file.mode != SFM_WRITE) - return SFE_BAD_MODE_RW ; - - samplesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ; - - pimasize = sizeof (IMA_ADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ; - - if ((pima = calloc (1, pimasize)) == NULL) - return SFE_MALLOC_FAILED ; - - psf->codec_data = (void*) pima ; - - pima->channels = psf->sf.channels ; - pima->blocksize = blockalign ; - pima->samplesperblock = samplesperblock ; - - pima->block = (unsigned char*) pima->data ; - pima->samples = (short*) (pima->data + blockalign) ; - - pima->samplecount = 0 ; - - switch (SF_CONTAINER (psf->sf.format)) - { case SF_FORMAT_WAV : - case SF_FORMAT_W64 : - pima->encode_block = wav_w64_ima_encode_block ; - break ; - - case SF_FORMAT_AIFF : - pima->encode_block = aiff_ima_encode_block ; - break ; - - default : - psf_log_printf (psf, "ima_reader_init: bad psf->sf.format\n") ; - return SFE_INTERNAL ; - } ; - - psf->write_short = ima_write_s ; - psf->write_int = ima_write_i ; - psf->write_float = ima_write_f ; - psf->write_double = ima_write_d ; - - return 0 ; -} /* ima_writer_init */ - -/*========================================================================================== -*/ - -static int -ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, const short *ptr, int len) -{ int count, total = 0, indx = 0 ; - - while (indx < len) - { count = (pima->samplesperblock - pima->samplecount) * pima->channels ; - - if (count > len - indx) - count = len - indx ; - - memcpy (&(pima->samples [pima->samplecount * pima->channels]), &(ptr [total]), count * sizeof (short)) ; - indx += count ; - pima->samplecount += count / pima->channels ; - total = indx ; - - if (pima->samplecount >= pima->samplesperblock) - pima->encode_block (psf, pima) ; - } ; - - return total ; -} /* ima_write_block */ - -static sf_count_t -ima_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ IMA_ADPCM_PRIVATE *pima ; - int writecount, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; - - while (len) - { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; - - count = ima_write_block (psf, pima, ptr, writecount) ; - - total += count ; - len -= count ; - if (count != writecount) - break ; - } ; - - return total ; -} /* ima_write_s */ - -static sf_count_t -ima_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ IMA_ADPCM_PRIVATE *pima ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, writecount, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : (int) len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = ptr [total + k] >> 16 ; - count = ima_write_block (psf, pima, sptr, writecount) ; - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - - return total ; -} /* ima_write_i */ - -static sf_count_t -ima_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ IMA_ADPCM_PRIVATE *pima ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, writecount, count ; - sf_count_t total = 0 ; - float normfact ; - - if (! psf->codec_data) - return 0 ; - pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : (int) len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = lrintf (normfact * ptr [total + k]) ; - count = ima_write_block (psf, pima, sptr, writecount) ; - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - - return total ; -} /* ima_write_f */ - -static sf_count_t -ima_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ IMA_ADPCM_PRIVATE *pima ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, writecount, count ; - sf_count_t total = 0 ; - double normfact ; - - if (! psf->codec_data) - return 0 ; - pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : (int) len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = lrint (normfact * ptr [total + k]) ; - count = ima_write_block (psf, pima, sptr, writecount) ; - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - - return total ; -} /* ima_write_d */ - diff --git a/libs/libsndfile/src/ima_oki_adpcm.c b/libs/libsndfile/src/ima_oki_adpcm.c deleted file mode 100644 index 26db9f65fb..0000000000 --- a/libs/libsndfile/src/ima_oki_adpcm.c +++ /dev/null @@ -1,297 +0,0 @@ -/* -** Copyright (C) 2007-2012 Erik de Castro Lopo -** Copyright (c) 2007 -** -** 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 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, -** Fifth Floor, 51 Franklin Street, Boston, MA 02111-1301, USA. -*/ - -/* ADPCM: IMA, OKI <==> 16-bit PCM. */ - -#include "sfconfig.h" - -#include - -/* Set up for libsndfile environment: */ -#include "common.h" - -#include "ima_oki_adpcm.h" - -#define MIN_SAMPLE -0x8000 -#define MAX_SAMPLE 0x7fff - -static int const ima_steps [] = /* ~16-bit precision */ -{ 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, - 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, - 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, - 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, - 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, - 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, - 32767 -} ; - -static int const oki_steps [] = /* ~12-bit precision */ -{ 256, 272, 304, 336, 368, 400, 448, 496, 544, 592, 656, 720, 800, 880, 960, - 1056, 1168, 1280, 1408, 1552, 1712, 1888, 2080, 2288, 2512, 2768, 3040, 3344, - 3680, 4048, 4464, 4912, 5392, 5936, 6528, 7184, 7904, 8704, 9568, 10528, - 11584, 12736, 14016, 15408, 16960, 18656, 20512, 22576, 24832 -} ; - -static int const step_changes [] = { -1, -1, -1, -1, 2, 4, 6, 8 } ; - -void -ima_oki_adpcm_init (IMA_OKI_ADPCM * state, IMA_OKI_ADPCM_TYPE type) -{ - memset (state, 0, sizeof (*state)) ; - - if (type == IMA_OKI_ADPCM_TYPE_IMA) - { state->max_step_index = ARRAY_LEN (ima_steps) - 1 ; - state->steps = ima_steps ; - state->mask = (~0) ; - } - else - { state->max_step_index = ARRAY_LEN (oki_steps) - 1 ; - state->steps = oki_steps ; - state->mask = (~0) << 4 ; - } ; - -} /* ima_oki_adpcm_init */ - - -int -adpcm_decode (IMA_OKI_ADPCM * state, int code) -{ int s ; - - s = ((code & 7) << 1) | 1 ; - s = ((state->steps [state->step_index] * s) >> 3) & state->mask ; - - if (code & 8) - s = -s ; - s += state->last_output ; - - if (s < MIN_SAMPLE || s > MAX_SAMPLE) - { int grace ; - - grace = (state->steps [state->step_index] >> 3) & state->mask ; - - if (s < MIN_SAMPLE - grace || s > MAX_SAMPLE + grace) - state->errors ++ ; - - s = s < MIN_SAMPLE ? MIN_SAMPLE : MAX_SAMPLE ; - } ; - - state->step_index += step_changes [code & 7] ; - state->step_index = SF_MIN (SF_MAX (state->step_index, 0), state->max_step_index) ; - state->last_output = s ; - - return s ; -} /* adpcm_decode */ - -int -adpcm_encode (IMA_OKI_ADPCM * state, int sample) -{ int delta, sign = 0, code ; - - delta = sample - state->last_output ; - - if (delta < 0) - { sign = 8 ; - delta = -delta ; - } ; - - code = 4 * delta / state->steps [state->step_index] ; - code = sign | SF_MIN (code, 7) ; - adpcm_decode (state, code) ; /* Update encoder state */ - - return code ; -} /* adpcm_encode */ - - -void -ima_oki_adpcm_decode_block (IMA_OKI_ADPCM * state) -{ unsigned char code ; - int k ; - - for (k = 0 ; k < state->code_count ; k++) - { code = state->codes [k] ; - state->pcm [2 * k] = adpcm_decode (state, code >> 4) ; - state->pcm [2 * k + 1] = adpcm_decode (state, code) ; - } ; - - state->pcm_count = 2 * k ; -} /* ima_oki_adpcm_decode_block */ - - -void -ima_oki_adpcm_encode_block (IMA_OKI_ADPCM * state) -{ unsigned char code ; - int k ; - - /* - ** The codec expects an even number of input samples. - ** - ** Samples should always be passed in even length blocks. If the last block to - ** be encoded is odd length, extend that block by one zero valued sample. - */ - if (state->pcm_count % 2 == 1) - state->pcm [state->pcm_count ++] = 0 ; - - for (k = 0 ; k < state->pcm_count / 2 ; k++) - { code = adpcm_encode (state, state->pcm [2 * k]) << 4 ; - code |= adpcm_encode (state, state->pcm [2 * k + 1]) ; - state->codes [k] = code ; - } ; - - state->code_count = k ; -} /* ima_oki_adpcm_encode_block */ - - -#ifdef TEST - -static const unsigned char test_codes [] = -{ 0x08, 0x08, 0x04, 0x7f, 0x72, 0xf7, 0x9f, 0x7c, 0xd7, 0xbc, 0x7a, 0xa7, 0xb8, - 0x4b, 0x0b, 0x38, 0xf6, 0x9d, 0x7a, 0xd7, 0xbc, 0x7a, 0xd7, 0xa8, 0x6c, 0x81, - 0x98, 0xe4, 0x0e, 0x7a, 0xd7, 0x9e, 0x7b, 0xc7, 0xab, 0x7a, 0x85, 0xc0, 0xb3, - 0x8f, 0x58, 0xd7, 0xad, 0x7a, 0xd7, 0xad, 0x7a, 0x87, 0xd0, 0x2b, 0x0e, 0x48, - 0xd7, 0xad, 0x78, 0xf7, 0xbc, 0x7a, 0xb7, 0xa8, 0x4b, 0x88, 0x18, 0xd5, 0x8d, - 0x6a, 0xa4, 0x98, 0x08, 0x00, 0x80, 0x88, -} ; - -static const short test_pcm [] = -{ 32, 0, 32, 0, 32, 320, 880, -336, 2304, 4192, -992, 10128, 5360, -16352, - 30208, 2272, -31872, 14688, -7040, -32432, 14128, -1392, -15488, 22960, - 1232, -1584, 21488, -240, 2576, -15360, 960, -1152, -30032, 10320, 1008, - -30032, 16528, 1008, -30032, 16528, -5200, -30592, 15968, 448, -30592, - 15968, 448, -2368, 30960, 3024, -80, 8384, 704, -1616, -29168, -1232, 1872, - -32768, 13792, -1728, -32768, 13792, 4480, -32192, 14368, -7360, -32752, - 13808, -1712, -21456, 16992, 1472, -1344, 26848, -1088, 2016, -17728, 208, - -2112, -32768, 1376, -1728, -32768, 13792, -1728, -32768, 13792, -1728, - -32768, 13792, -1728, -32768, 13792, -1728, -4544, 32767, -1377, 1727, - 15823, -2113, 207, -27345, 591, -2513, -32768, 13792, -1728, -32768, 13792, - 10688, -31632, 14928, -6800, -32192, 14368, -1152, -20896, 17552, 2032, - -784, 22288, 560, -2256, -4816, 2176, 64, -21120, 9920, 6816, -24224, 16128, - 608, -13488, 9584, 272, -2544, 16, -2304, -192, 1728, -16, 1568, 128, -1184, -} ; - - -static void -test_oki_adpcm (void) -{ - IMA_OKI_ADPCM adpcm ; - unsigned char code ; - int i, j ; - - printf (" Testing encoder : ") ; - fflush (stdout) ; - - ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; - for (i = 0 ; i < ARRAY_LEN (test_codes) ; i++) - for (j = 0, code = test_codes [i] ; j < 2 ; j++, code <<= 4) - if (adpcm_decode (&adpcm, code >> 4) != test_pcm [2 * i + j]) - { printf ("\n\nFail at i = %d, j = %d.\n\n", i, j) ; - exit (1) ; - } ; - - puts ("ok") ; - - printf (" Testing decoder : ") ; - fflush (stdout) ; - - ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; - for (i = 0 ; i < ARRAY_LEN (test_pcm) ; i += j) - { code = adpcm_encode (&adpcm, test_pcm [i]) ; - code = (code << 4) | adpcm_encode (&adpcm, test_pcm [i + 1]) ; - if (code != test_codes [i / 2]) - { printf ("\n\nFail at i = %d, %d should be %d\n\n", i, code, test_codes [i / 2]) ; - exit (1) ; - } ; - } ; - - puts ("ok") ; -} /* test_oki_adpcm */ - -static void -test_oki_adpcm_block (void) -{ - IMA_OKI_ADPCM adpcm ; - int k ; - - if (ARRAY_LEN (adpcm.pcm) < ARRAY_LEN (test_pcm)) - { printf ("\n\nLine %d : ARRAY_LEN (adpcm->pcm) > ARRAY_LEN (test_pcm) (%d > %d).\n\n", __LINE__, ARRAY_LEN (adpcm.pcm), ARRAY_LEN (test_pcm)) ; - exit (1) ; - } ; - - if (ARRAY_LEN (adpcm.codes) < ARRAY_LEN (test_codes)) - { printf ("\n\nLine %d : ARRAY_LEN (adcodes->codes) > ARRAY_LEN (test_codes).n", __LINE__) ; - exit (1) ; - } ; - - printf (" Testing block encoder : ") ; - fflush (stdout) ; - - ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; - - memcpy (adpcm.pcm, test_pcm, sizeof (adpcm.pcm [0]) * ARRAY_LEN (test_pcm)) ; - adpcm.pcm_count = ARRAY_LEN (test_pcm) ; - adpcm.code_count = 13 ; - - ima_oki_adpcm_encode_block (&adpcm) ; - - if (adpcm.code_count * 2 != ARRAY_LEN (test_pcm)) - { printf ("\n\nLine %d : %d * 2 != %d\n\n", __LINE__, adpcm.code_count * 2, ARRAY_LEN (test_pcm)) ; - exit (1) ; - } ; - - for (k = 0 ; k < ARRAY_LEN (test_codes) ; k++) - if (adpcm.codes [k] != test_codes [k]) - { printf ("\n\nLine %d : Fail at k = %d, %d should be %d\n\n", __LINE__, k, adpcm.codes [k], test_codes [k]) ; - exit (1) ; - } ; - - puts ("ok") ; - - printf (" Testing block decoder : ") ; - fflush (stdout) ; - - ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; - - memcpy (adpcm.codes, test_codes, sizeof (adpcm.codes [0]) * ARRAY_LEN (test_codes)) ; - adpcm.code_count = ARRAY_LEN (test_codes) ; - adpcm.pcm_count = 13 ; - - ima_oki_adpcm_decode_block (&adpcm) ; - - if (adpcm.pcm_count != 2 * ARRAY_LEN (test_codes)) - { printf ("\n\nLine %d : %d * 2 != %d\n\n", __LINE__, adpcm.pcm_count, 2 * ARRAY_LEN (test_codes)) ; - exit (1) ; - } ; - - for (k = 0 ; k < ARRAY_LEN (test_pcm) ; k++) - if (adpcm.pcm [k] != test_pcm [k]) - { printf ("\n\nLine %d : Fail at i = %d, %d should be %d.\n\n", __LINE__, k, adpcm.pcm [k], test_pcm [k]) ; - exit (1) ; - } ; - - puts ("ok") ; -} /* test_oki_adpcm_block */ - -int -main (void) -{ - test_oki_adpcm () ; - test_oki_adpcm_block () ; - - return 0 ; -} /* main */ - -#endif diff --git a/libs/libsndfile/src/ima_oki_adpcm.h b/libs/libsndfile/src/ima_oki_adpcm.h deleted file mode 100644 index 86241e7a2c..0000000000 --- a/libs/libsndfile/src/ima_oki_adpcm.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -** Copyright (C) 2007-2011 Erik de Castro Lopo -** Copyright (c) 2007 -** -** 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 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, -** Fifth Floor, 51 Franklin Street, Boston, MA 02111-1301, USA. -*/ - -/* ADPCM: IMA, OKI <==> 16-bit PCM. */ - - -#define IMA_OKI_ADPCM_CODE_LEN 256 -#define IMA_OKI_ADPCM_PCM_LEN (IMA_OKI_ADPCM_CODE_LEN *2) - -typedef struct -{ - /* private: */ - int mask ; - int last_output ; - int step_index ; - int max_step_index ; - int const * steps ; - - /* public: */ - int errors ; - int code_count, pcm_count ; - - unsigned char codes [IMA_OKI_ADPCM_CODE_LEN] ; - short pcm [IMA_OKI_ADPCM_PCM_LEN] ; -} IMA_OKI_ADPCM ; - -typedef enum -{ IMA_OKI_ADPCM_TYPE_IMA, - IMA_OKI_ADPCM_TYPE_OKI -} IMA_OKI_ADPCM_TYPE ; - -void ima_oki_adpcm_init (IMA_OKI_ADPCM * state, IMA_OKI_ADPCM_TYPE type) ; - -int adpcm_decode (IMA_OKI_ADPCM * state, int /* 0..15 */ code) ; -int adpcm_encode (IMA_OKI_ADPCM * state, int /* -32768..32767 */ sample) ; - -void ima_oki_adpcm_decode_block (IMA_OKI_ADPCM * state) ; -void ima_oki_adpcm_encode_block (IMA_OKI_ADPCM * state) ; diff --git a/libs/libsndfile/src/interleave.c b/libs/libsndfile/src/interleave.c deleted file mode 100644 index 5f799444c6..0000000000 --- a/libs/libsndfile/src/interleave.c +++ /dev/null @@ -1,299 +0,0 @@ -/* -** Copyright (C) 2002-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfendian.h" - -#include - -#include "sndfile.h" -#include "common.h" - -#define INTERLEAVE_CHANNELS 6 - -typedef struct -{ double buffer [SF_BUFFER_LEN / sizeof (double)] ; - - sf_count_t channel_len ; - - sf_count_t (*read_short) (SF_PRIVATE*, short *ptr, sf_count_t len) ; - sf_count_t (*read_int) (SF_PRIVATE*, int *ptr, sf_count_t len) ; - sf_count_t (*read_float) (SF_PRIVATE*, float *ptr, sf_count_t len) ; - sf_count_t (*read_double) (SF_PRIVATE*, double *ptr, sf_count_t len) ; - -} INTERLEAVE_DATA ; - - - -static sf_count_t interleave_read_short (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t interleave_read_int (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t interleave_read_float (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t interleave_read_double (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t interleave_seek (SF_PRIVATE*, int mode, sf_count_t samples_from_start) ; - - - - -int -interleave_init (SF_PRIVATE *psf) -{ INTERLEAVE_DATA *pdata ; - - if (psf->file.mode != SFM_READ) - return SFE_INTERLEAVE_MODE ; - - if (psf->interleave) - { psf_log_printf (psf, "*** Weird, already have interleave.\n") ; - return 666 ; - } ; - - /* Free this in sf_close() function. */ - if (! (pdata = malloc (sizeof (INTERLEAVE_DATA)))) - return SFE_MALLOC_FAILED ; - -puts ("interleave_init") ; - - psf->interleave = pdata ; - - /* Save the existing methods. */ - pdata->read_short = psf->read_short ; - pdata->read_int = psf->read_int ; - pdata->read_float = psf->read_float ; - pdata->read_double = psf->read_double ; - - pdata->channel_len = psf->sf.frames * psf->bytewidth ; - - /* Insert our new methods. */ - psf->read_short = interleave_read_short ; - psf->read_int = interleave_read_int ; - psf->read_float = interleave_read_float ; - psf->read_double = interleave_read_double ; - - psf->seek = interleave_seek ; - - return 0 ; -} /* pcm_interleave_init */ - -/*------------------------------------------------------------------------------ -*/ - -static sf_count_t -interleave_read_short (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ INTERLEAVE_DATA *pdata ; - sf_count_t offset, templen ; - int chan, count, k ; - short *inptr, *outptr ; - - if (! (pdata = psf->interleave)) - return 0 ; - - inptr = (short*) pdata->buffer ; - - for (chan = 0 ; chan < psf->sf.channels ; chan++) - { outptr = ptr + chan ; - - offset = psf->dataoffset + chan * psf->bytewidth * psf->read_current ; - - if (psf_fseek (psf, offset, SEEK_SET) != offset) - { psf->error = SFE_INTERLEAVE_SEEK ; - return 0 ; - } ; - - templen = len / psf->sf.channels ; - - while (templen > 0) - { if (templen > SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (short)) - count = SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (short) ; - else - count = (int) templen ; - - if (pdata->read_short (psf, inptr, count) != count) - { psf->error = SFE_INTERLEAVE_READ ; - return 0 ; - } ; - - for (k = 0 ; k < count ; k++) - { *outptr = inptr [k] ; - outptr += psf->sf.channels ; - } ; - - templen -= count ; - } ; - } ; - - return len ; -} /* interleave_read_short */ - -static sf_count_t -interleave_read_int (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ INTERLEAVE_DATA *pdata ; - sf_count_t offset, templen ; - int chan, count, k ; - int *inptr, *outptr ; - - if (! (pdata = psf->interleave)) - return 0 ; - - inptr = (int*) pdata->buffer ; - - for (chan = 0 ; chan < psf->sf.channels ; chan++) - { outptr = ptr + chan ; - - offset = psf->dataoffset + chan * psf->bytewidth * psf->read_current ; - - if (psf_fseek (psf, offset, SEEK_SET) != offset) - { psf->error = SFE_INTERLEAVE_SEEK ; - return 0 ; - } ; - - templen = len / psf->sf.channels ; - - while (templen > 0) - { if (templen > SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (int)) - count = SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (int) ; - else - count = (int) templen ; - - if (pdata->read_int (psf, inptr, count) != count) - { psf->error = SFE_INTERLEAVE_READ ; - return 0 ; - } ; - - for (k = 0 ; k < count ; k++) - { *outptr = inptr [k] ; - outptr += psf->sf.channels ; - } ; - - templen -= count ; - } ; - } ; - - return len ; -} /* interleave_read_int */ - -static sf_count_t -interleave_read_float (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ INTERLEAVE_DATA *pdata ; - sf_count_t offset, templen ; - int chan, count, k ; - float *inptr, *outptr ; - - if (! (pdata = psf->interleave)) - return 0 ; - - inptr = (float*) pdata->buffer ; - - for (chan = 0 ; chan < psf->sf.channels ; chan++) - { outptr = ptr + chan ; - - offset = psf->dataoffset + pdata->channel_len * chan + psf->read_current * psf->bytewidth ; - -/*-printf ("chan : %d read_current : %6lld offset : %6lld\n", chan, psf->read_current, offset) ;-*/ - - if (psf_fseek (psf, offset, SEEK_SET) != offset) - { psf->error = SFE_INTERLEAVE_SEEK ; -/*-puts ("interleave_seek error") ; exit (1) ;-*/ - return 0 ; - } ; - - templen = len / psf->sf.channels ; - - while (templen > 0) - { if (templen > SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (float)) - count = SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (float) ; - else - count = (int) templen ; - - if (pdata->read_float (psf, inptr, count) != count) - { psf->error = SFE_INTERLEAVE_READ ; -/*-puts ("interleave_read error") ; exit (1) ;-*/ - return 0 ; - } ; - - for (k = 0 ; k < count ; k++) - { *outptr = inptr [k] ; - outptr += psf->sf.channels ; - } ; - - templen -= count ; - } ; - } ; - - return len ; -} /* interleave_read_float */ - -static sf_count_t -interleave_read_double (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ INTERLEAVE_DATA *pdata ; - sf_count_t offset, templen ; - int chan, count, k ; - double *inptr, *outptr ; - - if (! (pdata = psf->interleave)) - return 0 ; - - inptr = (double*) pdata->buffer ; - - for (chan = 0 ; chan < psf->sf.channels ; chan++) - { outptr = ptr + chan ; - - offset = psf->dataoffset + chan * psf->bytewidth * psf->read_current ; - - if (psf_fseek (psf, offset, SEEK_SET) != offset) - { psf->error = SFE_INTERLEAVE_SEEK ; - return 0 ; - } ; - - templen = len / psf->sf.channels ; - - while (templen > 0) - { if (templen > SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (double)) - count = SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (double) ; - else - count = (int) templen ; - - if (pdata->read_double (psf, inptr, count) != count) - { psf->error = SFE_INTERLEAVE_READ ; - return 0 ; - } ; - - for (k = 0 ; k < count ; k++) - { *outptr = inptr [k] ; - outptr += psf->sf.channels ; - } ; - - templen -= count ; - } ; - } ; - - return len ; -} /* interleave_read_double */ - -/*------------------------------------------------------------------------------ -*/ - -static sf_count_t -interleave_seek (SF_PRIVATE * UNUSED (psf), int UNUSED (mode), sf_count_t samples_from_start) -{ - /* - ** Do nothing here. This is a place holder to prevent the default - ** seek function from being called. - */ - - return samples_from_start ; -} /* interleave_seek */ - diff --git a/libs/libsndfile/src/ircam.c b/libs/libsndfile/src/ircam.c deleted file mode 100644 index 6a6c7fc606..0000000000 --- a/libs/libsndfile/src/ircam.c +++ /dev/null @@ -1,323 +0,0 @@ -/* -** Copyright (C) 2001-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/*------------------------------------------------------------------------------ -** Macros to handle big/little endian issues. -*/ - -/* The IRCAM magic number is weird in that one byte in the number can have -** values of 0x1, 0x2, 0x03 or 0x04. Hence the need for a marker and a mask. -*/ - -#define IRCAM_BE_MASK (MAKE_MARKER (0xFF, 0xFF, 0x00, 0xFF)) -#define IRCAM_BE_MARKER (MAKE_MARKER (0x64, 0xA3, 0x00, 0x00)) - -#define IRCAM_LE_MASK (MAKE_MARKER (0xFF, 0x00, 0xFF, 0xFF)) -#define IRCAM_LE_MARKER (MAKE_MARKER (0x00, 0x00, 0xA3, 0x64)) - -#define IRCAM_02B_MARKER (MAKE_MARKER (0x64, 0xA3, 0x02, 0x00)) -#define IRCAM_03L_MARKER (MAKE_MARKER (0x64, 0xA3, 0x03, 0x00)) - -#define IRCAM_DATA_OFFSET (1024) - -/*------------------------------------------------------------------------------ -** Typedefs. -*/ - -enum -{ IRCAM_PCM_16 = 0x00002, - IRCAM_FLOAT = 0x00004, - IRCAM_ALAW = 0x10001, - IRCAM_ULAW = 0x20001, - IRCAM_PCM_32 = 0x40004 -} ; - - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int ircam_close (SF_PRIVATE *psf) ; -static int ircam_write_header (SF_PRIVATE *psf, int calc_length) ; -static int ircam_read_header (SF_PRIVATE *psf) ; - -static int get_encoding (int subformat) ; - -static const char* get_encoding_str (int encoding) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -ircam_open (SF_PRIVATE *psf) -{ int subformat ; - int error = SFE_NO_ERROR ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = ircam_read_header (psf))) - return error ; - } ; - - subformat = SF_CODEC (psf->sf.format) ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_IRCAM) - return SFE_BAD_OPEN_FORMAT ; - - psf->endian = SF_ENDIAN (psf->sf.format) ; - if (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU) - psf->endian = (CPU_IS_BIG_ENDIAN) ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ; - - psf->dataoffset = IRCAM_DATA_OFFSET ; - - if ((error = ircam_write_header (psf, SF_FALSE))) - return error ; - - psf->write_header = ircam_write_header ; - } ; - - psf->container_close = ircam_close ; - - switch (subformat) - { case SF_FORMAT_ULAW : /* 8-bit Ulaw encoding. */ - error = ulaw_init (psf) ; - break ; - - case SF_FORMAT_ALAW : /* 8-bit Alaw encoding. */ - error = alaw_init (psf) ; - break ; - - case SF_FORMAT_PCM_16 : /* 16-bit linear PCM. */ - case SF_FORMAT_PCM_32 : /* 32-bit linear PCM. */ - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_FLOAT : /* 32-bit linear PCM. */ - error = float32_init (psf) ; - break ; - - default : break ; - } ; - - return error ; -} /* ircam_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -ircam_read_header (SF_PRIVATE *psf) -{ unsigned int marker, encoding ; - float samplerate ; - int error = SFE_NO_ERROR ; - - psf_binheader_readf (psf, "epmf44", 0, &marker, &samplerate, &(psf->sf.channels), &encoding) ; - - if (((marker & IRCAM_BE_MASK) != IRCAM_BE_MARKER) && ((marker & IRCAM_LE_MASK) != IRCAM_LE_MARKER)) - { psf_log_printf (psf, "marker: 0x%X\n", marker) ; - return SFE_IRCAM_NO_MARKER ; - } ; - - psf->endian = SF_ENDIAN_LITTLE ; - - if (psf->sf.channels > 256) - { psf_binheader_readf (psf, "Epmf44", 0, &marker, &samplerate, &(psf->sf.channels), &encoding) ; - - /* Sanity checking for endian-ness detection. */ - if (psf->sf.channels > 256) - { psf_log_printf (psf, "marker: 0x%X\n", marker) ; - return SFE_IRCAM_BAD_CHANNELS ; - } ; - - psf->endian = SF_ENDIAN_BIG ; - } ; - - psf_log_printf (psf, "marker: 0x%X\n", marker) ; - - psf->sf.samplerate = (int) samplerate ; - - psf_log_printf (psf, " Sample Rate : %d\n" - " Channels : %d\n" - " Encoding : %X => %s\n", - psf->sf.samplerate, psf->sf.channels, encoding, get_encoding_str (encoding)) ; - - switch (encoding) - { case IRCAM_PCM_16 : - psf->bytewidth = 2 ; - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - - psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_16 ; - break ; - - case IRCAM_PCM_32 : - psf->bytewidth = 4 ; - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - - psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_32 ; - break ; - - case IRCAM_FLOAT : - psf->bytewidth = 4 ; - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - - psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_FLOAT ; - break ; - - case IRCAM_ALAW : - psf->bytewidth = 1 ; - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - - psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_ALAW ; - break ; - - case IRCAM_ULAW : - psf->bytewidth = 1 ; - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - - psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_ULAW ; - break ; - - default : - error = SFE_IRCAM_UNKNOWN_FORMAT ; - break ; - } ; - - if (psf->endian == SF_ENDIAN_BIG) - psf->sf.format |= SF_ENDIAN_BIG ; - else - psf->sf.format |= SF_ENDIAN_LITTLE ; - - if (error) - return error ; - - psf->dataoffset = IRCAM_DATA_OFFSET ; - psf->datalength = psf->filelength - psf->dataoffset ; - - if (psf->sf.frames == 0 && psf->blockwidth) - psf->sf.frames = psf->datalength / psf->blockwidth ; - - psf_log_printf (psf, " Samples : %d\n", psf->sf.frames) ; - - psf_binheader_readf (psf, "p", IRCAM_DATA_OFFSET) ; - - return 0 ; -} /* ircam_read_header */ - -static int -ircam_close (SF_PRIVATE *psf) -{ - psf_log_printf (psf, "close\n") ; - - return 0 ; -} /* ircam_close */ - -static int -ircam_write_header (SF_PRIVATE *psf, int UNUSED (calc_length)) -{ int encoding ; - float samplerate ; - sf_count_t current ; - - if (psf->pipeoffset > 0) - return 0 ; - - current = psf_ftell (psf) ; - - /* This also sets psf->endian. */ - encoding = get_encoding (SF_CODEC (psf->sf.format)) ; - - if (encoding == 0) - return SFE_BAD_OPEN_FORMAT ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - - if (psf->is_pipe == SF_FALSE) - psf_fseek (psf, 0, SEEK_SET) ; - - samplerate = psf->sf.samplerate ; - - switch (psf->endian) - { case SF_ENDIAN_BIG : - psf_binheader_writef (psf, "Emf", IRCAM_02B_MARKER, samplerate) ; - psf_binheader_writef (psf, "E44", psf->sf.channels, encoding) ; - break ; - - case SF_ENDIAN_LITTLE : - psf_binheader_writef (psf, "emf", IRCAM_03L_MARKER, samplerate) ; - psf_binheader_writef (psf, "e44", psf->sf.channels, encoding) ; - break ; - - default : return SFE_BAD_OPEN_FORMAT ; - } ; - - psf_binheader_writef (psf, "z", (size_t) (IRCAM_DATA_OFFSET - psf->headindex)) ; - - /* Header construction complete so write it out. */ - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* ircam_write_header */ - -static int -get_encoding (int subformat) -{ switch (subformat) - { case SF_FORMAT_PCM_16 : return IRCAM_PCM_16 ; - case SF_FORMAT_PCM_32 : return IRCAM_PCM_32 ; - - case SF_FORMAT_FLOAT : return IRCAM_FLOAT ; - - case SF_FORMAT_ULAW : return IRCAM_ULAW ; - case SF_FORMAT_ALAW : return IRCAM_ALAW ; - - default : break ; - } ; - - return 0 ; -} /* get_encoding */ - -static const char* -get_encoding_str (int encoding) -{ switch (encoding) - { case IRCAM_PCM_16 : return "16 bit PCM" ; - case IRCAM_FLOAT : return "32 bit float" ; - case IRCAM_ALAW : return "A law" ; - case IRCAM_ULAW : return "u law" ; - case IRCAM_PCM_32 : return "32 bit PCM" ; - } ; - return "Unknown encoding" ; -} /* get_encoding_str */ - diff --git a/libs/libsndfile/src/libsndfile-1.def b/libs/libsndfile/src/libsndfile-1.def deleted file mode 100644 index 93cab02d98..0000000000 --- a/libs/libsndfile/src/libsndfile-1.def +++ /dev/null @@ -1,41 +0,0 @@ -; Auto-generated by create_symbols_file.py - -LIBRARY libsndfile-1.dll -EXPORTS - -sf_command @1 -sf_open @2 -sf_close @3 -sf_seek @4 -sf_error @7 -sf_perror @8 -sf_error_str @9 -sf_error_number @10 -sf_format_check @11 -sf_read_raw @16 -sf_readf_short @17 -sf_readf_int @18 -sf_readf_float @19 -sf_readf_double @20 -sf_read_short @21 -sf_read_int @22 -sf_read_float @23 -sf_read_double @24 -sf_write_raw @32 -sf_writef_short @33 -sf_writef_int @34 -sf_writef_float @35 -sf_writef_double @36 -sf_write_short @37 -sf_write_int @38 -sf_write_float @39 -sf_write_double @40 -sf_strerror @50 -sf_get_string @60 -sf_set_string @61 -sf_version_string @68 -sf_open_fd @70 -sf_wchar_open @71 -sf_open_virtual @80 -sf_write_sync @90 - diff --git a/libs/libsndfile/src/libsndfile.def b/libs/libsndfile/src/libsndfile.def deleted file mode 100644 index 7b144538fc..0000000000 --- a/libs/libsndfile/src/libsndfile.def +++ /dev/null @@ -1,39 +0,0 @@ -; Auto-generated by create_symbols_file.py - -LIBRARY libsndfile-1.dll -EXPORTS - -sf_command @1 -sf_open @2 -sf_close @3 -sf_seek @4 -sf_error @7 -sf_perror @8 -sf_error_str @9 -sf_error_number @10 -sf_format_check @11 -sf_read_raw @16 -sf_readf_short @17 -sf_readf_int @18 -sf_readf_float @19 -sf_readf_double @20 -sf_read_short @21 -sf_read_int @22 -sf_read_float @23 -sf_read_double @24 -sf_write_raw @32 -sf_writef_short @33 -sf_writef_int @34 -sf_writef_float @35 -sf_writef_double @36 -sf_write_short @37 -sf_write_int @38 -sf_write_float @39 -sf_write_double @40 -sf_strerror @50 -sf_get_string @60 -sf_set_string @61 -sf_open_fd @70 -sf_open_virtual @80 -sf_write_sync @90 - diff --git a/libs/libsndfile/src/macbinary3.c b/libs/libsndfile/src/macbinary3.c deleted file mode 100644 index 3ad71e68b8..0000000000 --- a/libs/libsndfile/src/macbinary3.c +++ /dev/null @@ -1,45 +0,0 @@ -/* -** Copyright (C) 2003-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#if (OSX_DARWIN_VERSION >= 1) - -int -macbinary3_open (SF_PRIVATE * UNUSED (psf)) -{ - return 0 ; -} /* macbinary3_open */ - -#else - -int -macbinary3_open (SF_PRIVATE * UNUSED (psf)) -{ - return 0 ; -} /* macbinary3_open */ - -#endif /* OSX_DARWIN_VERSION */ - diff --git a/libs/libsndfile/src/macos.c b/libs/libsndfile/src/macos.c deleted file mode 100644 index 5f6c53191c..0000000000 --- a/libs/libsndfile/src/macos.c +++ /dev/null @@ -1,51 +0,0 @@ -/* -** Copyright (C) 2003-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#define STR_MARKER MAKE_MARKER ('S', 'T', 'R', ' ') - -int -macos_guess_file_type (SF_PRIVATE * psf, const char *filename) -{ static char rsrc_name [1024] ; - struct stat statbuf ; - - snprintf (rsrc_name, sizeof (rsrc_name), "%s/rsrc", filename) ; - - /* If there is no resource fork, just return. */ - if (stat (rsrc_name, &statbuf) != 0) - { psf_log_printf (psf, "No resource fork.\n") ; - return 0 ; - } ; - - if (statbuf.st_size == 0) - { psf_log_printf (psf, "Have zero size resource fork.\n") ; - return 0 ; - } ; - - return 0 ; -} /* macos_guess_file_type */ - diff --git a/libs/libsndfile/src/make-static-lib-hidden-privates.sh b/libs/libsndfile/src/make-static-lib-hidden-privates.sh deleted file mode 100644 index 5bfd485d26..0000000000 --- a/libs/libsndfile/src/make-static-lib-hidden-privates.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -e - -# This script takes a static library and removes all non-public symbols. -# Ie, it makes a static lib whose symbols are far less likely to clash with -# the symbols of another shared or static library. - -grep sf_ Symbols.gnu-binutils | sed -e "s/[ ;]//g" > Symbols.static - -ld -r --whole-archive .libs/libsndfile.a -o libsndfile_a.o - -objcopy --keep-global-symbols=Symbols.static libsndfile_a.o libsndfile.o - -rm -f libsndfile.a -ar cru libsndfile.a libsndfile.o diff --git a/libs/libsndfile/src/mat4.c b/libs/libsndfile/src/mat4.c deleted file mode 100644 index 77ece264b1..0000000000 --- a/libs/libsndfile/src/mat4.c +++ /dev/null @@ -1,390 +0,0 @@ -/* -** Copyright (C) 2002-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/*------------------------------------------------------------------------------ -** Information on how to decode and encode this file was obtained in a PDF -** file which I found on http://www.wotsit.org/. -** Also did a lot of testing with GNU Octave but do not have access to -** Matlab (tm) and so could not test it there. -*/ - -/*------------------------------------------------------------------------------ -** Macros to handle big/little endian issues. -*/ - -#define MAT4_BE_DOUBLE (MAKE_MARKER (0, 0, 0x03, 0xE8)) -#define MAT4_LE_DOUBLE (MAKE_MARKER (0, 0, 0, 0)) - -#define MAT4_BE_FLOAT (MAKE_MARKER (0, 0, 0x03, 0xF2)) -#define MAT4_LE_FLOAT (MAKE_MARKER (0x0A, 0, 0, 0)) - -#define MAT4_BE_PCM_32 (MAKE_MARKER (0, 0, 0x03, 0xFC)) -#define MAT4_LE_PCM_32 (MAKE_MARKER (0x14, 0, 0, 0)) - -#define MAT4_BE_PCM_16 (MAKE_MARKER (0, 0, 0x04, 0x06)) -#define MAT4_LE_PCM_16 (MAKE_MARKER (0x1E, 0, 0, 0)) - -/* Can't see any reason to ever implement this. */ -#define MAT4_BE_PCM_U8 (MAKE_MARKER (0, 0, 0x04, 0x1A)) -#define MAT4_LE_PCM_U8 (MAKE_MARKER (0x32, 0, 0, 0)) - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int mat4_close (SF_PRIVATE *psf) ; - -static int mat4_format_to_encoding (int format, int endian) ; - -static int mat4_write_header (SF_PRIVATE *psf, int calc_length) ; -static int mat4_read_header (SF_PRIVATE *psf) ; - -static const char * mat4_marker_to_str (int marker) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -mat4_open (SF_PRIVATE *psf) -{ int subformat, error = 0 ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = mat4_read_header (psf))) - return error ; - } ; - - if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_MAT4) - return SFE_BAD_OPEN_FORMAT ; - - subformat = SF_CODEC (psf->sf.format) ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if (psf->is_pipe) - return SFE_NO_PIPE_WRITE ; - - psf->endian = SF_ENDIAN (psf->sf.format) ; - if (CPU_IS_LITTLE_ENDIAN && (psf->endian == SF_ENDIAN_CPU || psf->endian == 0)) - psf->endian = SF_ENDIAN_LITTLE ; - else if (CPU_IS_BIG_ENDIAN && (psf->endian == SF_ENDIAN_CPU || psf->endian == 0)) - psf->endian = SF_ENDIAN_BIG ; - - if ((error = mat4_write_header (psf, SF_FALSE))) - return error ; - - psf->write_header = mat4_write_header ; - } ; - - psf->container_close = mat4_close ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - switch (subformat) - { case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_32 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_FLOAT : - error = float32_init (psf) ; - break ; - - case SF_FORMAT_DOUBLE : - error = double64_init (psf) ; - break ; - - default : break ; - } ; - - if (error) - return error ; - - return error ; -} /* mat4_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -mat4_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - mat4_write_header (psf, SF_TRUE) ; - - return 0 ; -} /* mat4_close */ - -/*------------------------------------------------------------------------------ -*/ - -static int -mat4_write_header (SF_PRIVATE *psf, int calc_length) -{ sf_count_t current ; - int encoding ; - double samplerate ; - - current = psf_ftell (psf) ; - - if (calc_length) - { psf->filelength = psf_get_filelen (psf) ; - - psf->datalength = psf->filelength - psf->dataoffset ; - if (psf->dataend) - psf->datalength -= psf->filelength - psf->dataend ; - - psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; - } ; - - encoding = mat4_format_to_encoding (SF_CODEC (psf->sf.format), psf->endian) ; - - if (encoding == -1) - return SFE_BAD_OPEN_FORMAT ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - psf_fseek (psf, 0, SEEK_SET) ; - - /* Need sample rate as a double for writing to the header. */ - samplerate = psf->sf.samplerate ; - - if (psf->endian == SF_ENDIAN_BIG) - { psf_binheader_writef (psf, "Em444", MAT4_BE_DOUBLE, 1, 1, 0) ; - psf_binheader_writef (psf, "E4bd", 11, "samplerate", make_size_t (11), samplerate) ; - psf_binheader_writef (psf, "tEm484", encoding, psf->sf.channels, psf->sf.frames, 0) ; - psf_binheader_writef (psf, "E4b", 9, "wavedata", make_size_t (9)) ; - } - else if (psf->endian == SF_ENDIAN_LITTLE) - { psf_binheader_writef (psf, "em444", MAT4_LE_DOUBLE, 1, 1, 0) ; - psf_binheader_writef (psf, "e4bd", 11, "samplerate", make_size_t (11), samplerate) ; - psf_binheader_writef (psf, "tem484", encoding, psf->sf.channels, psf->sf.frames, 0) ; - psf_binheader_writef (psf, "e4b", 9, "wavedata", make_size_t (9)) ; - } - else - return SFE_BAD_OPEN_FORMAT ; - - /* Header construction complete so write it out. */ - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - psf->dataoffset = psf->headindex ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* mat4_write_header */ - -static int -mat4_read_header (SF_PRIVATE *psf) -{ char buffer [256] ; - uint32_t marker, namesize ; - int rows, cols, imag ; - double value ; - const char *marker_str ; - char name [64] ; - - psf_binheader_readf (psf, "pm", 0, &marker) ; - - /* MAT4 file must start with a double for the samplerate. */ - if (marker == MAT4_BE_DOUBLE) - { psf->endian = psf->rwf_endian = SF_ENDIAN_BIG ; - marker_str = "big endian double" ; - } - else if (marker == MAT4_LE_DOUBLE) - { psf->endian = psf->rwf_endian = SF_ENDIAN_LITTLE ; - marker_str = "little endian double" ; - } - else - return SFE_UNIMPLEMENTED ; - - psf_log_printf (psf, "GNU Octave 2.0 / MATLAB v4.2 format\nMarker : %s\n", marker_str) ; - - psf_binheader_readf (psf, "444", &rows, &cols, &imag) ; - - psf_log_printf (psf, " Rows : %d\n Cols : %d\n Imag : %s\n", rows, cols, imag ? "True" : "False") ; - - psf_binheader_readf (psf, "4", &namesize) ; - - if (namesize >= SIGNED_SIZEOF (name)) - return SFE_MAT4_BAD_NAME ; - - psf_binheader_readf (psf, "b", name, namesize) ; - name [namesize] = 0 ; - - psf_log_printf (psf, " Name : %s\n", name) ; - - psf_binheader_readf (psf, "d", &value) ; - - snprintf (buffer, sizeof (buffer), " Value : %f\n", value) ; - psf_log_printf (psf, buffer) ; - - if ((rows != 1) || (cols != 1)) - return SFE_MAT4_NO_SAMPLERATE ; - - psf->sf.samplerate = lrint (value) ; - - /* Now write out the audio data. */ - - psf_binheader_readf (psf, "m", &marker) ; - - psf_log_printf (psf, "Marker : %s\n", mat4_marker_to_str (marker)) ; - - psf_binheader_readf (psf, "444", &rows, &cols, &imag) ; - - psf_log_printf (psf, " Rows : %d\n Cols : %d\n Imag : %s\n", rows, cols, imag ? "True" : "False") ; - - psf_binheader_readf (psf, "4", &namesize) ; - - if (namesize >= SIGNED_SIZEOF (name)) - return SFE_MAT4_BAD_NAME ; - - psf_binheader_readf (psf, "b", name, namesize) ; - name [namesize] = 0 ; - - psf_log_printf (psf, " Name : %s\n", name) ; - - psf->dataoffset = psf_ftell (psf) ; - - if (rows == 0 && cols == 0) - { psf_log_printf (psf, "*** Error : zero channel count.\n") ; - return SFE_CHANNEL_COUNT_ZERO ; - } ; - - psf->sf.channels = rows ; - psf->sf.frames = cols ; - - psf->sf.format = psf->endian | SF_FORMAT_MAT4 ; - switch (marker) - { case MAT4_BE_DOUBLE : - case MAT4_LE_DOUBLE : - psf->sf.format |= SF_FORMAT_DOUBLE ; - psf->bytewidth = 8 ; - break ; - - case MAT4_BE_FLOAT : - case MAT4_LE_FLOAT : - psf->sf.format |= SF_FORMAT_FLOAT ; - psf->bytewidth = 4 ; - break ; - - case MAT4_BE_PCM_32 : - case MAT4_LE_PCM_32 : - psf->sf.format |= SF_FORMAT_PCM_32 ; - psf->bytewidth = 4 ; - break ; - - case MAT4_BE_PCM_16 : - case MAT4_LE_PCM_16 : - psf->sf.format |= SF_FORMAT_PCM_16 ; - psf->bytewidth = 2 ; - break ; - - default : - psf_log_printf (psf, "*** Error : Bad marker %08X\n", marker) ; - return SFE_UNIMPLEMENTED ; - } ; - - if ((psf->filelength - psf->dataoffset) < psf->sf.channels * psf->sf.frames * psf->bytewidth) - { psf_log_printf (psf, "*** File seems to be truncated. %D <--> %D\n", - psf->filelength - psf->dataoffset, psf->sf.channels * psf->sf.frames * psf->bytewidth) ; - } - else if ((psf->filelength - psf->dataoffset) > psf->sf.channels * psf->sf.frames * psf->bytewidth) - psf->dataend = psf->dataoffset + rows * cols * psf->bytewidth ; - - psf->datalength = psf->filelength - psf->dataoffset - psf->dataend ; - - psf->sf.sections = 1 ; - - return 0 ; -} /* mat4_read_header */ - -static int -mat4_format_to_encoding (int format, int endian) -{ - switch (format | endian) - { case (SF_FORMAT_PCM_16 | SF_ENDIAN_BIG) : - return MAT4_BE_PCM_16 ; - - case (SF_FORMAT_PCM_16 | SF_ENDIAN_LITTLE) : - return MAT4_LE_PCM_16 ; - - case (SF_FORMAT_PCM_32 | SF_ENDIAN_BIG) : - return MAT4_BE_PCM_32 ; - - case (SF_FORMAT_PCM_32 | SF_ENDIAN_LITTLE) : - return MAT4_LE_PCM_32 ; - - case (SF_FORMAT_FLOAT | SF_ENDIAN_BIG) : - return MAT4_BE_FLOAT ; - - case (SF_FORMAT_FLOAT | SF_ENDIAN_LITTLE) : - return MAT4_LE_FLOAT ; - - case (SF_FORMAT_DOUBLE | SF_ENDIAN_BIG) : - return MAT4_BE_DOUBLE ; - - case (SF_FORMAT_DOUBLE | SF_ENDIAN_LITTLE) : - return MAT4_LE_DOUBLE ; - - default : break ; - } ; - - return -1 ; -} /* mat4_format_to_encoding */ - -static const char * -mat4_marker_to_str (int marker) -{ static char str [32] ; - - switch (marker) - { - case MAT4_BE_PCM_16 : return "big endian 16 bit PCM" ; - case MAT4_LE_PCM_16 : return "little endian 16 bit PCM" ; - - case MAT4_BE_PCM_32 : return "big endian 32 bit PCM" ; - case MAT4_LE_PCM_32 : return "little endian 32 bit PCM" ; - - - case MAT4_BE_FLOAT : return "big endian float" ; - case MAT4_LE_FLOAT : return "big endian float" ; - - case MAT4_BE_DOUBLE : return "big endian double" ; - case MAT4_LE_DOUBLE : return "little endian double" ; - } ; - - /* This is a little unsafe but is really only for debugging. */ - str [sizeof (str) - 1] = 0 ; - snprintf (str, sizeof (str) - 1, "%08X", marker) ; - return str ; -} /* mat4_marker_to_str */ - diff --git a/libs/libsndfile/src/mat5.c b/libs/libsndfile/src/mat5.c deleted file mode 100644 index 164fb29a21..0000000000 --- a/libs/libsndfile/src/mat5.c +++ /dev/null @@ -1,509 +0,0 @@ -/* -** Copyright (C) 2002-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/*------------------------------------------------------------------------------ -** Information on how to decode and encode this file was obtained in a PDF -** file which I found on http://www.wotsit.org/. -** Also did a lot of testing with GNU Octave but do not have access to -** Matlab (tm) and so could not test it there. -*/ - -/*------------------------------------------------------------------------------ -** Macros to handle big/little endian issues. -*/ - -#define MATL_MARKER (MAKE_MARKER ('M', 'A', 'T', 'L')) - -#define IM_MARKER (('I' << 8) + 'M') -#define MI_MARKER (('M' << 8) + 'I') - -/*------------------------------------------------------------------------------ -** Enums and typedefs. -*/ - -enum -{ MAT5_TYPE_SCHAR = 0x1, - MAT5_TYPE_UCHAR = 0x2, - MAT5_TYPE_INT16 = 0x3, - MAT5_TYPE_UINT16 = 0x4, - MAT5_TYPE_INT32 = 0x5, - MAT5_TYPE_UINT32 = 0x6, - MAT5_TYPE_FLOAT = 0x7, - MAT5_TYPE_DOUBLE = 0x9, - MAT5_TYPE_ARRAY = 0xE, - - MAT5_TYPE_COMP_USHORT = 0x00020004, - MAT5_TYPE_COMP_UINT = 0x00040006 -} ; - -typedef struct -{ sf_count_t size ; - int rows, cols ; - char name [32] ; -} MAT5_MATRIX ; - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int mat5_close (SF_PRIVATE *psf) ; - -static int mat5_write_header (SF_PRIVATE *psf, int calc_length) ; -static int mat5_read_header (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -mat5_open (SF_PRIVATE *psf) -{ int subformat, error = 0 ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = mat5_read_header (psf))) - return error ; - } ; - - if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_MAT5) - return SFE_BAD_OPEN_FORMAT ; - - subformat = SF_CODEC (psf->sf.format) ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if (psf->is_pipe) - return SFE_NO_PIPE_WRITE ; - - psf->endian = SF_ENDIAN (psf->sf.format) ; - if (CPU_IS_LITTLE_ENDIAN && (psf->endian == SF_ENDIAN_CPU || psf->endian == 0)) - psf->endian = SF_ENDIAN_LITTLE ; - else if (CPU_IS_BIG_ENDIAN && (psf->endian == SF_ENDIAN_CPU || psf->endian == 0)) - psf->endian = SF_ENDIAN_BIG ; - - if ((error = mat5_write_header (psf, SF_FALSE))) - return error ; - - psf->write_header = mat5_write_header ; - } ; - - psf->container_close = mat5_close ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - switch (subformat) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_32 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_FLOAT : - error = float32_init (psf) ; - break ; - - case SF_FORMAT_DOUBLE : - error = double64_init (psf) ; - break ; - - default : break ; - } ; - - return error ; -} /* mat5_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -mat5_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - mat5_write_header (psf, SF_TRUE) ; - - return 0 ; -} /* mat5_close */ - -/*------------------------------------------------------------------------------ -*/ - -static int -mat5_write_header (SF_PRIVATE *psf, int calc_length) -{ static const char *filename = "MATLAB 5.0 MAT-file, written by " PACKAGE "-" VERSION ", " ; - static const char *sr_name = "samplerate\0\0\0\0\0\0\0\0\0\0\0" ; - static const char *wd_name = "wavedata\0" ; - char buffer [256] ; - sf_count_t current, datasize ; - int encoding ; - - current = psf_ftell (psf) ; - - if (calc_length) - { psf_fseek (psf, 0, SEEK_END) ; - psf->filelength = psf_ftell (psf) ; - psf_fseek (psf, 0, SEEK_SET) ; - - psf->datalength = psf->filelength - psf->dataoffset ; - if (psf->dataend) - psf->datalength -= psf->filelength - psf->dataend ; - - psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; - } ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_U8 : - encoding = MAT5_TYPE_UCHAR ; - break ; - - case SF_FORMAT_PCM_16 : - encoding = MAT5_TYPE_INT16 ; - break ; - - case SF_FORMAT_PCM_32 : - encoding = MAT5_TYPE_INT32 ; - break ; - - case SF_FORMAT_FLOAT : - encoding = MAT5_TYPE_FLOAT ; - break ; - - case SF_FORMAT_DOUBLE : - encoding = MAT5_TYPE_DOUBLE ; - break ; - - default : - return SFE_BAD_OPEN_FORMAT ; - } ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - psf_fseek (psf, 0, SEEK_SET) ; - - psf_get_date_str (buffer, sizeof (buffer)) ; - psf_binheader_writef (psf, "bb", filename, strlen (filename), buffer, strlen (buffer) + 1) ; - - memset (buffer, ' ', 124 - psf->headindex) ; - psf_binheader_writef (psf, "b", buffer, make_size_t (124 - psf->headindex)) ; - - psf->rwf_endian = psf->endian ; - - if (psf->rwf_endian == SF_ENDIAN_BIG) - psf_binheader_writef (psf, "2b", 0x0100, "MI", make_size_t (2)) ; - else - psf_binheader_writef (psf, "2b", 0x0100, "IM", make_size_t (2)) ; - - psf_binheader_writef (psf, "444444", MAT5_TYPE_ARRAY, 64, MAT5_TYPE_UINT32, 8, 6, 0) ; - psf_binheader_writef (psf, "4444", MAT5_TYPE_INT32, 8, 1, 1) ; - psf_binheader_writef (psf, "44b", MAT5_TYPE_SCHAR, strlen (sr_name), sr_name, make_size_t (16)) ; - - if (psf->sf.samplerate > 0xFFFF) - psf_binheader_writef (psf, "44", MAT5_TYPE_COMP_UINT, psf->sf.samplerate) ; - else - { unsigned short samplerate = psf->sf.samplerate ; - - psf_binheader_writef (psf, "422", MAT5_TYPE_COMP_USHORT, samplerate, 0) ; - } ; - - datasize = psf->sf.frames * psf->sf.channels * psf->bytewidth ; - - psf_binheader_writef (psf, "t484444", MAT5_TYPE_ARRAY, datasize + 64, MAT5_TYPE_UINT32, 8, 6, 0) ; - psf_binheader_writef (psf, "t4448", MAT5_TYPE_INT32, 8, psf->sf.channels, psf->sf.frames) ; - psf_binheader_writef (psf, "44b", MAT5_TYPE_SCHAR, strlen (wd_name), wd_name, strlen (wd_name)) ; - - datasize = psf->sf.frames * psf->sf.channels * psf->bytewidth ; - if (datasize > 0x7FFFFFFF) - datasize = 0x7FFFFFFF ; - - psf_binheader_writef (psf, "t48", encoding, datasize) ; - - /* Header construction complete so write it out. */ - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - psf->dataoffset = psf->headindex ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* mat5_write_header */ - -static int -mat5_read_header (SF_PRIVATE *psf) -{ char buffer [256], name [32] ; - short version, endian ; - int type, flags1, flags2, rows, cols ; - unsigned size ; - int have_samplerate = 1 ; - - psf_binheader_readf (psf, "pb", 0, buffer, 124) ; - - buffer [125] = 0 ; - - if (strlen (buffer) >= 124) - return SFE_UNIMPLEMENTED ; - - if (strstr (buffer, "MATLAB 5.0 MAT-file") == buffer) - psf_log_printf (psf, "%s\n", buffer) ; - - - psf_binheader_readf (psf, "E22", &version, &endian) ; - - if (endian == MI_MARKER) - { psf->endian = psf->rwf_endian = SF_ENDIAN_BIG ; - if (CPU_IS_LITTLE_ENDIAN) version = ENDSWAP_16 (version) ; - } - else if (endian == IM_MARKER) - { psf->endian = psf->rwf_endian = SF_ENDIAN_LITTLE ; - if (CPU_IS_BIG_ENDIAN) version = ENDSWAP_16 (version) ; - } - else - return SFE_MAT5_BAD_ENDIAN ; - - if ((CPU_IS_LITTLE_ENDIAN && endian == IM_MARKER) || - (CPU_IS_BIG_ENDIAN && endian == MI_MARKER)) - version = ENDSWAP_16 (version) ; - - psf_log_printf (psf, "Version : 0x%04X\n", version) ; - psf_log_printf (psf, "Endian : 0x%04X => %s\n", endian, - (psf->endian == SF_ENDIAN_LITTLE) ? "Little" : "Big") ; - - /*========================================================*/ - psf_binheader_readf (psf, "44", &type, &size) ; - psf_log_printf (psf, "Block\n Type : %X Size : %d\n", type, size) ; - - if (type != MAT5_TYPE_ARRAY) - return SFE_MAT5_NO_BLOCK ; - - psf_binheader_readf (psf, "44", &type, &size) ; - psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; - - if (type != MAT5_TYPE_UINT32) - return SFE_MAT5_NO_BLOCK ; - - psf_binheader_readf (psf, "44", &flags1, &flags2) ; - psf_log_printf (psf, " Flg1 : %X Flg2 : %d\n", flags1, flags2) ; - - psf_binheader_readf (psf, "44", &type, &size) ; - psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; - - if (type != MAT5_TYPE_INT32) - return SFE_MAT5_NO_BLOCK ; - - psf_binheader_readf (psf, "44", &rows, &cols) ; - psf_log_printf (psf, " Rows : %d Cols : %d\n", rows, cols) ; - - if (rows != 1 || cols != 1) - { if (psf->sf.samplerate == 0) - psf->sf.samplerate = 44100 ; - have_samplerate = 0 ; - } - psf_binheader_readf (psf, "4", &type) ; - - if (type == MAT5_TYPE_SCHAR) - { psf_binheader_readf (psf, "4", &size) ; - psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; - if (size > SIGNED_SIZEOF (name) - 1) - { psf_log_printf (psf, "Error : Bad name length.\n") ; - return SFE_MAT5_NO_BLOCK ; - } ; - - psf_binheader_readf (psf, "bj", name, size, (8 - (size % 8)) % 8) ; - name [size] = 0 ; - } - else if ((type & 0xFFFF) == MAT5_TYPE_SCHAR) - { size = type >> 16 ; - if (size > 4) - { psf_log_printf (psf, "Error : Bad name length.\n") ; - return SFE_MAT5_NO_BLOCK ; - } ; - - psf_log_printf (psf, " Type : %X\n", type) ; - psf_binheader_readf (psf, "4", &name) ; - name [size] = 0 ; - } - else - return SFE_MAT5_NO_BLOCK ; - - psf_log_printf (psf, " Name : %s\n", name) ; - - /*-----------------------------------------*/ - - psf_binheader_readf (psf, "44", &type, &size) ; - - if (!have_samplerate) - goto skip_samplerate ; - - switch (type) - { case MAT5_TYPE_DOUBLE : - { double samplerate ; - - psf_binheader_readf (psf, "d", &samplerate) ; - snprintf (name, sizeof (name), "%f\n", samplerate) ; - psf_log_printf (psf, " Val : %s\n", name) ; - - psf->sf.samplerate = lrint (samplerate) ; - } ; - break ; - - case MAT5_TYPE_COMP_USHORT : - { unsigned short samplerate ; - - psf_binheader_readf (psf, "j2j", -4, &samplerate, 2) ; - psf_log_printf (psf, " Val : %u\n", samplerate) ; - psf->sf.samplerate = samplerate ; - } - break ; - - case MAT5_TYPE_COMP_UINT : - psf_log_printf (psf, " Val : %u\n", size) ; - psf->sf.samplerate = size ; - break ; - - default : - psf_log_printf (psf, " Type : %X Size : %d ***\n", type, size) ; - return SFE_MAT5_SAMPLE_RATE ; - } ; - - /*-----------------------------------------*/ - - - psf_binheader_readf (psf, "44", &type, &size) ; - psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; - - if (type != MAT5_TYPE_ARRAY) - return SFE_MAT5_NO_BLOCK ; - - psf_binheader_readf (psf, "44", &type, &size) ; - psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; - - if (type != MAT5_TYPE_UINT32) - return SFE_MAT5_NO_BLOCK ; - - psf_binheader_readf (psf, "44", &flags1, &flags2) ; - psf_log_printf (psf, " Flg1 : %X Flg2 : %d\n", flags1, flags2) ; - - psf_binheader_readf (psf, "44", &type, &size) ; - psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; - - if (type != MAT5_TYPE_INT32) - return SFE_MAT5_NO_BLOCK ; - - psf_binheader_readf (psf, "44", &rows, &cols) ; - psf_log_printf (psf, " Rows : %X Cols : %d\n", rows, cols) ; - - psf_binheader_readf (psf, "4", &type) ; - - if (type == MAT5_TYPE_SCHAR) - { psf_binheader_readf (psf, "4", &size) ; - psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; - if (size > SIGNED_SIZEOF (name) - 1) - { psf_log_printf (psf, "Error : Bad name length.\n") ; - return SFE_MAT5_NO_BLOCK ; - } ; - - psf_binheader_readf (psf, "bj", name, size, (8 - (size % 8)) % 8) ; - name [size] = 0 ; - } - else if ((type & 0xFFFF) == MAT5_TYPE_SCHAR) - { size = type >> 16 ; - if (size > 4) - { psf_log_printf (psf, "Error : Bad name length.\n") ; - return SFE_MAT5_NO_BLOCK ; - } ; - - psf_log_printf (psf, " Type : %X\n", type) ; - psf_binheader_readf (psf, "4", &name) ; - name [size] = 0 ; - } - else - return SFE_MAT5_NO_BLOCK ; - - psf_log_printf (psf, " Name : %s\n", name) ; - - psf_binheader_readf (psf, "44", &type, &size) ; - psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; - -skip_samplerate : - /*++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - if (rows == 0 && cols == 0) - { psf_log_printf (psf, "*** Error : zero channel count.\n") ; - return SFE_CHANNEL_COUNT_ZERO ; - } ; - - psf->sf.channels = rows ; - psf->sf.frames = cols ; - - psf->sf.format = psf->endian | SF_FORMAT_MAT5 ; - - switch (type) - { case MAT5_TYPE_DOUBLE : - psf_log_printf (psf, "Data type : double\n") ; - psf->sf.format |= SF_FORMAT_DOUBLE ; - psf->bytewidth = 8 ; - break ; - - case MAT5_TYPE_FLOAT : - psf_log_printf (psf, "Data type : float\n") ; - psf->sf.format |= SF_FORMAT_FLOAT ; - psf->bytewidth = 4 ; - break ; - - case MAT5_TYPE_INT32 : - psf_log_printf (psf, "Data type : 32 bit PCM\n") ; - psf->sf.format |= SF_FORMAT_PCM_32 ; - psf->bytewidth = 4 ; - break ; - - case MAT5_TYPE_INT16 : - psf_log_printf (psf, "Data type : 16 bit PCM\n") ; - psf->sf.format |= SF_FORMAT_PCM_16 ; - psf->bytewidth = 2 ; - break ; - - case MAT5_TYPE_UCHAR : - psf_log_printf (psf, "Data type : unsigned 8 bit PCM\n") ; - psf->sf.format |= SF_FORMAT_PCM_U8 ; - psf->bytewidth = 1 ; - break ; - - default : - psf_log_printf (psf, "*** Error : Bad marker %08X\n", type) ; - return SFE_UNIMPLEMENTED ; - } ; - - psf->dataoffset = psf_ftell (psf) ; - psf->datalength = psf->filelength - psf->dataoffset ; - - return 0 ; -} /* mat5_read_header */ - diff --git a/libs/libsndfile/src/mpc2k.c b/libs/libsndfile/src/mpc2k.c deleted file mode 100644 index 0170f7ccfb..0000000000 --- a/libs/libsndfile/src/mpc2k.c +++ /dev/null @@ -1,204 +0,0 @@ -/* -** Copyright (C) 2008-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/* -** Info from Olivier Tristan -** -** HEADER -** 2 magic bytes: 1 and 4. -** 17 char for the name of the sample. -** 3 bytes: level, tune and channels (0 for channels is mono while 1 is stereo) -** 4 uint32: sampleStart, loopEnd, sampleFrames and loopLength -** 1 byte: loopMode (0 no loop, 1 forward looping) -** 1 byte: number of beat in loop -** 1 uint16: sampleRate -** -** DATA -** Data are always non compressed 16 bits interleaved -*/ - -#define HEADER_LENGTH 42 /* Sum of above data fields. */ -#define HEADER_NAME_LEN 17 /* Length of name string. */ - -#define SFE_MPC_NO_MARKER 666 - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int mpc2k_close (SF_PRIVATE *psf) ; - -static int mpc2k_write_header (SF_PRIVATE *psf, int calc_length) ; -static int mpc2k_read_header (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -mpc2k_open (SF_PRIVATE *psf) -{ int error = 0 ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = mpc2k_read_header (psf))) - return error ; - } ; - - if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_MPC2K) - return SFE_BAD_OPEN_FORMAT ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if (mpc2k_write_header (psf, SF_FALSE)) - return psf->error ; - - psf->write_header = mpc2k_write_header ; - } ; - - psf->container_close = mpc2k_close ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - error = pcm_init (psf) ; - - return error ; -} /* mpc2k_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -mpc2k_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - mpc2k_write_header (psf, SF_TRUE) ; - - return 0 ; -} /* mpc2k_close */ - -static int -mpc2k_write_header (SF_PRIVATE *psf, int calc_length) -{ char sample_name [HEADER_NAME_LEN + 1] ; - sf_count_t current ; - - if (psf->pipeoffset > 0) - return 0 ; - - current = psf_ftell (psf) ; - - if (calc_length) - { psf->filelength = psf_get_filelen (psf) ; - - psf->dataoffset = HEADER_LENGTH ; - psf->datalength = psf->filelength - psf->dataoffset ; - - psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; - } ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - - /* - ** Only attempt to seek if we are not writng to a pipe. If we are - ** writing to a pipe we shouldn't be here anyway. - */ - if (psf->is_pipe == SF_FALSE) - psf_fseek (psf, 0, SEEK_SET) ; - - snprintf (sample_name, sizeof (sample_name), "%s ", psf->file.name.c) ; - - psf_binheader_writef (psf, "e11b", 1, 4, sample_name, make_size_t (HEADER_NAME_LEN)) ; - psf_binheader_writef (psf, "e111", 100, 0, (psf->sf.channels - 1) & 1) ; - psf_binheader_writef (psf, "et4888", 0, psf->sf.frames, psf->sf.frames, psf->sf.frames) ; - psf_binheader_writef (psf, "e112", 0, 1, (uint16_t) psf->sf.samplerate) ; - - /* Always 16 bit little endian data. */ - psf->bytewidth = 2 ; - psf->endian = SF_ENDIAN_LITTLE ; - - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - psf->dataoffset = psf->headindex ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* mpc2k_write_header */ - -static int -mpc2k_read_header (SF_PRIVATE *psf) -{ char sample_name [HEADER_NAME_LEN + 1] ; - unsigned char bytes [4] ; - uint32_t sample_start, loop_end, sample_frames, loop_length ; - uint16_t sample_rate ; - - psf_binheader_readf (psf, "pebb", 0, bytes, 2, sample_name, make_size_t (HEADER_NAME_LEN)) ; - - if (bytes [0] != 1 || bytes [1] != 4) - return SFE_MPC_NO_MARKER ; - - sample_name [HEADER_NAME_LEN] = 0 ; - - psf_log_printf (psf, "MPC2000\n Name : %s\n", sample_name) ; - - psf_binheader_readf (psf, "eb4444", bytes, 3, &sample_start, &loop_end, &sample_frames, &loop_length) ; - - psf->sf.channels = bytes [2] ? 2 : 1 ; - - psf_log_printf (psf, " Level : %d\n Tune : %d\n Stereo : %s\n", bytes [0], bytes [1], bytes [2] ? "Yes" : "No") ; - - psf_log_printf (psf, " Sample start : %d\n Loop end : %d\n Frames : %d\n Length : %d\n", sample_start, loop_end, sample_frames, loop_length) ; - - psf_binheader_readf (psf, "eb2", bytes, 2, &sample_rate) ; - - psf_log_printf (psf, " Loop mode : %s\n Beats : %d\n Sample rate : %d\nEnd\n", bytes [0] ? "None" : "Fwd", bytes [1], sample_rate) ; - - psf->sf.samplerate = sample_rate ; - - psf->sf.format = SF_FORMAT_MPC2K | SF_FORMAT_PCM_16 ; - - psf->dataoffset = psf_ftell (psf) ; - - /* Always 16 bit little endian data. */ - psf->bytewidth = 2 ; - psf->endian = SF_ENDIAN_LITTLE ; - - psf->datalength = psf->filelength - psf->dataoffset ; - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - psf->sf.frames = psf->datalength / psf->blockwidth ; - - psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; - - return 0 ; -} /* mpc2k_read_header */ - diff --git a/libs/libsndfile/src/ms_adpcm.c b/libs/libsndfile/src/ms_adpcm.c deleted file mode 100644 index 1643ddf443..0000000000 --- a/libs/libsndfile/src/ms_adpcm.c +++ /dev/null @@ -1,836 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" -#include "wav_w64.h" - -/* These required here because we write the header in this file. */ - -#define RIFF_MARKER (MAKE_MARKER ('R', 'I', 'F', 'F')) -#define WAVE_MARKER (MAKE_MARKER ('W', 'A', 'V', 'E')) -#define fmt_MARKER (MAKE_MARKER ('f', 'm', 't', ' ')) -#define fact_MARKER (MAKE_MARKER ('f', 'a', 'c', 't')) -#define data_MARKER (MAKE_MARKER ('d', 'a', 't', 'a')) - -#define WAVE_FORMAT_MS_ADPCM 0x0002 - -typedef struct -{ int channels, blocksize, samplesperblock, blocks, dataremaining ; - int blockcount ; - sf_count_t samplecount ; - short *samples ; - unsigned char *block ; - short dummydata [] ; /* ISO C99 struct flexible array. */ -} MSADPCM_PRIVATE ; - -/*============================================================================================ -** MS ADPCM static data and functions. -*/ - -static int AdaptationTable [] = -{ 230, 230, 230, 230, 307, 409, 512, 614, - 768, 614, 512, 409, 307, 230, 230, 230 -} ; - -/* TODO : The first 7 coef's are are always hardcode and must - appear in the actual WAVE file. They should be read in - in case a sound program added extras to the list. */ - -static int AdaptCoeff1 [MSADPCM_ADAPT_COEFF_COUNT] = -{ 256, 512, 0, 192, 240, 460, 392 -} ; - -static int AdaptCoeff2 [MSADPCM_ADAPT_COEFF_COUNT] = -{ 0, -256, 0, 64, 0, -208, -232 -} ; - -/*============================================================================================ -** MS ADPCM Block Layout. -** ====================== -** Block is usually 256, 512 or 1024 bytes depending on sample rate. -** For a mono file, the block is laid out as follows: -** byte purpose -** 0 block predictor [0..6] -** 1,2 initial idelta (positive) -** 3,4 sample 1 -** 5,6 sample 0 -** 7..n packed bytecodes -** -** For a stereo file, the block is laid out as follows: -** byte purpose -** 0 block predictor [0..6] for left channel -** 1 block predictor [0..6] for right channel -** 2,3 initial idelta (positive) for left channel -** 4,5 initial idelta (positive) for right channel -** 6,7 sample 1 for left channel -** 8,9 sample 1 for right channel -** 10,11 sample 0 for left channel -** 12,13 sample 0 for right channel -** 14..n packed bytecodes -*/ - -/*============================================================================================ -** Static functions. -*/ - -static int msadpcm_decode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ; -static sf_count_t msadpcm_read_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len) ; - -static int msadpcm_encode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ; -static sf_count_t msadpcm_write_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, const short *ptr, int len) ; - -static sf_count_t msadpcm_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t msadpcm_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t msadpcm_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t msadpcm_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t msadpcm_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t msadpcm_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t msadpcm_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t msadpcm_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static sf_count_t msadpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; -static int msadpcm_close (SF_PRIVATE *psf) ; - -static void choose_predictor (unsigned int channels, short *data, int *bpred, int *idelta) ; - -/*============================================================================================ -** MS ADPCM Read Functions. -*/ - -int -wav_w64_msadpcm_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) -{ MSADPCM_PRIVATE *pms ; - unsigned int pmssize ; - int count ; - - if (psf->codec_data != NULL) - { psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ; - return SFE_INTERNAL ; - } ; - - if (psf->file.mode == SFM_WRITE) - samplesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ; - - pmssize = sizeof (MSADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ; - - if (! (psf->codec_data = calloc (1, pmssize))) - return SFE_MALLOC_FAILED ; - pms = (MSADPCM_PRIVATE*) psf->codec_data ; - - pms->samples = pms->dummydata ; - pms->block = (unsigned char*) (pms->dummydata + psf->sf.channels * samplesperblock) ; - - pms->channels = psf->sf.channels ; - pms->blocksize = blockalign ; - pms->samplesperblock = samplesperblock ; - - if (pms->blocksize == 0) - { psf_log_printf (psf, "*** Error : pms->blocksize should not be zero.\n") ; - return SFE_INTERNAL ; - } ; - - if (psf->file.mode == SFM_READ) - { pms->dataremaining = psf->datalength ; - - if (psf->datalength % pms->blocksize) - pms->blocks = psf->datalength / pms->blocksize + 1 ; - else - pms->blocks = psf->datalength / pms->blocksize ; - - count = 2 * (pms->blocksize - 6 * pms->channels) / pms->channels ; - if (pms->samplesperblock != count) - { psf_log_printf (psf, "*** Error : samplesperblock should be %d.\n", count) ; - return SFE_INTERNAL ; - } ; - - psf->sf.frames = (psf->datalength / pms->blocksize) * pms->samplesperblock ; - - psf_log_printf (psf, " bpred idelta\n") ; - - msadpcm_decode_block (psf, pms) ; - - psf->read_short = msadpcm_read_s ; - psf->read_int = msadpcm_read_i ; - psf->read_float = msadpcm_read_f ; - psf->read_double = msadpcm_read_d ; - } ; - - if (psf->file.mode == SFM_WRITE) - { pms->samples = pms->dummydata ; - - pms->samplecount = 0 ; - - psf->write_short = msadpcm_write_s ; - psf->write_int = msadpcm_write_i ; - psf->write_float = msadpcm_write_f ; - psf->write_double = msadpcm_write_d ; - } ; - - psf->codec_close = msadpcm_close ; - psf->seek = msadpcm_seek ; - - return 0 ; -} /* wav_w64_msadpcm_init */ - -static int -msadpcm_decode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) -{ int chan, k, blockindx, sampleindx ; - short bytecode, bpred [2], chan_idelta [2] ; - - int predict ; - int current ; - int idelta ; - - pms->blockcount ++ ; - pms->samplecount = 0 ; - - if (pms->blockcount > pms->blocks) - { memset (pms->samples, 0, pms->samplesperblock * pms->channels) ; - return 1 ; - } ; - - if ((k = psf_fread (pms->block, 1, pms->blocksize, psf)) != pms->blocksize) - psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pms->blocksize) ; - - /* Read and check the block header. */ - - if (pms->channels == 1) - { bpred [0] = pms->block [0] ; - - if (bpred [0] >= 7) - psf_log_printf (psf, "MS ADPCM synchronisation error (%d).\n", bpred [0]) ; - - chan_idelta [0] = pms->block [1] | (pms->block [2] << 8) ; - chan_idelta [1] = 0 ; - - psf_log_printf (psf, "(%d) (%d)\n", bpred [0], chan_idelta [0]) ; - - pms->samples [1] = pms->block [3] | (pms->block [4] << 8) ; - pms->samples [0] = pms->block [5] | (pms->block [6] << 8) ; - blockindx = 7 ; - } - else - { bpred [0] = pms->block [0] ; - bpred [1] = pms->block [1] ; - - if (bpred [0] >= 7 || bpred [1] >= 7) - psf_log_printf (psf, "MS ADPCM synchronisation error (%d %d).\n", bpred [0], bpred [1]) ; - - chan_idelta [0] = pms->block [2] | (pms->block [3] << 8) ; - chan_idelta [1] = pms->block [4] | (pms->block [5] << 8) ; - - psf_log_printf (psf, "(%d, %d) (%d, %d)\n", bpred [0], bpred [1], chan_idelta [0], chan_idelta [1]) ; - - pms->samples [2] = pms->block [6] | (pms->block [7] << 8) ; - pms->samples [3] = pms->block [8] | (pms->block [9] << 8) ; - - pms->samples [0] = pms->block [10] | (pms->block [11] << 8) ; - pms->samples [1] = pms->block [12] | (pms->block [13] << 8) ; - - blockindx = 14 ; - } ; - - /*-------------------------------------------------------- - This was left over from a time when calculations were done - as ints rather than shorts. Keep this around as a reminder - in case I ever find a file which decodes incorrectly. - - if (chan_idelta [0] & 0x8000) - chan_idelta [0] -= 0x10000 ; - if (chan_idelta [1] & 0x8000) - chan_idelta [1] -= 0x10000 ; - --------------------------------------------------------*/ - - /* Pull apart the packed 4 bit samples and store them in their - ** correct sample positions. - */ - - sampleindx = 2 * pms->channels ; - while (blockindx < pms->blocksize) - { bytecode = pms->block [blockindx++] ; - pms->samples [sampleindx++] = (bytecode >> 4) & 0x0F ; - pms->samples [sampleindx++] = bytecode & 0x0F ; - } ; - - /* Decode the encoded 4 bit samples. */ - - for (k = 2 * pms->channels ; k < (pms->samplesperblock * pms->channels) ; k ++) - { chan = (pms->channels > 1) ? (k % 2) : 0 ; - - bytecode = pms->samples [k] & 0xF ; - - /* Compute next Adaptive Scale Factor (ASF) */ - idelta = chan_idelta [chan] ; - chan_idelta [chan] = (AdaptationTable [bytecode] * idelta) >> 8 ; /* => / 256 => FIXED_POINT_ADAPTATION_BASE == 256 */ - if (chan_idelta [chan] < 16) - chan_idelta [chan] = 16 ; - if (bytecode & 0x8) - bytecode -= 0x10 ; - - predict = ((pms->samples [k - pms->channels] * AdaptCoeff1 [bpred [chan]]) - + (pms->samples [k - 2 * pms->channels] * AdaptCoeff2 [bpred [chan]])) >> 8 ; /* => / 256 => FIXED_POINT_COEFF_BASE == 256 */ - current = (bytecode * idelta) + predict ; - - if (current > 32767) - current = 32767 ; - else if (current < -32768) - current = -32768 ; - - pms->samples [k] = current ; - } ; - - return 1 ; -} /* msadpcm_decode_block */ - -static sf_count_t -msadpcm_read_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len) -{ int count, total = 0, indx = 0 ; - - while (indx < len) - { if (pms->blockcount >= pms->blocks && pms->samplecount >= pms->samplesperblock) - { memset (&(ptr [indx]), 0, (size_t) ((len - indx) * sizeof (short))) ; - return total ; - } ; - - if (pms->samplecount >= pms->samplesperblock) - msadpcm_decode_block (psf, pms) ; - - count = (pms->samplesperblock - pms->samplecount) * pms->channels ; - count = (len - indx > count) ? count : len - indx ; - - memcpy (&(ptr [indx]), &(pms->samples [pms->samplecount * pms->channels]), count * sizeof (short)) ; - indx += count ; - pms->samplecount += count / pms->channels ; - total = indx ; - } ; - - return total ; -} /* msadpcm_read_block */ - -static sf_count_t -msadpcm_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ MSADPCM_PRIVATE *pms ; - int readcount, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pms = (MSADPCM_PRIVATE*) psf->codec_data ; - - while (len > 0) - { readcount = (len > 0x10000000) ? 0x10000000 : (int) len ; - - count = msadpcm_read_block (psf, pms, ptr, readcount) ; - - total += count ; - len -= count ; - if (count != readcount) - break ; - } ; - - return total ; -} /* msadpcm_read_s */ - -static sf_count_t -msadpcm_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ MSADPCM_PRIVATE *pms ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, readcount = 0, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pms = (MSADPCM_PRIVATE*) psf->codec_data ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = msadpcm_read_block (psf, pms, sptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = sptr [k] << 16 ; - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - return total ; -} /* msadpcm_read_i */ - -static sf_count_t -msadpcm_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ MSADPCM_PRIVATE *pms ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, readcount = 0, count ; - sf_count_t total = 0 ; - float normfact ; - - if (! psf->codec_data) - return 0 ; - pms = (MSADPCM_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = msadpcm_read_block (psf, pms, sptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * (float) (sptr [k]) ; - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - return total ; -} /* msadpcm_read_f */ - -static sf_count_t -msadpcm_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ MSADPCM_PRIVATE *pms ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, readcount = 0, count ; - sf_count_t total = 0 ; - double normfact ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; - - if (! psf->codec_data) - return 0 ; - pms = (MSADPCM_PRIVATE*) psf->codec_data ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = msadpcm_read_block (psf, pms, sptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * (double) (sptr [k]) ; - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - return total ; -} /* msadpcm_read_d */ - -static sf_count_t -msadpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) -{ MSADPCM_PRIVATE *pms ; - int newblock, newsample ; - - if (! psf->codec_data) - return 0 ; - pms = (MSADPCM_PRIVATE*) psf->codec_data ; - - if (psf->datalength < 0 || psf->dataoffset < 0) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - if (offset == 0) - { psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - pms->blockcount = 0 ; - msadpcm_decode_block (psf, pms) ; - pms->samplecount = 0 ; - return 0 ; - } ; - - if (offset < 0 || offset > pms->blocks * pms->samplesperblock) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - newblock = offset / pms->samplesperblock ; - newsample = offset % pms->samplesperblock ; - - if (mode == SFM_READ) - { psf_fseek (psf, psf->dataoffset + newblock * pms->blocksize, SEEK_SET) ; - pms->blockcount = newblock ; - msadpcm_decode_block (psf, pms) ; - pms->samplecount = newsample ; - } - else - { /* What to do about write??? */ - psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - return newblock * pms->samplesperblock + newsample ; -} /* msadpcm_seek */ - -/*========================================================================================== -** MS ADPCM Write Functions. -*/ - -void -msadpcm_write_adapt_coeffs (SF_PRIVATE *psf) -{ int k ; - - for (k = 0 ; k < MSADPCM_ADAPT_COEFF_COUNT ; k++) - psf_binheader_writef (psf, "22", AdaptCoeff1 [k], AdaptCoeff2 [k]) ; -} /* msadpcm_write_adapt_coeffs */ - -/*========================================================================================== -*/ - -static int -msadpcm_encode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) -{ unsigned int blockindx ; - unsigned char byte ; - int chan, k, predict, bpred [2], idelta [2], errordelta, newsamp ; - - choose_predictor (pms->channels, pms->samples, bpred, idelta) ; - - /* Write the block header. */ - - if (pms->channels == 1) - { pms->block [0] = bpred [0] ; - pms->block [1] = idelta [0] & 0xFF ; - pms->block [2] = idelta [0] >> 8 ; - pms->block [3] = pms->samples [1] & 0xFF ; - pms->block [4] = pms->samples [1] >> 8 ; - pms->block [5] = pms->samples [0] & 0xFF ; - pms->block [6] = pms->samples [0] >> 8 ; - - blockindx = 7 ; - byte = 0 ; - - /* Encode the samples as 4 bit. */ - - for (k = 2 ; k < pms->samplesperblock ; k++) - { predict = (pms->samples [k-1] * AdaptCoeff1 [bpred [0]] + pms->samples [k-2] * AdaptCoeff2 [bpred [0]]) >> 8 ; - errordelta = (pms->samples [k] - predict) / idelta [0] ; - if (errordelta < -8) - errordelta = -8 ; - else if (errordelta > 7) - errordelta = 7 ; - newsamp = predict + (idelta [0] * errordelta) ; - if (newsamp > 32767) - newsamp = 32767 ; - else if (newsamp < -32768) - newsamp = -32768 ; - if (errordelta < 0) - errordelta += 0x10 ; - - byte = (byte << 4) | (errordelta & 0xF) ; - if (k % 2) - { pms->block [blockindx++] = byte ; - byte = 0 ; - } ; - - idelta [0] = (idelta [0] * AdaptationTable [errordelta]) >> 8 ; - if (idelta [0] < 16) - idelta [0] = 16 ; - pms->samples [k] = newsamp ; - } ; - } - else - { /* Stereo file. */ - pms->block [0] = bpred [0] ; - pms->block [1] = bpred [1] ; - - pms->block [2] = idelta [0] & 0xFF ; - pms->block [3] = idelta [0] >> 8 ; - pms->block [4] = idelta [1] & 0xFF ; - pms->block [5] = idelta [1] >> 8 ; - - pms->block [6] = pms->samples [2] & 0xFF ; - pms->block [7] = pms->samples [2] >> 8 ; - pms->block [8] = pms->samples [3] & 0xFF ; - pms->block [9] = pms->samples [3] >> 8 ; - - pms->block [10] = pms->samples [0] & 0xFF ; - pms->block [11] = pms->samples [0] >> 8 ; - pms->block [12] = pms->samples [1] & 0xFF ; - pms->block [13] = pms->samples [1] >> 8 ; - - blockindx = 14 ; - byte = 0 ; - chan = 1 ; - - for (k = 4 ; k < 2 * pms->samplesperblock ; k++) - { chan = k & 1 ; - - predict = (pms->samples [k-2] * AdaptCoeff1 [bpred [chan]] + pms->samples [k-4] * AdaptCoeff2 [bpred [chan]]) >> 8 ; - errordelta = (pms->samples [k] - predict) / idelta [chan] ; - - - if (errordelta < -8) - errordelta = -8 ; - else if (errordelta > 7) - errordelta = 7 ; - newsamp = predict + (idelta [chan] * errordelta) ; - if (newsamp > 32767) - newsamp = 32767 ; - else if (newsamp < -32768) - newsamp = -32768 ; - if (errordelta < 0) - errordelta += 0x10 ; - - byte = (byte << 4) | (errordelta & 0xF) ; - - if (chan) - { pms->block [blockindx++] = byte ; - byte = 0 ; - } ; - - idelta [chan] = (idelta [chan] * AdaptationTable [errordelta]) >> 8 ; - if (idelta [chan] < 16) - idelta [chan] = 16 ; - pms->samples [k] = newsamp ; - } ; - } ; - - /* Write the block to disk. */ - - if ((k = psf_fwrite (pms->block, 1, pms->blocksize, psf)) != pms->blocksize) - psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pms->blocksize) ; - - memset (pms->samples, 0, pms->samplesperblock * sizeof (short)) ; - - pms->blockcount ++ ; - pms->samplecount = 0 ; - - return 1 ; -} /* msadpcm_encode_block */ - -static sf_count_t -msadpcm_write_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, const short *ptr, int len) -{ int count, total = 0, indx = 0 ; - - while (indx < len) - { count = (pms->samplesperblock - pms->samplecount) * pms->channels ; - - if (count > len - indx) - count = len - indx ; - - memcpy (&(pms->samples [pms->samplecount * pms->channels]), &(ptr [total]), count * sizeof (short)) ; - indx += count ; - pms->samplecount += count / pms->channels ; - total = indx ; - - if (pms->samplecount >= pms->samplesperblock) - msadpcm_encode_block (psf, pms) ; - } ; - - return total ; -} /* msadpcm_write_block */ - -static sf_count_t -msadpcm_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ MSADPCM_PRIVATE *pms ; - int writecount, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pms = (MSADPCM_PRIVATE*) psf->codec_data ; - - while (len > 0) - { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; - - count = msadpcm_write_block (psf, pms, ptr, writecount) ; - - total += count ; - len -= count ; - if (count != writecount) - break ; - } ; - - return total ; -} /* msadpcm_write_s */ - -static sf_count_t -msadpcm_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ MSADPCM_PRIVATE *pms ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, writecount, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pms = (MSADPCM_PRIVATE*) psf->codec_data ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = ptr [total + k] >> 16 ; - count = msadpcm_write_block (psf, pms, sptr, writecount) ; - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - return total ; -} /* msadpcm_write_i */ - -static sf_count_t -msadpcm_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ MSADPCM_PRIVATE *pms ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, writecount, count ; - sf_count_t total = 0 ; - float normfact ; - - if (! psf->codec_data) - return 0 ; - pms = (MSADPCM_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = lrintf (normfact * ptr [total + k]) ; - count = msadpcm_write_block (psf, pms, sptr, writecount) ; - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - return total ; -} /* msadpcm_write_f */ - -static sf_count_t -msadpcm_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ MSADPCM_PRIVATE *pms ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, writecount, count ; - sf_count_t total = 0 ; - double normfact ; - - normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; - - if (! psf->codec_data) - return 0 ; - pms = (MSADPCM_PRIVATE*) psf->codec_data ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = lrint (normfact * ptr [total + k]) ; - count = msadpcm_write_block (psf, pms, sptr, writecount) ; - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - return total ; -} /* msadpcm_write_d */ - -/*======================================================================================== -*/ - -static int -msadpcm_close (SF_PRIVATE *psf) -{ MSADPCM_PRIVATE *pms ; - - pms = (MSADPCM_PRIVATE*) psf->codec_data ; - - if (psf->file.mode == SFM_WRITE) - { /* Now we know static int for certain the length of the file we can - ** re-write the header. - */ - - if (pms->samplecount && pms->samplecount < pms->samplesperblock) - msadpcm_encode_block (psf, pms) ; - } ; - - return 0 ; -} /* msadpcm_close */ - -/*======================================================================================== -** Static functions. -*/ - -/*---------------------------------------------------------------------------------------- -** Choosing the block predictor. -** Each block requires a predictor and an idelta for each channel. -** The predictor is in the range [0..6] which is an indx into the two AdaptCoeff tables. -** The predictor is chosen by trying all of the possible predictors on a small set of -** samples at the beginning of the block. The predictor with the smallest average -** abs (idelta) is chosen as the best predictor for this block. -** The value of idelta is chosen to to give a 4 bit code value of +/- 4 (approx. half the -** max. code value). If the average abs (idelta) is zero, the sixth predictor is chosen. -** If the value of idelta is less then 16 it is set to 16. -** -** Microsoft uses an IDELTA_COUNT (number of sample pairs used to choose best predictor) -** value of 3. The best possible results would be obtained by using all the samples to -** choose the predictor. -*/ - -#define IDELTA_COUNT 3 - -static void -choose_predictor (unsigned int channels, short *data, int *block_pred, int *idelta) -{ unsigned int chan, k, bpred, idelta_sum, best_bpred, best_idelta ; - - for (chan = 0 ; chan < channels ; chan++) - { best_bpred = best_idelta = 0 ; - - for (bpred = 0 ; bpred < 7 ; bpred++) - { idelta_sum = 0 ; - for (k = 2 ; k < 2 + IDELTA_COUNT ; k++) - idelta_sum += abs (data [k * channels] - ((data [(k - 1) * channels] * AdaptCoeff1 [bpred] + data [(k - 2) * channels] * AdaptCoeff2 [bpred]) >> 8)) ; - idelta_sum /= (4 * IDELTA_COUNT) ; - - if (bpred == 0 || idelta_sum < best_idelta) - { best_bpred = bpred ; - best_idelta = idelta_sum ; - } ; - - if (! idelta_sum) - { best_bpred = bpred ; - best_idelta = 16 ; - break ; - } ; - - } ; /* for bpred ... */ - if (best_idelta < 16) - best_idelta = 16 ; - - block_pred [chan] = best_bpred ; - idelta [chan] = best_idelta ; - } ; - - return ; -} /* choose_predictor */ - diff --git a/libs/libsndfile/src/new.c b/libs/libsndfile/src/new.c deleted file mode 100644 index 23f3087f12..0000000000 --- a/libs/libsndfile/src/new.c +++ /dev/null @@ -1,116 +0,0 @@ -/* -** Copyright (C) 2002-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#if (ENABLE_EXPERIMENTAL_CODE == 0) - -int -new_open (SF_PRIVATE *psf) -{ if (psf) - return SFE_UNIMPLEMENTED ; - return (psf && 0) ; -} /* new_open */ - -#else - -/*------------------------------------------------------------------------------ -** Macros to handle big/little endian issues. -*/ - -/*------------------------------------------------------------------------------ -** Typedefs. -*/ - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int new_read_header (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -new_open (SF_PRIVATE *psf) -{ int subformat, error = 0 ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - return SFE_UNIMPLEMENTED ; - - if ((error = new_read_header (psf))) - return error ; - - if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_WVE) - return SFE_BAD_OPEN_FORMAT ; - - subformat = SF_CODEC (psf->sf.format) ; - - return error ; -} /* new_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -new_read_header (SF_PRIVATE *psf) -{ int marker ; - - /* Set position to start of file to begin reading header. */ - psf_binheader_readf (psf, "pm", 0, &marker) ; - if (marker != ALAW_MARKER) - return SFE_WVE_NOT_WVE ; - - psf_binheader_readf (psf, "m", &marker) ; - if (marker != SOUN_MARKER) - return SFE_WVE_NOT_WVE ; - - psf_binheader_readf (psf, "m", &marker) ; - if (marker != DFIL_MARKER) - return SFE_WVE_NOT_WVE ; - - psf_log_printf (psf, "Read only : Psion Alaw\n" - " Sample Rate : 8000\n" - " Channels : 1\n" - " Encoding : A-law\n") ; - - psf->dataoffset = 0x20 ; - psf->datalength = psf->filelength - psf->dataoffset ; - - psf->sf.format = SF_FORMAT_WVE | SF_FORMAT_ALAW ; - psf->sf.samplerate = 8000 ; - psf->sf.frames = psf->datalength ; - psf->sf.channels = 1 ; - - return alaw_init (psf) ; -} /* new_read_header */ - -/*------------------------------------------------------------------------------ -*/ - -#endif diff --git a/libs/libsndfile/src/nist.c b/libs/libsndfile/src/nist.c deleted file mode 100644 index 2aa679e55c..0000000000 --- a/libs/libsndfile/src/nist.c +++ /dev/null @@ -1,375 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* -** Some of the information used to read NIST files was gleaned from -** reading the code of Bill Schottstaedt's sndlib library -** ftp://ccrma-ftp.stanford.edu/pub/Lisp/sndlib.tar.gz -** However, no code from that package was used. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/*------------------------------------------------------------------------------ -*/ - -#define NIST_HEADER_LENGTH 1024 - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int nist_close (SF_PRIVATE *psf) ; -static int nist_write_header (SF_PRIVATE *psf, int calc_length) ; -static int nist_read_header (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------ -*/ - -int -nist_open (SF_PRIVATE *psf) -{ int error ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = nist_read_header (psf))) - return error ; - } ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if (psf->is_pipe) - return SFE_NO_PIPE_WRITE ; - - if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_NIST) - return SFE_BAD_OPEN_FORMAT ; - - psf->endian = SF_ENDIAN (psf->sf.format) ; - if (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU) - psf->endian = (CPU_IS_BIG_ENDIAN) ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - psf->sf.frames = 0 ; - - if ((error = nist_write_header (psf, SF_FALSE))) - return error ; - - psf->write_header = nist_write_header ; - } ; - - psf->container_close = nist_close ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_S8 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_ULAW : - error = ulaw_init (psf) ; - break ; - - case SF_FORMAT_ALAW : - error = alaw_init (psf) ; - break ; - - default : error = SFE_UNIMPLEMENTED ; - break ; - } ; - - return error ; -} /* nist_open */ - -/*------------------------------------------------------------------------------ -*/ - -static char bad_header [] = -{ 'N', 'I', 'S', 'T', '_', '1', 'A', 0x0d, 0x0a, - ' ', ' ', ' ', '1', '0', '2', '4', 0x0d, 0x0a, - 0 -} ; - - static int -nist_read_header (SF_PRIVATE *psf) -{ char psf_header [NIST_HEADER_LENGTH + 2] ; - int bitwidth = 0, count, encoding ; - unsigned bytes = 0 ; - char str [64], *cptr ; - long samples ; - - if (sizeof (psf->header) <= NIST_HEADER_LENGTH) - return SFE_INTERNAL ; - - /* Go to start of file and read in the whole header. */ - psf_binheader_readf (psf, "pb", 0, psf_header, NIST_HEADER_LENGTH) ; - - /* Header is a string, so make sure it is null terminated. */ - psf_header [NIST_HEADER_LENGTH] = 0 ; - - /* Now trim the header after the end marker. */ - if ((cptr = strstr (psf_header, "end_head"))) - { cptr += strlen ("end_head") + 1 ; - cptr [0] = 0 ; - } ; - - if (strstr (psf_header, bad_header) == psf_header) - return SFE_NIST_CRLF_CONVERISON ; - - /* Make sure its a NIST file. */ - if (strstr (psf_header, "NIST_1A\n") != psf_header) - { psf_log_printf (psf, "Not a NIST file.\n") ; - return SFE_NIST_BAD_HEADER ; - } ; - - if (sscanf (psf_header, "NIST_1A\n%d\n", &count) == 1) - psf->dataoffset = count ; - else - { psf_log_printf (psf, "*** Suspicious header length.\n") ; - psf->dataoffset = NIST_HEADER_LENGTH ; - } ; - - /* Determine sample encoding, start by assuming PCM. */ - encoding = SF_FORMAT_PCM_U8 ; - if ((cptr = strstr (psf_header, "sample_coding -s"))) - { sscanf (cptr, "sample_coding -s%d %63s", &count, str) ; - - if (strcmp (str, "pcm") == 0) - { /* Correct this later when we find out the bitwidth. */ - encoding = SF_FORMAT_PCM_U8 ; - } - else if (strcmp (str, "alaw") == 0) - encoding = SF_FORMAT_ALAW ; - else if ((strcmp (str, "ulaw") == 0) || (strcmp (str, "mu-law") == 0)) - encoding = SF_FORMAT_ULAW ; - else - { psf_log_printf (psf, "*** Unknown encoding : %s\n", str) ; - encoding = 0 ; - } ; - } ; - - if ((cptr = strstr (psf_header, "channel_count -i ")) != NULL) - sscanf (cptr, "channel_count -i %d", &(psf->sf.channels)) ; - - if ((cptr = strstr (psf_header, "sample_rate -i ")) != NULL) - sscanf (cptr, "sample_rate -i %d", &(psf->sf.samplerate)) ; - - if ((cptr = strstr (psf_header, "sample_count -i ")) != NULL) - { sscanf (cptr, "sample_count -i %ld", &samples) ; - psf->sf.frames = samples ; - } ; - - if ((cptr = strstr (psf_header, "sample_n_bytes -i ")) != NULL) - sscanf (cptr, "sample_n_bytes -i %d", &(psf->bytewidth)) ; - - /* Default endian-ness (for 8 bit, u-law, A-law. */ - psf->endian = (CPU_IS_BIG_ENDIAN) ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ; - - /* This is where we figure out endian-ness. */ - if ((cptr = strstr (psf_header, "sample_byte_format -s")) - && sscanf (cptr, "sample_byte_format -s%u %8s", &bytes, str) == 2) - { - if (bytes != strlen (str)) - psf_log_printf (psf, "Weird sample_byte_format : strlen '%s' != %d\n", str, bytes) ; - - if (bytes > 1) - { if (psf->bytewidth == 0) - psf->bytewidth = bytes ; - else if (psf->bytewidth - bytes != 0) - { psf_log_printf (psf, "psf->bytewidth (%d) != bytes (%d)\n", psf->bytewidth, bytes) ; - return SFE_NIST_BAD_ENCODING ; - } ; - - if (strcmp (str, "01") == 0) - psf->endian = SF_ENDIAN_LITTLE ; - else if (strcmp (str, "10") == 0) - psf->endian = SF_ENDIAN_BIG ; - else - { psf_log_printf (psf, "Weird endian-ness : %s\n", str) ; - return SFE_NIST_BAD_ENCODING ; - } ; - } ; - - psf->sf.format |= psf->endian ; - } ; - - if ((cptr = strstr (psf_header, "sample_sig_bits -i "))) - sscanf (cptr, "sample_sig_bits -i %d", &bitwidth) ; - - if (strstr (psf_header, "channels_interleaved -s5 FALSE")) - { psf_log_printf (psf, "Non-interleaved data unsupported.\n", str) ; - return SFE_NIST_BAD_ENCODING ; - } ; - - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - psf->datalength = psf->filelength - psf->dataoffset ; - - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - - if (encoding == SF_FORMAT_PCM_U8) - { switch (psf->bytewidth) - { case 1 : - psf->sf.format |= SF_FORMAT_PCM_S8 ; - break ; - - case 2 : - psf->sf.format |= SF_FORMAT_PCM_16 ; - break ; - - case 3 : - psf->sf.format |= SF_FORMAT_PCM_24 ; - break ; - - case 4 : - psf->sf.format |= SF_FORMAT_PCM_32 ; - break ; - - default : break ; - } ; - } - else if (encoding != 0) - psf->sf.format |= encoding ; - else - return SFE_UNIMPLEMENTED ; - - /* Sanitize psf->sf.format. */ - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_ULAW : - case SF_FORMAT_ALAW : - case SF_FORMAT_PCM_U8 : - /* Blank out endian bits. */ - psf->sf.format = SF_FORMAT_NIST | SF_CODEC (psf->sf.format) ; - break ; - - default : - break ; - } ; - - return 0 ; -} /* nist_read_header */ - -static int -nist_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - nist_write_header (psf, SF_TRUE) ; - - return 0 ; -} /* nist_close */ - -/*========================================================================= -*/ - -static int -nist_write_header (SF_PRIVATE *psf, int calc_length) -{ const char *end_str ; - long samples ; - sf_count_t current ; - - current = psf_ftell (psf) ; - - if (calc_length) - { psf->filelength = psf_get_filelen (psf) ; - - psf->datalength = psf->filelength - psf->dataoffset ; - - if (psf->dataend) - psf->datalength -= psf->filelength - psf->dataend ; - - if (psf->bytewidth > 0) - psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; - } ; - - if (psf->endian == SF_ENDIAN_BIG) - end_str = "10" ; - else if (psf->endian == SF_ENDIAN_LITTLE) - end_str = "01" ; - else - end_str = "error" ; - - /* Clear the whole header. */ - memset (psf->header, 0, sizeof (psf->header)) ; - psf->headindex = 0 ; - - psf_fseek (psf, 0, SEEK_SET) ; - - psf_asciiheader_printf (psf, "NIST_1A\n 1024\n") ; - psf_asciiheader_printf (psf, "channel_count -i %d\n", psf->sf.channels) ; - psf_asciiheader_printf (psf, "sample_rate -i %d\n", psf->sf.samplerate) ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_S8 : - psf_asciiheader_printf (psf, "sample_coding -s3 pcm\n") ; - psf_asciiheader_printf (psf, "sample_n_bytes -i 1\n" - "sample_sig_bits -i 8\n") ; - break ; - - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - psf_asciiheader_printf (psf, "sample_n_bytes -i %d\n", psf->bytewidth) ; - psf_asciiheader_printf (psf, "sample_sig_bits -i %d\n", psf->bytewidth * 8) ; - psf_asciiheader_printf (psf, "sample_coding -s3 pcm\n" - "sample_byte_format -s%d %s\n", psf->bytewidth, end_str) ; - break ; - - case SF_FORMAT_ALAW : - psf_asciiheader_printf (psf, "sample_coding -s4 alaw\n") ; - psf_asciiheader_printf (psf, "sample_n_bytes -s1 1\n") ; - break ; - - case SF_FORMAT_ULAW : - psf_asciiheader_printf (psf, "sample_coding -s4 ulaw\n") ; - psf_asciiheader_printf (psf, "sample_n_bytes -s1 1\n") ; - break ; - - default : return SFE_UNIMPLEMENTED ; - } ; - - psf->dataoffset = NIST_HEADER_LENGTH ; - - /* Fix this */ - samples = psf->sf.frames ; - psf_asciiheader_printf (psf, "sample_count -i %ld\n", samples) ; - psf_asciiheader_printf (psf, "end_head\n") ; - - /* Zero fill to dataoffset. */ - psf_binheader_writef (psf, "z", (size_t) (NIST_HEADER_LENGTH - psf->headindex)) ; - - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* nist_write_header */ - diff --git a/libs/libsndfile/src/ogg.c b/libs/libsndfile/src/ogg.c deleted file mode 100644 index 7bc4b31f9f..0000000000 --- a/libs/libsndfile/src/ogg.c +++ /dev/null @@ -1,253 +0,0 @@ -/* -** Copyright (C) 2002-2012 Erik de Castro Lopo -** Copyright (C) 2007 John ffitch -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#if HAVE_EXTERNAL_LIBS - -#include - -#include "ogg.h" - -static int ogg_close (SF_PRIVATE *psf) ; -static int ogg_stream_classify (SF_PRIVATE *psf, OGG_PRIVATE * odata) ; -static int ogg_page_classify (SF_PRIVATE * psf, const ogg_page * og) ; - -int -ogg_open (SF_PRIVATE *psf) -{ OGG_PRIVATE* odata = calloc (1, sizeof (OGG_PRIVATE)) ; - sf_count_t pos = psf_ftell (psf) ; - int error = 0 ; - - psf->container_data = odata ; - psf->container_close = ogg_close ; - - if (psf->file.mode == SFM_RDWR) - return SFE_BAD_MODE_RW ; - - if (psf->file.mode == SFM_READ) - if ((error = ogg_stream_classify (psf, odata)) != 0) - return error ; - - /* Reset everything to an initial state. */ - ogg_sync_clear (&odata->osync) ; - ogg_stream_clear (&odata->ostream) ; - psf_fseek (psf, pos, SEEK_SET) ; - - if (SF_ENDIAN (psf->sf.format) != 0) - return SFE_BAD_ENDIAN ; - - switch (psf->sf.format) - { case SF_FORMAT_OGG | SF_FORMAT_VORBIS : - return ogg_vorbis_open (psf) ; - - case SF_FORMAT_OGGFLAC : - free (psf->container_data) ; - psf->container_data = NULL ; - psf->container_close = NULL ; - return flac_open (psf) ; - -#if ENABLE_EXPERIMENTAL_CODE - case SF_FORMAT_OGG | SF_FORMAT_SPEEX : - return ogg_speex_open (psf) ; - - case SF_FORMAT_OGG | SF_FORMAT_PCM_16 : - case SF_FORMAT_OGG | SF_FORMAT_PCM_24 : - return ogg_pcm_open (psf) ; -#endif - - default : - break ; - } ; - - psf_log_printf (psf, "%s : bad psf->sf.format 0x%x.\n", __func__, psf->sf.format) ; - return SFE_INTERNAL ; -} /* ogg_open */ - - -static int -ogg_close (SF_PRIVATE *psf) -{ OGG_PRIVATE* odata = psf->container_data ; - - ogg_sync_clear (&odata->osync) ; - ogg_stream_clear (&odata->ostream) ; - - return 0 ; -} /* ogg_close */ - -static int -ogg_stream_classify (SF_PRIVATE *psf, OGG_PRIVATE* odata) -{ char *buffer ; - int bytes, nn ; - - /* Call this here so it only gets called once, so no memory is leaked. */ - ogg_sync_init (&odata->osync) ; - - odata->eos = 0 ; - - /* Weird stuff happens if these aren't called. */ - ogg_stream_reset (&odata->ostream) ; - ogg_sync_reset (&odata->osync) ; - - /* - ** Grab some data at the head of the stream. We want the first page - ** (which is guaranteed to be small and only contain the Vorbis - ** stream initial header) We need the first page to get the stream - ** serialno. - */ - - /* Expose the buffer */ - buffer = ogg_sync_buffer (&odata->osync, 4096L) ; - - /* Grab the part of the header that has already been read. */ - memcpy (buffer, psf->header, psf->headindex) ; - bytes = psf->headindex ; - - /* Submit a 4k block to libvorbis' Ogg layer */ - bytes += psf_fread (buffer + psf->headindex, 1, 4096 - psf->headindex, psf) ; - ogg_sync_wrote (&odata->osync, bytes) ; - - /* Get the first page. */ - if ((nn = ogg_sync_pageout (&odata->osync, &odata->opage)) != 1) - { - /* Have we simply run out of data? If so, we're done. */ - if (bytes < 4096) - return 0 ; - - /* Error case. Must not be Vorbis data */ - psf_log_printf (psf, "Input does not appear to be an Ogg bitstream.\n") ; - return SFE_MALFORMED_FILE ; - } ; - - /* - ** Get the serial number and set up the rest of decode. - ** Serialno first ; use it to set up a logical stream. - */ - ogg_stream_clear (&odata->ostream) ; - ogg_stream_init (&odata->ostream, ogg_page_serialno (&odata->opage)) ; - - if (ogg_stream_pagein (&odata->ostream, &odata->opage) < 0) - { /* Error ; stream version mismatch perhaps. */ - psf_log_printf (psf, "Error reading first page of Ogg bitstream data\n") ; - return SFE_MALFORMED_FILE ; - } ; - - if (ogg_stream_packetout (&odata->ostream, &odata->opacket) != 1) - { /* No page? must not be vorbis. */ - psf_log_printf (psf, "Error reading initial header packet.\n") ; - return SFE_MALFORMED_FILE ; - } ; - - odata->codec = ogg_page_classify (psf, &odata->opage) ; - - switch (odata->codec) - { case OGG_VORBIS : - psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; - return 0 ; - - case OGG_FLAC : - case OGG_FLAC0 : - psf->sf.format = SF_FORMAT_OGGFLAC ; - return 0 ; - - case OGG_SPEEX : - psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_SPEEX ; - return 0 ; - - case OGG_PCM : - psf_log_printf (psf, "Detected Ogg/PCM data. This is not supported yet.\n") ; - return SFE_UNIMPLEMENTED ; - - default : - break ; - } ; - - psf_log_printf (psf, "This Ogg bitstream contains some uknown data type.\n") ; - return SFE_UNIMPLEMENTED ; -} /* ogg_stream_classify */ - -/*============================================================================== -*/ - -static struct -{ const char *str, *name ; - int len, codec ; -} codec_lookup [] = -{ { "Annodex", "Annodex", 8, OGG_ANNODEX }, - { "AnxData", "AnxData", 7, OGG_ANXDATA }, - { "\177FLAC", "Flac1", 5, OGG_FLAC }, - { "fLaC", "Flac0", 4, OGG_FLAC0 }, - { "PCM ", "PCM", 8, OGG_PCM }, - { "Speex", "Speex", 5, OGG_SPEEX }, - { "\001vorbis", "Vorbis", 7, OGG_VORBIS }, -} ; - -static int -ogg_page_classify (SF_PRIVATE * psf, const ogg_page * og) -{ int k, len ; - - for (k = 0 ; k < ARRAY_LEN (codec_lookup) ; k++) - { if (codec_lookup [k].len > og->body_len) - continue ; - - if (memcmp (og->body, codec_lookup [k].str, codec_lookup [k].len) == 0) - { psf_log_printf (psf, "Ogg stream data : %s\n", codec_lookup [k].name) ; - psf_log_printf (psf, "Stream serialno : %u\n", (uint32_t) ogg_page_serialno (og)) ; - return codec_lookup [k].codec ; - } ; - } ; - - len = og->body_len < 8 ? og->body_len : 8 ; - - psf_log_printf (psf, "Ogg_stream data : '") ; - for (k = 0 ; k < len ; k++) - psf_log_printf (psf, "%c", isprint (og->body [k]) ? og->body [k] : '.') ; - psf_log_printf (psf, "' ") ; - for (k = 0 ; k < len ; k++) - psf_log_printf (psf, " %02x", og->body [k] & 0xff) ; - psf_log_printf (psf, "\n") ; - - return 0 ; -} /* ogg_page_classify */ - -#else /* HAVE_EXTERNAL_LIBS */ - -int -ogg_open (SF_PRIVATE *psf) -{ - psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Vorbis support.\n") ; - return SFE_UNIMPLEMENTED ; -} /* ogg_open */ - -#endif diff --git a/libs/libsndfile/src/ogg.h b/libs/libsndfile/src/ogg.h deleted file mode 100644 index 88544bb141..0000000000 --- a/libs/libsndfile/src/ogg.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -** Copyright (C) 2008-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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 SF_SRC_OGG_H - -enum -{ OGG_ANNODEX = 300, - OGG_ANXDATA, - OGG_FLAC, - OGG_FLAC0, - OGG_PCM, - OGG_SPEEX, - OGG_VORBIS, -} ; - -typedef struct -{ /* Sync and verify incoming physical bitstream */ - ogg_sync_state osync ; - /* Take physical pages, weld into a logical stream of packets */ - ogg_stream_state ostream ; - /* One Ogg bitstream page. Vorbis packets are inside */ - ogg_page opage ; - /* One raw packet of data for decode */ - ogg_packet opacket ; - int eos ; - int codec ; -} OGG_PRIVATE ; - - -#define readint(buf, base) (((buf [base + 3] << 24) & 0xff000000) | \ - ((buf [base + 2] <<16) & 0xff0000) | \ - ((buf [base + 1] << 8) & 0xff00) | \ - (buf [base] & 0xff)) - - - -#endif /* SF_SRC_OGG_H */ diff --git a/libs/libsndfile/src/ogg_opus.c b/libs/libsndfile/src/ogg_opus.c deleted file mode 100644 index 0824810c0d..0000000000 --- a/libs/libsndfile/src/ogg_opus.c +++ /dev/null @@ -1,149 +0,0 @@ -/* -** Copyright (C) 2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#if (ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_LIBS) - -#include - -#include "ogg.h" - -typedef struct -{ int32_t serialno ; - - - void * state ; -} OPUS_PRIVATE ; - -static int ogg_opus_read_header (SF_PRIVATE * psf) ; -static int ogg_opus_close (SF_PRIVATE *psf) ; - -int -ogg_opus_open (SF_PRIVATE *psf) -{ OGG_PRIVATE* odata = psf->container_data ; - OPUS_PRIVATE* oopus = calloc (1, sizeof (OPUS_PRIVATE)) ; - int error = 0 ; - - if (odata == NULL) - { psf_log_printf (psf, "%s : odata is NULL???\n", __func__) ; - return SFE_INTERNAL ; - } ; - - psf->codec_data = oopus ; - if (oopus == NULL) - return SFE_MALLOC_FAILED ; - - if (psf->file.mode == SFM_RDWR) - return SFE_BAD_MODE_RW ; - - if (psf->file.mode == SFM_READ) - { /* Call this here so it only gets called once, so no memory is leaked. */ - ogg_sync_init (&odata->osync) ; - - if ((error = ogg_opus_read_header (psf))) - return error ; - -#if 0 - psf->read_short = ogg_opus_read_s ; - psf->read_int = ogg_opus_read_i ; - psf->read_float = ogg_opus_read_f ; - psf->read_double = ogg_opus_read_d ; - psf->sf.frames = ogg_opus_length (psf) ; -#endif - } ; - - psf->codec_close = ogg_opus_close ; - - if (psf->file.mode == SFM_WRITE) - { -#if 0 - /* Set the default oopus quality here. */ - vdata->quality = 0.4 ; - - psf->write_header = ogg_opus_write_header ; - psf->write_short = ogg_opus_write_s ; - psf->write_int = ogg_opus_write_i ; - psf->write_float = ogg_opus_write_f ; - psf->write_double = ogg_opus_write_d ; -#endif - - psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */ - psf->strings.flags = SF_STR_ALLOW_START ; - } ; - - psf->bytewidth = 1 ; - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - -#if 0 - psf->seek = ogg_opus_seek ; - psf->command = ogg_opus_command ; -#endif - - /* FIXME, FIXME, FIXME : Hack these here for now and correct later. */ - psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_SPEEX ; - psf->sf.sections = 1 ; - - psf->datalength = 1 ; - psf->dataoffset = 0 ; - /* End FIXME. */ - - return error ; -} /* ogg_opus_open */ - -static int -ogg_opus_read_header (SF_PRIVATE * UNUSED (psf)) -{ - return 0 ; -} /* ogg_opus_read_header */ - -static int -ogg_opus_close (SF_PRIVATE * UNUSED (psf)) -{ - - - return 0 ; -} /* ogg_opus_close */ - - -#else /* ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_LIBS */ - -int -ogg_opus_open (SF_PRIVATE *psf) -{ - psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Opus support.\n") ; - return SFE_UNIMPLEMENTED ; -} /* ogg_opus_open */ - -#endif diff --git a/libs/libsndfile/src/ogg_pcm.c b/libs/libsndfile/src/ogg_pcm.c deleted file mode 100644 index 2e3b7f251c..0000000000 --- a/libs/libsndfile/src/ogg_pcm.c +++ /dev/null @@ -1,164 +0,0 @@ -/* -** Copyright (C) 2008-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#if (ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_LIBS) - -#include - -#include "ogg.h" - -typedef struct -{ int32_t serialno ; - - - void * state ; -} OPCM_PRIVATE ; - -static int opcm_read_header (SF_PRIVATE * psf) ; -static int opcm_close (SF_PRIVATE *psf) ; - -int -ogg_pcm_open (SF_PRIVATE *psf) -{ OGG_PRIVATE* odata = psf->container_data ; - OPCM_PRIVATE* opcm = calloc (1, sizeof (OPCM_PRIVATE)) ; - int error = 0 ; - - if (odata == NULL) - { psf_log_printf (psf, "%s : odata is NULL???\n", __func__) ; - return SFE_INTERNAL ; - } ; - - psf->codec_data = opcm ; - if (opcm == NULL) - return SFE_MALLOC_FAILED ; - - if (psf->file.mode == SFM_RDWR) - return SFE_BAD_MODE_RW ; - - if (psf->file.mode == SFM_READ) - { /* Call this here so it only gets called once, so no memory is leaked. */ - ogg_sync_init (&odata->osync) ; - - if ((error = opcm_read_header (psf))) - return error ; - -#if 0 - psf->read_short = opcm_read_s ; - psf->read_int = opcm_read_i ; - psf->read_float = opcm_read_f ; - psf->read_double = opcm_read_d ; - psf->sf.frames = opcm_length (psf) ; -#endif - } ; - - psf->codec_close = opcm_close ; - - if (psf->file.mode == SFM_WRITE) - { -#if 0 - /* Set the default opcm quality here. */ - vdata->quality = 0.4 ; - - psf->write_header = opcm_write_header ; - psf->write_short = opcm_write_s ; - psf->write_int = opcm_write_i ; - psf->write_float = opcm_write_f ; - psf->write_double = opcm_write_d ; -#endif - - psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */ - psf->strings.flags = SF_STR_ALLOW_START ; - } ; - - psf->bytewidth = 1 ; - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - -#if 0 - psf->seek = opcm_seek ; - psf->command = opcm_command ; -#endif - - /* FIXME, FIXME, FIXME : Hack these here for now and correct later. */ - psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_SPEEX ; - psf->sf.sections = 1 ; - - psf->datalength = 1 ; - psf->dataoffset = 0 ; - /* End FIXME. */ - - return error ; -} /* ogg_pcm_open */ - -static int -opcm_read_header (SF_PRIVATE * UNUSED (psf)) -{ - return 0 ; -} /* opcm_read_header */ - -static int -opcm_close (SF_PRIVATE * UNUSED (psf)) -{ - - - return 0 ; -} /* opcm_close */ - - - -/* -encoded_speex_frames = (frames_per_packet * Packets) - = 1 * 272 - = 272 - -audio_samples = encoded_speex_frames * frame_size - = 272 * 640 - = 174080 - -duration = audio_samples / rate - = 174080 / 44100 - = 3.947 -*/ - -#else /* ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_LIBS */ - -int -ogg_pcm_open (SF_PRIVATE *psf) -{ - psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Speex support.\n") ; - return SFE_UNIMPLEMENTED ; -} /* ogg_pcm_open */ - -#endif diff --git a/libs/libsndfile/src/ogg_speex.c b/libs/libsndfile/src/ogg_speex.c deleted file mode 100644 index f24e242e57..0000000000 --- a/libs/libsndfile/src/ogg_speex.c +++ /dev/null @@ -1,425 +0,0 @@ -/* -** Copyright (C) 2008-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#if (ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_LIBS) - -#include - -#include -#include -#include -#include - -#include "ogg.h" - -#define OGG_SPX_READ_SIZE 200 - -typedef struct -{ SpeexBits bits ; - - int32_t serialno ; - - int frame_size, granule_frame_size, nframes ; - int force_mode ; - - SpeexStereoState stereo ; - SpeexHeader header ; - - void * state ; -} SPX_PRIVATE ; - -static int spx_read_header (SF_PRIVATE * psf) ; -static int spx_close (SF_PRIVATE *psf) ; -static void *spx_header_read (SF_PRIVATE * psf, ogg_packet *op, spx_int32_t enh_enabled, int force_mode) ; -static void spx_print_comments (const char *comments, int length) ; - -int -ogg_speex_open (SF_PRIVATE *psf) -{ OGG_PRIVATE* odata = psf->container_data ; - SPX_PRIVATE* spx = calloc (1, sizeof (SPX_PRIVATE)) ; - int error = 0 ; - - if (odata == NULL) - { psf_log_printf (psf, "%s : odata is NULL???\n", __func__) ; - return SFE_INTERNAL ; - } ; - - psf->codec_data = spx ; - if (spx == NULL) - return SFE_MALLOC_FAILED ; - - if (psf->file.mode == SFM_RDWR) - return SFE_BAD_MODE_RW ; - - if (psf->file.mode == SFM_READ) - { /* Call this here so it only gets called once, so no memory is leaked. */ - ogg_sync_init (&odata->osync) ; - - if ((error = spx_read_header (psf))) - return error ; - -#if 0 - psf->read_short = spx_read_s ; - psf->read_int = spx_read_i ; - psf->read_float = spx_read_f ; - psf->read_double = spx_read_d ; - psf->sf.frames = spx_length (psf) ; -#endif - } ; - - psf->codec_close = spx_close ; - - if (psf->file.mode == SFM_WRITE) - { -#if 0 - /* Set the default spx quality here. */ - vdata->quality = 0.4 ; - - psf->write_header = spx_write_header ; - psf->write_short = spx_write_s ; - psf->write_int = spx_write_i ; - psf->write_float = spx_write_f ; - psf->write_double = spx_write_d ; -#endif - - psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */ - psf->strings.flags = SF_STR_ALLOW_START ; - } ; - - psf->bytewidth = 1 ; - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - -#if 0 - psf->seek = spx_seek ; - psf->command = spx_command ; -#endif - - /* FIXME, FIXME, FIXME : Hack these here for now and correct later. */ - psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_SPEEX ; - psf->sf.sections = 1 ; - - psf->datalength = 1 ; - psf->dataoffset = 0 ; - /* End FIXME. */ - - return error ; -} /* ogg_speex_open */ - -#define le_short (x) (x) - -static int -spx_read_header (SF_PRIVATE * psf) -{ static SpeexStereoState STEREO_INIT = SPEEX_STEREO_STATE_INIT ; - - OGG_PRIVATE* odata = psf->container_data ; - SPX_PRIVATE* spx = psf->codec_data ; - - ogg_int64_t page_granule = 0 ; - int stream_init = 0 ; - int page_nb_packets = 0 ; - int packet_count = 0 ; - int enh_enabled = 1 ; - int force_mode = -1 ; - char * data ; - int nb_read ; - int lookahead ; - -printf ("%s %d\n", __func__, __LINE__) ; - - psf_log_printf (psf, "Speex header\n") ; - odata->eos = 0 ; - - /* Reset ogg stuff which has already been used in src/ogg.c. */ - ogg_stream_reset (&odata->ostream) ; - ogg_sync_reset (&odata->osync) ; - - /* Seek to start of stream. */ - psf_fseek (psf, 0, SEEK_SET) ; - - /* Initialize. */ - ogg_sync_init (&odata->osync) ; - speex_bits_init (&spx->bits) ; - - /* Set defaults. */ - psf->sf.channels = -1 ; - psf->sf.samplerate = 0 ; - spx->stereo = STEREO_INIT ; - - /* Get a pointer to the ogg buffer and read data into it. */ - data = ogg_sync_buffer (&odata->osync, OGG_SPX_READ_SIZE) ; - nb_read = psf_fread (data, 1, OGG_SPX_READ_SIZE, psf) ; - ogg_sync_wrote (&odata->osync, nb_read) ; - - /* Now we chew on Ogg packets. */ - while (ogg_sync_pageout (&odata->osync, &odata->opage) == 1) - { if (stream_init == 0) - { ogg_stream_init (&odata->ostream, ogg_page_serialno (&odata->opage)) ; - stream_init = 1 ; - } ; - - if (ogg_page_serialno (&odata->opage) != odata->ostream.serialno) - { /* so all streams are read. */ - ogg_stream_reset_serialno (&odata->ostream, ogg_page_serialno (&odata->opage)) ; - } ; - - /*Add page to the bitstream*/ - ogg_stream_pagein (&odata->ostream, &odata->opage) ; - page_granule = ogg_page_granulepos (&odata->opage) ; - page_nb_packets = ogg_page_packets (&odata->opage) ; - - /*Extract all available packets*/ - while (odata->eos == 0 && ogg_stream_packetout (&odata->ostream, &odata->opacket) == 1) - { if (odata->opacket.bytes >= 8 && memcmp (odata->opacket.packet, "Speex ", 8) == 0) - { spx->serialno = odata->ostream.serialno ; - } ; - - if (spx->serialno == -1 || odata->ostream.serialno != spx->serialno) - break ; - - if (packet_count == 0) - { spx->state = spx_header_read (psf, &odata->opacket, enh_enabled, force_mode) ; - if (! spx->state) - break ; - - speex_decoder_ctl (spx->state, SPEEX_GET_LOOKAHEAD, &lookahead) ; - if (spx->nframes == 0) - spx->nframes = 1 ; - } - else if (packet_count == 1) - { spx_print_comments ((const char*) odata->opacket.packet, odata->opacket.bytes) ; - } - else if (packet_count < 2 + spx->header.extra_headers) - { /* Ignore extra headers */ - } - packet_count ++ ; - } ; - } ; - - psf_log_printf (psf, "End\n") ; - - psf_log_printf (psf, "packet_count %d\n", packet_count) ; - psf_log_printf (psf, "page_nb_packets %d\n", page_nb_packets) ; - psf_log_printf (psf, "page_granule %lld\n", page_granule) ; - - return 0 ; -} /* spx_read_header */ - -static int -spx_close (SF_PRIVATE *psf) -{ SPX_PRIVATE* spx = psf->codec_data ; - - if (spx->state) - speex_decoder_destroy (spx->state) ; - - if (spx) - speex_bits_destroy (&spx->bits) ; - - return 0 ; -} /* spx_close */ - - - -static void * -spx_header_read (SF_PRIVATE * psf, ogg_packet *op, spx_int32_t enh_enabled, int force_mode) -{ SPX_PRIVATE* spx = psf->codec_data ; - void *st ; - const SpeexMode *mode ; - SpeexHeader *tmp_header ; - int modeID ; - SpeexCallback callback ; - - tmp_header = speex_packet_to_header ((char*) op->packet, op->bytes) ; - if (tmp_header == NULL) - { psf_log_printf (psf, "Cannot read Speex header\n") ; - return NULL ; - } ; - - memcpy (&spx->header, tmp_header, sizeof (spx->header)) ; - free (tmp_header) ; - tmp_header = NULL ; - - if (spx->header.mode >= SPEEX_NB_MODES || spx->header.mode < 0) - { psf_log_printf (psf, "Mode number %d does not (yet/any longer) exist in this version\n", spx->header.mode) ; - return NULL ; - } ; - - modeID = spx->header.mode ; - if (force_mode != -1) - modeID = force_mode ; - - mode = speex_lib_get_mode (modeID) ; - - if (spx->header.speex_version_id > 1) - { psf_log_printf (psf, "This file was encoded with Speex bit-stream version %d, which I don't know how to decode\n", spx->header.speex_version_id) ; - return NULL ; - } ; - - if (mode->bitstream_version < spx->header.mode_bitstream_version) - { psf_log_printf (psf, "The file was encoded with a newer version of Speex. You need to upgrade in order to play it.\n") ; - return NULL ; - } ; - - if (mode->bitstream_version > spx->header.mode_bitstream_version) - { psf_log_printf (psf, "The file was encoded with an older version of Speex. You would need to downgrade the version in order to play it.\n") ; - return NULL ; - } ; - - st = speex_decoder_init (mode) ; - if (!st) - { psf_log_printf (psf, "Decoder initialization failed.\n") ; - return NULL ; - } ; - - speex_decoder_ctl (st, SPEEX_SET_ENH, &enh_enabled) ; - speex_decoder_ctl (st, SPEEX_GET_FRAME_SIZE, &spx->frame_size) ; - spx->granule_frame_size = spx->frame_size ; - - if (!psf->sf.samplerate) - psf->sf.samplerate = spx->header.rate ; - /* Adjust rate if --force-* options are used */ - if (force_mode != -1) - { if (spx->header.mode < force_mode) - { psf->sf.samplerate <<= (force_mode - spx->header.mode) ; - spx->granule_frame_size >>= (force_mode - spx->header.mode) ; - } ; - if (spx->header.mode > force_mode) - { psf->sf.samplerate >>= (spx->header.mode - force_mode) ; - spx->granule_frame_size <<= (spx->header.mode - force_mode) ; - } ; - } ; - - speex_decoder_ctl (st, SPEEX_SET_SAMPLING_RATE, &psf->sf.samplerate) ; - - spx->nframes = spx->header.frames_per_packet ; - - if (psf->sf.channels == -1) - psf->sf.channels = spx->header.nb_channels ; - - if (! (psf->sf.channels == 1)) - { psf->sf.channels = 2 ; - callback.callback_id = SPEEX_INBAND_STEREO ; - callback.func = speex_std_stereo_request_handler ; - callback.data = &spx->stereo ; - speex_decoder_ctl (st, SPEEX_SET_HANDLER, &callback) ; - } ; - - spx->header.speex_version [sizeof (spx->header.speex_version) - 1] = 0 ; - - psf_log_printf (psf, " Encoder ver : %s\n Frames/packet : %d\n", - spx->header.speex_version, spx->header.frames_per_packet) ; - - if (spx->header.bitrate > 0) - psf_log_printf (psf, " Bit rate : %d\n", spx->header.bitrate) ; - - psf_log_printf (psf, " Sample rate : %d\n Mode : %s\n VBR : %s\n Channels : %d\n", - psf->sf.samplerate, mode->modeName, (spx->header.vbr ? "yes" : "no"), psf->sf.channels) ; - - psf_log_printf (psf, " Extra headers : %d\n", spx->header.extra_headers) ; - - return st ; -} /* spx_header_read */ - - -static void -spx_print_comments (const char *c, int length) -{ - const char *end ; - int len, i, nb_fields ; - -printf ("%s %d\n", __func__, __LINE__) ; - if (length < 8) - { fprintf (stderr, "Invalid/corrupted comments\n") ; - return ; - } - end = c + length ; - len = readint (c, 0) ; - c += 4 ; - if (len < 0 || c + len > end) - { fprintf (stderr, "Invalid/corrupted comments\n") ; - return ; - } - (void) fwrite (c, 1, len, stderr) ; - c += len ; - fprintf (stderr, "\n") ; - if (c + 4 > end) - { fprintf (stderr, "Invalid/corrupted comments\n") ; - return ; - } - nb_fields = readint (c, 0) ; - c += 4 ; - for (i = 0 ; i < nb_fields ; i++) - { if (c + 4 > end) - { fprintf (stderr, "Invalid/corrupted comments\n") ; - return ; - } ; - len = readint (c, 0) ; - c += 4 ; - if (len < 0 || c + len > end) - { fprintf (stderr, "Invalid/corrupted comments\n") ; - return ; - } - (void) fwrite (c, 1, len, stderr) ; - c += len ; - fprintf (stderr, "\n") ; - } ; - return ; -} /* spx_print_comments */ - - -/* -encoded_speex_frames = (frames_per_packet * Packets) - = 1 * 272 - = 272 - -audio_samples = encoded_speex_frames * frame_size - = 272 * 640 - = 174080 - -duration = audio_samples / rate - = 174080 / 44100 - = 3.947 -*/ - -#else /* ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_LIBS */ - -int -ogg_speex_open (SF_PRIVATE *psf) -{ - psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Speex support.\n") ; - return SFE_UNIMPLEMENTED ; -} /* ogg_speex_open */ - -#endif diff --git a/libs/libsndfile/src/ogg_vorbis.c b/libs/libsndfile/src/ogg_vorbis.c deleted file mode 100644 index 4d1adef20f..0000000000 --- a/libs/libsndfile/src/ogg_vorbis.c +++ /dev/null @@ -1,1172 +0,0 @@ -/* -** Copyright (C) 2002-2012 Erik de Castro Lopo -** Copyright (C) 2002-2005 Michael Smith -** Copyright (C) 2007 John ffitch -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* -** Much of this code is based on the examples in libvorbis from the -** XIPHOPHORUS Company http://www.xiph.org/ which has a BSD-style Licence -** Copyright (c) 2002, Xiph.org Foundation -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** - Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** -** - Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** -** - Neither the name of the Xiph.org Foundation nor the names of its -** contributors may be used to endorse or promote products derived from -** this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION -** OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE, -** DATA, OR PROFITS ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#if HAVE_EXTERNAL_LIBS - -#include -#include -#include - -#include "ogg.h" - -typedef int convert_func (SF_PRIVATE *psf, int, void *, int, int, float **) ; - -static int vorbis_read_header (SF_PRIVATE *psf, int log_data) ; -static int vorbis_write_header (SF_PRIVATE *psf, int calc_length) ; -static int vorbis_close (SF_PRIVATE *psf) ; -static int vorbis_command (SF_PRIVATE *psf, int command, void *data, int datasize) ; -static int vorbis_byterate (SF_PRIVATE *psf) ; -static sf_count_t vorbis_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; -static sf_count_t vorbis_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t vorbis_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t vorbis_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t vorbis_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; -static sf_count_t vorbis_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t vorbis_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t vorbis_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t vorbis_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; -static sf_count_t vorbis_read_sample (SF_PRIVATE *psf, void *ptr, sf_count_t lens, convert_func *transfn) ; -static sf_count_t vorbis_length (SF_PRIVATE *psf) ; - -typedef struct -{ int id ; - const char *name ; -} STR_PAIRS ; - -static STR_PAIRS vorbis_metatypes [] = -{ { SF_STR_TITLE, "Title" }, - { SF_STR_COPYRIGHT, "Copyright" }, - { SF_STR_SOFTWARE, "Software" }, - { SF_STR_ARTIST, "Artist" }, - { SF_STR_COMMENT, "Comment" }, - { SF_STR_DATE, "Date" }, - { SF_STR_ALBUM, "Album" }, - { SF_STR_LICENSE, "License" }, -} ; - -typedef struct -{ /* Count current location */ - sf_count_t loc ; - /* Struct that stores all the static vorbis bitstream settings */ - vorbis_info vinfo ; - /* Struct that stores all the bitstream user comments */ - vorbis_comment vcomment ; - /* Ventral working state for the packet->PCM decoder */ - vorbis_dsp_state vdsp ; - /* Local working space for packet->PCM decode */ - vorbis_block vblock ; - - /* Encoding quality in range [0.0, 1.0]. */ - double quality ; -} VORBIS_PRIVATE ; - -static int -vorbis_read_header (SF_PRIVATE *psf, int log_data) -{ - OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; - VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; - char *buffer ; - int bytes ; - int i, nn ; - - odata->eos = 0 ; - - /* Weird stuff happens if these aren't called. */ - ogg_stream_reset (&odata->ostream) ; - ogg_sync_reset (&odata->osync) ; - - /* - ** Grab some data at the head of the stream. We want the first page - ** (which is guaranteed to be small and only contain the Vorbis - ** stream initial header) We need the first page to get the stream - ** serialno. - */ - - /* Expose the buffer */ - buffer = ogg_sync_buffer (&odata->osync, 4096L) ; - - /* Grab the part of the header that has already been read. */ - memcpy (buffer, psf->header, psf->headindex) ; - bytes = psf->headindex ; - - /* Submit a 4k block to libvorbis' Ogg layer */ - bytes += psf_fread (buffer + psf->headindex, 1, 4096 - psf->headindex, psf) ; - ogg_sync_wrote (&odata->osync, bytes) ; - - /* Get the first page. */ - if ((nn = ogg_sync_pageout (&odata->osync, &odata->opage)) != 1) - { - /* Have we simply run out of data? If so, we're done. */ - if (bytes < 4096) - return 0 ; - - /* Error case. Must not be Vorbis data */ - psf_log_printf (psf, "Input does not appear to be an Ogg bitstream.\n") ; - return SFE_MALFORMED_FILE ; - } ; - - /* - ** Get the serial number and set up the rest of decode. - ** Serialno first ; use it to set up a logical stream. - */ - ogg_stream_clear (&odata->ostream) ; - ogg_stream_init (&odata->ostream, ogg_page_serialno (&odata->opage)) ; - - if (ogg_stream_pagein (&odata->ostream, &odata->opage) < 0) - { /* Error ; stream version mismatch perhaps. */ - psf_log_printf (psf, "Error reading first page of Ogg bitstream data\n") ; - return SFE_MALFORMED_FILE ; - } ; - - if (ogg_stream_packetout (&odata->ostream, &odata->opacket) != 1) - { /* No page? must not be vorbis. */ - psf_log_printf (psf, "Error reading initial header packet.\n") ; - return SFE_MALFORMED_FILE ; - } ; - - /* - ** This function (vorbis_read_header) gets called multiple times, so the OGG - ** and vorbis structs have to be cleared every time we pass through to - ** prevent memory leaks. - */ - vorbis_block_clear (&vdata->vblock) ; - vorbis_dsp_clear (&vdata->vdsp) ; - vorbis_comment_clear (&vdata->vcomment) ; - vorbis_info_clear (&vdata->vinfo) ; - - /* - ** Extract the initial header from the first page and verify that the - ** Ogg bitstream is in fact Vorbis data. - ** - ** I handle the initial header first instead of just having the code - ** read all three Vorbis headers at once because reading the initial - ** header is an easy way to identify a Vorbis bitstream and it's - ** useful to see that functionality seperated out. - */ - vorbis_info_init (&vdata->vinfo) ; - vorbis_comment_init (&vdata->vcomment) ; - - if (vorbis_synthesis_headerin (&vdata->vinfo, &vdata->vcomment, &odata->opacket) < 0) - { /* Error case ; not a vorbis header. */ - psf_log_printf (psf, "Found Vorbis in stream header, but vorbis_synthesis_headerin failed.\n") ; - return SFE_MALFORMED_FILE ; - } ; - - /* - ** Common Ogg metadata fields? - ** TITLE, VERSION, ALBUM, TRACKNUMBER, ARTIST, PERFORMER, COPYRIGHT, LICENSE, - ** ORGANIZATION, DESCRIPTION, GENRE, DATE, LOCATION, CONTACT, ISRC, - */ - - if (log_data) - { int k ; - - for (k = 0 ; k < ARRAY_LEN (vorbis_metatypes) ; k++) - { char *dd ; - - dd = vorbis_comment_query (&vdata->vcomment, vorbis_metatypes [k].name, 0) ; - if (dd == NULL) - continue ; - psf_store_string (psf, vorbis_metatypes [k].id, dd) ; - } ; - } ; - - /* - ** At this point, we're sure we're Vorbis. We've set up the logical (Ogg) - ** bitstream decoder. Get the comment and codebook headers and set up the - ** Vorbis decoder. - ** - ** The next two packets in order are the comment and codebook headers. - ** They're likely large and may span multiple pages. Thus we reead - ** and submit data until we get our two pacakets, watching that no - ** pages are missing. If a page is missing, error out ; losing a - ** header page is the only place where missing data is fatal. - */ - - i = 0 ; /* Count of number of packets read */ - while (i < 2) - { int result = ogg_sync_pageout (&odata->osync, &odata->opage) ; - if (result == 0) - { /* Need more data */ - buffer = ogg_sync_buffer (&odata->osync, 4096) ; - bytes = psf_fread (buffer, 1, 4096, psf) ; - - if (bytes == 0 && i < 2) - { psf_log_printf (psf, "End of file before finding all Vorbis headers!\n") ; - return SFE_MALFORMED_FILE ; - } ; - nn = ogg_sync_wrote (&odata->osync, bytes) ; - } - else if (result == 1) - { /* - ** Don't complain about missing or corrupt data yet. We'll - ** catch it at the packet output phase. - ** - ** We can ignore any errors here as they'll also become apparent - ** at packetout. - */ - nn = ogg_stream_pagein (&odata->ostream, &odata->opage) ; - while (i < 2) - { result = ogg_stream_packetout (&odata->ostream, &odata->opacket) ; - if (result == 0) - break ; - if (result < 0) - { /* Uh oh ; data at some point was corrupted or missing! - ** We can't tolerate that in a header. Die. */ - psf_log_printf (psf, "Corrupt secondary header. Exiting.\n") ; - return SFE_MALFORMED_FILE ; - } ; - - vorbis_synthesis_headerin (&vdata->vinfo, &vdata->vcomment, &odata->opacket) ; - i++ ; - } ; - } ; - } ; - - if (log_data) - { int printed_metadata_msg = 0 ; - int k ; - - psf_log_printf (psf, "Bitstream is %d channel, %D Hz\n", vdata->vinfo.channels, vdata->vinfo.rate) ; - psf_log_printf (psf, "Encoded by : %s\n", vdata->vcomment.vendor) ; - - /* Throw the comments plus a few lines about the bitstream we're decoding. */ - for (k = 0 ; k < ARRAY_LEN (vorbis_metatypes) ; k++) - { char *dd ; - - dd = vorbis_comment_query (&vdata->vcomment, vorbis_metatypes [k].name, 0) ; - if (dd == NULL) - continue ; - - if (printed_metadata_msg == 0) - { psf_log_printf (psf, "Metadata :\n") ; - printed_metadata_msg = 1 ; - } ; - - psf_store_string (psf, vorbis_metatypes [k].id, dd) ; - psf_log_printf (psf, " %-10s : %s\n", vorbis_metatypes [k].name, dd) ; - } ; - - psf_log_printf (psf, "End\n") ; - } ; - - psf->sf.samplerate = vdata->vinfo.rate ; - psf->sf.channels = vdata->vinfo.channels ; - psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; - - /* OK, got and parsed all three headers. Initialize the Vorbis - ** packet->PCM decoder. - ** Central decode state. */ - vorbis_synthesis_init (&vdata->vdsp, &vdata->vinfo) ; - - /* Local state for most of the decode so multiple block decodes can - ** proceed in parallel. We could init multiple vorbis_block structures - ** for vd here. */ - vorbis_block_init (&vdata->vdsp, &vdata->vblock) ; - - vdata->loc = 0 ; - - return 0 ; -} /* vorbis_read_header */ - -static int -vorbis_write_header (SF_PRIVATE *psf, int UNUSED (calc_length)) -{ - OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; - VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; - int k, ret ; - - vorbis_info_init (&vdata->vinfo) ; - - /* The style of encoding should be selectable here, VBR quality mode. */ - ret = vorbis_encode_init_vbr (&vdata->vinfo, psf->sf.channels, psf->sf.samplerate, vdata->quality) ; - -#if 0 - ret = vorbis_encode_init (&vdata->vinfo, psf->sf.channels, psf->sf.samplerate, -1, 128000, -1) ; /* average bitrate mode */ - ret = ( vorbis_encode_setup_managed (&vdata->vinfo, psf->sf.channels, psf->sf.samplerate, -1, 128000, -1) - || vorbis_encode_ctl (&vdata->vinfo, OV_ECTL_RATEMANAGE_AVG, NULL) - || vorbis_encode_setup_init (&vdata->vinfo) - ) ; -#endif - if (ret) - return SFE_BAD_OPEN_FORMAT ; - - vdata->loc = 0 ; - - /* add a comment */ - vorbis_comment_init (&vdata->vcomment) ; - - vorbis_comment_add_tag (&vdata->vcomment, "ENCODER", "libsndfile") ; - for (k = 0 ; k < SF_MAX_STRINGS ; k++) - { const char * name ; - - if (psf->strings.data [k].type == 0) - break ; - - switch (psf->strings.data [k].type) - { case SF_STR_TITLE : name = "TITLE" ; break ; - case SF_STR_COPYRIGHT : name = "COPYRIGHT" ; break ; - case SF_STR_SOFTWARE : name = "SOFTWARE" ; break ; - case SF_STR_ARTIST : name = "ARTIST" ; break ; - case SF_STR_COMMENT : name = "COMMENT" ; break ; - case SF_STR_DATE : name = "DATE" ; break ; - case SF_STR_ALBUM : name = "ALBUM" ; break ; - case SF_STR_LICENSE : name = "LICENSE" ; break ; - default : continue ; - } ; - - vorbis_comment_add_tag (&vdata->vcomment, name, psf->strings.storage + psf->strings.data [k].offset) ; - } ; - - /* set up the analysis state and auxiliary encoding storage */ - vorbis_analysis_init (&vdata->vdsp, &vdata->vinfo) ; - vorbis_block_init (&vdata->vdsp, &vdata->vblock) ; - - /* - ** Set up our packet->stream encoder. - ** Pick a random serial number ; that way we can more likely build - ** chained streams just by concatenation. - */ - - ogg_stream_init (&odata->ostream, psf_rand_int32 ()) ; - - /* Vorbis streams begin with three headers ; the initial header (with - most of the codec setup parameters) which is mandated by the Ogg - bitstream spec. The second header holds any comment fields. The - third header holds the bitstream codebook. We merely need to - make the headers, then pass them to libvorbis one at a time ; - libvorbis handles the additional Ogg bitstream constraints */ - - { ogg_packet header ; - ogg_packet header_comm ; - ogg_packet header_code ; - int result ; - - vorbis_analysis_headerout (&vdata->vdsp, &vdata->vcomment, &header, &header_comm, &header_code) ; - ogg_stream_packetin (&odata->ostream, &header) ; /* automatically placed in its own page */ - ogg_stream_packetin (&odata->ostream, &header_comm) ; - ogg_stream_packetin (&odata->ostream, &header_code) ; - - /* This ensures the actual - * audio data will start on a new page, as per spec - */ - while ((result = ogg_stream_flush (&odata->ostream, &odata->opage)) != 0) - { psf_fwrite (odata->opage.header, 1, odata->opage.header_len, psf) ; - psf_fwrite (odata->opage.body, 1, odata->opage.body_len, psf) ; - } ; - } - - return 0 ; -} /* vorbis_write_header */ - -static int -vorbis_close (SF_PRIVATE *psf) -{ OGG_PRIVATE* odata = psf->container_data ; - VORBIS_PRIVATE *vdata = psf->codec_data ; - - if (odata == NULL || vdata == NULL) - return 0 ; - - /* Clean up this logical bitstream ; before exit we shuld see if we're - ** followed by another [chained]. */ - - if (psf->file.mode == SFM_WRITE) - { - if (psf->write_current <= 0) - vorbis_write_header (psf, 0) ; - - vorbis_analysis_wrote (&vdata->vdsp, 0) ; - while (vorbis_analysis_blockout (&vdata->vdsp, &vdata->vblock) == 1) - { - - /* analysis, assume we want to use bitrate management */ - vorbis_analysis (&vdata->vblock, NULL) ; - vorbis_bitrate_addblock (&vdata->vblock) ; - - while (vorbis_bitrate_flushpacket (&vdata->vdsp, &odata->opacket)) - { /* weld the packet into the bitstream */ - ogg_stream_packetin (&odata->ostream, &odata->opacket) ; - - /* write out pages (if any) */ - while (!odata->eos) - { int result = ogg_stream_pageout (&odata->ostream, &odata->opage) ; - if (result == 0) break ; - psf_fwrite (odata->opage.header, 1, odata->opage.header_len, psf) ; - psf_fwrite (odata->opage.body, 1, odata->opage.body_len, psf) ; - - /* this could be set above, but for illustrative purposes, I do - it here (to show that vorbis does know where the stream ends) */ - - if (ogg_page_eos (&odata->opage)) odata->eos = 1 ; - } - } - } - } - - /* ogg_page and ogg_packet structs always point to storage in - libvorbis. They are never freed or manipulated directly */ - - vorbis_block_clear (&vdata->vblock) ; - vorbis_dsp_clear (&vdata->vdsp) ; - vorbis_comment_clear (&vdata->vcomment) ; - vorbis_info_clear (&vdata->vinfo) ; - - return 0 ; -} /* vorbis_close */ - -int -ogg_vorbis_open (SF_PRIVATE *psf) -{ OGG_PRIVATE* odata = psf->container_data ; - VORBIS_PRIVATE* vdata = calloc (1, sizeof (VORBIS_PRIVATE)) ; - int error = 0 ; - - if (odata == NULL) - { psf_log_printf (psf, "%s : odata is NULL???\n", __func__) ; - return SFE_INTERNAL ; - } ; - - psf->codec_data = vdata ; - - if (psf->file.mode == SFM_RDWR) - return SFE_BAD_MODE_RW ; - - psf_log_printf (psf, "Vorbis library version : %s\n", vorbis_version_string ()) ; - - if (psf->file.mode == SFM_READ) - { /* Call this here so it only gets called once, so no memory is leaked. */ - ogg_sync_init (&odata->osync) ; - - if ((error = vorbis_read_header (psf, 1))) - return error ; - - psf->read_short = vorbis_read_s ; - psf->read_int = vorbis_read_i ; - psf->read_float = vorbis_read_f ; - psf->read_double = vorbis_read_d ; - psf->sf.frames = vorbis_length (psf) ; - } ; - - psf->codec_close = vorbis_close ; - if (psf->file.mode == SFM_WRITE) - { - /* Set the default vorbis quality here. */ - vdata->quality = 0.4 ; - - psf->write_header = vorbis_write_header ; - psf->write_short = vorbis_write_s ; - psf->write_int = vorbis_write_i ; - psf->write_float = vorbis_write_f ; - psf->write_double = vorbis_write_d ; - - psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */ - psf->strings.flags = SF_STR_ALLOW_START ; - } ; - - psf->seek = vorbis_seek ; - psf->command = vorbis_command ; - psf->byterate = vorbis_byterate ; - - /* FIXME, FIXME, FIXME : Hack these here for now and correct later. */ - psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; - psf->sf.sections = 1 ; - - psf->datalength = 1 ; - psf->dataoffset = 0 ; - /* End FIXME. */ - - return error ; -} /* ogg_vorbis_open */ - -static int -vorbis_command (SF_PRIVATE *psf, int command, void * data, int datasize) -{ VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; - - switch (command) - { case SFC_SET_COMPRESSION_LEVEL : - if (data == NULL || datasize != sizeof (double)) - return SF_FALSE ; - - if (psf->have_written) - return SF_FALSE ; - - vdata->quality = 1.0 - *((double *) data) ; - - /* Clip range. */ - vdata->quality = SF_MAX (0.0, SF_MIN (1.0, vdata->quality)) ; - - psf_log_printf (psf, "%s : Setting SFC_SET_VBR_ENCODING_QUALITY to %f.\n", __func__, vdata->quality) ; - return SF_TRUE ; - - default : - return SF_FALSE ; - } ; - - return SF_FALSE ; -} /* vorbis_command */ - -static int -vorbis_rnull (SF_PRIVATE *UNUSED (psf), int samples, void *UNUSED (vptr), int UNUSED (off) , int channels, float **UNUSED (pcm)) -{ - return samples * channels ; -} /* vorbis_rnull */ - -static int -vorbis_rshort (SF_PRIVATE *psf, int samples, void *vptr, int off, int channels, float **pcm) -{ - short *ptr = (short*) vptr + off ; - int i = 0, j, n ; - if (psf->float_int_mult) - { - float inverse = 1.0 / psf->float_max ; - for (j = 0 ; j < samples ; j++) - for (n = 0 ; n < channels ; n++) - ptr [i++] = lrintf ((pcm [n][j] * inverse) * 32767.0f) ; - } - else - { - for (j = 0 ; j < samples ; j++) - for (n = 0 ; n < channels ; n++) - ptr [i++] = lrintf (pcm [n][j] * 32767.0f) ; - } - return i ; -} /* vorbis_rshort */ - -static int -vorbis_rint (SF_PRIVATE *psf, int samples, void *vptr, int off, int channels, float **pcm) -{ - int *ptr = (int*) vptr + off ; - int i = 0, j, n ; - - if (psf->float_int_mult) - { - float inverse = 1.0 / psf->float_max ; - for (j = 0 ; j < samples ; j++) - for (n = 0 ; n < channels ; n++) - ptr [i++] = lrintf ((pcm [n][j] * inverse) * 2147483647.0f) ; - } - else - { - for (j = 0 ; j < samples ; j++) - for (n = 0 ; n < channels ; n++) - ptr [i++] = lrintf (pcm [n][j] * 2147483647.0f) ; - } - return i ; -} /* vorbis_rint */ - -static int -vorbis_rfloat (SF_PRIVATE *UNUSED (psf), int samples, void *vptr, int off, int channels, float **pcm) -{ - float *ptr = (float*) vptr + off ; - int i = 0, j, n ; - for (j = 0 ; j < samples ; j++) - for (n = 0 ; n < channels ; n++) - ptr [i++] = pcm [n][j] ; - return i ; -} /* vorbis_rfloat */ - -static int -vorbis_rdouble (SF_PRIVATE *UNUSED (psf), int samples, void *vptr, int off, int channels, float **pcm) -{ - double *ptr = (double*) vptr + off ; - int i = 0, j, n ; - for (j = 0 ; j < samples ; j++) - for (n = 0 ; n < channels ; n++) - ptr [i++] = pcm [n][j] ; - return i ; -} /* vorbis_rdouble */ - - -static sf_count_t -vorbis_read_sample (SF_PRIVATE *psf, void *ptr, sf_count_t lens, convert_func *transfn) -{ - VORBIS_PRIVATE *vdata = psf->codec_data ; - OGG_PRIVATE *odata = psf->container_data ; - int len, samples, i = 0 ; - float **pcm ; - - len = lens / psf->sf.channels ; - - while ((samples = vorbis_synthesis_pcmout (&vdata->vdsp, &pcm)) > 0) - { if (samples > len) samples = len ; - i += transfn (psf, samples, ptr, i, psf->sf.channels, pcm) ; - len -= samples ; - /* tell libvorbis how many samples we actually consumed */ - vorbis_synthesis_read (&vdata->vdsp, samples) ; - vdata->loc += samples ; - if (len == 0) - return i ; /* Is this necessary */ - } - goto start0 ; /* Jump into the nasty nest */ - while (len > 0 && !odata->eos) - { - while (len > 0 && !odata->eos) - { int result = ogg_sync_pageout (&odata->osync, &odata->opage) ; - if (result == 0) break ; /* need more data */ - if (result < 0) - { /* missing or corrupt data at this page position */ - psf_log_printf (psf, "Corrupt or missing data in bitstream ; continuing...\n") ; - } - else - { /* can safely ignore errors at this point */ - ogg_stream_pagein (&odata->ostream, &odata->opage) ; - start0: - while (1) - { result = ogg_stream_packetout (&odata->ostream, &odata->opacket) ; - if (result == 0) - break ; /* need more data */ - if (result < 0) - { /* missing or corrupt data at this page position */ - /* no reason to complain ; already complained above */ - } - else - { /* we have a packet. Decode it */ - if (vorbis_synthesis (&vdata->vblock, &odata->opacket) == 0) /* test for success! */ - vorbis_synthesis_blockin (&vdata->vdsp, &vdata->vblock) ; - /* - ** pcm is a multichannel float vector. In stereo, for - ** example, pcm [0] is left, and pcm [1] is right. samples is - ** the size of each channel. Convert the float values - ** (-1.<=range<=1.) to whatever PCM format and write it out. - */ - - while ((samples = vorbis_synthesis_pcmout (&vdata->vdsp, &pcm)) > 0) - { if (samples > len) samples = len ; - i += transfn (psf, samples, ptr, i, psf->sf.channels, pcm) ; - len -= samples ; - /* tell libvorbis how many samples we actually consumed */ - vorbis_synthesis_read (&vdata->vdsp, samples) ; - vdata->loc += samples ; - if (len == 0) - return i ; /* Is this necessary */ - } ; - } - } - if (ogg_page_eos (&odata->opage)) odata->eos = 1 ; - } - } - if (!odata->eos) - { char *buffer ; - int bytes ; - buffer = ogg_sync_buffer (&odata->osync, 4096) ; - bytes = psf_fread (buffer, 1, 4096, psf) ; - ogg_sync_wrote (&odata->osync, bytes) ; - if (bytes == 0) odata->eos = 1 ; - } - } - return i ; -} /* vorbis_read_sample */ - -static sf_count_t -vorbis_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t lens) -{ return vorbis_read_sample (psf, (void*) ptr, lens, vorbis_rshort) ; -} /* vorbis_read_s */ - -static sf_count_t -vorbis_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t lens) -{ return vorbis_read_sample (psf, (void*) ptr, lens, vorbis_rint) ; -} /* vorbis_read_i */ - -static sf_count_t -vorbis_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t lens) -{ return vorbis_read_sample (psf, (void*) ptr, lens, vorbis_rfloat) ; -} /* vorbis_read_f */ - -static sf_count_t -vorbis_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t lens) -{ return vorbis_read_sample (psf, (void*) ptr, lens, vorbis_rdouble) ; -} /* vorbis_read_d */ - -/*============================================================================== -*/ - -static void -vorbis_write_samples (SF_PRIVATE *psf, OGG_PRIVATE *odata, VORBIS_PRIVATE *vdata, int in_frames) -{ - vorbis_analysis_wrote (&vdata->vdsp, in_frames) ; - - /* - ** Vorbis does some data preanalysis, then divvies up blocks for - ** more involved (potentially parallel) processing. Get a single - ** block for encoding now. - */ - while (vorbis_analysis_blockout (&vdata->vdsp, &vdata->vblock) == 1) - { - /* analysis, assume we want to use bitrate management */ - vorbis_analysis (&vdata->vblock, NULL) ; - vorbis_bitrate_addblock (&vdata->vblock) ; - - while (vorbis_bitrate_flushpacket (&vdata->vdsp, &odata->opacket)) - { - /* weld the packet into the bitstream */ - ogg_stream_packetin (&odata->ostream, &odata->opacket) ; - - /* write out pages (if any) */ - while (!odata->eos) - { int result = ogg_stream_pageout (&odata->ostream, &odata->opage) ; - if (result == 0) - break ; - psf_fwrite (odata->opage.header, 1, odata->opage.header_len, psf) ; - psf_fwrite (odata->opage.body, 1, odata->opage.body_len, psf) ; - - /* This could be set above, but for illustrative purposes, I do - ** it here (to show that vorbis does know where the stream ends) */ - if (ogg_page_eos (&odata->opage)) - odata->eos = 1 ; - } ; - } ; - } ; - - vdata->loc += in_frames ; -} /* vorbis_write_data */ - - -static sf_count_t -vorbis_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t lens) -{ - int i, m, j = 0 ; - OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; - VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; - int in_frames = lens / psf->sf.channels ; - float **buffer = vorbis_analysis_buffer (&vdata->vdsp, in_frames) ; - for (i = 0 ; i < in_frames ; i++) - for (m = 0 ; m < psf->sf.channels ; m++) - buffer [m][i] = (float) (ptr [j++]) / 32767.0f ; - - vorbis_write_samples (psf, odata, vdata, in_frames) ; - - return lens ; -} /* vorbis_write_s */ - -static sf_count_t -vorbis_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t lens) -{ int i, m, j = 0 ; - OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; - VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; - int in_frames = lens / psf->sf.channels ; - float **buffer = vorbis_analysis_buffer (&vdata->vdsp, in_frames) ; - for (i = 0 ; i < in_frames ; i++) - for (m = 0 ; m < psf->sf.channels ; m++) - buffer [m][i] = (float) (ptr [j++]) / 2147483647.0f ; - - vorbis_write_samples (psf, odata, vdata, in_frames) ; - - return lens ; -} /* vorbis_write_i */ - -static sf_count_t -vorbis_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t lens) -{ int i, m, j = 0 ; - OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; - VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; - int in_frames = lens / psf->sf.channels ; - float **buffer = vorbis_analysis_buffer (&vdata->vdsp, in_frames) ; - for (i = 0 ; i < in_frames ; i++) - for (m = 0 ; m < psf->sf.channels ; m++) - buffer [m][i] = ptr [j++] ; - - vorbis_write_samples (psf, odata, vdata, in_frames) ; - - return lens ; -} /* vorbis_write_f */ - -static sf_count_t -vorbis_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t lens) -{ int i, m, j = 0 ; - OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; - VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; - int in_frames = lens / psf->sf.channels ; - float **buffer = vorbis_analysis_buffer (&vdata->vdsp, in_frames) ; - for (i = 0 ; i < in_frames ; i++) - for (m = 0 ; m < psf->sf.channels ; m++) - buffer [m][i] = (float) ptr [j++] ; - - vorbis_write_samples (psf, odata, vdata, in_frames) ; - - return lens ; -} /* vorbis_write_d */ - -static sf_count_t -vorbis_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset) -{ - OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; - VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; - - if (odata == NULL || vdata == NULL) - return 0 ; - - if (offset < 0) - { psf->error = SFE_BAD_SEEK ; - return ((sf_count_t) -1) ; - } ; - - if (psf->file.mode == SFM_READ) - { sf_count_t target = offset - vdata->loc ; - - if (target < 0) - { /* 12 to allow for OggS bit */ - psf_fseek (psf, 12, SEEK_SET) ; - vorbis_read_header (psf, 0) ; /* Reset state */ - target = offset ; - } ; - - while (target > 0) - { sf_count_t m = target > 4096 ? 4096 : target ; - - /* - ** Need to multiply by channels here because the seek is done in - ** terms of frames and the read function is done in terms of - ** samples. - */ - vorbis_read_sample (psf, (void *) NULL, m * psf->sf.channels, vorbis_rnull) ; - - target -= m ; - } ; - - return vdata->loc ; - } ; - - return 0 ; -} /* vorbis_seek */ - - -static int -vorbis_byterate (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_READ) - return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ; - - return -1 ; -} /* vorbis_byterate */ - -/*============================================================================== -** Most of the following code was snipped from Mike Smith's ogginfo utility -** which is part of vorbis-tools. -** Vorbis tools is released under the GPL but Mike has kindly allowed the -** following to be relicensed as LGPL for libsndfile. -*/ - -typedef struct -{ - int isillegal ; - int shownillegal ; - int isnew ; - int end ; - - uint32_t serial ; /* must be 32 bit unsigned */ - ogg_stream_state ostream ; - - vorbis_info vinfo ; - vorbis_comment vcomment ; - sf_count_t lastgranulepos ; - int doneheaders ; -} stream_processor ; - -typedef struct -{ - stream_processor *streams ; - int allocated ; - int used ; - int in_headers ; -} stream_set ; - -static stream_set * -create_stream_set (void) -{ stream_set *set = calloc (1, sizeof (stream_set)) ; - - set->streams = calloc (5, sizeof (stream_processor)) ; - set->allocated = 5 ; - set->used = 0 ; - - return set ; -} /* create_stream_set */ - -static void -vorbis_end (stream_processor *stream, sf_count_t * len) -{ *len += stream->lastgranulepos ; - vorbis_comment_clear (&stream->vcomment) ; - vorbis_info_clear (&stream->vinfo) ; -} /* vorbis_end */ - -static void -free_stream_set (stream_set *set, sf_count_t * len) -{ int i ; - - for (i = 0 ; i < set->used ; i++) - { if (!set->streams [i].end) - vorbis_end (&set->streams [i], len) ; - ogg_stream_clear (&set->streams [i].ostream) ; - } ; - - free (set->streams) ; - free (set) ; -} /* free_stream_set */ - -static int -streams_open (stream_set *set) -{ int i, res = 0 ; - - for (i = 0 ; i < set->used ; i++) - if (!set->streams [i].end) - res ++ ; - return res ; -} /* streams_open */ - -static stream_processor * -find_stream_processor (stream_set *set, ogg_page *page) -{ uint32_t serial = ogg_page_serialno (page) ; - int i, invalid = 0 ; - - stream_processor *stream ; - - for (i = 0 ; i < set->used ; i++) - { - if (serial == set->streams [i].serial) - { /* We have a match! */ - stream = & (set->streams [i]) ; - - set->in_headers = 0 ; - /* if we have detected EOS, then this can't occur here. */ - if (stream->end) - { stream->isillegal = 1 ; - return stream ; - } - - stream->isnew = 0 ; - stream->end = ogg_page_eos (page) ; - stream->serial = serial ; - return stream ; - } ; - } ; - - /* If there are streams open, and we've reached the end of the - ** headers, then we can't be starting a new stream. - ** XXX: might this sometimes catch ok streams if EOS flag is missing, - ** but the stream is otherwise ok? - */ - if (streams_open (set) && !set->in_headers) - invalid = 1 ; - - set->in_headers = 1 ; - - if (set->allocated < set->used) - stream = &set->streams [set->used] ; - else - { set->allocated += 5 ; - set->streams = realloc (set->streams, sizeof (stream_processor) * set->allocated) ; - stream = &set->streams [set->used] ; - } ; - - set->used++ ; - - stream->isnew = 1 ; - stream->isillegal = invalid ; - - { - int res ; - ogg_packet packet ; - - /* We end up processing the header page twice, but that's ok. */ - ogg_stream_init (&stream->ostream, serial) ; - ogg_stream_pagein (&stream->ostream, page) ; - res = ogg_stream_packetout (&stream->ostream, &packet) ; - if (res <= 0) - return NULL ; - else if (packet.bytes >= 7 && memcmp (packet.packet, "\x01vorbis", 7) == 0) - { - stream->lastgranulepos = 0 ; - vorbis_comment_init (&stream->vcomment) ; - vorbis_info_init (&stream->vinfo) ; - } ; - - res = ogg_stream_packetout (&stream->ostream, &packet) ; - - /* re-init, ready for processing */ - ogg_stream_clear (&stream->ostream) ; - ogg_stream_init (&stream->ostream, serial) ; - } - - stream->end = ogg_page_eos (page) ; - stream->serial = serial ; - - return stream ; -} /* find_stream_processor */ - -static int -vorbis_length_get_next_page (SF_PRIVATE *psf, ogg_sync_state * osync, ogg_page *page) -{ static const int CHUNK_SIZE = 4500 ; - - while (ogg_sync_pageout (osync, page) <= 0) - { char * buffer = ogg_sync_buffer (osync, CHUNK_SIZE) ; - int bytes = psf_fread (buffer, 1, 4096, psf) ; - - if (bytes <= 0) - { ogg_sync_wrote (osync, 0) ; - return 0 ; - } ; - - ogg_sync_wrote (osync, bytes) ; - } ; - - return 1 ; -} /* vorbis_length_get_next_page */ - -static sf_count_t -vorbis_length_aux (SF_PRIVATE * psf) -{ - ogg_sync_state osync ; - ogg_page page ; - sf_count_t len = 0 ; - stream_set *processors ; - - processors = create_stream_set () ; - if (processors == NULL) - return 0 ; // out of memory? - - ogg_sync_init (&osync) ; - - while (vorbis_length_get_next_page (psf, &osync, &page)) - { - stream_processor *p = find_stream_processor (processors, &page) ; - - if (!p) - { len = 0 ; - break ; - } ; - - if (p->isillegal && !p->shownillegal) - { - p->shownillegal = 1 ; - /* If it's a new stream, we want to continue processing this page - ** anyway to suppress additional spurious errors - */ - if (!p->isnew) continue ; - } ; - - if (!p->isillegal) - { ogg_packet packet ; - int header = 0 ; - - ogg_stream_pagein (&p->ostream, &page) ; - if (p->doneheaders < 3) - header = 1 ; - - while (ogg_stream_packetout (&p->ostream, &packet) > 0) - { - if (p->doneheaders < 3) - { if (vorbis_synthesis_headerin (&p->vinfo, &p->vcomment, &packet) < 0) - continue ; - p->doneheaders ++ ; - } ; - } ; - if (!header) - { sf_count_t gp = ogg_page_granulepos (&page) ; - if (gp > 0) p->lastgranulepos = gp ; - } ; - if (p->end) - { vorbis_end (p, &len) ; - p->isillegal = 1 ; - } ; - } ; - } ; - - ogg_sync_clear (&osync) ; - free_stream_set (processors, &len) ; - - return len ; -} /* vorbis_length_aux */ - -static sf_count_t -vorbis_length (SF_PRIVATE *psf) -{ sf_count_t length ; - int error ; - - if (psf->sf.seekable == 0) - return SF_COUNT_MAX ; - - psf_fseek (psf, 0, SEEK_SET) ; - length = vorbis_length_aux (psf) ; - - psf_fseek (psf, 12, SEEK_SET) ; - if ((error = vorbis_read_header (psf, 0)) != 0) - psf->error = error ; - - return length ; -} /* vorbis_length */ - -#else /* HAVE_EXTERNAL_LIBS */ - -int -ogg_vorbis_open (SF_PRIVATE *psf) -{ - psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Vorbis support.\n") ; - return SFE_UNIMPLEMENTED ; -} /* ogg_vorbis_open */ - -#endif diff --git a/libs/libsndfile/src/paf.c b/libs/libsndfile/src/paf.c deleted file mode 100644 index 1360c33710..0000000000 --- a/libs/libsndfile/src/paf.c +++ /dev/null @@ -1,819 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/*------------------------------------------------------------------------------ -** Macros to handle big/little endian issues. -*/ - -#define FAP_MARKER (MAKE_MARKER ('f', 'a', 'p', ' ')) -#define PAF_MARKER (MAKE_MARKER (' ', 'p', 'a', 'f')) - -/*------------------------------------------------------------------------------ -** Other defines. -*/ - -#define PAF_HEADER_LENGTH 2048 - -#define PAF24_SAMPLES_PER_BLOCK 10 -#define PAF24_BLOCK_SIZE 32 - -/*------------------------------------------------------------------------------ -** Typedefs. -*/ - -typedef struct -{ int version ; - int endianness ; - int samplerate ; - int format ; - int channels ; - int source ; -} PAF_FMT ; - -typedef struct -{ int max_blocks, channels, blocksize ; - int read_block, write_block, read_count, write_count ; - sf_count_t sample_count ; - int *samples ; - unsigned char *block ; - int data [] ; /* ISO C99 struct flexible array. */ -} PAF24_PRIVATE ; - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int paf24_init (SF_PRIVATE *psf) ; - -static int paf_read_header (SF_PRIVATE *psf) ; -static int paf_write_header (SF_PRIVATE *psf, int calc_length) ; - -static sf_count_t paf24_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t paf24_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t paf24_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t paf24_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t paf24_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t paf24_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t paf24_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t paf24_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static sf_count_t paf24_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; - -enum -{ PAF_PCM_16 = 0, - PAF_PCM_24 = 1, - PAF_PCM_S8 = 2 -} ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -paf_open (SF_PRIVATE *psf) -{ int subformat, error, endian ; - - psf->dataoffset = PAF_HEADER_LENGTH ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = paf_read_header (psf))) - return error ; - } ; - - subformat = SF_CODEC (psf->sf.format) ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_PAF) - return SFE_BAD_OPEN_FORMAT ; - - endian = SF_ENDIAN (psf->sf.format) ; - - /* PAF is by default big endian. */ - psf->endian = SF_ENDIAN_BIG ; - - if (endian == SF_ENDIAN_LITTLE || (CPU_IS_LITTLE_ENDIAN && (endian == SF_ENDIAN_CPU))) - psf->endian = SF_ENDIAN_LITTLE ; - - if ((error = paf_write_header (psf, SF_FALSE))) - return error ; - - psf->write_header = paf_write_header ; - } ; - - switch (subformat) - { case SF_FORMAT_PCM_S8 : - psf->bytewidth = 1 ; - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_PCM_16 : - psf->bytewidth = 2 ; - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_PCM_24 : - /* No bytewidth because of whacky 24 bit encoding. */ - error = paf24_init (psf) ; - break ; - - default : return SFE_PAF_UNKNOWN_FORMAT ; - } ; - - return error ; -} /* paf_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -paf_read_header (SF_PRIVATE *psf) -{ PAF_FMT paf_fmt ; - int marker ; - - if (psf->filelength < PAF_HEADER_LENGTH) - return SFE_PAF_SHORT_HEADER ; - - memset (&paf_fmt, 0, sizeof (paf_fmt)) ; - psf_binheader_readf (psf, "pm", 0, &marker) ; - - psf_log_printf (psf, "Signature : '%M'\n", marker) ; - - if (marker == PAF_MARKER) - { psf_binheader_readf (psf, "E444444", &(paf_fmt.version), &(paf_fmt.endianness), - &(paf_fmt.samplerate), &(paf_fmt.format), &(paf_fmt.channels), &(paf_fmt.source)) ; - } - else if (marker == FAP_MARKER) - { psf_binheader_readf (psf, "e444444", &(paf_fmt.version), &(paf_fmt.endianness), - &(paf_fmt.samplerate), &(paf_fmt.format), &(paf_fmt.channels), &(paf_fmt.source)) ; - } - else - return SFE_PAF_NO_MARKER ; - - psf_log_printf (psf, "Version : %d\n", paf_fmt.version) ; - - if (paf_fmt.version != 0) - { psf_log_printf (psf, "*** Bad version number. should be zero.\n") ; - return SFE_PAF_VERSION ; - } ; - - psf_log_printf (psf, "Sample Rate : %d\n", paf_fmt.samplerate) ; - psf_log_printf (psf, "Channels : %d\n", paf_fmt.channels) ; - - psf_log_printf (psf, "Endianness : %d => ", paf_fmt.endianness) ; - if (paf_fmt.endianness) - { psf_log_printf (psf, "Little\n", paf_fmt.endianness) ; - psf->endian = SF_ENDIAN_LITTLE ; - } - else - { psf_log_printf (psf, "Big\n", paf_fmt.endianness) ; - psf->endian = SF_ENDIAN_BIG ; - } ; - - if (paf_fmt.channels < 1 || paf_fmt.channels > SF_MAX_CHANNELS) - return SFE_PAF_BAD_CHANNELS ; - - psf->datalength = psf->filelength - psf->dataoffset ; - - psf_binheader_readf (psf, "p", (int) psf->dataoffset) ; - - psf->sf.samplerate = paf_fmt.samplerate ; - psf->sf.channels = paf_fmt.channels ; - - /* Only fill in type major. */ - psf->sf.format = SF_FORMAT_PAF ; - - psf_log_printf (psf, "Format : %d => ", paf_fmt.format) ; - - /* PAF is by default big endian. */ - psf->sf.format |= paf_fmt.endianness ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ; - - switch (paf_fmt.format) - { case PAF_PCM_S8 : - psf_log_printf (psf, "8 bit linear PCM\n") ; - psf->bytewidth = 1 ; - - psf->sf.format |= SF_FORMAT_PCM_S8 ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - psf->sf.frames = psf->datalength / psf->blockwidth ; - break ; - - case PAF_PCM_16 : - psf_log_printf (psf, "16 bit linear PCM\n") ; - psf->bytewidth = 2 ; - - psf->sf.format |= SF_FORMAT_PCM_16 ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - psf->sf.frames = psf->datalength / psf->blockwidth ; - break ; - - case PAF_PCM_24 : - psf_log_printf (psf, "24 bit linear PCM\n") ; - psf->bytewidth = 3 ; - - psf->sf.format |= SF_FORMAT_PCM_24 ; - - psf->blockwidth = 0 ; - psf->sf.frames = PAF24_SAMPLES_PER_BLOCK * psf->datalength / - (PAF24_BLOCK_SIZE * psf->sf.channels) ; - break ; - - default : psf_log_printf (psf, "Unknown\n") ; - return SFE_PAF_UNKNOWN_FORMAT ; - break ; - } ; - - psf_log_printf (psf, "Source : %d => ", paf_fmt.source) ; - - switch (paf_fmt.source) - { case 1 : psf_log_printf (psf, "Analog Recording\n") ; - break ; - case 2 : psf_log_printf (psf, "Digital Transfer\n") ; - break ; - case 3 : psf_log_printf (psf, "Multi-track Mixdown\n") ; - break ; - case 5 : psf_log_printf (psf, "Audio Resulting From DSP Processing\n") ; - break ; - default : psf_log_printf (psf, "Unknown\n") ; - break ; - } ; - - return 0 ; -} /* paf_read_header */ - -static int -paf_write_header (SF_PRIVATE *psf, int UNUSED (calc_length)) -{ int paf_format ; - - /* PAF header already written so no need to re-write. */ - if (psf_ftell (psf) >= PAF_HEADER_LENGTH) - return 0 ; - - psf->dataoffset = PAF_HEADER_LENGTH ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_S8 : - paf_format = PAF_PCM_S8 ; - break ; - - case SF_FORMAT_PCM_16 : - paf_format = PAF_PCM_16 ; - break ; - - case SF_FORMAT_PCM_24 : - paf_format = PAF_PCM_24 ; - break ; - - default : return SFE_PAF_UNKNOWN_FORMAT ; - } ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - - if (psf->endian == SF_ENDIAN_BIG) - { /* Marker, version, endianness, samplerate */ - psf_binheader_writef (psf, "Em444", PAF_MARKER, 0, 0, psf->sf.samplerate) ; - /* format, channels, source */ - psf_binheader_writef (psf, "E444", paf_format, psf->sf.channels, 0) ; - } - else if (psf->endian == SF_ENDIAN_LITTLE) - { /* Marker, version, endianness, samplerate */ - psf_binheader_writef (psf, "em444", FAP_MARKER, 0, 1, psf->sf.samplerate) ; - /* format, channels, source */ - psf_binheader_writef (psf, "e444", paf_format, psf->sf.channels, 0) ; - } ; - - /* Zero fill to dataoffset. */ - psf_binheader_writef (psf, "z", (size_t) (psf->dataoffset - psf->headindex)) ; - - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - return psf->error ; -} /* paf_write_header */ - -/*=============================================================================== -** 24 bit PAF files have a really weird encoding. -** For a mono file, 10 samples (each being 3 bytes) are packed into a 32 byte -** block. The 8 ints in this 32 byte block are then endian swapped (as ints) -** if necessary before being written to disk. -** For a stereo file, blocks of 10 samples from the same channel are encoded -** into 32 bytes as for the mono case. The 32 byte blocks are then interleaved -** on disk. -** Reading has to reverse the above process :-). -** Weird!!! -** -** The code below attempts to gain efficiency while maintaining readability. -*/ - -static int paf24_read_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24) ; -static int paf24_write_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24) ; -static int paf24_close (SF_PRIVATE *psf) ; - - -static int -paf24_init (SF_PRIVATE *psf) -{ PAF24_PRIVATE *ppaf24 ; - int paf24size ; - - paf24size = sizeof (PAF24_PRIVATE) + psf->sf.channels * - (PAF24_BLOCK_SIZE + PAF24_SAMPLES_PER_BLOCK * sizeof (int)) ; - - /* - ** Not exatly sure why this needs to be here but the tests - ** fail without it. - */ - psf->last_op = 0 ; - - if (! (psf->codec_data = calloc (1, paf24size))) - return SFE_MALLOC_FAILED ; - - ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; - - ppaf24->channels = psf->sf.channels ; - ppaf24->samples = ppaf24->data ; - ppaf24->block = (unsigned char*) (ppaf24->data + PAF24_SAMPLES_PER_BLOCK * ppaf24->channels) ; - - ppaf24->blocksize = PAF24_BLOCK_SIZE * ppaf24->channels ; - - if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) - { paf24_read_block (psf, ppaf24) ; /* Read first block. */ - - psf->read_short = paf24_read_s ; - psf->read_int = paf24_read_i ; - psf->read_float = paf24_read_f ; - psf->read_double = paf24_read_d ; - } ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { psf->write_short = paf24_write_s ; - psf->write_int = paf24_write_i ; - psf->write_float = paf24_write_f ; - psf->write_double = paf24_write_d ; - } ; - - psf->seek = paf24_seek ; - psf->container_close = paf24_close ; - - psf->filelength = psf_get_filelen (psf) ; - psf->datalength = psf->filelength - psf->dataoffset ; - - if (psf->datalength % PAF24_BLOCK_SIZE) - { if (psf->file.mode == SFM_READ) - psf_log_printf (psf, "*** Warning : file seems to be truncated.\n") ; - ppaf24->max_blocks = psf->datalength / ppaf24->blocksize + 1 ; - } - else - ppaf24->max_blocks = psf->datalength / ppaf24->blocksize ; - - ppaf24->read_block = 0 ; - if (psf->file.mode == SFM_RDWR) - ppaf24->write_block = ppaf24->max_blocks ; - else - ppaf24->write_block = 0 ; - - psf->sf.frames = PAF24_SAMPLES_PER_BLOCK * ppaf24->max_blocks ; - ppaf24->sample_count = psf->sf.frames ; - - return 0 ; -} /* paf24_init */ - -static sf_count_t -paf24_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) -{ PAF24_PRIVATE *ppaf24 ; - int newblock, newsample ; - - if (psf->codec_data == NULL) - { psf->error = SFE_INTERNAL ; - return PSF_SEEK_ERROR ; - } ; - - ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; - - if (mode == SFM_READ && ppaf24->write_count > 0) - paf24_write_block (psf, ppaf24) ; - - newblock = offset / PAF24_SAMPLES_PER_BLOCK ; - newsample = offset % PAF24_SAMPLES_PER_BLOCK ; - - switch (mode) - { case SFM_READ : - if (psf->last_op == SFM_WRITE && ppaf24->write_count) - paf24_write_block (psf, ppaf24) ; - - psf_fseek (psf, psf->dataoffset + newblock * ppaf24->blocksize, SEEK_SET) ; - ppaf24->read_block = newblock ; - paf24_read_block (psf, ppaf24) ; - ppaf24->read_count = newsample ; - break ; - - case SFM_WRITE : - if (offset > ppaf24->sample_count) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - if (psf->last_op == SFM_WRITE && ppaf24->write_count) - paf24_write_block (psf, ppaf24) ; - - psf_fseek (psf, psf->dataoffset + newblock * ppaf24->blocksize, SEEK_SET) ; - ppaf24->write_block = newblock ; - paf24_read_block (psf, ppaf24) ; - ppaf24->write_count = newsample ; - break ; - - default : - psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - return newblock * PAF24_SAMPLES_PER_BLOCK + newsample ; -} /* paf24_seek */ - -static int -paf24_close (SF_PRIVATE *psf) -{ PAF24_PRIVATE *ppaf24 ; - - if (psf->codec_data == NULL) - return 0 ; - - ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if (ppaf24->write_count > 0) - paf24_write_block (psf, ppaf24) ; - } ; - - return 0 ; -} /* paf24_close */ - -/*--------------------------------------------------------------------------- -*/ -static int -paf24_read_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24) -{ int k, channel ; - unsigned char *cptr ; - - ppaf24->read_block ++ ; - ppaf24->read_count = 0 ; - - if (ppaf24->read_block * PAF24_SAMPLES_PER_BLOCK > ppaf24->sample_count) - { memset (ppaf24->samples, 0, PAF24_SAMPLES_PER_BLOCK * ppaf24->channels) ; - return 1 ; - } ; - - /* Read the block. */ - if ((k = psf_fread (ppaf24->block, 1, ppaf24->blocksize, psf)) != ppaf24->blocksize) - psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, ppaf24->blocksize) ; - - - /* Do endian swapping if necessary. */ - if (psf->endian == SF_ENDIAN_BIG) - endswap_int_array (ppaf24->data, 8 * ppaf24->channels) ; - - /* Unpack block. */ - for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++) - { channel = k % ppaf24->channels ; - cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ; - ppaf24->samples [k] = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ; - } ; - - return 1 ; -} /* paf24_read_block */ - -static int -paf24_read (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len) -{ int count, total = 0 ; - - while (total < len) - { if (ppaf24->read_block * PAF24_SAMPLES_PER_BLOCK >= ppaf24->sample_count) - { memset (&(ptr [total]), 0, (len - total) * sizeof (int)) ; - return total ; - } ; - - if (ppaf24->read_count >= PAF24_SAMPLES_PER_BLOCK) - paf24_read_block (psf, ppaf24) ; - - count = (PAF24_SAMPLES_PER_BLOCK - ppaf24->read_count) * ppaf24->channels ; - count = (len - total > count) ? count : len - total ; - - memcpy (&(ptr [total]), &(ppaf24->samples [ppaf24->read_count * ppaf24->channels]), count * sizeof (int)) ; - total += count ; - ppaf24->read_count += count / ppaf24->channels ; - } ; - - return total ; -} /* paf24_read */ - -static sf_count_t -paf24_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - PAF24_PRIVATE *ppaf24 ; - int *iptr ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - - if (psf->codec_data == NULL) - return 0 ; - ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = paf24_read (psf, ppaf24, iptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = iptr [k] >> 16 ; - total += count ; - len -= readcount ; - } ; - return total ; -} /* paf24_read_s */ - -static sf_count_t -paf24_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ PAF24_PRIVATE *ppaf24 ; - int total ; - - if (psf->codec_data == NULL) - return 0 ; - ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; - - total = paf24_read (psf, ppaf24, ptr, len) ; - - return total ; -} /* paf24_read_i */ - -static sf_count_t -paf24_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - PAF24_PRIVATE *ppaf24 ; - int *iptr ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - float normfact ; - - if (psf->codec_data == NULL) - return 0 ; - ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_float == SF_TRUE) ? (1.0 / 0x80000000) : (1.0 / 0x100) ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = paf24_read (psf, ppaf24, iptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * iptr [k] ; - total += count ; - len -= readcount ; - } ; - return total ; -} /* paf24_read_f */ - -static sf_count_t -paf24_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - PAF24_PRIVATE *ppaf24 ; - int *iptr ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - double normfact ; - - if (psf->codec_data == NULL) - return 0 ; - ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_double == SF_TRUE) ? (1.0 / 0x80000000) : (1.0 / 0x100) ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = paf24_read (psf, ppaf24, iptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * iptr [k] ; - total += count ; - len -= readcount ; - } ; - return total ; -} /* paf24_read_d */ - -/*--------------------------------------------------------------------------- -*/ - -static int -paf24_write_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24) -{ int k, nextsample, channel ; - unsigned char *cptr ; - - /* First pack block. */ - - if (CPU_IS_LITTLE_ENDIAN) - { for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++) - { channel = k % ppaf24->channels ; - cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ; - nextsample = ppaf24->samples [k] >> 8 ; - cptr [0] = nextsample ; - cptr [1] = nextsample >> 8 ; - cptr [2] = nextsample >> 16 ; - } ; - - /* Do endian swapping if necessary. */ - if (psf->endian == SF_ENDIAN_BIG) - endswap_int_array (ppaf24->data, 8 * ppaf24->channels) ; - } - else if (CPU_IS_BIG_ENDIAN) - { /* This is correct. */ - for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++) - { channel = k % ppaf24->channels ; - cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ; - nextsample = ppaf24->samples [k] >> 8 ; - cptr [0] = nextsample ; - cptr [1] = nextsample >> 8 ; - cptr [2] = nextsample >> 16 ; - } ; - if (psf->endian == SF_ENDIAN_BIG) - endswap_int_array (ppaf24->data, 8 * ppaf24->channels) ; - } ; - - /* Write block to disk. */ - if ((k = psf_fwrite (ppaf24->block, 1, ppaf24->blocksize, psf)) != ppaf24->blocksize) - psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, ppaf24->blocksize) ; - - if (ppaf24->sample_count < ppaf24->write_block * PAF24_SAMPLES_PER_BLOCK + ppaf24->write_count) - ppaf24->sample_count = ppaf24->write_block * PAF24_SAMPLES_PER_BLOCK + ppaf24->write_count ; - - if (ppaf24->write_count == PAF24_SAMPLES_PER_BLOCK) - { ppaf24->write_block ++ ; - ppaf24->write_count = 0 ; - } ; - - return 1 ; -} /* paf24_write_block */ - -static int -paf24_write (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, const int *ptr, int len) -{ int count, total = 0 ; - - while (total < len) - { count = (PAF24_SAMPLES_PER_BLOCK - ppaf24->write_count) * ppaf24->channels ; - - if (count > len - total) - count = len - total ; - - memcpy (&(ppaf24->samples [ppaf24->write_count * ppaf24->channels]), &(ptr [total]), count * sizeof (int)) ; - total += count ; - ppaf24->write_count += count / ppaf24->channels ; - - if (ppaf24->write_count >= PAF24_SAMPLES_PER_BLOCK) - paf24_write_block (psf, ppaf24) ; - } ; - - return total ; -} /* paf24_write */ - -static sf_count_t -paf24_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - PAF24_PRIVATE *ppaf24 ; - int *iptr ; - int k, bufferlen, writecount = 0, count ; - sf_count_t total = 0 ; - - if (psf->codec_data == NULL) - return 0 ; - ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - iptr [k] = ptr [total + k] << 16 ; - count = paf24_write (psf, ppaf24, iptr, writecount) ; - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - return total ; -} /* paf24_write_s */ - -static sf_count_t -paf24_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ PAF24_PRIVATE *ppaf24 ; - int writecount, count ; - sf_count_t total = 0 ; - - if (psf->codec_data == NULL) - return 0 ; - ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; - - while (len > 0) - { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; - - count = paf24_write (psf, ppaf24, ptr, writecount) ; - - total += count ; - len -= count ; - if (count != writecount) - break ; - } ; - - return total ; -} /* paf24_write_i */ - -static sf_count_t -paf24_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - PAF24_PRIVATE *ppaf24 ; - int *iptr ; - int k, bufferlen, writecount = 0, count ; - sf_count_t total = 0 ; - float normfact ; - - if (psf->codec_data == NULL) - return 0 ; - ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : (1.0 / 0x100) ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - iptr [k] = lrintf (normfact * ptr [total + k]) ; - count = paf24_write (psf, ppaf24, iptr, writecount) ; - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - - return total ; -} /* paf24_write_f */ - -static sf_count_t -paf24_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - PAF24_PRIVATE *ppaf24 ; - int *iptr ; - int k, bufferlen, writecount = 0, count ; - sf_count_t total = 0 ; - double normfact ; - - if (psf->codec_data == NULL) - return 0 ; - ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; - - normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : (1.0 / 0x100) ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - iptr [k] = lrint (normfact * ptr [total+k]) ; - count = paf24_write (psf, ppaf24, iptr, writecount) ; - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - - return total ; -} /* paf24_write_d */ - diff --git a/libs/libsndfile/src/pcm.c b/libs/libsndfile/src/pcm.c deleted file mode 100644 index 8a06858b2a..0000000000 --- a/libs/libsndfile/src/pcm.c +++ /dev/null @@ -1,2961 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/* Need to be able to handle 3 byte (24 bit) integers. So defined a -** type and use SIZEOF_TRIBYTE instead of (tribyte). -*/ - -typedef void tribyte ; - -#define SIZEOF_TRIBYTE 3 - -static sf_count_t pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t pcm_read_les2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t pcm_read_let2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; - -static sf_count_t pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t pcm_read_les2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t pcm_read_let2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; - -static sf_count_t pcm_read_sc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t pcm_read_uc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t pcm_read_les2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t pcm_read_let2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; - -static sf_count_t pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; -static sf_count_t pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; -static sf_count_t pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; -static sf_count_t pcm_read_les2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; -static sf_count_t pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; -static sf_count_t pcm_read_let2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; -static sf_count_t pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; -static sf_count_t pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t pcm_write_s2sc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t pcm_write_s2uc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t pcm_write_s2bes (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t pcm_write_s2les (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t pcm_write_s2bet (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t pcm_write_s2let (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t pcm_write_s2bei (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t pcm_write_s2lei (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; - -static sf_count_t pcm_write_i2sc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t pcm_write_i2uc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t pcm_write_i2bes (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t pcm_write_i2les (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t pcm_write_i2bet (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t pcm_write_i2let (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t pcm_write_i2bei (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t pcm_write_i2lei (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; - -static sf_count_t pcm_write_f2sc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t pcm_write_f2uc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t pcm_write_f2bes (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t pcm_write_f2les (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t pcm_write_f2bet (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t pcm_write_f2let (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t pcm_write_f2bei (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t pcm_write_f2lei (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; - -static sf_count_t pcm_write_d2sc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; -static sf_count_t pcm_write_d2uc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; -static sf_count_t pcm_write_d2bes (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; -static sf_count_t pcm_write_d2les (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; -static sf_count_t pcm_write_d2bet (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; -static sf_count_t pcm_write_d2let (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; -static sf_count_t pcm_write_d2bei (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; -static sf_count_t pcm_write_d2lei (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -/*----------------------------------------------------------------------------------------------- -*/ - -enum -{ /* Char type for 8 bit files. */ - SF_CHARS_SIGNED = 200, - SF_CHARS_UNSIGNED = 201 -} ; - -/*----------------------------------------------------------------------------------------------- -*/ - -int -pcm_init (SF_PRIVATE *psf) -{ int chars = 0 ; - - if (psf->bytewidth == 0 || psf->sf.channels == 0) - { psf_log_printf (psf, "pcm_init : internal error : bytewitdh = %d, channels = %d\n", psf->bytewidth, psf->sf.channels) ; - return SFE_INTERNAL ; - } ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_PCM_S8) - chars = SF_CHARS_SIGNED ; - else if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_PCM_U8) - chars = SF_CHARS_UNSIGNED ; - - if (CPU_IS_BIG_ENDIAN) - psf->data_endswap = (psf->endian == SF_ENDIAN_BIG) ? SF_FALSE : SF_TRUE ; - else - psf->data_endswap = (psf->endian == SF_ENDIAN_LITTLE) ? SF_FALSE : SF_TRUE ; - - if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) - { switch (psf->bytewidth * 0x10000 + psf->endian + chars) - { case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_SIGNED) : - case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_SIGNED) : - psf->read_short = pcm_read_sc2s ; - psf->read_int = pcm_read_sc2i ; - psf->read_float = pcm_read_sc2f ; - psf->read_double = pcm_read_sc2d ; - break ; - case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_UNSIGNED) : - case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_UNSIGNED) : - psf->read_short = pcm_read_uc2s ; - psf->read_int = pcm_read_uc2i ; - psf->read_float = pcm_read_uc2f ; - psf->read_double = pcm_read_uc2d ; - break ; - - case (2 * 0x10000 + SF_ENDIAN_BIG) : - psf->read_short = pcm_read_bes2s ; - psf->read_int = pcm_read_bes2i ; - psf->read_float = pcm_read_bes2f ; - psf->read_double = pcm_read_bes2d ; - break ; - case (3 * 0x10000 + SF_ENDIAN_BIG) : - psf->read_short = pcm_read_bet2s ; - psf->read_int = pcm_read_bet2i ; - psf->read_float = pcm_read_bet2f ; - psf->read_double = pcm_read_bet2d ; - break ; - case (4 * 0x10000 + SF_ENDIAN_BIG) : - - psf->read_short = pcm_read_bei2s ; - psf->read_int = pcm_read_bei2i ; - psf->read_float = pcm_read_bei2f ; - psf->read_double = pcm_read_bei2d ; - break ; - - case (2 * 0x10000 + SF_ENDIAN_LITTLE) : - psf->read_short = pcm_read_les2s ; - psf->read_int = pcm_read_les2i ; - psf->read_float = pcm_read_les2f ; - psf->read_double = pcm_read_les2d ; - break ; - case (3 * 0x10000 + SF_ENDIAN_LITTLE) : - psf->read_short = pcm_read_let2s ; - psf->read_int = pcm_read_let2i ; - psf->read_float = pcm_read_let2f ; - psf->read_double = pcm_read_let2d ; - break ; - case (4 * 0x10000 + SF_ENDIAN_LITTLE) : - psf->read_short = pcm_read_lei2s ; - psf->read_int = pcm_read_lei2i ; - psf->read_float = pcm_read_lei2f ; - psf->read_double = pcm_read_lei2d ; - break ; - default : - psf_log_printf (psf, "pcm.c returning SFE_UNIMPLEMENTED\nbytewidth %d endian %d\n", psf->bytewidth, psf->endian) ; - return SFE_UNIMPLEMENTED ; - } ; - } ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { switch (psf->bytewidth * 0x10000 + psf->endian + chars) - { case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_SIGNED) : - case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_SIGNED) : - psf->write_short = pcm_write_s2sc ; - psf->write_int = pcm_write_i2sc ; - psf->write_float = pcm_write_f2sc ; - psf->write_double = pcm_write_d2sc ; - break ; - case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_UNSIGNED) : - case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_UNSIGNED) : - psf->write_short = pcm_write_s2uc ; - psf->write_int = pcm_write_i2uc ; - psf->write_float = pcm_write_f2uc ; - psf->write_double = pcm_write_d2uc ; - break ; - - case (2 * 0x10000 + SF_ENDIAN_BIG) : - psf->write_short = pcm_write_s2bes ; - psf->write_int = pcm_write_i2bes ; - psf->write_float = pcm_write_f2bes ; - psf->write_double = pcm_write_d2bes ; - break ; - - case (3 * 0x10000 + SF_ENDIAN_BIG) : - psf->write_short = pcm_write_s2bet ; - psf->write_int = pcm_write_i2bet ; - psf->write_float = pcm_write_f2bet ; - psf->write_double = pcm_write_d2bet ; - break ; - - case (4 * 0x10000 + SF_ENDIAN_BIG) : - psf->write_short = pcm_write_s2bei ; - psf->write_int = pcm_write_i2bei ; - psf->write_float = pcm_write_f2bei ; - psf->write_double = pcm_write_d2bei ; - break ; - - case (2 * 0x10000 + SF_ENDIAN_LITTLE) : - psf->write_short = pcm_write_s2les ; - psf->write_int = pcm_write_i2les ; - psf->write_float = pcm_write_f2les ; - psf->write_double = pcm_write_d2les ; - break ; - - case (3 * 0x10000 + SF_ENDIAN_LITTLE) : - psf->write_short = pcm_write_s2let ; - psf->write_int = pcm_write_i2let ; - psf->write_float = pcm_write_f2let ; - psf->write_double = pcm_write_d2let ; - break ; - - case (4 * 0x10000 + SF_ENDIAN_LITTLE) : - psf->write_short = pcm_write_s2lei ; - psf->write_int = pcm_write_i2lei ; - psf->write_float = pcm_write_f2lei ; - psf->write_double = pcm_write_d2lei ; - break ; - - default : - psf_log_printf (psf, "pcm.c returning SFE_UNIMPLEMENTED\nbytewidth %s endian %d\n", psf->bytewidth, psf->endian) ; - return SFE_UNIMPLEMENTED ; - } ; - - } ; - - if (psf->filelength > psf->dataoffset) - { psf->datalength = (psf->dataend > 0) ? psf->dataend - psf->dataoffset : - psf->filelength - psf->dataoffset ; - } - else - psf->datalength = 0 ; - - psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ; - - return 0 ; -} /* pcm_init */ - -/*============================================================================== -*/ - -static inline void -sc2s_array (signed char *src, int count, short *dest) -{ while (--count >= 0) - { dest [count] = src [count] << 8 ; - } ; -} /* sc2s_array */ - -static inline void -uc2s_array (unsigned char *src, int count, short *dest) -{ while (--count >= 0) - { dest [count] = (((short) src [count]) - 0x80) << 8 ; - } ; -} /* uc2s_array */ - -static inline void -let2s_array (tribyte *src, int count, short *dest) -{ unsigned char *ucptr ; - - ucptr = ((unsigned char*) src) + 3 * count ; - while (--count >= 0) - { ucptr -= 3 ; - dest [count] = LET2H_16_PTR (ucptr) ; - } ; -} /* let2s_array */ - -static inline void -bet2s_array (tribyte *src, int count, short *dest) -{ unsigned char *ucptr ; - - ucptr = ((unsigned char*) src) + 3 * count ; - while (--count >= 0) - { ucptr -= 3 ; - dest [count] = BET2H_16_PTR (ucptr) ; - } ; -} /* bet2s_array */ - -static inline void -lei2s_array (int *src, int count, short *dest) -{ int value ; - - while (--count >= 0) - { value = LE2H_32 (src [count]) ; - dest [count] = value >> 16 ; - } ; -} /* lei2s_array */ - -static inline void -bei2s_array (int *src, int count, short *dest) -{ int value ; - - while (--count >= 0) - { value = BE2H_32 (src [count]) ; - dest [count] = value >> 16 ; - } ; -} /* bei2s_array */ - -/*-------------------------------------------------------------------------- -*/ - -static inline void -sc2i_array (signed char *src, int count, int *dest) -{ while (--count >= 0) - { dest [count] = ((int) src [count]) << 24 ; - } ; -} /* sc2i_array */ - -static inline void -uc2i_array (unsigned char *src, int count, int *dest) -{ while (--count >= 0) - { dest [count] = (((int) src [count]) - 128) << 24 ; - } ; -} /* uc2i_array */ - -static inline void -bes2i_array (short *src, int count, int *dest) -{ short value ; - - while (--count >= 0) - { value = BE2H_16 (src [count]) ; - dest [count] = value << 16 ; - } ; -} /* bes2i_array */ - -static inline void -les2i_array (short *src, int count, int *dest) -{ short value ; - - while (--count >= 0) - { value = LE2H_16 (src [count]) ; - dest [count] = value << 16 ; - } ; -} /* les2i_array */ - -static inline void -bet2i_array (tribyte *src, int count, int *dest) -{ unsigned char *ucptr ; - - ucptr = ((unsigned char*) src) + 3 * count ; - while (--count >= 0) - { ucptr -= 3 ; - dest [count] = BET2H_32_PTR (ucptr) ; - } ; -} /* bet2i_array */ - -static inline void -let2i_array (tribyte *src, int count, int *dest) -{ unsigned char *ucptr ; - - ucptr = ((unsigned char*) src) + 3 * count ; - while (--count >= 0) - { ucptr -= 3 ; - dest [count] = LET2H_32_PTR (ucptr) ; - } ; -} /* let2i_array */ - -/*-------------------------------------------------------------------------- -*/ - -static inline void -sc2f_array (signed char *src, int count, float *dest, float normfact) -{ while (--count >= 0) - dest [count] = ((float) src [count]) * normfact ; -} /* sc2f_array */ - -static inline void -uc2f_array (unsigned char *src, int count, float *dest, float normfact) -{ while (--count >= 0) - dest [count] = (((int) src [count]) - 128) * normfact ; -} /* uc2f_array */ - -static inline void -les2f_array (short *src, int count, float *dest, float normfact) -{ short value ; - - while (--count >= 0) - { value = src [count] ; - value = LE2H_16 (value) ; - dest [count] = ((float) value) * normfact ; - } ; -} /* les2f_array */ - -static inline void -bes2f_array (short *src, int count, float *dest, float normfact) -{ short value ; - - while (--count >= 0) - { value = src [count] ; - value = BE2H_16 (value) ; - dest [count] = ((float) value) * normfact ; - } ; -} /* bes2f_array */ - -static inline void -let2f_array (tribyte *src, int count, float *dest, float normfact) -{ unsigned char *ucptr ; - int value ; - - ucptr = ((unsigned char*) src) + 3 * count ; - while (--count >= 0) - { ucptr -= 3 ; - value = LET2H_32_PTR (ucptr) ; - dest [count] = ((float) value) * normfact ; - } ; -} /* let2f_array */ - -static inline void -bet2f_array (tribyte *src, int count, float *dest, float normfact) -{ unsigned char *ucptr ; - int value ; - - ucptr = ((unsigned char*) src) + 3 * count ; - while (--count >= 0) - { ucptr -= 3 ; - value = BET2H_32_PTR (ucptr) ; - dest [count] = ((float) value) * normfact ; - } ; -} /* bet2f_array */ - -static inline void -lei2f_array (int *src, int count, float *dest, float normfact) -{ int value ; - - while (--count >= 0) - { value = src [count] ; - value = LE2H_32 (value) ; - dest [count] = ((float) value) * normfact ; - } ; -} /* lei2f_array */ - -static inline void -bei2f_array (int *src, int count, float *dest, float normfact) -{ int value ; - - while (--count >= 0) - { value = src [count] ; - value = BE2H_32 (value) ; - dest [count] = ((float) value) * normfact ; - } ; -} /* bei2f_array */ - -/*-------------------------------------------------------------------------- -*/ - -static inline void -sc2d_array (signed char *src, int count, double *dest, double normfact) -{ while (--count >= 0) - dest [count] = ((double) src [count]) * normfact ; -} /* sc2d_array */ - -static inline void -uc2d_array (unsigned char *src, int count, double *dest, double normfact) -{ while (--count >= 0) - dest [count] = (((int) src [count]) - 128) * normfact ; -} /* uc2d_array */ - -static inline void -les2d_array (short *src, int count, double *dest, double normfact) -{ short value ; - - while (--count >= 0) - { value = src [count] ; - value = LE2H_16 (value) ; - dest [count] = ((double) value) * normfact ; - } ; -} /* les2d_array */ - -static inline void -bes2d_array (short *src, int count, double *dest, double normfact) -{ short value ; - - while (--count >= 0) - { value = src [count] ; - value = BE2H_16 (value) ; - dest [count] = ((double) value) * normfact ; - } ; -} /* bes2d_array */ - -static inline void -let2d_array (tribyte *src, int count, double *dest, double normfact) -{ unsigned char *ucptr ; - int value ; - - ucptr = ((unsigned char*) src) + 3 * count ; - while (--count >= 0) - { ucptr -= 3 ; - value = LET2H_32_PTR (ucptr) ; - dest [count] = ((double) value) * normfact ; - } ; -} /* let2d_array */ - -static inline void -bet2d_array (tribyte *src, int count, double *dest, double normfact) -{ unsigned char *ucptr ; - int value ; - - ucptr = ((unsigned char*) src) + 3 * count ; - while (--count >= 0) - { ucptr -= 3 ; - value = (ucptr [0] << 24) | (ucptr [1] << 16) | (ucptr [2] << 8) ; - dest [count] = ((double) value) * normfact ; - } ; -} /* bet2d_array */ - -static inline void -lei2d_array (int *src, int count, double *dest, double normfact) -{ int value ; - - while (--count >= 0) - { value = src [count] ; - value = LE2H_32 (value) ; - dest [count] = ((double) value) * normfact ; - } ; -} /* lei2d_array */ - -static inline void -bei2d_array (int *src, int count, double *dest, double normfact) -{ int value ; - - while (--count >= 0) - { value = src [count] ; - value = BE2H_32 (value) ; - dest [count] = ((double) value) * normfact ; - } ; -} /* bei2d_array */ - -/*-------------------------------------------------------------------------- -*/ - -static inline void -s2sc_array (const short *src, signed char *dest, int count) -{ while (--count >= 0) - dest [count] = src [count] >> 8 ; -} /* s2sc_array */ - -static inline void -s2uc_array (const short *src, unsigned char *dest, int count) -{ while (--count >= 0) - dest [count] = (src [count] >> 8) + 0x80 ; -} /* s2uc_array */ - -static inline void -s2let_array (const short *src, tribyte *dest, int count) -{ unsigned char *ucptr ; - - ucptr = ((unsigned char*) dest) + 3 * count ; - while (--count >= 0) - { ucptr -= 3 ; - ucptr [0] = 0 ; - ucptr [1] = src [count] ; - ucptr [2] = src [count] >> 8 ; - } ; -} /* s2let_array */ - -static inline void -s2bet_array (const short *src, tribyte *dest, int count) -{ unsigned char *ucptr ; - - ucptr = ((unsigned char*) dest) + 3 * count ; - while (--count >= 0) - { ucptr -= 3 ; - ucptr [2] = 0 ; - ucptr [1] = src [count] ; - ucptr [0] = src [count] >> 8 ; - } ; -} /* s2bet_array */ - -static inline void -s2lei_array (const short *src, int *dest, int count) -{ unsigned char *ucptr ; - - ucptr = ((unsigned char*) dest) + 4 * count ; - while (--count >= 0) - { ucptr -= 4 ; - ucptr [0] = 0 ; - ucptr [1] = 0 ; - ucptr [2] = src [count] ; - ucptr [3] = src [count] >> 8 ; - } ; -} /* s2lei_array */ - -static inline void -s2bei_array (const short *src, int *dest, int count) -{ unsigned char *ucptr ; - - ucptr = ((unsigned char*) dest) + 4 * count ; - while (--count >= 0) - { ucptr -= 4 ; - ucptr [0] = src [count] >> 8 ; - ucptr [1] = src [count] ; - ucptr [2] = 0 ; - ucptr [3] = 0 ; - } ; -} /* s2bei_array */ - -/*-------------------------------------------------------------------------- -*/ - -static inline void -i2sc_array (const int *src, signed char *dest, int count) -{ while (--count >= 0) - dest [count] = (src [count] >> 24) ; -} /* i2sc_array */ - -static inline void -i2uc_array (const int *src, unsigned char *dest, int count) -{ while (--count >= 0) - dest [count] = ((src [count] >> 24) + 128) ; -} /* i2uc_array */ - -static inline void -i2bes_array (const int *src, short *dest, int count) -{ unsigned char *ucptr ; - - ucptr = ((unsigned char*) dest) + 2 * count ; - while (--count >= 0) - { ucptr -= 2 ; - ucptr [0] = src [count] >> 24 ; - ucptr [1] = src [count] >> 16 ; - } ; -} /* i2bes_array */ - -static inline void -i2les_array (const int *src, short *dest, int count) -{ unsigned char *ucptr ; - - ucptr = ((unsigned char*) dest) + 2 * count ; - while (--count >= 0) - { ucptr -= 2 ; - ucptr [0] = src [count] >> 16 ; - ucptr [1] = src [count] >> 24 ; - } ; -} /* i2les_array */ - -static inline void -i2let_array (const int *src, tribyte *dest, int count) -{ unsigned char *ucptr ; - int value ; - - ucptr = ((unsigned char*) dest) + 3 * count ; - while (--count >= 0) - { ucptr -= 3 ; - value = src [count] >> 8 ; - ucptr [0] = value ; - ucptr [1] = value >> 8 ; - ucptr [2] = value >> 16 ; - } ; -} /* i2let_array */ - -static inline void -i2bet_array (const int *src, tribyte *dest, int count) -{ unsigned char *ucptr ; - int value ; - - ucptr = ((unsigned char*) dest) + 3 * count ; - while (--count >= 0) - { ucptr -= 3 ; - value = src [count] >> 8 ; - ucptr [2] = value ; - ucptr [1] = value >> 8 ; - ucptr [0] = value >> 16 ; - } ; -} /* i2bet_array */ - -/*=============================================================================================== -*/ - -static sf_count_t -pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.scbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - sc2s_array (ubuf.scbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_sc2s */ - -static sf_count_t -pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ; - uc2s_array (ubuf.ucbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_uc2s */ - -static sf_count_t -pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ int total ; - - total = psf_fread (ptr, sizeof (short), len, psf) ; - if (CPU_IS_LITTLE_ENDIAN) - endswap_short_array (ptr, len) ; - - return total ; -} /* pcm_read_bes2s */ - -static sf_count_t -pcm_read_les2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ int total ; - - total = psf_fread (ptr, sizeof (short), len, psf) ; - if (CPU_IS_BIG_ENDIAN) - endswap_short_array (ptr, len) ; - - return total ; -} /* pcm_read_les2s */ - -static sf_count_t -pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - bet2s_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_bet2s */ - -static sf_count_t -pcm_read_let2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - let2s_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_let2s */ - -static sf_count_t -pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ; - bei2s_array (ubuf.ibuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_bei2s */ - -static sf_count_t -pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ; - lei2s_array (ubuf.ibuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_lei2s */ - -/*----------------------------------------------------------------------------------------------- -*/ - -static sf_count_t -pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.scbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - sc2i_array (ubuf.scbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_sc2i */ - -static sf_count_t -pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ; - uc2i_array (ubuf.ucbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_uc2i */ - -static sf_count_t -pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - bes2i_array (ubuf.sbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_bes2i */ - -static sf_count_t -pcm_read_les2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - les2i_array (ubuf.sbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_les2i */ - -static sf_count_t -pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - bet2i_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_bet2i */ - -static sf_count_t -pcm_read_let2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - let2i_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_let2i */ - -static sf_count_t -pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ int total ; - - total = psf_fread (ptr, sizeof (int), len, psf) ; - if (CPU_IS_LITTLE_ENDIAN) - endswap_int_array (ptr, len) ; - - return total ; -} /* pcm_read_bei2i */ - -static sf_count_t -pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ int total ; - - total = psf_fread (ptr, sizeof (int), len, psf) ; - if (CPU_IS_BIG_ENDIAN) - endswap_int_array (ptr, len) ; - - return total ; -} /* pcm_read_lei2i */ - -/*----------------------------------------------------------------------------------------------- -*/ - -static sf_count_t -pcm_read_sc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float normfact ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.scbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - sc2f_array (ubuf.scbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_sc2f */ - -static sf_count_t -pcm_read_uc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float normfact ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ; - uc2f_array (ubuf.ucbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_uc2f */ - -static sf_count_t -pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float normfact ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - bes2f_array (ubuf.sbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_bes2f */ - -static sf_count_t -pcm_read_les2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float normfact ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - les2f_array (ubuf.sbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_les2f */ - -static sf_count_t -pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float normfact ; - - /* Special normfactor because tribyte value is read into an int. */ - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 / 256.0 ; - - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - bet2f_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_bet2f */ - -static sf_count_t -pcm_read_let2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float normfact ; - - /* Special normfactor because tribyte value is read into an int. */ - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 / 256.0 ; - - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - let2f_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_let2f */ - -static sf_count_t -pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float normfact ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ; - bei2f_array (ubuf.ibuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_bei2f */ - -static sf_count_t -pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float normfact ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ; - lei2f_array (ubuf.ibuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_lei2f */ - -/*----------------------------------------------------------------------------------------------- -*/ - -static sf_count_t -pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double normfact ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.scbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - sc2d_array (ubuf.scbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_sc2d */ - -static sf_count_t -pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double normfact ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ; - uc2d_array (ubuf.ucbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_uc2d */ - -static sf_count_t -pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double normfact ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - bes2d_array (ubuf.sbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_bes2d */ - -static sf_count_t -pcm_read_les2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double normfact ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - les2d_array (ubuf.sbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_les2d */ - -static sf_count_t -pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double normfact ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 / 256.0 ; - - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - bet2d_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_bet2d */ - -static sf_count_t -pcm_read_let2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double normfact ; - - /* Special normfactor because tribyte value is read into an int. */ - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 / 256.0 ; - - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - let2d_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_let2d */ - -static sf_count_t -pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double normfact ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ; - bei2d_array (ubuf.ibuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_bei2d */ - -static sf_count_t -pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double normfact ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ; - lei2d_array (ubuf.ibuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* pcm_read_lei2d */ - -/*=============================================================================================== -**----------------------------------------------------------------------------------------------- -**=============================================================================================== -*/ - -static sf_count_t -pcm_write_s2sc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.scbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - s2sc_array (ptr + total, ubuf.scbuf, bufferlen) ; - writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_s2sc */ - -static sf_count_t -pcm_write_s2uc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - s2uc_array (ptr + total, ubuf.ucbuf, bufferlen) ; - writecount = psf_fwrite (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_s2uc */ - -static sf_count_t -pcm_write_s2bes (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - if (CPU_IS_BIG_ENDIAN) - return psf_fwrite (ptr, sizeof (short), len, psf) ; - else - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - endswap_short_copy (ubuf.sbuf, ptr + total, bufferlen) ; - writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_s2bes */ - -static sf_count_t -pcm_write_s2les (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - if (CPU_IS_LITTLE_ENDIAN) - return psf_fwrite (ptr, sizeof (short), len, psf) ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - endswap_short_copy (ubuf.sbuf, ptr + total, bufferlen) ; - writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_s2les */ - -static sf_count_t -pcm_write_s2bet (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - s2bet_array (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen) ; - writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_s2bet */ - -static sf_count_t -pcm_write_s2let (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - s2let_array (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen) ; - writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_s2let */ - -static sf_count_t -pcm_write_s2bei (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - s2bei_array (ptr + total, ubuf.ibuf, bufferlen) ; - writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_s2bei */ - -static sf_count_t -pcm_write_s2lei (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - s2lei_array (ptr + total, ubuf.ibuf, bufferlen) ; - writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_s2lei */ - -/*----------------------------------------------------------------------------------------------- -*/ - -static sf_count_t -pcm_write_i2sc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.scbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - i2sc_array (ptr + total, ubuf.scbuf, bufferlen) ; - writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_i2sc */ - -static sf_count_t -pcm_write_i2uc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - i2uc_array (ptr + total, ubuf.ucbuf, bufferlen) ; - writecount = psf_fwrite (ubuf.ucbuf, sizeof (signed char), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_i2uc */ - -static sf_count_t -pcm_write_i2bes (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - i2bes_array (ptr + total, ubuf.sbuf, bufferlen) ; - writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_i2bes */ - -static sf_count_t -pcm_write_i2les (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - i2les_array (ptr + total, ubuf.sbuf, bufferlen) ; - writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_i2les */ - -static sf_count_t -pcm_write_i2bet (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - i2bet_array (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen) ; - writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_i2bet */ - -static sf_count_t -pcm_write_i2let (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - i2let_array (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen) ; - writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_i2les */ - -static sf_count_t -pcm_write_i2bei (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - if (CPU_IS_BIG_ENDIAN) - return psf_fwrite (ptr, sizeof (int), len, psf) ; - - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - endswap_int_copy (ubuf.ibuf, ptr + total, bufferlen) ; - writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_i2bei */ - -static sf_count_t -pcm_write_i2lei (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - if (CPU_IS_LITTLE_ENDIAN) - return psf_fwrite (ptr, sizeof (int), len, psf) ; - - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - endswap_int_copy (ubuf.ibuf, ptr + total, bufferlen) ; - writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_i2lei */ - -/*------------------------------------------------------------------------------ -**============================================================================== -**------------------------------------------------------------------------------ -*/ - -static void -f2sc_array (const float *src, signed char *dest, int count, int normalize) -{ float normfact ; - - normfact = normalize ? (1.0 * 0x7F) : 1.0 ; - - while (--count >= 0) - { dest [count] = lrintf (src [count] * normfact) ; - } ; -} /* f2sc_array */ - -static void -f2sc_clip_array (const float *src, signed char *dest, int count, int normalize) -{ float normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ; - - while (--count >= 0) - { scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { dest [count] = 127 ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { dest [count] = -128 ; - continue ; - } ; - - dest [count] = lrintf (scaled_value) >> 24 ; - } ; -} /* f2sc_clip_array */ - -static sf_count_t -pcm_write_f2sc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const float *, signed char *, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? f2sc_clip_array : f2sc_array ; - bufferlen = ARRAY_LEN (ubuf.scbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, ubuf.scbuf, bufferlen, psf->norm_float) ; - writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_f2sc */ - -/*============================================================================== -*/ - -static void -f2uc_array (const float *src, unsigned char *dest, int count, int normalize) -{ float normfact ; - - normfact = normalize ? (1.0 * 0x7F) : 1.0 ; - - while (--count >= 0) - { dest [count] = lrintf (src [count] * normfact) + 128 ; - } ; -} /* f2uc_array */ - -static void -f2uc_clip_array (const float *src, unsigned char *dest, int count, int normalize) -{ float normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ; - - while (--count >= 0) - { scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { dest [count] = 0xFF ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { dest [count] = 0 ; - continue ; - } ; - - dest [count] = (lrintf (scaled_value) >> 24) + 128 ; - } ; -} /* f2uc_clip_array */ - -static sf_count_t -pcm_write_f2uc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const float *, unsigned char *, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? f2uc_clip_array : f2uc_array ; - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, ubuf.ucbuf, bufferlen, psf->norm_float) ; - writecount = psf_fwrite (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_f2uc */ - -/*============================================================================== -*/ - -static void -f2bes_array (const float *src, short *dest, int count, int normalize) -{ unsigned char *ucptr ; - float normfact ; - short value ; - - normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; - ucptr = ((unsigned char*) dest) + 2 * count ; - - while (--count >= 0) - { ucptr -= 2 ; - value = lrintf (src [count] * normfact) ; - ucptr [1] = value ; - ucptr [0] = value >> 8 ; - } ; -} /* f2bes_array */ - -static void -f2bes_clip_array (const float *src, short *dest, int count, int normalize) -{ unsigned char *ucptr ; - float normfact, scaled_value ; - int value ; - - normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ; - ucptr = ((unsigned char*) dest) + 2 * count ; - - while (--count >= 0) - { ucptr -= 2 ; - scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { ucptr [1] = 0xFF ; - ucptr [0] = 0x7F ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { ucptr [1] = 0x00 ; - ucptr [0] = 0x80 ; - continue ; - } ; - - value = lrintf (scaled_value) ; - ucptr [1] = value >> 16 ; - ucptr [0] = value >> 24 ; - } ; -} /* f2bes_clip_array */ - -static sf_count_t -pcm_write_f2bes (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const float *, short *t, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? f2bes_clip_array : f2bes_array ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, ubuf.sbuf, bufferlen, psf->norm_float) ; - writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_f2bes */ - -/*============================================================================== -*/ - -static void -f2les_array (const float *src, short *dest, int count, int normalize) -{ unsigned char *ucptr ; - float normfact ; - int value ; - - normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; - ucptr = ((unsigned char*) dest) + 2 * count ; - - while (--count >= 0) - { ucptr -= 2 ; - value = lrintf (src [count] * normfact) ; - ucptr [0] = value ; - ucptr [1] = value >> 8 ; - } ; -} /* f2les_array */ - -static void -f2les_clip_array (const float *src, short *dest, int count, int normalize) -{ unsigned char *ucptr ; - float normfact, scaled_value ; - int value ; - - normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ; - ucptr = ((unsigned char*) dest) + 2 * count ; - - while (--count >= 0) - { ucptr -= 2 ; - scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { ucptr [0] = 0xFF ; - ucptr [1] = 0x7F ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { ucptr [0] = 0x00 ; - ucptr [1] = 0x80 ; - continue ; - } ; - - value = lrintf (scaled_value) ; - ucptr [0] = value >> 16 ; - ucptr [1] = value >> 24 ; - } ; -} /* f2les_clip_array */ - -static sf_count_t -pcm_write_f2les (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const float *, short *t, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? f2les_clip_array : f2les_array ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, ubuf.sbuf, bufferlen, psf->norm_float) ; - writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_f2les */ - -/*============================================================================== -*/ - -static void -f2let_array (const float *src, tribyte *dest, int count, int normalize) -{ unsigned char *ucptr ; - float normfact ; - int value ; - - normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ; - ucptr = ((unsigned char*) dest) + 3 * count ; - - while (--count >= 0) - { ucptr -= 3 ; - value = lrintf (src [count] * normfact) ; - ucptr [0] = value ; - ucptr [1] = value >> 8 ; - ucptr [2] = value >> 16 ; - } ; -} /* f2let_array */ - -static void -f2let_clip_array (const float *src, tribyte *dest, int count, int normalize) -{ unsigned char *ucptr ; - float normfact, scaled_value ; - int value ; - - normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ; - ucptr = ((unsigned char*) dest) + 3 * count ; - - while (--count >= 0) - { ucptr -= 3 ; - scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { ucptr [0] = 0xFF ; - ucptr [1] = 0xFF ; - ucptr [2] = 0x7F ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { ucptr [0] = 0x00 ; - ucptr [1] = 0x00 ; - ucptr [2] = 0x80 ; - continue ; - } ; - - value = lrintf (scaled_value) ; - ucptr [0] = value >> 8 ; - ucptr [1] = value >> 16 ; - ucptr [2] = value >> 24 ; - } ; -} /* f2let_clip_array */ - -static sf_count_t -pcm_write_f2let (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const float *, tribyte *, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? f2let_clip_array : f2let_array ; - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen, psf->norm_float) ; - writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_f2let */ - -/*============================================================================== -*/ - -static void -f2bet_array (const float *src, tribyte *dest, int count, int normalize) -{ unsigned char *ucptr ; - float normfact ; - int value ; - - normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ; - ucptr = ((unsigned char*) dest) + 3 * count ; - - while (--count >= 0) - { ucptr -= 3 ; - value = lrintf (src [count] * normfact) ; - ucptr [0] = value >> 16 ; - ucptr [1] = value >> 8 ; - ucptr [2] = value ; - } ; -} /* f2bet_array */ - -static void -f2bet_clip_array (const float *src, tribyte *dest, int count, int normalize) -{ unsigned char *ucptr ; - float normfact, scaled_value ; - int value ; - - normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ; - ucptr = ((unsigned char*) dest) + 3 * count ; - - while (--count >= 0) - { ucptr -= 3 ; - scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { ucptr [0] = 0x7F ; - ucptr [1] = 0xFF ; - ucptr [2] = 0xFF ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { ucptr [0] = 0x80 ; - ucptr [1] = 0x00 ; - ucptr [2] = 0x00 ; - continue ; - } ; - - value = lrint (scaled_value) ; - ucptr [0] = value >> 24 ; - ucptr [1] = value >> 16 ; - ucptr [2] = value >> 8 ; - } ; -} /* f2bet_clip_array */ - -static sf_count_t -pcm_write_f2bet (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const float *, tribyte *, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? f2bet_clip_array : f2bet_array ; - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen, psf->norm_float) ; - writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_f2bet */ - -/*============================================================================== -*/ - -static void -f2bei_array (const float *src, int *dest, int count, int normalize) -{ unsigned char *ucptr ; - float normfact ; - int value ; - - normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ; - ucptr = ((unsigned char*) dest) + 4 * count ; - while (--count >= 0) - { ucptr -= 4 ; - value = lrintf (src [count] * normfact) ; - ucptr [0] = value >> 24 ; - ucptr [1] = value >> 16 ; - ucptr [2] = value >> 8 ; - ucptr [3] = value ; - } ; -} /* f2bei_array */ - -static void -f2bei_clip_array (const float *src, int *dest, int count, int normalize) -{ unsigned char *ucptr ; - float normfact, scaled_value ; - int value ; - - normfact = normalize ? (8.0 * 0x10000000) : 1.0 ; - ucptr = ((unsigned char*) dest) + 4 * count ; - - while (--count >= 0) - { ucptr -= 4 ; - scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= 1.0 * 0x7FFFFFFF) - { ucptr [0] = 0x7F ; - ucptr [1] = 0xFF ; - ucptr [2] = 0xFF ; - ucptr [3] = 0xFF ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { ucptr [0] = 0x80 ; - ucptr [1] = 0x00 ; - ucptr [2] = 0x00 ; - ucptr [3] = 0x00 ; - continue ; - } ; - - value = lrintf (scaled_value) ; - ucptr [0] = value >> 24 ; - ucptr [1] = value >> 16 ; - ucptr [2] = value >> 8 ; - ucptr [3] = value ; - } ; -} /* f2bei_clip_array */ - -static sf_count_t -pcm_write_f2bei (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const float *, int *, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? f2bei_clip_array : f2bei_array ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, ubuf.ibuf, bufferlen, psf->norm_float) ; - writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_f2bei */ - -/*============================================================================== -*/ - -static void -f2lei_array (const float *src, int *dest, int count, int normalize) -{ unsigned char *ucptr ; - float normfact ; - int value ; - - normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ; - ucptr = ((unsigned char*) dest) + 4 * count ; - - while (--count >= 0) - { ucptr -= 4 ; - value = lrintf (src [count] * normfact) ; - ucptr [0] = value ; - ucptr [1] = value >> 8 ; - ucptr [2] = value >> 16 ; - ucptr [3] = value >> 24 ; - } ; -} /* f2lei_array */ - -static void -f2lei_clip_array (const float *src, int *dest, int count, int normalize) -{ unsigned char *ucptr ; - float normfact, scaled_value ; - int value ; - - normfact = normalize ? (8.0 * 0x10000000) : 1.0 ; - ucptr = ((unsigned char*) dest) + 4 * count ; - - while (--count >= 0) - { ucptr -= 4 ; - scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { ucptr [0] = 0xFF ; - ucptr [1] = 0xFF ; - ucptr [2] = 0xFF ; - ucptr [3] = 0x7F ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { ucptr [0] = 0x00 ; - ucptr [1] = 0x00 ; - ucptr [2] = 0x00 ; - ucptr [3] = 0x80 ; - continue ; - } ; - - value = lrintf (scaled_value) ; - ucptr [0] = value ; - ucptr [1] = value >> 8 ; - ucptr [2] = value >> 16 ; - ucptr [3] = value >> 24 ; - } ; -} /* f2lei_clip_array */ - -static sf_count_t -pcm_write_f2lei (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const float *, int *, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? f2lei_clip_array : f2lei_array ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, ubuf.ibuf, bufferlen, psf->norm_float) ; - writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_f2lei */ - -/*============================================================================== -*/ - -static void -d2sc_array (const double *src, signed char *dest, int count, int normalize) -{ double normfact ; - - normfact = normalize ? (1.0 * 0x7F) : 1.0 ; - - while (--count >= 0) - { dest [count] = lrint (src [count] * normfact) ; - } ; -} /* d2sc_array */ - -static void -d2sc_clip_array (const double *src, signed char *dest, int count, int normalize) -{ double normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ; - - while (--count >= 0) - { scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { dest [count] = 127 ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { dest [count] = -128 ; - continue ; - } ; - - dest [count] = lrintf (scaled_value) >> 24 ; - } ; -} /* d2sc_clip_array */ - -static sf_count_t -pcm_write_d2sc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const double *, signed char *, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? d2sc_clip_array : d2sc_array ; - bufferlen = ARRAY_LEN (ubuf.scbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, ubuf.scbuf, bufferlen, psf->norm_double) ; - writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_d2sc */ - -/*============================================================================== -*/ - -static void -d2uc_array (const double *src, unsigned char *dest, int count, int normalize) -{ double normfact ; - - normfact = normalize ? (1.0 * 0x7F) : 1.0 ; - - while (--count >= 0) - { dest [count] = lrint (src [count] * normfact) + 128 ; - } ; -} /* d2uc_array */ - -static void -d2uc_clip_array (const double *src, unsigned char *dest, int count, int normalize) -{ double normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ; - - while (--count >= 0) - { scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { dest [count] = 255 ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { dest [count] = 0 ; - continue ; - } ; - - dest [count] = (lrint (src [count] * normfact) >> 24) + 128 ; - } ; -} /* d2uc_clip_array */ - -static sf_count_t -pcm_write_d2uc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const double *, unsigned char *, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? d2uc_clip_array : d2uc_array ; - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, ubuf.ucbuf, bufferlen, psf->norm_double) ; - writecount = psf_fwrite (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_d2uc */ - -/*============================================================================== -*/ - -static void -d2bes_array (const double *src, short *dest, int count, int normalize) -{ unsigned char *ucptr ; - short value ; - double normfact ; - - normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; - ucptr = ((unsigned char*) dest) + 2 * count ; - - while (--count >= 0) - { ucptr -= 2 ; - value = lrint (src [count] * normfact) ; - ucptr [1] = value ; - ucptr [0] = value >> 8 ; - } ; -} /* d2bes_array */ - -static void -d2bes_clip_array (const double *src, short *dest, int count, int normalize) -{ unsigned char *ucptr ; - double normfact, scaled_value ; - int value ; - - normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ; - ucptr = ((unsigned char*) dest) + 2 * count ; - - while (--count >= 0) - { ucptr -= 2 ; - scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { ucptr [1] = 0xFF ; - ucptr [0] = 0x7F ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { ucptr [1] = 0x00 ; - ucptr [0] = 0x80 ; - continue ; - } ; - - value = lrint (scaled_value) ; - ucptr [1] = value >> 16 ; - ucptr [0] = value >> 24 ; - } ; -} /* d2bes_clip_array */ - -static sf_count_t -pcm_write_d2bes (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const double *, short *, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? d2bes_clip_array : d2bes_array ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, ubuf.sbuf, bufferlen, psf->norm_double) ; - writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_d2bes */ - -/*============================================================================== -*/ - -static void -d2les_array (const double *src, short *dest, int count, int normalize) -{ unsigned char *ucptr ; - short value ; - double normfact ; - - normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; - ucptr = ((unsigned char*) dest) + 2 * count ; - - while (--count >= 0) - { ucptr -= 2 ; - value = lrint (src [count] * normfact) ; - ucptr [0] = value ; - ucptr [1] = value >> 8 ; - } ; -} /* d2les_array */ - -static void -d2les_clip_array (const double *src, short *dest, int count, int normalize) -{ unsigned char *ucptr ; - int value ; - double normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ; - ucptr = ((unsigned char*) dest) + 2 * count ; - - while (--count >= 0) - { ucptr -= 2 ; - scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { ucptr [0] = 0xFF ; - ucptr [1] = 0x7F ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { ucptr [0] = 0x00 ; - ucptr [1] = 0x80 ; - continue ; - } ; - - value = lrint (scaled_value) ; - ucptr [0] = value >> 16 ; - ucptr [1] = value >> 24 ; - } ; -} /* d2les_clip_array */ - -static sf_count_t -pcm_write_d2les (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const double *, short *, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? d2les_clip_array : d2les_array ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, ubuf.sbuf, bufferlen, psf->norm_double) ; - writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_d2les */ - -/*============================================================================== -*/ - -static void -d2let_array (const double *src, tribyte *dest, int count, int normalize) -{ unsigned char *ucptr ; - int value ; - double normfact ; - - normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ; - ucptr = ((unsigned char*) dest) + 3 * count ; - - while (--count >= 0) - { ucptr -= 3 ; - value = lrint (src [count] * normfact) ; - ucptr [0] = value ; - ucptr [1] = value >> 8 ; - ucptr [2] = value >> 16 ; - } ; -} /* d2let_array */ - -static void -d2let_clip_array (const double *src, tribyte *dest, int count, int normalize) -{ unsigned char *ucptr ; - int value ; - double normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ; - ucptr = ((unsigned char*) dest) + 3 * count ; - - while (--count >= 0) - { ucptr -= 3 ; - scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { ucptr [0] = 0xFF ; - ucptr [1] = 0xFF ; - ucptr [2] = 0x7F ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { ucptr [0] = 0x00 ; - ucptr [1] = 0x00 ; - ucptr [2] = 0x80 ; - continue ; - } ; - - value = lrint (scaled_value) ; - ucptr [0] = value >> 8 ; - ucptr [1] = value >> 16 ; - ucptr [2] = value >> 24 ; - } ; -} /* d2let_clip_array */ - -static sf_count_t -pcm_write_d2let (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const double *, tribyte *, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? d2let_clip_array : d2let_array ; - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen, psf->norm_double) ; - writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_d2let */ - -/*============================================================================== -*/ - -static void -d2bet_array (const double *src, tribyte *dest, int count, int normalize) -{ unsigned char *ucptr ; - int value ; - double normfact ; - - normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ; - ucptr = ((unsigned char*) dest) + 3 * count ; - - while (--count >= 0) - { ucptr -= 3 ; - value = lrint (src [count] * normfact) ; - ucptr [2] = value ; - ucptr [1] = value >> 8 ; - ucptr [0] = value >> 16 ; - } ; -} /* d2bet_array */ - -static void -d2bet_clip_array (const double *src, tribyte *dest, int count, int normalize) -{ unsigned char *ucptr ; - int value ; - double normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ; - ucptr = ((unsigned char*) dest) + 3 * count ; - - while (--count >= 0) - { ucptr -= 3 ; - scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { ucptr [2] = 0xFF ; - ucptr [1] = 0xFF ; - ucptr [0] = 0x7F ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { ucptr [2] = 0x00 ; - ucptr [1] = 0x00 ; - ucptr [0] = 0x80 ; - continue ; - } ; - - value = lrint (scaled_value) ; - ucptr [2] = value >> 8 ; - ucptr [1] = value >> 16 ; - ucptr [0] = value >> 24 ; - } ; -} /* d2bet_clip_array */ - -static sf_count_t -pcm_write_d2bet (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const double *, tribyte *, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? d2bet_clip_array : d2bet_array ; - bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen, psf->norm_double) ; - writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_d2bet */ - -/*============================================================================== -*/ - -static void -d2bei_array (const double *src, int *dest, int count, int normalize) -{ unsigned char *ucptr ; - int value ; - double normfact ; - - normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ; - ucptr = ((unsigned char*) dest) + 4 * count ; - - while (--count >= 0) - { ucptr -= 4 ; - value = lrint (src [count] * normfact) ; - ucptr [0] = value >> 24 ; - ucptr [1] = value >> 16 ; - ucptr [2] = value >> 8 ; - ucptr [3] = value ; - } ; -} /* d2bei_array */ - -static void -d2bei_clip_array (const double *src, int *dest, int count, int normalize) -{ unsigned char *ucptr ; - int value ; - double normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x10000000) : 1.0 ; - ucptr = ((unsigned char*) dest) + 4 * count ; - - while (--count >= 0) - { ucptr -= 4 ; - scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { ucptr [3] = 0xFF ; - ucptr [2] = 0xFF ; - ucptr [1] = 0xFF ; - ucptr [0] = 0x7F ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { ucptr [3] = 0x00 ; - ucptr [2] = 0x00 ; - ucptr [1] = 0x00 ; - ucptr [0] = 0x80 ; - continue ; - } ; - - value = lrint (scaled_value) ; - ucptr [0] = value >> 24 ; - ucptr [1] = value >> 16 ; - ucptr [2] = value >> 8 ; - ucptr [3] = value ; - } ; -} /* d2bei_clip_array */ - -static sf_count_t -pcm_write_d2bei (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const double *, int *, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? d2bei_clip_array : d2bei_array ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, ubuf.ibuf, bufferlen, psf->norm_double) ; - writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_d2bei */ - -/*============================================================================== -*/ - -static void -d2lei_array (const double *src, int *dest, int count, int normalize) -{ unsigned char *ucptr ; - int value ; - double normfact ; - - normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ; - ucptr = ((unsigned char*) dest) + 4 * count ; - - while (--count >= 0) - { ucptr -= 4 ; - value = lrint (src [count] * normfact) ; - ucptr [0] = value ; - ucptr [1] = value >> 8 ; - ucptr [2] = value >> 16 ; - ucptr [3] = value >> 24 ; - } ; -} /* d2lei_array */ - -static void -d2lei_clip_array (const double *src, int *dest, int count, int normalize) -{ unsigned char *ucptr ; - int value ; - double normfact, scaled_value ; - - normfact = normalize ? (8.0 * 0x10000000) : 1.0 ; - ucptr = ((unsigned char*) dest) + 4 * count ; - - while (--count >= 0) - { ucptr -= 4 ; - scaled_value = src [count] * normfact ; - if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) - { ucptr [0] = 0xFF ; - ucptr [1] = 0xFF ; - ucptr [2] = 0xFF ; - ucptr [3] = 0x7F ; - continue ; - } ; - if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) - { ucptr [0] = 0x00 ; - ucptr [1] = 0x00 ; - ucptr [2] = 0x00 ; - ucptr [3] = 0x80 ; - continue ; - } ; - - value = lrint (scaled_value) ; - ucptr [0] = value ; - ucptr [1] = value >> 8 ; - ucptr [2] = value >> 16 ; - ucptr [3] = value >> 24 ; - } ; -} /* d2lei_clip_array */ - -static sf_count_t -pcm_write_d2lei (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - void (*convert) (const double *, int *, int, int) ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - convert = (psf->add_clipping) ? d2lei_clip_array : d2lei_array ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - convert (ptr + total, ubuf.ibuf, bufferlen, psf->norm_double) ; - writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* pcm_write_d2lei */ - diff --git a/libs/libsndfile/src/pvf.c b/libs/libsndfile/src/pvf.c deleted file mode 100644 index 4ea24b6b68..0000000000 --- a/libs/libsndfile/src/pvf.c +++ /dev/null @@ -1,188 +0,0 @@ -/* -** Copyright (C) 2002-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/*------------------------------------------------------------------------------ -** Macros to handle big/little endian issues. -*/ - -#define PVF1_MARKER (MAKE_MARKER ('P', 'V', 'F', '1')) - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int pvf_close (SF_PRIVATE *psf) ; - -static int pvf_write_header (SF_PRIVATE *psf, int calc_length) ; -static int pvf_read_header (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -pvf_open (SF_PRIVATE *psf) -{ int subformat ; - int error = 0 ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = pvf_read_header (psf))) - return error ; - } ; - - subformat = SF_CODEC (psf->sf.format) ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_PVF) - return SFE_BAD_OPEN_FORMAT ; - - psf->endian = SF_ENDIAN_BIG ; - - if (pvf_write_header (psf, SF_FALSE)) - return psf->error ; - - psf->write_header = pvf_write_header ; - } ; - - psf->container_close = pvf_close ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - switch (subformat) - { case SF_FORMAT_PCM_S8 : /* 8-bit linear PCM. */ - case SF_FORMAT_PCM_16 : /* 16-bit linear PCM. */ - case SF_FORMAT_PCM_32 : /* 32-bit linear PCM. */ - error = pcm_init (psf) ; - break ; - - default : break ; - } ; - - return error ; -} /* pvf_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -pvf_close (SF_PRIVATE * UNUSED (psf)) -{ - return 0 ; -} /* pvf_close */ - -static int -pvf_write_header (SF_PRIVATE *psf, int UNUSED (calc_length)) -{ sf_count_t current ; - - if (psf->pipeoffset > 0) - return 0 ; - - current = psf_ftell (psf) ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - - if (psf->is_pipe == SF_FALSE) - psf_fseek (psf, 0, SEEK_SET) ; - - snprintf ((char*) psf->header, sizeof (psf->header), "PVF1\n%d %d %d\n", - psf->sf.channels, psf->sf.samplerate, psf->bytewidth * 8) ; - - psf->headindex = strlen ((char*) psf->header) ; - - /* Header construction complete so write it out. */ - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - psf->dataoffset = psf->headindex ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* pvf_write_header */ - -static int -pvf_read_header (SF_PRIVATE *psf) -{ char buffer [32] ; - int marker, channels, samplerate, bitwidth ; - - psf_binheader_readf (psf, "pmj", 0, &marker, 1) ; - psf_log_printf (psf, "%M\n", marker) ; - - if (marker != PVF1_MARKER) - return SFE_PVF_NO_PVF1 ; - - /* Grab characters up until a newline which is replaced by an EOS. */ - psf_binheader_readf (psf, "G", buffer, sizeof (buffer)) ; - - if (sscanf (buffer, "%d %d %d", &channels, &samplerate, &bitwidth) != 3) - return SFE_PVF_BAD_HEADER ; - - psf_log_printf (psf, " Channels : %d\n Sample rate : %d\n Bit width : %d\n", - channels, samplerate, bitwidth) ; - - psf->sf.channels = channels ; - psf->sf.samplerate = samplerate ; - - switch (bitwidth) - { case 8 : - psf->sf.format = SF_FORMAT_PVF | SF_FORMAT_PCM_S8 ; - psf->bytewidth = 1 ; - break ; - - case 16 : - psf->sf.format = SF_FORMAT_PVF | SF_FORMAT_PCM_16 ; - psf->bytewidth = 2 ; - break ; - case 32 : - psf->sf.format = SF_FORMAT_PVF | SF_FORMAT_PCM_32 ; - psf->bytewidth = 4 ; - break ; - - default : - return SFE_PVF_BAD_BITWIDTH ; - } ; - - psf->dataoffset = psf_ftell (psf) ; - psf_log_printf (psf, " Data Offset : %D\n", psf->dataoffset) ; - - psf->endian = SF_ENDIAN_BIG ; - - psf->datalength = psf->filelength - psf->dataoffset ; - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - - if (! psf->sf.frames && psf->blockwidth) - psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; - - return 0 ; -} /* pvf_read_header */ diff --git a/libs/libsndfile/src/raw.c b/libs/libsndfile/src/raw.c deleted file mode 100644 index e5dc49e2ff..0000000000 --- a/libs/libsndfile/src/raw.c +++ /dev/null @@ -1,104 +0,0 @@ -/* -** Copyright (C) 1999-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include - -#include "sndfile.h" -#include "common.h" - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -raw_open (SF_PRIVATE *psf) -{ int subformat, error = SFE_NO_ERROR ; - - subformat = SF_CODEC (psf->sf.format) ; - - psf->endian = SF_ENDIAN (psf->sf.format) ; - - if (CPU_IS_BIG_ENDIAN && (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU)) - psf->endian = SF_ENDIAN_BIG ; - else if (CPU_IS_LITTLE_ENDIAN && (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU)) - psf->endian = SF_ENDIAN_LITTLE ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - psf->dataoffset = 0 ; - psf->datalength = psf->filelength ; - - switch (subformat) - { case SF_FORMAT_PCM_S8 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_PCM_U8 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_ULAW : - error = ulaw_init (psf) ; - break ; - - case SF_FORMAT_ALAW : - error = alaw_init (psf) ; - break ; - - case SF_FORMAT_GSM610 : - error = gsm610_init (psf) ; - break ; - - /* Lite remove start */ - case SF_FORMAT_FLOAT : - error = float32_init (psf) ; - break ; - - case SF_FORMAT_DOUBLE : - error = double64_init (psf) ; - break ; - - case SF_FORMAT_DWVW_12 : - error = dwvw_init (psf, 12) ; - break ; - - case SF_FORMAT_DWVW_16 : - error = dwvw_init (psf, 16) ; - break ; - - case SF_FORMAT_DWVW_24 : - error = dwvw_init (psf, 24) ; - break ; - - case SF_FORMAT_VOX_ADPCM : - error = vox_adpcm_init (psf) ; - break ; - /* Lite remove end */ - - default : return SFE_BAD_OPEN_FORMAT ; - } ; - - return error ; -} /* raw_open */ diff --git a/libs/libsndfile/src/rf64.c b/libs/libsndfile/src/rf64.c deleted file mode 100644 index 7f14ef89ba..0000000000 --- a/libs/libsndfile/src/rf64.c +++ /dev/null @@ -1,726 +0,0 @@ -/* -** Copyright (C) 2008-2013 Erik de Castro Lopo -** Copyright (C) 2009 Uli Franke -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* -** This format documented at: -** http://www.sr.se/utveckling/tu/bwf/prog/RF_64v1_4.pdf -** -** But this may be a better reference: -** http://www.ebu.ch/CMSimages/en/tec_doc_t3306-2007_tcm6-42570.pdf -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" -#include "wav_w64.h" - -/*------------------------------------------------------------------------------ -** Macros to handle big/little endian issues. -*/ -#define RF64_MARKER MAKE_MARKER ('R', 'F', '6', '4') -#define FFFF_MARKER MAKE_MARKER (0xff, 0xff, 0xff, 0xff) -#define WAVE_MARKER MAKE_MARKER ('W', 'A', 'V', 'E') -#define ds64_MARKER MAKE_MARKER ('d', 's', '6', '4') -#define fmt_MARKER MAKE_MARKER ('f', 'm', 't', ' ') -#define fact_MARKER MAKE_MARKER ('f', 'a', 'c', 't') -#define data_MARKER MAKE_MARKER ('d', 'a', 't', 'a') - -#define bext_MARKER MAKE_MARKER ('b', 'e', 'x', 't') -#define cart_MARKER MAKE_MARKER ('c', 'a', 'r', 't') -#define OggS_MARKER MAKE_MARKER ('O', 'g', 'g', 'S') -#define wvpk_MARKER MAKE_MARKER ('w', 'v', 'p', 'k') - -/*------------------------------------------------------------------------------ -** Typedefs. -*/ - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) ; -static int rf64_write_header (SF_PRIVATE *psf, int calc_length) ; -static int rf64_close (SF_PRIVATE *psf) ; -static int rf64_command (SF_PRIVATE *psf, int command, void * UNUSED (data), int datasize) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -rf64_open (SF_PRIVATE *psf) -{ WAV_PRIVATE *wpriv ; - int subformat, error = 0 ; - int blockalign, framesperblock ; - - if ((wpriv = calloc (1, sizeof (WAV_PRIVATE))) == NULL) - return SFE_MALLOC_FAILED ; - psf->container_data = wpriv ; - wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ; - - /* All RF64 files are little endian. */ - psf->endian = SF_ENDIAN_LITTLE ; - - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = rf64_read_header (psf, &blockalign, &framesperblock)) != 0) - return error ; - } ; - - if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RF64) - return SFE_BAD_OPEN_FORMAT ; - - subformat = psf->sf.format & SF_FORMAT_SUBMASK ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if (psf->is_pipe) - return SFE_NO_PIPE_WRITE ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - if ((error = rf64_write_header (psf, SF_FALSE))) - return error ; - - psf->write_header = rf64_write_header ; - } ; - - psf->container_close = rf64_close ; - psf->command = rf64_command ; - - switch (subformat) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_ULAW : - error = ulaw_init (psf) ; - break ; - - case SF_FORMAT_ALAW : - error = alaw_init (psf) ; - break ; - - /* Lite remove start */ - case SF_FORMAT_FLOAT : - error = float32_init (psf) ; - break ; - - case SF_FORMAT_DOUBLE : - error = double64_init (psf) ; - break ; - - /* Lite remove end */ - - default : return SFE_UNIMPLEMENTED ; - } ; - - return error ; -} /* rf64_open */ - -/*------------------------------------------------------------------------------ -*/ -enum -{ HAVE_ds64 = 0x01, - HAVE_fmt = 0x02, - HAVE_bext = 0x04, - HAVE_data = 0x08, - HAVE_cart = 0x10 -} ; - -#define HAVE_CHUNK(CHUNK) ((parsestage & CHUNK) != 0) - -static int -rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) -{ WAV_PRIVATE *wpriv ; - WAV_FMT *wav_fmt ; - sf_count_t riff_size = 0, frame_count = 0, ds64_datalength = 0 ; - uint32_t marks [2], size32, parsestage = 0 ; - int marker, error, done = 0, format = 0 ; - - if ((wpriv = psf->container_data) == NULL) - return SFE_INTERNAL ; - wav_fmt = &wpriv->wav_fmt ; - - /* Set position to start of file to begin reading header. */ - psf_binheader_readf (psf, "pmmm", 0, &marker, marks, marks + 1) ; - if (marker != RF64_MARKER || marks [1] != WAVE_MARKER) - return SFE_RF64_NOT_RF64 ; - - if (marks [0] == FFFF_MARKER) - psf_log_printf (psf, "%M\n %M\n", RF64_MARKER, WAVE_MARKER) ; - else - psf_log_printf (psf, "%M : 0x%x (should be 0xFFFFFFFF)\n %M\n", RF64_MARKER, WAVE_MARKER) ; - - while (NOT (done)) - { psf_binheader_readf (psf, "em4", &marker, &size32) ; - - switch (marker) - { case ds64_MARKER : - { unsigned int table_len, bytesread ; - - /* Read ds64 sizes (3 8-byte words). */ - bytesread = psf_binheader_readf (psf, "888", &riff_size, &ds64_datalength, &frame_count) ; - - /* Read table length. */ - bytesread += psf_binheader_readf (psf, "4", &table_len) ; - /* Skip table for now. (this was "table_len + 4", why?) */ - bytesread += psf_binheader_readf (psf, "j", table_len) ; - - if (size32 == bytesread) - psf_log_printf (psf, "%M : %u\n", marker, size32) ; - else if (size32 >= bytesread + 4) - { unsigned int next ; - psf_binheader_readf (psf, "m", &next) ; - if (next == fmt_MARKER) - { psf_log_printf (psf, "%M : %u (should be %u)\n", marker, size32, bytesread) ; - psf_binheader_readf (psf, "j", -4) ; - } - else - { psf_log_printf (psf, "%M : %u\n", marker, size32) ; - psf_binheader_readf (psf, "j", size32 - bytesread - 4) ; - } ; - } ; - - if (psf->filelength != riff_size + 8) - psf_log_printf (psf, " Riff size : %D (should be %D)\n", riff_size, psf->filelength - 8) ; - else - psf_log_printf (psf, " Riff size : %D\n", riff_size) ; - - psf_log_printf (psf, " Data size : %D\n", ds64_datalength) ; - - psf_log_printf (psf, " Frames : %D\n", frame_count) ; - psf_log_printf (psf, " Table length : %u\n", table_len) ; - - } ; - parsestage |= HAVE_ds64 ; - break ; - - case fmt_MARKER: - psf_log_printf (psf, "%M : %u\n", marker, size32) ; - if ((error = wav_w64_read_fmt_chunk (psf, size32)) != 0) - return error ; - format = wav_fmt->format ; - parsestage |= HAVE_fmt ; - break ; - - case bext_MARKER : - if ((error = wav_read_bext_chunk (psf, size32)) != 0) - return error ; - parsestage |= HAVE_bext ; - break ; - - case cart_MARKER : - if ((error = wav_read_cart_chunk (psf, size32)) != 0) - return error ; - parsestage |= HAVE_cart ; - break ; - - case data_MARKER : - /* see wav for more sophisticated parsing -> implement state machine with parsestage */ - - if (HAVE_CHUNK (HAVE_ds64)) - { if (size32 == 0xffffffff) - psf_log_printf (psf, "%M : 0x%x\n", marker, size32) ; - else - psf_log_printf (psf, "%M : 0x%x (should be 0xffffffff\n", marker, size32) ; - psf->datalength = ds64_datalength ; - } - else - { if (size32 == 0xffffffff) - { psf_log_printf (psf, "%M : 0x%x\n", marker, size32) ; - psf_log_printf (psf, " *** Data length not specified no 'ds64' chunk.\n") ; - } - else - { psf_log_printf (psf, "%M : 0x%x\n**** Weird, RF64 file without a 'ds64' chunk and no valid 'data' size.\n", marker, size32) ; - psf->datalength = size32 ; - } ; - } ; - - psf->dataoffset = psf_ftell (psf) ; - - if (psf->dataoffset > 0) - { if (size32 == 0 && riff_size == 8 && psf->filelength > 44) - { psf_log_printf (psf, " *** Looks like a WAV file which wasn't closed properly. Fixing it.\n") ; - psf->datalength = psf->filelength - psf->dataoffset ; - } ; - - /* Only set dataend if there really is data at the end. */ - if (psf->datalength + psf->dataoffset < psf->filelength) - psf->dataend = psf->datalength + psf->dataoffset ; - - if (NOT (psf->sf.seekable) || psf->dataoffset < 0) - break ; - - /* Seek past data and continue reading header. */ - psf_fseek (psf, psf->datalength, SEEK_CUR) ; - - if (psf_ftell (psf) != psf->datalength + psf->dataoffset) - psf_log_printf (psf, " *** psf_fseek past end error ***\n") ; - break ; - } ; - break ; - - default : - if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF) - && isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF)) - { psf_log_printf (psf, "*** %M : %d (unknown marker)\n", marker, size32) ; - if (size32 < 8) - done = SF_TRUE ; - psf_binheader_readf (psf, "j", size32) ; - break ; - } ; - if (psf_ftell (psf) & 0x03) - { psf_log_printf (psf, " Unknown chunk marker at position 0x%x. Resynching.\n", size32 - 4) ; - psf_binheader_readf (psf, "j", -3) ; - break ; - } ; - psf_log_printf (psf, "*** Unknown chunk marker (0x%X) at position 0x%X. Exiting parser.\n", marker, psf_ftell (psf) - 4) ; - done = SF_TRUE ; - break ; - } ; /* switch (marker) */ - - if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (marker)) - { psf_log_printf (psf, "End\n") ; - break ; - } ; - } ; - - if (psf->dataoffset <= 0) - return SFE_WAV_NO_DATA ; - - /* WAVs can be little or big endian */ - psf->endian = psf->rwf_endian ; - - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - - if (psf->is_pipe == 0) - { /* - ** Check for 'wvpk' at the start of the DATA section. Not able to - ** handle this. - */ - psf_binheader_readf (psf, "4", &marker) ; - if (marker == wvpk_MARKER || marker == OggS_MARKER) - return SFE_WAV_WVPK_DATA ; - } ; - - /* Seek to start of DATA section. */ - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - - if (psf->blockwidth) - { if (psf->filelength - psf->dataoffset < psf->datalength) - psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; - else - psf->sf.frames = psf->datalength / psf->blockwidth ; - } ; - - if (frame_count != psf->sf.frames) - psf_log_printf (psf, "*** Calculated frame count %d does not match value from 'ds64' chunk of %d.\n", psf->sf.frames, frame_count) ; - - switch (format) - { - case WAVE_FORMAT_EXTENSIBLE : - - /* with WAVE_FORMAT_EXTENSIBLE the psf->sf.format field is already set. We just have to set the major to rf64 */ - psf->sf.format = (psf->sf.format & ~SF_FORMAT_TYPEMASK) | SF_FORMAT_RF64 ; - - if (psf->sf.format == (SF_FORMAT_WAVEX | SF_FORMAT_MS_ADPCM)) - { *blockalign = wav_fmt->msadpcm.blockalign ; - *framesperblock = wav_fmt->msadpcm.samplesperblock ; - } ; - break ; - - case WAVE_FORMAT_PCM : - psf->sf.format = SF_FORMAT_RF64 | u_bitwidth_to_subformat (psf->bytewidth * 8) ; - break ; - - case WAVE_FORMAT_MULAW : - case IBM_FORMAT_MULAW : - psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_ULAW) ; - break ; - - case WAVE_FORMAT_ALAW : - case IBM_FORMAT_ALAW : - psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_ALAW) ; - break ; - - case WAVE_FORMAT_MS_ADPCM : - psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_MS_ADPCM) ; - *blockalign = wav_fmt->msadpcm.blockalign ; - *framesperblock = wav_fmt->msadpcm.samplesperblock ; - break ; - - case WAVE_FORMAT_IMA_ADPCM : - psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_IMA_ADPCM) ; - *blockalign = wav_fmt->ima.blockalign ; - *framesperblock = wav_fmt->ima.samplesperblock ; - break ; - - case WAVE_FORMAT_GSM610 : - psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_GSM610) ; - break ; - - case WAVE_FORMAT_IEEE_FLOAT : - psf->sf.format = SF_FORMAT_RF64 ; - psf->sf.format |= (psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT ; - break ; - - case WAVE_FORMAT_G721_ADPCM : - psf->sf.format = SF_FORMAT_RF64 | SF_FORMAT_G721_32 ; - break ; - - default : return SFE_UNIMPLEMENTED ; - } ; - - if (wpriv->fmt_is_broken) - wav_w64_analyze (psf) ; - - /* Only set the format endian-ness if its non-standard big-endian. */ - if (psf->endian == SF_ENDIAN_BIG) - psf->sf.format |= SF_ENDIAN_BIG ; - - return 0 ; -} /* rf64_read_header */ - -/* known WAVEFORMATEXTENSIBLE GUIDS */ -static const EXT_SUBFORMAT MSGUID_SUBTYPE_PCM = -{ 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_MS_ADPCM = -{ 0x00000002, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_IEEE_FLOAT = -{ 0x00000003, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_ALAW = -{ 0x00000006, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_MULAW = -{ 0x00000007, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -/* -** the next two are from -** http://dream.cs.bath.ac.uk/researchdev/wave-ex/bformat.html -*/ -static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM = -{ 0x00000001, 0x0721, 0x11d3, { 0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT = -{ 0x00000003, 0x0721, 0x11d3, { 0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 } -} ; - - -static int -rf64_write_fmt_chunk (SF_PRIVATE *psf) -{ WAV_PRIVATE *wpriv ; - int subformat, fmt_size ; - - if ((wpriv = psf->container_data) == NULL) - return SFE_INTERNAL ; - - subformat = psf->sf.format & SF_FORMAT_SUBMASK ; - - /* initial section (same for all, it appears) */ - switch (subformat) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - case SF_FORMAT_FLOAT : - case SF_FORMAT_DOUBLE : - case SF_FORMAT_ULAW : - case SF_FORMAT_ALAW : - fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 + 4 + 4 + 2 + 2 + 8 ; - - /* fmt : format, channels, samplerate */ - psf_binheader_writef (psf, "4224", fmt_size, WAVE_FORMAT_EXTENSIBLE, psf->sf.channels, psf->sf.samplerate) ; - /* fmt : bytespersec */ - psf_binheader_writef (psf, "4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ; - /* fmt : blockalign, bitwidth */ - psf_binheader_writef (psf, "22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ; - - /* cbSize 22 is sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX) */ - psf_binheader_writef (psf, "2", 22) ; - - /* wValidBitsPerSample, for our use same as bitwidth as we use it fully */ - psf_binheader_writef (psf, "2", psf->bytewidth * 8) ; - - /* For an Ambisonic file set the channel mask to zero. - ** Otherwise use a default based on the channel count. - */ - if (wpriv->wavex_ambisonic != SF_AMBISONIC_NONE) - psf_binheader_writef (psf, "4", 0) ; - else if (wpriv->wavex_channelmask != 0) - psf_binheader_writef (psf, "4", wpriv->wavex_channelmask) ; - else - { /* - ** Ok some liberty is taken here to use the most commonly used channel masks - ** instead of "no mapping". If you really want to use "no mapping" for 8 channels and less - ** please don't use wavex. (otherwise we'll have to create a new SF_COMMAND) - */ - switch (psf->sf.channels) - { case 1 : /* center channel mono */ - psf_binheader_writef (psf, "4", 0x4) ; - break ; - - case 2 : /* front left and right */ - psf_binheader_writef (psf, "4", 0x1 | 0x2) ; - break ; - - case 4 : /* Quad */ - psf_binheader_writef (psf, "4", 0x1 | 0x2 | 0x10 | 0x20) ; - break ; - - case 6 : /* 5.1 */ - psf_binheader_writef (psf, "4", 0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20) ; - break ; - - case 8 : /* 7.1 */ - psf_binheader_writef (psf, "4", 0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20 | 0x40 | 0x80) ; - break ; - - default : /* 0 when in doubt , use direct out, ie NO mapping*/ - psf_binheader_writef (psf, "4", 0x0) ; - break ; - } ; - } ; - break ; - - case SF_FORMAT_MS_ADPCM : /* Todo, GUID exists might have different header as per wav_write_header */ - default : - return SFE_UNIMPLEMENTED ; - } ; - - /* GUID section, different for each */ - - switch (subformat) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - wavex_write_guid (psf, wpriv->wavex_ambisonic == SF_AMBISONIC_NONE ? - &MSGUID_SUBTYPE_PCM : &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM) ; - break ; - - case SF_FORMAT_FLOAT : - case SF_FORMAT_DOUBLE : - wavex_write_guid (psf, wpriv->wavex_ambisonic == SF_AMBISONIC_NONE ? - &MSGUID_SUBTYPE_IEEE_FLOAT : &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT) ; - break ; - - case SF_FORMAT_ULAW : - wavex_write_guid (psf, &MSGUID_SUBTYPE_MULAW) ; - break ; - - case SF_FORMAT_ALAW : - wavex_write_guid (psf, &MSGUID_SUBTYPE_ALAW) ; - break ; - - default : return SFE_UNIMPLEMENTED ; - } ; - - return 0 ; -} /* rf64_write_fmt_chunk */ - - -static int -rf64_write_header (SF_PRIVATE *psf, int calc_length) -{ sf_count_t current ; - int error = 0, has_data = SF_FALSE ; - - current = psf_ftell (psf) ; - - if (psf->dataoffset > 0 && current > psf->dataoffset) - has_data = SF_TRUE ; - - if (calc_length) - { psf->filelength = psf_get_filelen (psf) ; - psf->datalength = psf->filelength - psf->dataoffset ; - - if (psf->dataend) - psf->datalength -= psf->filelength - psf->dataend ; - - if (psf->bytewidth > 0) - psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; - } ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - psf_fseek (psf, 0, SEEK_SET) ; - - psf_binheader_writef (psf, "em4m", RF64_MARKER, 0xffffffff, WAVE_MARKER) ; - - /* Currently no table. */ - psf_binheader_writef (psf, "m48884", ds64_MARKER, 28, psf->filelength - 8, psf->datalength, psf->sf.frames, 0) ; - - /* WAVE and 'fmt ' markers. */ - psf_binheader_writef (psf, "m", fmt_MARKER) ; - - /* Write the 'fmt ' chunk. */ - switch (psf->sf.format & SF_FORMAT_TYPEMASK) - { case SF_FORMAT_WAV : - psf_log_printf (psf, "ooops SF_FORMAT_WAV\n") ; - return SFE_UNIMPLEMENTED ; - break ; - - case SF_FORMAT_WAVEX : - case SF_FORMAT_RF64 : - if ((error = rf64_write_fmt_chunk (psf)) != 0) - return error ; - break ; - - default : - return SFE_UNIMPLEMENTED ; - } ; - - if (psf->broadcast_16k != NULL) - wav_write_bext_chunk (psf) ; - - if (psf->cart_16k != NULL) - wav_write_cart_chunk (psf) ; -#if 0 - /* The LIST/INFO chunk. */ - if (psf->strings.flags & SF_STR_LOCATE_START) - wav_write_strings (psf, SF_STR_LOCATE_START) ; - - if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_START) - { psf_binheader_writef (psf, "m4", PEAK_MARKER, WAV_PEAK_CHUNK_SIZE (psf->sf.channels)) ; - psf_binheader_writef (psf, "44", 1, time (NULL)) ; - for (k = 0 ; k < psf->sf.channels ; k++) - psf_binheader_writef (psf, "ft8", (float) psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ; - } ; - -// if (psf->broadcast_info != NULL) -// wav_write_bext_chunk (psf) ; - - if (psf->instrument != NULL) - { int tmp ; - double dtune = (double) (0x40000000) / 25.0 ; - - psf_binheader_writef (psf, "m4", smpl_MARKER, 9 * 4 + psf->instrument->loop_count * 6 * 4) ; - psf_binheader_writef (psf, "44", 0, 0) ; /* Manufacturer zero is everyone */ - tmp = (int) (1.0e9 / psf->sf.samplerate) ; /* Sample period in nano seconds */ - psf_binheader_writef (psf, "44", tmp, psf->instrument->basenote) ; - tmp = (unsigned int) (psf->instrument->detune * dtune + 0.5) ; - psf_binheader_writef (psf, "4", tmp) ; - psf_binheader_writef (psf, "44", 0, 0) ; /* SMTPE format */ - psf_binheader_writef (psf, "44", psf->instrument->loop_count, 0) ; - - for (tmp = 0 ; tmp < psf->instrument->loop_count ; tmp++) - { int type ; - - type = psf->instrument->loops [tmp].mode ; - type = (type == SF_LOOP_FORWARD ? 0 : type == SF_LOOP_BACKWARD ? 2 : type == SF_LOOP_ALTERNATING ? 1 : 32) ; - - psf_binheader_writef (psf, "44", tmp, type) ; - psf_binheader_writef (psf, "44", psf->instrument->loops [tmp].start, psf->instrument->loops [tmp].end) ; - psf_binheader_writef (psf, "44", 0, psf->instrument->loops [tmp].count) ; - } ; - } ; - - if (psf->headindex + 8 < psf->dataoffset) - { /* Add PAD data if necessary. */ - k = psf->dataoffset - 16 - psf->headindex ; - psf_binheader_writef (psf, "m4z", PAD_MARKER, k, make_size_t (k)) ; - } ; - -#endif - - psf_binheader_writef (psf, "m4", data_MARKER, 0xffffffff) ; - - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - if (psf->error) - return psf->error ; - - if (has_data && psf->dataoffset != psf->headindex) - { printf ("Oooops : has_data && psf->dataoffset != psf->headindex\n") ; - return psf->error = SFE_INTERNAL ; - } ; - - psf->dataoffset = psf->headindex ; - - if (NOT (has_data)) - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - else if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* rf64_write_header */ - -static int -rf64_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { // rf64_write_tailer (psf) ; - - psf->write_header (psf, SF_TRUE) ; - } ; - - return 0 ; -} /* rf64_close */ - -static int -rf64_command (SF_PRIVATE *psf, int command, void * UNUSED (data), int datasize) -{ WAV_PRIVATE *wpriv ; - - if ((wpriv = psf->container_data) == NULL) - return SFE_INTERNAL ; - - switch (command) - { case SFC_WAVEX_SET_AMBISONIC : - if ((SF_CONTAINER (psf->sf.format)) == SF_FORMAT_WAVEX) - { if (datasize == SF_AMBISONIC_NONE) - wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ; - else if (datasize == SF_AMBISONIC_B_FORMAT) - wpriv->wavex_ambisonic = SF_AMBISONIC_B_FORMAT ; - else - return 0 ; - } ; - return wpriv->wavex_ambisonic ; - - case SFC_WAVEX_GET_AMBISONIC : - return wpriv->wavex_ambisonic ; - - case SFC_SET_CHANNEL_MAP_INFO : - wpriv->wavex_channelmask = wavex_gen_channel_mask (psf->channel_map, psf->sf.channels) ; - return (wpriv->wavex_channelmask != 0) ; - - default : - break ; - } ; - - return 0 ; -} /* rf64_command */ - diff --git a/libs/libsndfile/src/rx2.c b/libs/libsndfile/src/rx2.c deleted file mode 100644 index 0a730480e7..0000000000 --- a/libs/libsndfile/src/rx2.c +++ /dev/null @@ -1,318 +0,0 @@ -/* -** Copyright (C) 2001-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#if (ENABLE_EXPERIMENTAL_CODE == 0) - -int -rx2_open (SF_PRIVATE *psf) -{ if (psf) - return SFE_UNIMPLEMENTED ; - return 0 ; -} /* rx2_open */ - -#else - -/*------------------------------------------------------------------------------ - * Macros to handle big/little endian issues. -*/ - -#define CAT_MARKER (MAKE_MARKER ('C', 'A', 'T', ' ')) -#define GLOB_MARKER (MAKE_MARKER ('G', 'L', 'O', 'B')) - -#define RECY_MARKER (MAKE_MARKER ('R', 'E', 'C', 'Y')) - -#define SLCL_MARKER (MAKE_MARKER ('S', 'L', 'C', 'L')) -#define SLCE_MARKER (MAKE_MARKER ('S', 'L', 'C', 'E')) - -#define DEVL_MARKER (MAKE_MARKER ('D', 'E', 'V', 'L')) -#define TRSH_MARKER (MAKE_MARKER ('T', 'R', 'S', 'H')) - -#define EQ_MARKER (MAKE_MARKER ('E', 'Q', ' ', ' ')) -#define COMP_MARKER (MAKE_MARKER ('C', 'O', 'M', 'P')) - -#define SINF_MARKER (MAKE_MARKER ('S', 'I', 'N', 'F')) -#define SDAT_MARKER (MAKE_MARKER ('S', 'D', 'A', 'T')) - -/*------------------------------------------------------------------------------ - * Typedefs for file chunks. -*/ - - -/*------------------------------------------------------------------------------ - * Private static functions. -*/ -static int rx2_close (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------ -** Public functions. -*/ - -int -rx2_open (SF_PRIVATE *psf) -{ static const char *marker_type [4] = - { "Original Enabled", "Enabled Hidden", - "Additional/PencilTool", "Disabled" - } ; - - BUF_UNION ubuf ; - int error, marker, length, glob_offset, slce_count, frames ; - int sdat_length = 0, slce_total = 0 ; - int n_channels ; - - - /* So far only doing read. */ - - psf_binheader_readf (psf, "Epm4", 0, &marker, &length) ; - - if (marker != CAT_MARKER) - { psf_log_printf (psf, "length : %d\n", length) ; - return -1000 ; - } ; - - if (length != psf->filelength - 8) - psf_log_printf (psf, "%M : %d (should be %d)\n", marker, length, psf->filelength - 8) ; - else - psf_log_printf (psf, "%M : %d\n", marker, length) ; - - /* 'REX2' marker */ - psf_binheader_readf (psf, "m", &marker) ; - psf_log_printf (psf, "%M", marker) ; - - /* 'HEAD' marker */ - psf_binheader_readf (psf, "m", &marker) ; - psf_log_printf (psf, "%M\n", marker) ; - - /* Grab 'GLOB' offset. */ - psf_binheader_readf (psf, "E4", &glob_offset) ; - glob_offset += 0x14 ; /* Add the current file offset. */ - - /* Jump to offset 0x30 */ - psf_binheader_readf (psf, "p", 0x30) ; - - /* Get name length */ - length = 0 ; - psf_binheader_readf (psf, "1", &length) ; - if (length >= SIGNED_SIZEOF (ubuf.cbuf)) - { psf_log_printf (psf, " Text : %d *** Error : Too sf_count_t!\n") ; - return -1001 ; - } - - memset (ubuf.cbuf, 0, sizeof (ubuf.cbuf)) ; - psf_binheader_readf (psf, "b", ubuf.cbuf, length) ; - psf_log_printf (psf, " Text : \"%s\"\n", ubuf.cbuf) ; - - /* Jump to GLOB offset position. */ - if (glob_offset & 1) - glob_offset ++ ; - - psf_binheader_readf (psf, "p", glob_offset) ; - - slce_count = 0 ; - /* GLOB */ - while (1) - { psf_binheader_readf (psf, "m", &marker) ; - - if (marker != SLCE_MARKER && slce_count > 0) - { psf_log_printf (psf, " SLCE count : %d\n", slce_count) ; - slce_count = 0 ; - } - switch (marker) - { case GLOB_MARKER: - psf_binheader_readf (psf, "E4", &length) ; - psf_log_printf (psf, " %M : %d\n", marker, length) ; - psf_binheader_readf (psf, "j", length) ; - break ; - - case RECY_MARKER: - psf_binheader_readf (psf, "E4", &length) ; - psf_log_printf (psf, " %M : %d\n", marker, length) ; - psf_binheader_readf (psf, "j", (length+1) & 0xFFFFFFFE) ; /* ?????? */ - break ; - - case CAT_MARKER: - psf_binheader_readf (psf, "E4", &length) ; - psf_log_printf (psf, " %M : %d\n", marker, length) ; - /*-psf_binheader_readf (psf, "j", length) ;-*/ - break ; - - case DEVL_MARKER: - psf_binheader_readf (psf, "mE4", &marker, &length) ; - psf_log_printf (psf, " DEVL%M : %d\n", marker, length) ; - if (length & 1) - length ++ ; - psf_binheader_readf (psf, "j", length) ; - break ; - - case EQ_MARKER: - case COMP_MARKER: - psf_binheader_readf (psf, "E4", &length) ; - psf_log_printf (psf, " %M : %d\n", marker, length) ; - /* This is weird!!!! why make this (length - 1) */ - if (length & 1) - length ++ ; - psf_binheader_readf (psf, "j", length) ; - break ; - - case SLCL_MARKER: - psf_log_printf (psf, " %M\n (Offset, Next Offset, Type)\n", marker) ; - slce_count = 0 ; - break ; - - case SLCE_MARKER: - { int len [4], indx ; - - psf_binheader_readf (psf, "E4444", &len [0], &len [1], &len [2], &len [3]) ; - - indx = ((len [3] & 0x0000FFFF) >> 8) & 3 ; - - if (len [2] == 1) - { if (indx != 1) - indx = 3 ; /* 2 cases, where next slice offset = 1 -> disabled & enabled/hidden */ - - psf_log_printf (psf, " %M : (%6d, ?: 0x%X, %s)\n", marker, len [1], (len [3] & 0xFFFF0000) >> 16, marker_type [indx]) ; - } - else - { slce_total += len [2] ; - - psf_log_printf (psf, " %M : (%6d, SLCE_next_ofs:%d, ?: 0x%X, %s)\n", marker, len [1], len [2], (len [3] & 0xFFFF0000) >> 16, marker_type [indx]) ; - } ; - - slce_count ++ ; - } ; - break ; - - case SINF_MARKER: - psf_binheader_readf (psf, "E4", &length) ; - psf_log_printf (psf, " %M : %d\n", marker, length) ; - - psf_binheader_readf (psf, "E2", &n_channels) ; - n_channels = (n_channels & 0x0000FF00) >> 8 ; - psf_log_printf (psf, " Channels : %d\n", n_channels) ; - - psf_binheader_readf (psf, "E44", &psf->sf.samplerate, &frames) ; - psf->sf.frames = frames ; - psf_log_printf (psf, " Sample Rate : %d\n", psf->sf.samplerate) ; - psf_log_printf (psf, " Frames : %D\n", psf->sf.frames) ; - - psf_binheader_readf (psf, "E4", &length) ; - psf_log_printf (psf, " ??????????? : %d\n", length) ; - - psf_binheader_readf (psf, "E4", &length) ; - psf_log_printf (psf, " ??????????? : %d\n", length) ; - break ; - - case SDAT_MARKER: - psf_binheader_readf (psf, "E4", &length) ; - - sdat_length = length ; - - /* Get the current offset. */ - psf->dataoffset = psf_binheader_readf (psf, NULL) ; - - if (psf->dataoffset + length != psf->filelength) - psf_log_printf (psf, " %M : %d (should be %d)\n", marker, length, psf->dataoffset + psf->filelength) ; - else - psf_log_printf (psf, " %M : %d\n", marker, length) ; - break ; - - default : - psf_log_printf (psf, "Unknown marker : 0x%X %M", marker, marker) ; - return -1003 ; - break ; - } ; - - /* SDAT always last marker in file. */ - if (marker == SDAT_MARKER) - break ; - } ; - - puts (psf->parselog.buf) ; - puts ("-----------------------------------") ; - - printf ("SDAT length : %d\n", sdat_length) ; - printf ("SLCE count : %d\n", slce_count) ; - - /* Hack for zero slice count. */ - if (slce_count == 0 && slce_total == 1) - slce_total = frames ; - - printf ("SLCE samples : %d\n", slce_total) ; - - /* Two bytes per sample. */ - printf ("Comp Ratio : %f:1\n", (2.0 * slce_total * n_channels) / sdat_length) ; - - puts (" ") ; - - psf->parselog.buf [0] = 0 ; - - /* OK, have the header although not too sure what it all means. */ - - psf->endian = SF_ENDIAN_BIG ; - - psf->datalength = psf->filelength - psf->dataoffset ; - - if (psf_fseek (psf, psf->dataoffset, SEEK_SET)) - return SFE_BAD_SEEK ; - - psf->sf.format = (SF_FORMAT_REX2 | SF_FORMAT_DWVW_12) ; - - psf->sf.channels = 1 ; - psf->bytewidth = 2 ; - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - - if ((error = dwvw_init (psf, 16))) - return error ; - - psf->container_close = rx2_close ; - - if (! psf->sf.frames && psf->blockwidth) - psf->sf.frames = psf->datalength / psf->blockwidth ; - - /* All done. */ - - return 0 ; -} /* rx2_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -rx2_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE) - { /* Now we know for certain the length of the file we can re-write - ** correct values for the FORM, 8SVX and BODY chunks. - */ - - } ; - - return 0 ; -} /* rx2_close */ - -#endif diff --git a/libs/libsndfile/src/sd2.c b/libs/libsndfile/src/sd2.c deleted file mode 100644 index 6be150cd57..0000000000 --- a/libs/libsndfile/src/sd2.c +++ /dev/null @@ -1,654 +0,0 @@ -/* -** Copyright (C) 2001-2013 Erik de Castro Lopo -** Copyright (C) 2004 Paavo Jumppanen -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* -** The sd2 support implemented in this file was partially sponsored -** (financially) by Paavo Jumppanen. -*/ - -/* -** Documentation on the Mac resource fork was obtained here : -** http://developer.apple.com/documentation/mac/MoreToolbox/MoreToolbox-99.html -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/*------------------------------------------------------------------------------ - * Markers. -*/ - -#define Sd2f_MARKER MAKE_MARKER ('S', 'd', '2', 'f') -#define Sd2a_MARKER MAKE_MARKER ('S', 'd', '2', 'a') -#define ALCH_MARKER MAKE_MARKER ('A', 'L', 'C', 'H') -#define lsf1_MARKER MAKE_MARKER ('l', 's', 'f', '1') - -#define STR_MARKER MAKE_MARKER ('S', 'T', 'R', ' ') -#define sdML_MARKER MAKE_MARKER ('s', 'd', 'M', 'L') - -enum -{ RSRC_STR = 111, - RSRC_BIN -} ; - -typedef struct -{ unsigned char * rsrc_data ; - int rsrc_len ; - int need_to_free_rsrc_data ; - - int data_offset, data_length ; - int map_offset, map_length ; - - int type_count, type_offset ; - int item_offset ; - - int str_index, str_count ; - - int string_offset ; - - /* All the above just to get these three. */ - int sample_size, sample_rate, channels ; -} SD2_RSRC ; - -typedef struct -{ int type ; - int id ; - char name [32] ; - char value [32] ; - int value_len ; -} STR_RSRC ; - -/*------------------------------------------------------------------------------ - * Private static functions. -*/ - -static int sd2_close (SF_PRIVATE *psf) ; - -static int sd2_parse_rsrc_fork (SF_PRIVATE *psf) ; -static int parse_str_rsrc (SF_PRIVATE *psf, SD2_RSRC * rsrc) ; - -static int sd2_write_rsrc_fork (SF_PRIVATE *psf, int calc_length) ; - -/*------------------------------------------------------------------------------ -** Public functions. -*/ - -int -sd2_open (SF_PRIVATE *psf) -{ int subformat, error = 0, valid ; - - /* SD2 is always big endian. */ - psf->endian = SF_ENDIAN_BIG ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->rsrclength > 0)) - { psf_use_rsrc (psf, SF_TRUE) ; - valid = psf_file_valid (psf) ; - psf_use_rsrc (psf, SF_FALSE) ; - if (! valid) - { psf_log_printf (psf, "sd2_open : psf->rsrc.filedes < 0\n") ; - return SFE_SD2_BAD_RSRC ; - } ; - - error = sd2_parse_rsrc_fork (psf) ; - - if (error) - goto error_cleanup ; - } ; - - if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_SD2) - { error = SFE_BAD_OPEN_FORMAT ; - goto error_cleanup ; - } ; - - subformat = SF_CODEC (psf->sf.format) ; - psf->dataoffset = 0 ; - - /* Only open and write the resource in RDWR mode is its current length is zero. */ - if (psf->file.mode == SFM_WRITE || (psf->file.mode == SFM_RDWR && psf->rsrclength == 0)) - { psf->rsrc.mode = psf->file.mode ; - psf_open_rsrc (psf) ; - - error = sd2_write_rsrc_fork (psf, SF_FALSE) ; - - if (error) - goto error_cleanup ; - - /* Not needed. */ - psf->write_header = NULL ; - } ; - - psf->container_close = sd2_close ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - switch (subformat) - { case SF_FORMAT_PCM_S8 : /* 8-bit linear PCM. */ - case SF_FORMAT_PCM_16 : /* 16-bit linear PCM. */ - case SF_FORMAT_PCM_24 : /* 24-bit linear PCM */ - case SF_FORMAT_PCM_32 : /* 32-bit linear PCM */ - error = pcm_init (psf) ; - break ; - - default : - error = SFE_UNIMPLEMENTED ; - break ; - } ; - - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - -error_cleanup: - - /* Close the resource fork regardless. We won't need it again. */ - psf_close_rsrc (psf) ; - - return error ; -} /* sd2_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -sd2_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE) - { /* Now we know for certain the audio_length of the file we can re-write - ** correct values for the FORM, 8SVX and BODY chunks. - */ - - } ; - - return 0 ; -} /* sd2_close */ - -/*------------------------------------------------------------------------------ -*/ - -static inline void -write_char (unsigned char * data, int offset, char value) -{ data [offset] = value ; -} /* write_char */ - -static inline void -write_short (unsigned char * data, int offset, short value) -{ data [offset] = value >> 8 ; - data [offset + 1] = value ; -} /* write_char */ - -static inline void -write_int (unsigned char * data, int offset, int value) -{ data [offset] = value >> 24 ; - data [offset + 1] = value >> 16 ; - data [offset + 2] = value >> 8 ; - data [offset + 3] = value ; -} /* write_int */ - -static inline void -write_marker (unsigned char * data, int offset, int value) -{ - if (CPU_IS_BIG_ENDIAN) - { data [offset] = value >> 24 ; - data [offset + 1] = value >> 16 ; - data [offset + 2] = value >> 8 ; - data [offset + 3] = value ; - } - else - { data [offset] = value ; - data [offset + 1] = value >> 8 ; - data [offset + 2] = value >> 16 ; - data [offset + 3] = value >> 24 ; - } ; -} /* write_marker */ - -static void -write_str (unsigned char * data, int offset, const char * buffer, int buffer_len) -{ memcpy (data + offset, buffer, buffer_len) ; -} /* write_str */ - -static int -sd2_write_rsrc_fork (SF_PRIVATE *psf, int UNUSED (calc_length)) -{ SD2_RSRC rsrc ; - STR_RSRC str_rsrc [] = - { { RSRC_STR, 1000, "_sample-size", "", 0 }, - { RSRC_STR, 1001, "_sample-rate", "", 0 }, - { RSRC_STR, 1002, "_channels", "", 0 }, - { RSRC_BIN, 1000, "_Markers", "", 8 } - } ; - - int k, str_offset, data_offset, next_str ; - - psf_use_rsrc (psf, SF_TRUE) ; - - memset (&rsrc, 0, sizeof (rsrc)) ; - - rsrc.sample_rate = psf->sf.samplerate ; - rsrc.sample_size = psf->bytewidth ; - rsrc.channels = psf->sf.channels ; - - rsrc.rsrc_data = psf->header ; - rsrc.rsrc_len = sizeof (psf->header) ; - memset (rsrc.rsrc_data, 0xea, rsrc.rsrc_len) ; - - snprintf (str_rsrc [0].value, sizeof (str_rsrc [0].value), "_%d", rsrc.sample_size) ; - snprintf (str_rsrc [1].value, sizeof (str_rsrc [1].value), "_%d.000000", rsrc.sample_rate) ; - snprintf (str_rsrc [2].value, sizeof (str_rsrc [2].value), "_%d", rsrc.channels) ; - - for (k = 0 ; k < ARRAY_LEN (str_rsrc) ; k++) - { if (str_rsrc [k].value_len == 0) - { str_rsrc [k].value_len = strlen (str_rsrc [k].value) ; - str_rsrc [k].value [0] = str_rsrc [k].value_len - 1 ; - } ; - - /* Turn name string into a pascal string. */ - str_rsrc [k].name [0] = strlen (str_rsrc [k].name) - 1 ; - } ; - - rsrc.data_offset = 0x100 ; - - /* - ** Calculate data length : - ** length of strings, plus the length of the sdML chunk. - */ - rsrc.data_length = 0 ; - for (k = 0 ; k < ARRAY_LEN (str_rsrc) ; k++) - rsrc.data_length += str_rsrc [k].value_len + 4 ; - - rsrc.map_offset = rsrc.data_offset + rsrc.data_length ; - - /* Very start of resource fork. */ - write_int (rsrc.rsrc_data, 0, rsrc.data_offset) ; - write_int (rsrc.rsrc_data, 4, rsrc.map_offset) ; - write_int (rsrc.rsrc_data, 8, rsrc.data_length) ; - - write_char (rsrc.rsrc_data, 0x30, strlen (psf->file.name.c)) ; - write_str (rsrc.rsrc_data, 0x31, psf->file.name.c, strlen (psf->file.name.c)) ; - - write_short (rsrc.rsrc_data, 0x50, 0) ; - write_marker (rsrc.rsrc_data, 0x52, Sd2f_MARKER) ; - write_marker (rsrc.rsrc_data, 0x56, lsf1_MARKER) ; - - /* Very start of resource map. */ - write_int (rsrc.rsrc_data, rsrc.map_offset + 0, rsrc.data_offset) ; - write_int (rsrc.rsrc_data, rsrc.map_offset + 4, rsrc.map_offset) ; - write_int (rsrc.rsrc_data, rsrc.map_offset + 8, rsrc.data_length) ; - - /* These I don't currently understand. */ - if (1) - { write_char (rsrc.rsrc_data, rsrc.map_offset+ 16, 1) ; - /* Next resource map. */ - write_int (rsrc.rsrc_data, rsrc.map_offset + 17, 0x12345678) ; - /* File ref number. */ - write_short (rsrc.rsrc_data, rsrc.map_offset + 21, 0xabcd) ; - /* Fork attributes. */ - write_short (rsrc.rsrc_data, rsrc.map_offset + 23, 0) ; - } ; - - /* Resource type offset. */ - rsrc.type_offset = rsrc.map_offset + 30 ; - write_short (rsrc.rsrc_data, rsrc.map_offset + 24, rsrc.type_offset - rsrc.map_offset - 2) ; - - /* Type index max. */ - rsrc.type_count = 2 ; - write_short (rsrc.rsrc_data, rsrc.map_offset + 28, rsrc.type_count - 1) ; - - rsrc.item_offset = rsrc.type_offset + rsrc.type_count * 8 ; - - rsrc.str_count = ARRAY_LEN (str_rsrc) ; - rsrc.string_offset = rsrc.item_offset + (rsrc.str_count + 1) * 12 - rsrc.map_offset ; - write_short (rsrc.rsrc_data, rsrc.map_offset + 26, rsrc.string_offset) ; - - /* Write 'STR ' resource type. */ - rsrc.str_count = 3 ; - write_marker (rsrc.rsrc_data, rsrc.type_offset, STR_MARKER) ; - write_short (rsrc.rsrc_data, rsrc.type_offset + 4, rsrc.str_count - 1) ; - write_short (rsrc.rsrc_data, rsrc.type_offset + 6, 0x12) ; - - /* Write 'sdML' resource type. */ - write_marker (rsrc.rsrc_data, rsrc.type_offset + 8, sdML_MARKER) ; - write_short (rsrc.rsrc_data, rsrc.type_offset + 12, 0) ; - write_short (rsrc.rsrc_data, rsrc.type_offset + 14, 0x36) ; - - str_offset = rsrc.map_offset + rsrc.string_offset ; - next_str = 0 ; - data_offset = rsrc.data_offset ; - for (k = 0 ; k < ARRAY_LEN (str_rsrc) ; k++) - { write_str (rsrc.rsrc_data, str_offset, str_rsrc [k].name, strlen (str_rsrc [k].name)) ; - - write_short (rsrc.rsrc_data, rsrc.item_offset + k * 12, str_rsrc [k].id) ; - write_short (rsrc.rsrc_data, rsrc.item_offset + k * 12 + 2, next_str) ; - - str_offset += strlen (str_rsrc [k].name) ; - next_str += strlen (str_rsrc [k].name) ; - - write_int (rsrc.rsrc_data, rsrc.item_offset + k * 12 + 4, data_offset - rsrc.data_offset) ; - - write_int (rsrc.rsrc_data, data_offset, str_rsrc [k].value_len) ; - write_str (rsrc.rsrc_data, data_offset + 4, str_rsrc [k].value, str_rsrc [k].value_len) ; - data_offset += 4 + str_rsrc [k].value_len ; - } ; - - /* Finally, calculate and set map length. */ - rsrc.map_length = str_offset - rsrc.map_offset ; - write_int (rsrc.rsrc_data, 12, rsrc.map_length) ; - write_int (rsrc.rsrc_data, rsrc.map_offset + 12, rsrc.map_length) ; - - rsrc.rsrc_len = rsrc.map_offset + rsrc.map_length ; - - psf_fwrite (rsrc.rsrc_data, rsrc.rsrc_len, 1, psf) ; - - psf_use_rsrc (psf, SF_FALSE) ; - - if (psf->error) - return psf->error ; - - return 0 ; -} /* sd2_write_rsrc_fork */ - -/*------------------------------------------------------------------------------ -*/ - -static inline int -read_rsrc_char (const SD2_RSRC *prsrc, int offset) -{ const unsigned char * data = prsrc->rsrc_data ; - if (offset < 0 || offset >= prsrc->rsrc_len) - return 0 ; - return data [offset] ; -} /* read_rsrc_char */ - -static inline int -read_rsrc_short (const SD2_RSRC *prsrc, int offset) -{ const unsigned char * data = prsrc->rsrc_data ; - if (offset < 0 || offset + 1 >= prsrc->rsrc_len) - return 0 ; - return (data [offset] << 8) + data [offset + 1] ; -} /* read_rsrc_short */ - -static inline int -read_rsrc_int (const SD2_RSRC *prsrc, int offset) -{ const unsigned char * data = prsrc->rsrc_data ; - if (offset < 0 || offset + 3 >= prsrc->rsrc_len) - return 0 ; - return (data [offset] << 24) + (data [offset + 1] << 16) + (data [offset + 2] << 8) + data [offset + 3] ; -} /* read_rsrc_int */ - -static inline int -read_rsrc_marker (const SD2_RSRC *prsrc, int offset) -{ const unsigned char * data = prsrc->rsrc_data ; - - if (offset < 0 || offset + 3 >= prsrc->rsrc_len) - return 0 ; - - if (CPU_IS_BIG_ENDIAN) - return (data [offset] << 24) + (data [offset + 1] << 16) + (data [offset + 2] << 8) + data [offset + 3] ; - if (CPU_IS_LITTLE_ENDIAN) - return data [offset] + (data [offset + 1] << 8) + (data [offset + 2] << 16) + (data [offset + 3] << 24) ; - - return 0 ; -} /* read_rsrc_marker */ - -static void -read_rsrc_str (const SD2_RSRC *prsrc, int offset, char * buffer, int buffer_len) -{ const unsigned char * data = prsrc->rsrc_data ; - int k ; - - memset (buffer, 0, buffer_len) ; - - if (offset < 0 || offset + buffer_len >= prsrc->rsrc_len) - return ; - - for (k = 0 ; k < buffer_len - 1 ; k++) - { if (psf_isprint (data [offset + k]) == 0) - return ; - buffer [k] = data [offset + k] ; - } ; - return ; -} /* read_rsrc_str */ - -static int -sd2_parse_rsrc_fork (SF_PRIVATE *psf) -{ SD2_RSRC rsrc ; - int k, marker, error = 0 ; - - psf_use_rsrc (psf, SF_TRUE) ; - - memset (&rsrc, 0, sizeof (rsrc)) ; - - rsrc.rsrc_len = psf_get_filelen (psf) ; - psf_log_printf (psf, "Resource length : %d (0x%04X)\n", rsrc.rsrc_len, rsrc.rsrc_len) ; - - if (rsrc.rsrc_len > SIGNED_SIZEOF (psf->header)) - { rsrc.rsrc_data = calloc (1, rsrc.rsrc_len) ; - rsrc.need_to_free_rsrc_data = SF_TRUE ; - } - else - rsrc.rsrc_data = psf->header ; - - /* Read in the whole lot. */ - psf_fread (rsrc.rsrc_data, rsrc.rsrc_len, 1, psf) ; - - /* Reset the header storage because we have changed to the rsrcdes. */ - psf->headindex = psf->headend = rsrc.rsrc_len ; - - rsrc.data_offset = read_rsrc_int (&rsrc, 0) ; - rsrc.map_offset = read_rsrc_int (&rsrc, 4) ; - rsrc.data_length = read_rsrc_int (&rsrc, 8) ; - rsrc.map_length = read_rsrc_int (&rsrc, 12) ; - - if (rsrc.data_offset == 0x51607 && rsrc.map_offset == 0x20000) - { psf_log_printf (psf, "Trying offset of 0x52 bytes.\n") ; - rsrc.data_offset = read_rsrc_int (&rsrc, 0x52 + 0) + 0x52 ; - rsrc.map_offset = read_rsrc_int (&rsrc, 0x52 + 4) + 0x52 ; - rsrc.data_length = read_rsrc_int (&rsrc, 0x52 + 8) ; - rsrc.map_length = read_rsrc_int (&rsrc, 0x52 + 12) ; - } ; - - psf_log_printf (psf, " data offset : 0x%04X\n map offset : 0x%04X\n" - " data length : 0x%04X\n map length : 0x%04X\n", - rsrc.data_offset, rsrc.map_offset, rsrc.data_length, rsrc.map_length) ; - - if (rsrc.data_offset > rsrc.rsrc_len) - { psf_log_printf (psf, "Error : rsrc.data_offset (%d, 0x%x) > len\n", rsrc.data_offset, rsrc.data_offset) ; - error = SFE_SD2_BAD_DATA_OFFSET ; - goto parse_rsrc_fork_cleanup ; - } ; - - if (rsrc.map_offset > rsrc.rsrc_len) - { psf_log_printf (psf, "Error : rsrc.map_offset > len\n") ; - error = SFE_SD2_BAD_MAP_OFFSET ; - goto parse_rsrc_fork_cleanup ; - } ; - - if (rsrc.data_length > rsrc.rsrc_len) - { psf_log_printf (psf, "Error : rsrc.data_length > len\n") ; - error = SFE_SD2_BAD_DATA_LENGTH ; - goto parse_rsrc_fork_cleanup ; - } ; - - if (rsrc.map_length > rsrc.rsrc_len) - { psf_log_printf (psf, "Error : rsrc.map_length > len\n") ; - error = SFE_SD2_BAD_MAP_LENGTH ; - goto parse_rsrc_fork_cleanup ; - } ; - - if (rsrc.data_offset + rsrc.data_length != rsrc.map_offset || rsrc.map_offset + rsrc.map_length != rsrc.rsrc_len) - { psf_log_printf (psf, "Error : This does not look like a MacOSX resource fork.\n") ; - error = SFE_SD2_BAD_RSRC ; - goto parse_rsrc_fork_cleanup ; - } ; - - if (rsrc.map_offset + 28 >= rsrc.rsrc_len) - { psf_log_printf (psf, "Bad map offset (%d + 28 > %d).\n", rsrc.map_offset, rsrc.rsrc_len) ; - error = SFE_SD2_BAD_RSRC ; - goto parse_rsrc_fork_cleanup ; - } ; - - rsrc.string_offset = rsrc.map_offset + read_rsrc_short (&rsrc, rsrc.map_offset + 26) ; - if (rsrc.string_offset > rsrc.rsrc_len) - { psf_log_printf (psf, "Bad string offset (%d).\n", rsrc.string_offset) ; - error = SFE_SD2_BAD_RSRC ; - goto parse_rsrc_fork_cleanup ; - } ; - - rsrc.type_offset = rsrc.map_offset + 30 ; - - rsrc.type_count = read_rsrc_short (&rsrc, rsrc.map_offset + 28) + 1 ; - if (rsrc.type_count < 1) - { psf_log_printf (psf, "Bad type count.\n") ; - error = SFE_SD2_BAD_RSRC ; - goto parse_rsrc_fork_cleanup ; - } ; - - rsrc.item_offset = rsrc.type_offset + rsrc.type_count * 8 ; - if (rsrc.item_offset < 0 || rsrc.item_offset > rsrc.rsrc_len) - { psf_log_printf (psf, "Bad item offset (%d).\n", rsrc.item_offset) ; - error = SFE_SD2_BAD_RSRC ; - goto parse_rsrc_fork_cleanup ; - } ; - - rsrc.str_index = -1 ; - for (k = 0 ; k < rsrc.type_count ; k ++) - { marker = read_rsrc_marker (&rsrc, rsrc.type_offset + k * 8) ; - - if (marker == STR_MARKER) - { rsrc.str_index = k ; - rsrc.str_count = read_rsrc_short (&rsrc, rsrc.type_offset + k * 8 + 4) + 1 ; - error = parse_str_rsrc (psf, &rsrc) ; - goto parse_rsrc_fork_cleanup ; - } ; - } ; - - psf_log_printf (psf, "No 'STR ' resource.\n") ; - error = SFE_SD2_BAD_RSRC ; - -parse_rsrc_fork_cleanup : - - psf_use_rsrc (psf, SF_FALSE) ; - - if (rsrc.need_to_free_rsrc_data) - free (rsrc.rsrc_data) ; - - return error ; -} /* sd2_parse_rsrc_fork */ - -static int -parse_str_rsrc (SF_PRIVATE *psf, SD2_RSRC * rsrc) -{ char name [32], value [32] ; - int k, str_offset, rsrc_id, data_offset = 0, data_len = 0 ; - - psf_log_printf (psf, "Finding parameters :\n") ; - - str_offset = rsrc->string_offset ; - psf_log_printf (psf, " Offset RsrcId dlen slen Value\n") ; - - for (k = 0 ; data_offset + data_len < rsrc->rsrc_len ; k++) - { int slen ; - - slen = read_rsrc_char (rsrc, str_offset) ; - read_rsrc_str (rsrc, str_offset + 1, name, SF_MIN (SIGNED_SIZEOF (name), slen + 1)) ; - str_offset += slen + 1 ; - - rsrc_id = read_rsrc_short (rsrc, rsrc->item_offset + k * 12) ; - - data_offset = rsrc->data_offset + read_rsrc_int (rsrc, rsrc->item_offset + k * 12 + 4) ; - if (data_offset < 0 || data_offset > rsrc->rsrc_len) - { psf_log_printf (psf, "Exiting parser on data offset of %d.\n", data_offset) ; - break ; - } ; - - data_len = read_rsrc_int (rsrc, data_offset) ; - if (data_len < 0 || data_len > rsrc->rsrc_len) - { psf_log_printf (psf, "Exiting parser on data length of %d.\n", data_len) ; - break ; - } ; - - slen = read_rsrc_char (rsrc, data_offset + 4) ; - read_rsrc_str (rsrc, data_offset + 5, value, SF_MIN (SIGNED_SIZEOF (value), slen + 1)) ; - - psf_log_printf (psf, " 0x%04x %4d %4d %3d '%s'\n", data_offset, rsrc_id, data_len, slen, value) ; - - if (rsrc_id == 1000 && rsrc->sample_size == 0) - rsrc->sample_size = strtol (value, NULL, 10) ; - else if (rsrc_id == 1001 && rsrc->sample_rate == 0) - rsrc->sample_rate = strtol (value, NULL, 10) ; - else if (rsrc_id == 1002 && rsrc->channels == 0) - rsrc->channels = strtol (value, NULL, 10) ; - } ; - - psf_log_printf (psf, "Found Parameters :\n") ; - psf_log_printf (psf, " sample-size : %d\n", rsrc->sample_size) ; - psf_log_printf (psf, " sample-rate : %d\n", rsrc->sample_rate) ; - psf_log_printf (psf, " channels : %d\n", rsrc->channels) ; - - if (rsrc->sample_rate <= 4 && rsrc->sample_size > 4) - { int temp ; - - psf_log_printf (psf, "Geez!! Looks like sample rate and sample size got switched.\nCorrecting this screw up.\n") ; - temp = rsrc->sample_rate ; - rsrc->sample_rate = rsrc->sample_size ; - rsrc->sample_size = temp ; - } ; - - if (rsrc->sample_rate < 0) - { psf_log_printf (psf, "Bad sample rate (%d)\n", rsrc->sample_rate) ; - return SFE_SD2_BAD_RSRC ; - } ; - - if (rsrc->channels < 0) - { psf_log_printf (psf, "Bad channel count (%d)\n", rsrc->channels) ; - return SFE_SD2_BAD_RSRC ; - } ; - - psf->sf.samplerate = rsrc->sample_rate ; - psf->sf.channels = rsrc->channels ; - psf->bytewidth = rsrc->sample_size ; - - switch (rsrc->sample_size) - { case 1 : - psf->sf.format = SF_FORMAT_SD2 | SF_FORMAT_PCM_S8 ; - break ; - - case 2 : - psf->sf.format = SF_FORMAT_SD2 | SF_FORMAT_PCM_16 ; - break ; - - case 3 : - psf->sf.format = SF_FORMAT_SD2 | SF_FORMAT_PCM_24 ; - break ; - - case 4 : - psf->sf.format = SF_FORMAT_SD2 | SF_FORMAT_PCM_32 ; - break ; - - default : - psf_log_printf (psf, "Bad sample size (%d)\n", rsrc->sample_size) ; - return SFE_SD2_BAD_SAMPLE_SIZE ; - } ; - - psf_log_printf (psf, "ok\n") ; - - return 0 ; -} /* parse_str_rsrc */ - diff --git a/libs/libsndfile/src/sds.c b/libs/libsndfile/src/sds.c deleted file mode 100644 index 7dd1d9d27e..0000000000 --- a/libs/libsndfile/src/sds.c +++ /dev/null @@ -1,1022 +0,0 @@ -/* -** Copyright (C) 2002-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/*------------------------------------------------------------------------------ -*/ - -#define SDS_DATA_OFFSET 0x15 -#define SDS_BLOCK_SIZE 127 - -#define SDS_AUDIO_BYTES_PER_BLOCK 120 - -#define SDS_3BYTE_TO_INT_DECODE(x) (((x) & 0x7F) | (((x) & 0x7F00) >> 1) | (((x) & 0x7F0000) >> 2)) -#define SDS_INT_TO_3BYTE_ENCODE(x) (((x) & 0x7F) | (((x) << 1) & 0x7F00) | (((x) << 2) & 0x7F0000)) - -/*------------------------------------------------------------------------------ -** Typedefs. -*/ - -typedef struct tag_SDS_PRIVATE -{ int bitwidth, frames ; - int samplesperblock, total_blocks ; - - int (*reader) (SF_PRIVATE *psf, struct tag_SDS_PRIVATE *psds) ; - int (*writer) (SF_PRIVATE *psf, struct tag_SDS_PRIVATE *psds) ; - - int read_block, read_count ; - unsigned char read_data [SDS_BLOCK_SIZE] ; - int read_samples [SDS_BLOCK_SIZE / 2] ; /* Maximum samples per block */ - - int write_block, write_count ; - int total_written ; - unsigned char write_data [SDS_BLOCK_SIZE] ; - int write_samples [SDS_BLOCK_SIZE / 2] ; /* Maximum samples per block */ -} SDS_PRIVATE ; - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int sds_close (SF_PRIVATE *psf) ; - -static int sds_write_header (SF_PRIVATE *psf, int calc_length) ; -static int sds_read_header (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; - -static int sds_init (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; - -static sf_count_t sds_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t sds_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t sds_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t sds_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t sds_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t sds_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t sds_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t sds_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static sf_count_t sds_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; -static int sds_byterate (SF_PRIVATE * psf) ; - -static int sds_2byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; -static int sds_3byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; -static int sds_4byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; - -static int sds_read (SF_PRIVATE *psf, SDS_PRIVATE *psds, int *iptr, int readcount) ; - -static int sds_2byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; -static int sds_3byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; -static int sds_4byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; - -static int sds_write (SF_PRIVATE *psf, SDS_PRIVATE *psds, const int *iptr, int writecount) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -sds_open (SF_PRIVATE *psf) -{ SDS_PRIVATE *psds ; - int error = 0 ; - - /* Hmmmm, need this here to pass update_header_test. */ - psf->sf.frames = 0 ; - - if (! (psds = calloc (1, sizeof (SDS_PRIVATE)))) - return SFE_MALLOC_FAILED ; - psf->codec_data = psds ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = sds_read_header (psf, psds))) - return error ; - } ; - - if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_SDS) - return SFE_BAD_OPEN_FORMAT ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if (sds_write_header (psf, SF_FALSE)) - return psf->error ; - - psf->write_header = sds_write_header ; - - psf_fseek (psf, SDS_DATA_OFFSET, SEEK_SET) ; - } ; - - if ((error = sds_init (psf, psds)) != 0) - return error ; - - psf->container_close = sds_close ; - psf->seek = sds_seek ; - psf->byterate = sds_byterate ; - - psf->blockwidth = 0 ; - - return error ; -} /* sds_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -sds_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { SDS_PRIVATE *psds ; - - if ((psds = (SDS_PRIVATE *) psf->codec_data) == NULL) - { psf_log_printf (psf, "*** Bad psf->codec_data ptr.\n") ; - return SFE_INTERNAL ; - } ; - - if (psds->write_count > 0) - { memset (&(psds->write_data [psds->write_count]), 0, (psds->samplesperblock - psds->write_count) * sizeof (int)) ; - psds->writer (psf, psds) ; - } ; - - sds_write_header (psf, SF_TRUE) ; - } ; - - return 0 ; -} /* sds_close */ - -static int -sds_init (SF_PRIVATE *psf, SDS_PRIVATE *psds) -{ - if (psds->bitwidth < 8 || psds->bitwidth > 28) - return (psf->error = SFE_SDS_BAD_BIT_WIDTH) ; - - if (psds->bitwidth < 14) - { psds->reader = sds_2byte_read ; - psds->writer = sds_2byte_write ; - psds->samplesperblock = SDS_AUDIO_BYTES_PER_BLOCK / 2 ; - } - else if (psds->bitwidth < 21) - { psds->reader = sds_3byte_read ; - psds->writer = sds_3byte_write ; - psds->samplesperblock = SDS_AUDIO_BYTES_PER_BLOCK / 3 ; - } - else - { psds->reader = sds_4byte_read ; - psds->writer = sds_4byte_write ; - psds->samplesperblock = SDS_AUDIO_BYTES_PER_BLOCK / 4 ; - } ; - - if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) - { psf->read_short = sds_read_s ; - psf->read_int = sds_read_i ; - psf->read_float = sds_read_f ; - psf->read_double = sds_read_d ; - - /* Read first block. */ - psds->reader (psf, psds) ; - } ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { psf->write_short = sds_write_s ; - psf->write_int = sds_write_i ; - psf->write_float = sds_write_f ; - psf->write_double = sds_write_d ; - } ; - - return 0 ; -} /* sds_init */ - -static int -sds_read_header (SF_PRIVATE *psf, SDS_PRIVATE *psds) -{ unsigned char channel, bitwidth, loop_type, byte ; - unsigned short sample_no, marker ; - unsigned int samp_period, data_length, sustain_loop_start, sustain_loop_end ; - int bytesread, blockcount ; - - /* Set position to start of file to begin reading header. */ - bytesread = psf_binheader_readf (psf, "pE211", 0, &marker, &channel, &byte) ; - - if (marker != 0xF07E || byte != 0x01) - return SFE_SDS_NOT_SDS ; - - bytesread += psf_binheader_readf (psf, "e2", &sample_no) ; - sample_no = SDS_3BYTE_TO_INT_DECODE (sample_no) ; - - psf_log_printf (psf, "Midi Sample Dump Standard (.sds)\nF07E\n" - " Midi Channel : %d\n Sample Number : %d\n", - channel, sample_no) ; - - bytesread += psf_binheader_readf (psf, "e13", &bitwidth, &samp_period) ; - - samp_period = SDS_3BYTE_TO_INT_DECODE (samp_period) ; - - psds->bitwidth = bitwidth ; - - if (psds->bitwidth > 1) - psf_log_printf (psf, " Bit Width : %d\n", psds->bitwidth) ; - else - { psf_log_printf (psf, " Bit Width : %d (should be > 1)\n", psds->bitwidth) ; - return SFE_SDS_BAD_BIT_WIDTH ; - } ; - - if (samp_period > 0) - { psf->sf.samplerate = 1000000000 / samp_period ; - - psf_log_printf (psf, " Sample Period : %d\n" - " Sample Rate : %d\n", - samp_period, psf->sf.samplerate) ; - } - else - { psf->sf.samplerate = 16000 ; - - psf_log_printf (psf, " Sample Period : %d (should be > 0)\n" - " Sample Rate : %d (guessed)\n", - samp_period, psf->sf.samplerate) ; - } ; - - bytesread += psf_binheader_readf (psf, "e3331", &data_length, &sustain_loop_start, &sustain_loop_end, &loop_type) ; - - data_length = SDS_3BYTE_TO_INT_DECODE (data_length) ; - - psf->sf.frames = psds->frames = data_length ; - - sustain_loop_start = SDS_3BYTE_TO_INT_DECODE (sustain_loop_start) ; - sustain_loop_end = SDS_3BYTE_TO_INT_DECODE (sustain_loop_end) ; - - psf_log_printf (psf, " Sustain Loop\n" - " Start : %d\n" - " End : %d\n" - " Loop Type : %d\n", - sustain_loop_start, sustain_loop_end, loop_type) ; - - psf->dataoffset = SDS_DATA_OFFSET ; - psf->datalength = psf->filelength - psf->dataoffset ; - - bytesread += psf_binheader_readf (psf, "1", &byte) ; - if (byte != 0xF7) - psf_log_printf (psf, "bad end : %X\n", byte & 0xFF) ; - - for (blockcount = 0 ; bytesread < psf->filelength ; blockcount++) - { - bytesread += psf_fread (&marker, 1, 2, psf) ; - - if (marker == 0) - break ; - - psf_fseek (psf, SDS_BLOCK_SIZE - 2, SEEK_CUR) ; - bytesread += SDS_BLOCK_SIZE - 2 ; - } ; - - psf_log_printf (psf, "\nBlocks : %d\n", blockcount) ; - psds->total_blocks = blockcount ; - - psds->samplesperblock = SDS_AUDIO_BYTES_PER_BLOCK / ((psds->bitwidth + 6) / 7) ; - psf_log_printf (psf, "Samples/Block : %d\n", psds->samplesperblock) ; - - psf_log_printf (psf, "Frames : %d\n", blockcount * psds->samplesperblock) ; - - /* Always Mono */ - psf->sf.channels = 1 ; - psf->sf.sections = 1 ; - - /* - ** Lie to the user about PCM bit width. Always round up to - ** the next multiple of 8. - */ - switch ((psds->bitwidth + 7) / 8) - { case 1 : - psf->sf.format = SF_FORMAT_SDS | SF_FORMAT_PCM_S8 ; - break ; - - case 2 : - psf->sf.format = SF_FORMAT_SDS | SF_FORMAT_PCM_16 ; - break ; - - case 3 : - psf->sf.format = SF_FORMAT_SDS | SF_FORMAT_PCM_24 ; - break ; - - case 4 : - psf->sf.format = SF_FORMAT_SDS | SF_FORMAT_PCM_32 ; - break ; - - default : - psf_log_printf (psf, "*** Weird byte width (%d)\n", (psds->bitwidth + 7) / 8) ; - return SFE_SDS_BAD_BIT_WIDTH ; - } ; - - psf_fseek (psf, SDS_DATA_OFFSET, SEEK_SET) ; - - return 0 ; -} /* sds_read_header */ - -static int -sds_write_header (SF_PRIVATE *psf, int calc_length) -{ SDS_PRIVATE *psds ; - sf_count_t current ; - int samp_period, data_length, sustain_loop_start, sustain_loop_end ; - unsigned char loop_type = 0 ; - - if ((psds = (SDS_PRIVATE *) psf->codec_data) == NULL) - { psf_log_printf (psf, "*** Bad psf->codec_data ptr.\n") ; - return SFE_INTERNAL ; - } ; - - if (psf->pipeoffset > 0) - return 0 ; - - current = psf_ftell (psf) ; - - if (calc_length) - psf->sf.frames = psds->total_written ; - - if (psds->write_count > 0) - { int current_count = psds->write_count ; - int current_block = psds->write_block ; - - psds->writer (psf, psds) ; - - psf_fseek (psf, -1 * SDS_BLOCK_SIZE, SEEK_CUR) ; - - psds->write_count = current_count ; - psds->write_block = current_block ; - } ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - - if (psf->is_pipe == SF_FALSE) - psf_fseek (psf, 0, SEEK_SET) ; - - psf_binheader_writef (psf, "E211", 0xF07E, 0, 1) ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_S8 : - psds->bitwidth = 8 ; - break ; - case SF_FORMAT_PCM_16 : - psds->bitwidth = 16 ; - break ; - case SF_FORMAT_PCM_24 : - psds->bitwidth = 24 ; - break ; - default: - return SFE_SDS_BAD_BIT_WIDTH ; - } ; - - samp_period = SDS_INT_TO_3BYTE_ENCODE (1000000000 / psf->sf.samplerate) ; - - psf_binheader_writef (psf, "e213", 0, psds->bitwidth, samp_period) ; - - data_length = SDS_INT_TO_3BYTE_ENCODE (psds->total_written) ; - sustain_loop_start = SDS_INT_TO_3BYTE_ENCODE (0) ; - sustain_loop_end = SDS_INT_TO_3BYTE_ENCODE (0) ; - - psf_binheader_writef (psf, "e33311", data_length, sustain_loop_start, sustain_loop_end, loop_type, 0xF7) ; - - /* Header construction complete so write it out. */ - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - psf->dataoffset = psf->headindex ; - psf->datalength = psds->write_block * SDS_BLOCK_SIZE ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* sds_write_header */ - - -/*------------------------------------------------------------------------------ -*/ - -static int -sds_2byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) -{ unsigned char *ucptr, checksum ; - unsigned int sample ; - int k ; - - psds->read_block ++ ; - psds->read_count = 0 ; - - if (psds->read_block * psds->samplesperblock > psds->frames) - { memset (psds->read_samples, 0, psds->samplesperblock * sizeof (int)) ; - return 1 ; - } ; - - if ((k = psf_fread (psds->read_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) - psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, SDS_BLOCK_SIZE) ; - - if (psds->read_data [0] != 0xF0) - { printf ("Error A : %02X\n", psds->read_data [0] & 0xFF) ; - } ; - - checksum = psds->read_data [1] ; - if (checksum != 0x7E) - { printf ("Error 1 : %02X\n", checksum & 0xFF) ; - } - - for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++) - checksum ^= psds->read_data [k] ; - - checksum &= 0x7F ; - - if (checksum != psds->read_data [SDS_BLOCK_SIZE - 2]) - { psf_log_printf (psf, "Block %d : checksum is %02X should be %02X\n", psds->read_data [4], checksum, psds->read_data [SDS_BLOCK_SIZE - 2]) ; - } ; - - ucptr = psds->read_data + 5 ; - for (k = 0 ; k < 120 ; k += 2) - { sample = (ucptr [k] << 25) + (ucptr [k + 1] << 18) ; - psds->read_samples [k / 2] = (int) (sample - 0x80000000) ; - } ; - - return 1 ; -} /* sds_2byte_read */ - -static int -sds_3byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) -{ unsigned char *ucptr, checksum ; - unsigned int sample ; - int k ; - - psds->read_block ++ ; - psds->read_count = 0 ; - - if (psds->read_block * psds->samplesperblock > psds->frames) - { memset (psds->read_samples, 0, psds->samplesperblock * sizeof (int)) ; - return 1 ; - } ; - - if ((k = psf_fread (psds->read_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) - psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, SDS_BLOCK_SIZE) ; - - if (psds->read_data [0] != 0xF0) - { printf ("Error A : %02X\n", psds->read_data [0] & 0xFF) ; - } ; - - checksum = psds->read_data [1] ; - if (checksum != 0x7E) - { printf ("Error 1 : %02X\n", checksum & 0xFF) ; - } - - for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++) - checksum ^= psds->read_data [k] ; - - checksum &= 0x7F ; - - if (checksum != psds->read_data [SDS_BLOCK_SIZE - 2]) - { psf_log_printf (psf, "Block %d : checksum is %02X should be %02X\n", psds->read_data [4], checksum, psds->read_data [SDS_BLOCK_SIZE - 2]) ; - } ; - - ucptr = psds->read_data + 5 ; - for (k = 0 ; k < 120 ; k += 3) - { sample = (ucptr [k] << 25) + (ucptr [k + 1] << 18) + (ucptr [k + 2] << 11) ; - psds->read_samples [k / 3] = (int) (sample - 0x80000000) ; - } ; - - return 1 ; -} /* sds_3byte_read */ - -static int -sds_4byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) -{ unsigned char *ucptr, checksum ; - unsigned int sample ; - int k ; - - psds->read_block ++ ; - psds->read_count = 0 ; - - if (psds->read_block * psds->samplesperblock > psds->frames) - { memset (psds->read_samples, 0, psds->samplesperblock * sizeof (int)) ; - return 1 ; - } ; - - if ((k = psf_fread (psds->read_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) - psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, SDS_BLOCK_SIZE) ; - - if (psds->read_data [0] != 0xF0) - { printf ("Error A : %02X\n", psds->read_data [0] & 0xFF) ; - } ; - - checksum = psds->read_data [1] ; - if (checksum != 0x7E) - { printf ("Error 1 : %02X\n", checksum & 0xFF) ; - } - - for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++) - checksum ^= psds->read_data [k] ; - - checksum &= 0x7F ; - - if (checksum != psds->read_data [SDS_BLOCK_SIZE - 2]) - { psf_log_printf (psf, "Block %d : checksum is %02X should be %02X\n", psds->read_data [4], checksum, psds->read_data [SDS_BLOCK_SIZE - 2]) ; - } ; - - ucptr = psds->read_data + 5 ; - for (k = 0 ; k < 120 ; k += 4) - { sample = (ucptr [k] << 25) + (ucptr [k + 1] << 18) + (ucptr [k + 2] << 11) + (ucptr [k + 3] << 4) ; - psds->read_samples [k / 4] = (int) (sample - 0x80000000) ; - } ; - - return 1 ; -} /* sds_4byte_read */ - - -static sf_count_t -sds_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - SDS_PRIVATE *psds ; - int *iptr ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - - if (psf->codec_data == NULL) - return 0 ; - psds = (SDS_PRIVATE*) psf->codec_data ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = sds_read (psf, psds, iptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = iptr [k] >> 16 ; - total += count ; - len -= readcount ; - } ; - - return total ; -} /* sds_read_s */ - -static sf_count_t -sds_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ SDS_PRIVATE *psds ; - int total ; - - if (psf->codec_data == NULL) - return 0 ; - psds = (SDS_PRIVATE*) psf->codec_data ; - - total = sds_read (psf, psds, ptr, len) ; - - return total ; -} /* sds_read_i */ - -static sf_count_t -sds_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - SDS_PRIVATE *psds ; - int *iptr ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - float normfact ; - - if (psf->codec_data == NULL) - return 0 ; - psds = (SDS_PRIVATE*) psf->codec_data ; - - if (psf->norm_float == SF_TRUE) - normfact = 1.0 / 0x80000000 ; - else - normfact = 1.0 / (1 << psds->bitwidth) ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = sds_read (psf, psds, iptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * iptr [k] ; - total += count ; - len -= readcount ; - } ; - - return total ; -} /* sds_read_f */ - -static sf_count_t -sds_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - SDS_PRIVATE *psds ; - int *iptr ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - double normfact ; - - if (psf->codec_data == NULL) - return 0 ; - psds = (SDS_PRIVATE*) psf->codec_data ; - - if (psf->norm_double == SF_TRUE) - normfact = 1.0 / 0x80000000 ; - else - normfact = 1.0 / (1 << psds->bitwidth) ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = sds_read (psf, psds, iptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * iptr [k] ; - total += count ; - len -= readcount ; - } ; - - return total ; -} /* sds_read_d */ - -static int -sds_read (SF_PRIVATE *psf, SDS_PRIVATE *psds, int *ptr, int len) -{ int count, total = 0 ; - - while (total < len) - { if (psds->read_block * psds->samplesperblock >= psds->frames) - { memset (&(ptr [total]), 0, (len - total) * sizeof (int)) ; - return total ; - } ; - - if (psds->read_count >= psds->samplesperblock) - psds->reader (psf, psds) ; - - count = (psds->samplesperblock - psds->read_count) ; - count = (len - total > count) ? count : len - total ; - - memcpy (&(ptr [total]), &(psds->read_samples [psds->read_count]), count * sizeof (int)) ; - total += count ; - psds->read_count += count ; - } ; - - return total ; -} /* sds_read */ - -/*============================================================================== -*/ - -static sf_count_t -sds_seek (SF_PRIVATE *psf, int mode, sf_count_t seek_from_start) -{ SDS_PRIVATE *psds ; - sf_count_t file_offset ; - int newblock, newsample ; - - if ((psds = psf->codec_data) == NULL) - { psf->error = SFE_INTERNAL ; - return PSF_SEEK_ERROR ; - } ; - - if (psf->datalength < 0 || psf->dataoffset < 0) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - if (seek_from_start < 0 || seek_from_start > psf->sf.frames) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - if (mode == SFM_READ && psds->write_count > 0) - psds->writer (psf, psds) ; - - newblock = seek_from_start / psds->samplesperblock ; - newsample = seek_from_start % psds->samplesperblock ; - - switch (mode) - { case SFM_READ : - if (newblock > psds->total_blocks) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - file_offset = psf->dataoffset + newblock * SDS_BLOCK_SIZE ; - - if (psf_fseek (psf, file_offset, SEEK_SET) != file_offset) - { psf->error = SFE_SEEK_FAILED ; - return PSF_SEEK_ERROR ; - } ; - - psds->read_block = newblock ; - psds->reader (psf, psds) ; - psds->read_count = newsample ; - break ; - - case SFM_WRITE : - if (newblock > psds->total_blocks) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - file_offset = psf->dataoffset + newblock * SDS_BLOCK_SIZE ; - - if (psf_fseek (psf, file_offset, SEEK_SET) != file_offset) - { psf->error = SFE_SEEK_FAILED ; - return PSF_SEEK_ERROR ; - } ; - - psds->write_block = newblock ; - psds->reader (psf, psds) ; - psds->write_count = newsample ; - break ; - - default : - psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - break ; - } ; - - return seek_from_start ; -} /* sds_seek */ - -static int -sds_byterate (SF_PRIVATE * psf) -{ - if (psf->file.mode == SFM_READ) - return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ; - - return -1 ; -} /* sds_byterate */ - -/*============================================================================== -*/ - -static int -sds_2byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) -{ unsigned char *ucptr, checksum ; - unsigned int sample ; - int k ; - - psds->write_data [0] = 0xF0 ; - psds->write_data [1] = 0x7E ; - psds->write_data [2] = 0 ; /* Channel number */ - psds->write_data [3] = 2 ; - psds->write_data [4] = psds->write_block & 0x7F ; /* Packet number */ - - ucptr = psds->write_data + 5 ; - for (k = 0 ; k < 120 ; k += 2) - { sample = psds->write_samples [k / 2] ; - sample += 0x80000000 ; - ucptr [k] = (sample >> 25) & 0x7F ; - ucptr [k + 1] = (sample >> 18) & 0x7F ; - } ; - - checksum = psds->write_data [1] ; - for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++) - checksum ^= psds->write_data [k] ; - checksum &= 0x7F ; - - psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ; - psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ; - - if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) - psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ; - - psds->write_block ++ ; - psds->write_count = 0 ; - - if (psds->write_block > psds->total_blocks) - psds->total_blocks = psds->write_block ; - psds->frames = psds->total_blocks * psds->samplesperblock ; - - return 1 ; -} /* sds_2byte_write */ - -static int -sds_3byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) -{ unsigned char *ucptr, checksum ; - unsigned int sample ; - int k ; - - psds->write_data [0] = 0xF0 ; - psds->write_data [1] = 0x7E ; - psds->write_data [2] = 0 ; /* Channel number */ - psds->write_data [3] = 2 ; - psds->write_data [4] = psds->write_block & 0x7F ; /* Packet number */ - - ucptr = psds->write_data + 5 ; - for (k = 0 ; k < 120 ; k += 3) - { sample = psds->write_samples [k / 3] ; - sample += 0x80000000 ; - ucptr [k] = (sample >> 25) & 0x7F ; - ucptr [k + 1] = (sample >> 18) & 0x7F ; - ucptr [k + 2] = (sample >> 11) & 0x7F ; - } ; - - checksum = psds->write_data [1] ; - for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++) - checksum ^= psds->write_data [k] ; - checksum &= 0x7F ; - - psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ; - psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ; - - if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) - psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ; - - psds->write_block ++ ; - psds->write_count = 0 ; - - if (psds->write_block > psds->total_blocks) - psds->total_blocks = psds->write_block ; - psds->frames = psds->total_blocks * psds->samplesperblock ; - - return 1 ; -} /* sds_3byte_write */ - -static int -sds_4byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) -{ unsigned char *ucptr, checksum ; - unsigned int sample ; - int k ; - - psds->write_data [0] = 0xF0 ; - psds->write_data [1] = 0x7E ; - psds->write_data [2] = 0 ; /* Channel number */ - psds->write_data [3] = 2 ; - psds->write_data [4] = psds->write_block & 0x7F ; /* Packet number */ - - ucptr = psds->write_data + 5 ; - for (k = 0 ; k < 120 ; k += 4) - { sample = psds->write_samples [k / 4] ; - sample += 0x80000000 ; - ucptr [k] = (sample >> 25) & 0x7F ; - ucptr [k + 1] = (sample >> 18) & 0x7F ; - ucptr [k + 2] = (sample >> 11) & 0x7F ; - ucptr [k + 3] = (sample >> 4) & 0x7F ; - } ; - - checksum = psds->write_data [1] ; - for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++) - checksum ^= psds->write_data [k] ; - checksum &= 0x7F ; - - psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ; - psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ; - - if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) - psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ; - - psds->write_block ++ ; - psds->write_count = 0 ; - - if (psds->write_block > psds->total_blocks) - psds->total_blocks = psds->write_block ; - psds->frames = psds->total_blocks * psds->samplesperblock ; - - return 1 ; -} /* sds_4byte_write */ - -static sf_count_t -sds_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - SDS_PRIVATE *psds ; - int *iptr ; - int k, bufferlen, writecount, count ; - sf_count_t total = 0 ; - - if (psf->codec_data == NULL) - return 0 ; - psds = (SDS_PRIVATE*) psf->codec_data ; - psds->total_written += len ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - iptr [k] = ptr [total + k] << 16 ; - count = sds_write (psf, psds, iptr, writecount) ; - total += count ; - len -= writecount ; - } ; - - return total ; -} /* sds_write_s */ - -static sf_count_t -sds_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ SDS_PRIVATE *psds ; - int total ; - - if (psf->codec_data == NULL) - return 0 ; - psds = (SDS_PRIVATE*) psf->codec_data ; - psds->total_written += len ; - - total = sds_write (psf, psds, ptr, len) ; - - return total ; -} /* sds_write_i */ - -static sf_count_t -sds_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - SDS_PRIVATE *psds ; - int *iptr ; - int k, bufferlen, writecount, count ; - sf_count_t total = 0 ; - float normfact ; - - if (psf->codec_data == NULL) - return 0 ; - psds = (SDS_PRIVATE*) psf->codec_data ; - psds->total_written += len ; - - if (psf->norm_float == SF_TRUE) - normfact = 1.0 * 0x80000000 ; - else - normfact = 1.0 * (1 << psds->bitwidth) ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - iptr [k] = normfact * ptr [total + k] ; - count = sds_write (psf, psds, iptr, writecount) ; - total += count ; - len -= writecount ; - } ; - - return total ; -} /* sds_write_f */ - -static sf_count_t -sds_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - SDS_PRIVATE *psds ; - int *iptr ; - int k, bufferlen, writecount, count ; - sf_count_t total = 0 ; - double normfact ; - - if (psf->codec_data == NULL) - return 0 ; - psds = (SDS_PRIVATE*) psf->codec_data ; - psds->total_written += len ; - - if (psf->norm_double == SF_TRUE) - normfact = 1.0 * 0x80000000 ; - else - normfact = 1.0 * (1 << psds->bitwidth) ; - - iptr = ubuf.ibuf ; - bufferlen = ARRAY_LEN (ubuf.ibuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : len ; - for (k = 0 ; k < writecount ; k++) - iptr [k] = normfact * ptr [total + k] ; - count = sds_write (psf, psds, iptr, writecount) ; - total += count ; - len -= writecount ; - } ; - - return total ; -} /* sds_write_d */ - -static int -sds_write (SF_PRIVATE *psf, SDS_PRIVATE *psds, const int *ptr, int len) -{ int count, total = 0 ; - - while (total < len) - { count = psds->samplesperblock - psds->write_count ; - if (count > len - total) - count = len - total ; - - memcpy (&(psds->write_samples [psds->write_count]), &(ptr [total]), count * sizeof (int)) ; - total += count ; - psds->write_count += count ; - - if (psds->write_count >= psds->samplesperblock) - psds->writer (psf, psds) ; - } ; - - return total ; -} /* sds_write */ - diff --git a/libs/libsndfile/src/sf_unistd.h b/libs/libsndfile/src/sf_unistd.h deleted file mode 100644 index 9fca68eff2..0000000000 --- a/libs/libsndfile/src/sf_unistd.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -** Copyright (C) 2002-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* Some defines that microsoft 'forgot' to implement. */ - -#ifndef S_IRWXU -#define S_IRWXU 0000700 /* rwx, owner */ -#endif - -#ifndef S_IRUSR -#define S_IRUSR 0000400 /* read permission, owner */ -#endif - -#ifndef S_IWUSR -#define S_IWUSR 0000200 /* write permission, owner */ -#endif - -#ifndef S_IXUSR -#define S_IXUSR 0000100 /* execute/search permission, owner */ -#endif - -/* Windows doesn't have group permissions so set all these to zero. */ -#define S_IRWXG 0 /* rwx, group */ -#define S_IRGRP 0 /* read permission, group */ -#define S_IWGRP 0 /* write permission, grougroup */ -#define S_IXGRP 0 /* execute/search permission, group */ - -/* Windows doesn't have others permissions so set all these to zero. */ -#define S_IRWXO 0 /* rwx, other */ -#define S_IROTH 0 /* read permission, other */ -#define S_IWOTH 0 /* write permission, other */ -#define S_IXOTH 0 /* execute/search permission, other */ - -#ifndef S_ISFIFO -#define S_ISFIFO(mode) (((mode) & _S_IFMT) == _S_IFIFO) -#endif - -#ifndef S_ISREG -#define S_ISREG(mode) (((mode) & _S_IFREG) == _S_IFREG) -#endif - -/* -** Don't know if these are still needed. -** -** #define _IFMT _S_IFMT -** #define _IFREG _S_IFREG -*/ - diff --git a/libs/libsndfile/src/sfconfig.h b/libs/libsndfile/src/sfconfig.h deleted file mode 100644 index b9b2dbda0d..0000000000 --- a/libs/libsndfile/src/sfconfig.h +++ /dev/null @@ -1,115 +0,0 @@ -/* -** Copyright (C) 2005-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* -** Autoconf leaves many config parameters undefined. -** Here we change then from being undefined to defining them to 0. -** This allows things like: -** -** #if HAVE_CONFIG_PARAM -** -** and -** -** if (HAVE_CONFIG_PARAM) -** do_something () ; -*/ - -#ifndef SFCONFIG_H -#define SFCONFIG_H - -/* Include the Autoconf generated file. */ -#include "config.h" - -/* Now fiddle the values. */ - -#ifndef HAVE_ALSA_ASOUNDLIB_H -#define HAVE_ALSA_ASOUNDLIB_H 0 -#endif - -#ifndef HAVE_BYTESWAP_H -#define HAVE_BYTESWAP_H 0 -#endif - -#ifndef HAVE_DECL_S_IRGRP -#define HAVE_DECL_S_IRGRP 0 -#endif - -#ifndef HAVE_ENDIAN_H -#define HAVE_ENDIAN_H 0 -#endif - -#ifndef HAVE_FSTAT64 -#define HAVE_FSTAT64 0 -#endif - -#ifndef HAVE_FSYNC -#define HAVE_FSYNC 0 -#endif - -#ifndef HAVE_LOCALE_H -#define HAVE_LOCALE_H 0 -#endif - -#ifndef HAVE_LRINT -#define HAVE_LRINT 0 -#endif - -#ifndef HAVE_LRINTF -#define HAVE_LRINTF 0 -#endif - -#ifndef HAVE_MMAP -#define HAVE_MMAP 0 -#endif - -#ifndef HAVE_SETLOCALE -#define HAVE_SETLOCALE 0 -#endif - -#ifndef HAVE_SQLITE3 -#define HAVE_SQLITE3 0 -#endif - -#ifndef HAVE_STDINT_H -#define HAVE_STDINT_H 0 -#endif - -#ifndef HAVE_SYS_WAIT_H -#define HAVE_SYS_WAIT_H 0 -#endif - -#ifndef HAVE_UNISTD_H -#define HAVE_UNISTD_H 0 -#endif - -#ifndef HAVE_PIPE -#define HAVE_PIPE 0 -#endif - -#ifndef HAVE_WAITPID -#define HAVE_WAITPID 0 -#endif - -#ifndef HAVE_X86INTRIN_H -#define HAVE_X86INTRIN_H 0 -#endif - -#define CPU_IS_X86 (defined __i486__ || defined __i586__ || defined __i686__ || defined __x86_64__) -#define CPU_IS_X86_64 (defined __x86_64__) - -#endif diff --git a/libs/libsndfile/src/sfendian.h b/libs/libsndfile/src/sfendian.h deleted file mode 100644 index 044fa3a77f..0000000000 --- a/libs/libsndfile/src/sfendian.h +++ /dev/null @@ -1,296 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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 SFENDIAN_INCLUDED -#define SFENDIAN_INCLUDED - -#include "sfconfig.h" - -#include -#ifndef WIN32 -#include -#endif - - -#if COMPILER_IS_GCC && CPU_IS_X86 - -static inline int16_t -ENDSWAP_16 (int16_t x) -{ int16_t y ; - __asm__ ("rorw $8, %w0" : "=r" (y) : "0" (x) : "cc") ; - return y ; -} /* ENDSWAP_16 */ - -static inline int32_t -ENDSWAP_32 (int32_t x) -{ int32_t y ; - __asm__ ("bswap %0" : "=r" (y) : "0" (x)) ; - return y ; -} /* ENDSWAP_32 */ - -#if CPU_IS_X86_64 - -static inline int64_t -ENDSWAP_64X (int64_t x) -{ int64_t y ; - __asm__ ("bswap %q0" : "=r" (y) : "0" (x)) ; - return y ; -} /* ENDSWAP_64X */ - -#define ENDSWAP_64 ENDSWAP_64X - -#endif - -#elif HAVE_BYTESWAP_H /* Linux, any CPU */ -#include - -#define ENDSWAP_16(x) (bswap_16 (x)) -#define ENDSWAP_32(x) (bswap_32 (x)) -#define ENDSWAP_64(x) (bswap_64 (x)) - -#else - -#define ENDSWAP_16(x) ((((x) >> 8) & 0xFF) + (((x) & 0xFF) << 8)) -#define ENDSWAP_32(x) ((((x) >> 24) & 0xFF) + (((x) >> 8) & 0xFF00) + (((x) & 0xFF00) << 8) + (((x) & 0xFF) << 24)) - -#endif - -#ifndef ENDSWAP_64 -static inline uint64_t -ENDSWAP_64 (uint64_t x) -{ union - { uint32_t parts [2] ; - uint64_t whole ; - } u ; - uint32_t temp ; - - u.whole = x ; - temp = u.parts [0] ; - u.parts [0] = ENDSWAP_32 (u.parts [1]) ; - u.parts [1] = ENDSWAP_32 (temp) ; - return u.whole ; -} -#endif - -/* -** Many file types (ie WAV, AIFF) use sets of four consecutive bytes as a -** marker indicating different sections of the file. -** The following MAKE_MARKER macro allows th creation of integer constants -** for these markers. -*/ - -#if (CPU_IS_LITTLE_ENDIAN == 1) - #define MAKE_MARKER(a, b, c, d) ((uint32_t) ((a) | ((b) << 8) | ((c) << 16) | (((uint32_t) (d)) << 24))) -#elif (CPU_IS_BIG_ENDIAN == 1) - #define MAKE_MARKER(a, b, c, d) ((uint32_t) ((((uint32_t) (a)) << 24) | ((b) << 16) | ((c) << 8) | (d))) -#else - #error "Target CPU endian-ness unknown. May need to hand edit src/sfconfig.h" -#endif - -/* -** Macros to handle reading of data of a specific endian-ness into host endian -** shorts and ints. The single input is an unsigned char* pointer to the start -** of the object. There are two versions of each macro as we need to deal with -** both big and little endian CPUs. -*/ - -#if (CPU_IS_LITTLE_ENDIAN == 1) - #define LE2H_16(x) (x) - #define LE2H_32(x) (x) - - #define BE2H_16(x) ENDSWAP_16 (x) - #define BE2H_32(x) ENDSWAP_32 (x) - #define BE2H_64(x) ENDSWAP_64 (x) - - #define H2BE_16(x) ENDSWAP_16 (x) - #define H2BE_32(x) ENDSWAP_32 (x) - -#elif (CPU_IS_BIG_ENDIAN == 1) - #define LE2H_16(x) ENDSWAP_16 (x) - #define LE2H_32(x) ENDSWAP_32 (x) - - #define BE2H_16(x) (x) - #define BE2H_32(x) (x) - #define BE2H_64(x) (x) - - #define H2BE_16(x) (x) - #define H2BE_32(x) (x) - - #define H2LE_16(x) ENDSWAP_16 (x) - #define H2LE_32(x) ENDSWAP_32 (x) - -#else - #error "Target CPU endian-ness unknown. May need to hand edit src/sfconfig.h" -#endif - -#define LET2H_16_PTR(x) ((x) [1] + ((x) [2] << 8)) -#define LET2H_32_PTR(x) (((x) [0] << 8) + ((x) [1] << 16) + ((x) [2] << 24)) - -#define BET2H_16_PTR(x) (((x) [0] << 8) + (x) [1]) -#define BET2H_32_PTR(x) (((x) [0] << 24) + ((x) [1] << 16) + ((x) [2] << 8)) - -static inline void -psf_put_be64 (uint8_t *ptr, int offset, int64_t value) -{ - ptr [offset] = value >> 56 ; - ptr [offset + 1] = value >> 48 ; - ptr [offset + 2] = value >> 40 ; - ptr [offset + 3] = value >> 32 ; - ptr [offset + 4] = value >> 24 ; - ptr [offset + 5] = value >> 16 ; - ptr [offset + 6] = value >> 8 ; - ptr [offset + 7] = value ; -} /* psf_put_be64 */ - -static inline void -psf_put_be32 (uint8_t *ptr, int offset, int32_t value) -{ - ptr [offset] = value >> 24 ; - ptr [offset + 1] = value >> 16 ; - ptr [offset + 2] = value >> 8 ; - ptr [offset + 3] = value ; -} /* psf_put_be32 */ - -static inline void -psf_put_be16 (uint8_t *ptr, int offset, int16_t value) -{ - ptr [offset] = value >> 8 ; - ptr [offset + 1] = value ; -} /* psf_put_be16 */ - -static inline int64_t -psf_get_be64 (uint8_t *ptr, int offset) -{ int64_t value ; - - value = ptr [offset] << 24 ; - value += ptr [offset + 1] << 16 ; - value += ptr [offset + 2] << 8 ; - value += ptr [offset + 3] ; - - value <<= 32 ; - - value += ptr [offset + 4] << 24 ; - value += ptr [offset + 5] << 16 ; - value += ptr [offset + 6] << 8 ; - value += ptr [offset + 7] ; - return value ; -} /* psf_get_be64 */ - -static inline int32_t -psf_get_be32 (uint8_t *ptr, int offset) -{ int32_t value ; - - value = ptr [offset] << 24 ; - value += ptr [offset + 1] << 16 ; - value += ptr [offset + 2] << 8 ; - value += ptr [offset + 3] ; - return value ; -} /* psf_get_be32 */ - -static inline int16_t -psf_get_be16 (uint8_t *ptr, int offset) -{ return (ptr [offset] << 8) + ptr [offset + 1] ; -} /* psf_get_be16 */ - -/*----------------------------------------------------------------------------------------------- -** Generic functions for performing endian swapping on integer arrays. -*/ - -static inline void -endswap_short_array (short *ptr, int len) -{ short temp ; - - while (--len >= 0) - { temp = ptr [len] ; - ptr [len] = ENDSWAP_16 (temp) ; - } ; -} /* endswap_short_array */ - -static inline void -endswap_short_copy (short *dest, const short *src, int len) -{ - while (--len >= 0) - { dest [len] = ENDSWAP_16 (src [len]) ; - } ; -} /* endswap_short_copy */ - -static inline void -endswap_int_array (int *ptr, int len) -{ int temp ; - - while (--len >= 0) - { temp = ptr [len] ; - ptr [len] = ENDSWAP_32 (temp) ; - } ; -} /* endswap_int_array */ - -static inline void -endswap_int_copy (int *dest, const int *src, int len) -{ - while (--len >= 0) - { dest [len] = ENDSWAP_32 (src [len]) ; - } ; -} /* endswap_int_copy */ - -/*======================================================================================== -*/ - -static inline void -endswap_int64_t_array (int64_t *ptr, int len) -{ int64_t value ; - - while (--len >= 0) - { value = ptr [len] ; - ptr [len] = ENDSWAP_64 (value) ; - } ; -} /* endswap_int64_t_array */ - -static inline void -endswap_int64_t_copy (int64_t *dest, const int64_t *src, int len) -{ int64_t value ; - - while (--len >= 0) - { value = src [len] ; - dest [len] = ENDSWAP_64 (value) ; - } ; -} /* endswap_int64_t_copy */ - -/* A couple of wrapper functions. */ - -static inline void -endswap_float_array (float *ptr, int len) -{ endswap_int_array ((int *) ptr, len) ; -} /* endswap_float_array */ - -static inline void -endswap_double_array (double *ptr, int len) -{ endswap_int64_t_array ((int64_t *) ptr, len) ; -} /* endswap_double_array */ - -static inline void -endswap_float_copy (float *dest, const float *src, int len) -{ endswap_int_copy ((int *) dest, (const int *) src, len) ; -} /* endswap_float_copy */ - -static inline void -endswap_double_copy (double *dest, const double *src, int len) -{ endswap_int64_t_copy ((int64_t *) dest, (const int64_t *) src, len) ; -} /* endswap_double_copy */ - -#endif /* SFENDIAN_INCLUDED */ - diff --git a/libs/libsndfile/src/sndfile.c b/libs/libsndfile/src/sndfile.c deleted file mode 100644 index cfe75ac4d9..0000000000 --- a/libs/libsndfile/src/sndfile.c +++ /dev/null @@ -1,3093 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#define SNDFILE_MAGICK 0x1234C0DE - -#ifdef __APPLE__ - /* - ** Detect if a compile for a universal binary is being attempted and barf if it is. - ** See the URL below for the rationale. - */ - #ifdef __BIG_ENDIAN__ - #if (CPU_IS_LITTLE_ENDIAN == 1) - #error "Universal binary compile detected. See http://www.mega-nerd.com/libsndfile/FAQ.html#Q018" - #endif - #endif - - #ifdef __LITTLE_ENDIAN__ - #if (CPU_IS_BIG_ENDIAN == 1) - #error "Universal binary compile detected. See http://www.mega-nerd.com/libsndfile/FAQ.html#Q018" - #endif - #endif -#endif - - -typedef struct -{ int error ; - const char *str ; -} ErrorStruct ; - -static -ErrorStruct SndfileErrors [] = -{ - /* Public error values and their associated strings. */ - { SF_ERR_NO_ERROR , "No Error." }, - { SF_ERR_UNRECOGNISED_FORMAT , "Format not recognised." }, - { SF_ERR_SYSTEM , "System error." /* Often replaced. */ }, - { SF_ERR_MALFORMED_FILE , "Supported file format but file is malformed." }, - { SF_ERR_UNSUPPORTED_ENCODING , "Supported file format but unsupported encoding." }, - - /* Private error values and their associated strings. */ - { SFE_ZERO_MAJOR_FORMAT , "Error : major format is 0." }, - { SFE_ZERO_MINOR_FORMAT , "Error : minor format is 0." }, - { SFE_BAD_FILE , "File does not exist or is not a regular file (possibly a pipe?)." }, - { SFE_BAD_FILE_READ , "File exists but no data could be read." }, - { SFE_OPEN_FAILED , "Could not open file." }, - { SFE_BAD_SNDFILE_PTR , "Not a valid SNDFILE* pointer." }, - { SFE_BAD_SF_INFO_PTR , "NULL SF_INFO pointer passed to libsndfile." }, - { SFE_BAD_SF_INCOMPLETE , "SF_PRIVATE struct incomplete and end of header parsing." }, - { SFE_BAD_FILE_PTR , "Bad FILE pointer." }, - { SFE_BAD_INT_PTR , "Internal error, Bad pointer." }, - { SFE_BAD_STAT_SIZE , "Error : software was misconfigured at compile time (sizeof statbuf.st_size)." }, - { SFE_NO_TEMP_DIR , "Error : Could not file temp dir." }, - - { SFE_MALLOC_FAILED , "Internal malloc () failed." }, - { SFE_UNIMPLEMENTED , "File contains data in an unimplemented format." }, - { SFE_BAD_READ_ALIGN , "Attempt to read a non-integer number of channels." }, - { SFE_BAD_WRITE_ALIGN , "Attempt to write a non-integer number of channels." }, - { SFE_UNKNOWN_FORMAT , "File contains data in an unknown format." }, - { SFE_NOT_READMODE , "Read attempted on file currently open for write." }, - { SFE_NOT_WRITEMODE , "Write attempted on file currently open for read." }, - { SFE_BAD_MODE_RW , "Error : This file format does not support read/write mode." }, - { SFE_BAD_SF_INFO , "Internal error : SF_INFO struct incomplete." }, - { SFE_BAD_OFFSET , "Error : supplied offset beyond end of file." }, - { SFE_NO_EMBED_SUPPORT , "Error : embedding not supported for this file format." }, - { SFE_NO_EMBEDDED_RDWR , "Error : cannot open embedded file read/write." }, - { SFE_NO_PIPE_WRITE , "Error : this file format does not support pipe write." }, - { SFE_BAD_VIRTUAL_IO , "Error : bad pointer on SF_VIRTUAL_IO struct." }, - { SFE_BAD_BROADCAST_INFO_SIZE - , "Error : bad coding_history_size in SF_BROADCAST_INFO struct." }, - { SFE_BAD_BROADCAST_INFO_TOO_BIG - , "Error : SF_BROADCAST_INFO struct too large." }, - { SFE_BAD_CART_INFO_SIZE , "Error: SF_CART_INFO struct too large." }, - { SFE_BAD_CART_INFO_TOO_BIG , "Error: bag tag_text_size in SF_CART_INFO struct." }, - { SFE_INTERLEAVE_MODE , "Attempt to write to file with non-interleaved data." }, - { SFE_INTERLEAVE_SEEK , "Bad karma in seek during interleave read operation." }, - { SFE_INTERLEAVE_READ , "Bad karma in read during interleave read operation." }, - - { SFE_INTERNAL , "Unspecified internal error." }, - { SFE_BAD_COMMAND_PARAM , "Bad parameter passed to function sf_command." }, - { SFE_BAD_ENDIAN , "Bad endian-ness. Try default endian-ness" }, - { SFE_CHANNEL_COUNT_ZERO , "Channel count is zero." }, - { SFE_CHANNEL_COUNT , "Too many channels specified." }, - - { SFE_BAD_SEEK , "Internal psf_fseek() failed." }, - { SFE_NOT_SEEKABLE , "Seek attempted on unseekable file type." }, - { SFE_AMBIGUOUS_SEEK , "Error : combination of file open mode and seek command is ambiguous." }, - { SFE_WRONG_SEEK , "Error : invalid seek parameters." }, - { SFE_SEEK_FAILED , "Error : parameters OK, but psf_seek() failed." }, - - { SFE_BAD_OPEN_MODE , "Error : bad mode parameter for file open." }, - { SFE_OPEN_PIPE_RDWR , "Error : attempt to open a pipe in read/write mode." }, - { SFE_RDWR_POSITION , "Error on RDWR position (cryptic)." }, - { SFE_RDWR_BAD_HEADER , "Error : Cannot open file in read/write mode due to string data in header." }, - { SFE_CMD_HAS_DATA , "Error : Command fails because file already has audio data." }, - - { SFE_STR_NO_SUPPORT , "Error : File type does not support string data." }, - { SFE_STR_NOT_WRITE , "Error : Trying to set a string when file is not in write mode." }, - { SFE_STR_MAX_DATA , "Error : Maximum string data storage reached." }, - { SFE_STR_MAX_COUNT , "Error : Maximum string data count reached." }, - { SFE_STR_BAD_TYPE , "Error : Bad string data type." }, - { SFE_STR_NO_ADD_END , "Error : file type does not support strings added at end of file." }, - { SFE_STR_BAD_STRING , "Error : bad string." }, - { SFE_STR_WEIRD , "Error : Weird string error." }, - - { SFE_WAV_NO_RIFF , "Error in WAV file. No 'RIFF' chunk marker." }, - { SFE_WAV_NO_WAVE , "Error in WAV file. No 'WAVE' chunk marker." }, - { SFE_WAV_NO_FMT , "Error in WAV/W64/RF64 file. No 'fmt ' chunk marker." }, - { SFE_WAV_BAD_FMT , "Error in WAV/W64/RF64 file. Malformed 'fmt ' chunk." }, - { SFE_WAV_FMT_SHORT , "Error in WAV/W64/RF64 file. Short 'fmt ' chunk." }, - - { SFE_WAV_BAD_FACT , "Error in WAV file. 'fact' chunk out of place." }, - { SFE_WAV_BAD_PEAK , "Error in WAV file. Bad 'PEAK' chunk." }, - { SFE_WAV_PEAK_B4_FMT , "Error in WAV file. 'PEAK' chunk found before 'fmt ' chunk." }, - - { SFE_WAV_BAD_FORMAT , "Error in WAV file. Errors in 'fmt ' chunk." }, - { SFE_WAV_BAD_BLOCKALIGN , "Error in WAV file. Block alignment in 'fmt ' chunk is incorrect." }, - { SFE_WAV_NO_DATA , "Error in WAV file. No 'data' chunk marker." }, - { SFE_WAV_BAD_LIST , "Error in WAV file. Malformed LIST chunk." }, - { SFE_WAV_UNKNOWN_CHUNK , "Error in WAV file. File contains an unknown chunk marker." }, - { SFE_WAV_WVPK_DATA , "Error in WAV file. Data is in WAVPACK format." }, - - { SFE_WAV_ADPCM_NOT4BIT , "Error in ADPCM WAV file. Invalid bit width." }, - { SFE_WAV_ADPCM_CHANNELS , "Error in ADPCM WAV file. Invalid number of channels." }, - { SFE_WAV_GSM610_FORMAT , "Error in GSM610 WAV file. Invalid format chunk." }, - - { SFE_AIFF_NO_FORM , "Error in AIFF file, bad 'FORM' marker." }, - { SFE_AIFF_AIFF_NO_FORM , "Error in AIFF file, 'AIFF' marker without 'FORM'." }, - { SFE_AIFF_COMM_NO_FORM , "Error in AIFF file, 'COMM' marker without 'FORM'." }, - { SFE_AIFF_SSND_NO_COMM , "Error in AIFF file, 'SSND' marker without 'COMM'." }, - { SFE_AIFF_UNKNOWN_CHUNK , "Error in AIFF file, unknown chunk." }, - { SFE_AIFF_COMM_CHUNK_SIZE, "Error in AIFF file, bad 'COMM' chunk size." }, - { SFE_AIFF_BAD_COMM_CHUNK , "Error in AIFF file, bad 'COMM' chunk." }, - { SFE_AIFF_PEAK_B4_COMM , "Error in AIFF file. 'PEAK' chunk found before 'COMM' chunk." }, - { SFE_AIFF_BAD_PEAK , "Error in AIFF file. Bad 'PEAK' chunk." }, - { SFE_AIFF_NO_SSND , "Error in AIFF file, bad 'SSND' chunk." }, - { SFE_AIFF_NO_DATA , "Error in AIFF file, no sound data." }, - { SFE_AIFF_RW_SSND_NOT_LAST, "Error in AIFF file, RDWR only possible if SSND chunk at end of file." }, - - { SFE_AU_UNKNOWN_FORMAT , "Error in AU file, unknown format." }, - { SFE_AU_NO_DOTSND , "Error in AU file, missing '.snd' or 'dns.' marker." }, - { SFE_AU_EMBED_BAD_LEN , "Embedded AU file with unknown length." }, - - { SFE_RAW_READ_BAD_SPEC , "Error while opening RAW file for read. Must specify format and channels.\n" - "Possibly trying to open unsupported format." }, - { SFE_RAW_BAD_BITWIDTH , "Error. RAW file bitwidth must be a multiple of 8." }, - { SFE_RAW_BAD_FORMAT , "Error. Bad format field in SF_INFO struct when openning a RAW file for read." }, - - { SFE_PAF_NO_MARKER , "Error in PAF file, no marker." }, - { SFE_PAF_VERSION , "Error in PAF file, bad version." }, - { SFE_PAF_UNKNOWN_FORMAT , "Error in PAF file, unknown format." }, - { SFE_PAF_SHORT_HEADER , "Error in PAF file. File shorter than minimal header." }, - { SFE_PAF_BAD_CHANNELS , "Error in PAF file. Bad channel count." }, - - { SFE_SVX_NO_FORM , "Error in 8SVX / 16SV file, no 'FORM' marker." }, - { SFE_SVX_NO_BODY , "Error in 8SVX / 16SV file, no 'BODY' marker." }, - { SFE_SVX_NO_DATA , "Error in 8SVX / 16SV file, no sound data." }, - { SFE_SVX_BAD_COMP , "Error in 8SVX / 16SV file, unsupported compression format." }, - { SFE_SVX_BAD_NAME_LENGTH , "Error in 8SVX / 16SV file, NAME chunk too long." }, - - { SFE_NIST_BAD_HEADER , "Error in NIST file, bad header." }, - { SFE_NIST_CRLF_CONVERISON, "Error : NIST file damaged by Windows CR -> CRLF conversion process." }, - { SFE_NIST_BAD_ENCODING , "Error in NIST file, unsupported compression format." }, - - { SFE_VOC_NO_CREATIVE , "Error in VOC file, no 'Creative Voice File' marker." }, - { SFE_VOC_BAD_FORMAT , "Error in VOC file, bad format." }, - { SFE_VOC_BAD_VERSION , "Error in VOC file, bad version number." }, - { SFE_VOC_BAD_MARKER , "Error in VOC file, bad marker in file." }, - { SFE_VOC_BAD_SECTIONS , "Error in VOC file, incompatible VOC sections." }, - { SFE_VOC_MULTI_SAMPLERATE, "Error in VOC file, more than one sample rate defined." }, - { SFE_VOC_MULTI_SECTION , "Unimplemented VOC file feature, file contains multiple sound sections." }, - { SFE_VOC_MULTI_PARAM , "Error in VOC file, file contains multiple bit or channel widths." }, - { SFE_VOC_SECTION_COUNT , "Error in VOC file, too many sections." }, - { SFE_VOC_NO_PIPE , "Error : not able to operate on VOC files over a pipe." }, - - { SFE_IRCAM_NO_MARKER , "Error in IRCAM file, bad IRCAM marker." }, - { SFE_IRCAM_BAD_CHANNELS , "Error in IRCAM file, bad channel count." }, - { SFE_IRCAM_UNKNOWN_FORMAT, "Error in IRCAM file, unknow encoding format." }, - - { SFE_W64_64_BIT , "Error in W64 file, file contains 64 bit offset." }, - { SFE_W64_NO_RIFF , "Error in W64 file. No 'riff' chunk marker." }, - { SFE_W64_NO_WAVE , "Error in W64 file. No 'wave' chunk marker." }, - { SFE_W64_NO_DATA , "Error in W64 file. No 'data' chunk marker." }, - { SFE_W64_ADPCM_NOT4BIT , "Error in ADPCM W64 file. Invalid bit width." }, - { SFE_W64_ADPCM_CHANNELS , "Error in ADPCM W64 file. Invalid number of channels." }, - { SFE_W64_GSM610_FORMAT , "Error in GSM610 W64 file. Invalid format chunk." }, - - { SFE_MAT4_BAD_NAME , "Error in MAT4 file. No variable name." }, - { SFE_MAT4_NO_SAMPLERATE , "Error in MAT4 file. No sample rate." }, - - { SFE_MAT5_BAD_ENDIAN , "Error in MAT5 file. Not able to determine endian-ness." }, - { SFE_MAT5_NO_BLOCK , "Error in MAT5 file. Bad block structure." }, - { SFE_MAT5_SAMPLE_RATE , "Error in MAT5 file. Not able to determine sample rate." }, - - { SFE_PVF_NO_PVF1 , "Error in PVF file. No PVF1 marker." }, - { SFE_PVF_BAD_HEADER , "Error in PVF file. Bad header." }, - { SFE_PVF_BAD_BITWIDTH , "Error in PVF file. Bad bit width." }, - - { SFE_XI_BAD_HEADER , "Error in XI file. Bad header." }, - { SFE_XI_EXCESS_SAMPLES , "Error in XI file. Excess samples in file." }, - { SFE_XI_NO_PIPE , "Error : not able to operate on XI files over a pipe." }, - - { SFE_HTK_NO_PIPE , "Error : not able to operate on HTK files over a pipe." }, - - { SFE_SDS_NOT_SDS , "Error : not an SDS file." }, - { SFE_SDS_BAD_BIT_WIDTH , "Error : bad bit width for SDS file." }, - - { SFE_SD2_FD_DISALLOWED , "Error : cannot open SD2 file without a file name." }, - { SFE_SD2_BAD_DATA_OFFSET , "Error : bad data offset." }, - { SFE_SD2_BAD_MAP_OFFSET , "Error : bad map offset." }, - { SFE_SD2_BAD_DATA_LENGTH , "Error : bad data length." }, - { SFE_SD2_BAD_MAP_LENGTH , "Error : bad map length." }, - { SFE_SD2_BAD_RSRC , "Error : bad resource fork." }, - { SFE_SD2_BAD_SAMPLE_SIZE , "Error : bad sample size." }, - - { SFE_FLAC_BAD_HEADER , "Error : bad flac header." }, - { SFE_FLAC_NEW_DECODER , "Error : problem while creating flac decoder." }, - { SFE_FLAC_INIT_DECODER , "Error : problem while initialization of the flac decoder." }, - { SFE_FLAC_LOST_SYNC , "Error : flac decoder lost sync." }, - { SFE_FLAC_BAD_SAMPLE_RATE, "Error : flac does not support this sample rate." }, - { SFE_FLAC_UNKOWN_ERROR , "Error : unknown error in flac decoder." }, - - { SFE_WVE_NOT_WVE , "Error : not a WVE file." }, - { SFE_WVE_NO_PIPE , "Error : not able to operate on WVE files over a pipe." }, - - { SFE_DWVW_BAD_BITWIDTH , "Error : Bad bit width for DWVW encoding. Must be 12, 16 or 24." }, - { SFE_G72X_NOT_MONO , "Error : G72x encoding does not support more than 1 channel." }, - - { SFE_VORBIS_ENCODER_BUG , "Error : Sample rate chosen is known to trigger a Vorbis encoder bug on this CPU." }, - - { SFE_RF64_NOT_RF64 , "Error : Not an RF64 file." }, - { SFE_ALAC_FAIL_TMPFILE , "Error : Failed to open tmp file for ALAC encoding." }, - - { SFE_BAD_CHUNK_PTR , "Error : Bad SF_CHUNK_INFO pointer." }, - { SFE_UNKNOWN_CHUNK , "Error : Unknown chunk marker." }, - { SFE_BAD_CHUNK_FORMAT , "Error : Reading/writing chunks from this file format is not supported." }, - { SFE_BAD_CHUNK_MARKER , "Error : Bad chunk marker." }, - { SFE_BAD_CHUNK_DATA_PTR , "Error : Bad data pointer in SF_CHUNK_INFO struct." }, - - { SFE_MAX_ERROR , "Maximum error number." }, - { SFE_MAX_ERROR + 1 , NULL } -} ; - -/*------------------------------------------------------------------------------ -*/ - -static int format_from_extension (SF_PRIVATE *psf) ; -static int guess_file_type (SF_PRIVATE *psf) ; -static int validate_sfinfo (SF_INFO *sfinfo) ; -static int validate_psf (SF_PRIVATE *psf) ; -static void save_header_info (SF_PRIVATE *psf) ; -static void copy_filename (SF_PRIVATE *psf, const char *path) ; -static int psf_close (SF_PRIVATE *psf) ; - -static int try_resource_fork (SF_PRIVATE * psf) ; - -/*------------------------------------------------------------------------------ -** Private (static) variables. -*/ - -int sf_errno = 0 ; -static char sf_parselog [SF_BUFFER_LEN] = { 0 } ; -static char sf_syserr [SF_SYSERR_LEN] = { 0 } ; - -/*------------------------------------------------------------------------------ -*/ - -#define VALIDATE_SNDFILE_AND_ASSIGN_PSF(a, b, c) \ - { if ((a) == NULL) \ - { sf_errno = SFE_BAD_SNDFILE_PTR ; \ - return 0 ; \ - } ; \ - (b) = (SF_PRIVATE*) (a) ; \ - if ((b)->virtual_io == SF_FALSE && \ - psf_file_valid (b) == 0) \ - { (b)->error = SFE_BAD_FILE_PTR ; \ - return 0 ; \ - } ; \ - if ((b)->Magick != SNDFILE_MAGICK) \ - { (b)->error = SFE_BAD_SNDFILE_PTR ; \ - return 0 ; \ - } ; \ - if (c) (b)->error = 0 ; \ - } - -/*------------------------------------------------------------------------------ -** Public functions. -*/ - -SNDFILE* -sf_open (const char *path, int mode, SF_INFO *sfinfo) -{ SF_PRIVATE *psf ; - - /* Ultimate sanity check. */ - assert (sizeof (sf_count_t) == 8) ; - - if ((psf = calloc (1, sizeof (SF_PRIVATE))) == NULL) - { sf_errno = SFE_MALLOC_FAILED ; - return NULL ; - } ; - - psf_init_files (psf) ; - - psf_log_printf (psf, "File : %s\n", path) ; - - copy_filename (psf, path) ; - - psf->file.mode = mode ; - if (strcmp (path, "-") == 0) - psf->error = psf_set_stdio (psf) ; - else - psf->error = psf_fopen (psf) ; - - return psf_open_file (psf, sfinfo) ; -} /* sf_open */ - -SNDFILE* -sf_open_fd (int fd, int mode, SF_INFO *sfinfo, int close_desc) -{ SF_PRIVATE *psf ; - - if ((SF_CONTAINER (sfinfo->format)) == SF_FORMAT_SD2) - { sf_errno = SFE_SD2_FD_DISALLOWED ; - return NULL ; - } ; - - if ((psf = calloc (1, sizeof (SF_PRIVATE))) == NULL) - { sf_errno = SFE_MALLOC_FAILED ; - return NULL ; - } ; - - psf_init_files (psf) ; - copy_filename (psf, "") ; - - psf->file.mode = mode ; - psf_set_file (psf, fd) ; - psf->is_pipe = psf_is_pipe (psf) ; - psf->fileoffset = psf_ftell (psf) ; - - if (! close_desc) - psf->file.do_not_close_descriptor = SF_TRUE ; - - return psf_open_file (psf, sfinfo) ; -} /* sf_open_fd */ - -SNDFILE* -sf_open_virtual (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) -{ SF_PRIVATE *psf ; - - /* Make sure we have a valid set ot virtual pointers. */ - if (sfvirtual->get_filelen == NULL || sfvirtual->seek == NULL || sfvirtual->tell == NULL) - { sf_errno = SFE_BAD_VIRTUAL_IO ; - snprintf (sf_parselog, sizeof (sf_parselog), "Bad vio_get_filelen / vio_seek / vio_tell in SF_VIRTUAL_IO struct.\n") ; - return NULL ; - } ; - - if ((mode == SFM_READ || mode == SFM_RDWR) && sfvirtual->read == NULL) - { sf_errno = SFE_BAD_VIRTUAL_IO ; - snprintf (sf_parselog, sizeof (sf_parselog), "Bad vio_read in SF_VIRTUAL_IO struct.\n") ; - return NULL ; - } ; - - if ((mode == SFM_WRITE || mode == SFM_RDWR) && sfvirtual->write == NULL) - { sf_errno = SFE_BAD_VIRTUAL_IO ; - snprintf (sf_parselog, sizeof (sf_parselog), "Bad vio_write in SF_VIRTUAL_IO struct.\n") ; - return NULL ; - } ; - - if ((psf = calloc (1, sizeof (SF_PRIVATE))) == NULL) - { sf_errno = SFE_MALLOC_FAILED ; - return NULL ; - } ; - - psf_init_files (psf) ; - - psf->virtual_io = SF_TRUE ; - psf->vio = *sfvirtual ; - psf->vio_user_data = user_data ; - - psf->file.mode = mode ; - - return psf_open_file (psf, sfinfo) ; -} /* sf_open_virtual */ - -int -sf_close (SNDFILE *sndfile) -{ SF_PRIVATE *psf ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - return psf_close (psf) ; -} /* sf_close */ - -void -sf_write_sync (SNDFILE *sndfile) -{ SF_PRIVATE *psf ; - - if ((psf = (SF_PRIVATE *) sndfile) == NULL) - return ; - - psf_fsync (psf) ; - - return ; -} /* sf_write_sync */ - -/*============================================================================== -*/ - -const char* -sf_error_number (int errnum) -{ static const char *bad_errnum = - "No error defined for this error number. This is a bug in libsndfile." ; - int k ; - - if (errnum == SFE_MAX_ERROR) - return SndfileErrors [0].str ; - - if (errnum < 0 || errnum > SFE_MAX_ERROR) - { /* This really shouldn't happen in release versions. */ - printf ("Not a valid error number (%d).\n", errnum) ; - return bad_errnum ; - } ; - - for (k = 0 ; SndfileErrors [k].str ; k++) - if (errnum == SndfileErrors [k].error) - return SndfileErrors [k].str ; - - return bad_errnum ; -} /* sf_error_number */ - -const char* -sf_strerror (SNDFILE *sndfile) -{ SF_PRIVATE *psf = NULL ; - int errnum ; - - if (sndfile == NULL) - { errnum = sf_errno ; - if (errnum == SFE_SYSTEM && sf_syserr [0]) - return sf_syserr ; - } - else - { psf = (SF_PRIVATE *) sndfile ; - - if (psf->Magick != SNDFILE_MAGICK) - return "sf_strerror : Bad magic number." ; - - errnum = psf->error ; - - if (errnum == SFE_SYSTEM && psf->syserr [0]) - return psf->syserr ; - } ; - - return sf_error_number (errnum) ; -} /* sf_strerror */ - -/*------------------------------------------------------------------------------ -*/ - -int -sf_error (SNDFILE *sndfile) -{ SF_PRIVATE *psf ; - - if (sndfile == NULL) - return sf_errno ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 0) ; - - if (psf->error) - return psf->error ; - - return 0 ; -} /* sf_error */ - -/*------------------------------------------------------------------------------ -*/ - -int -sf_perror (SNDFILE *sndfile) -{ SF_PRIVATE *psf ; - int errnum ; - - if (sndfile == NULL) - { errnum = sf_errno ; - } - else - { VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 0) ; - errnum = psf->error ; - } ; - - fprintf (stderr, "%s\n", sf_error_number (errnum)) ; - return SFE_NO_ERROR ; -} /* sf_perror */ - - -/*------------------------------------------------------------------------------ -*/ - -int -sf_error_str (SNDFILE *sndfile, char *str, size_t maxlen) -{ SF_PRIVATE *psf ; - int errnum ; - - if (str == NULL) - return SFE_INTERNAL ; - - if (sndfile == NULL) - errnum = sf_errno ; - else - { VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 0) ; - errnum = psf->error ; - } ; - - snprintf (str, maxlen, "%s", sf_error_number (errnum)) ; - - return SFE_NO_ERROR ; -} /* sf_error_str */ - -/*============================================================================== -*/ - -int -sf_format_check (const SF_INFO *info) -{ int subformat, endian ; - - subformat = SF_CODEC (info->format) ; - endian = SF_ENDIAN (info->format) ; - - /* This is the place where each file format can check if the suppiled - ** SF_INFO struct is valid. - ** Return 0 on failure, 1 ons success. - */ - - if (info->channels < 1 || info->channels > SF_MAX_CHANNELS) - return 0 ; - - if (info->samplerate < 0) - return 0 ; - - switch (SF_CONTAINER (info->format)) - { case SF_FORMAT_WAV : - /* WAV now allows both endian, RIFF or RIFX (little or big respectively) */ - if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16) - return 1 ; - if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) - return 1 ; - if ((subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) && info->channels <= 2) - return 1 ; - if (subformat == SF_FORMAT_GSM610 && info->channels == 1) - return 1 ; - if (subformat == SF_FORMAT_G721_32 && info->channels == 1) - return 1 ; - if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) - return 1 ; - if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) - return 1 ; - break ; - - case SF_FORMAT_WAVEX : - if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU) - return 0 ; - if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16) - return 1 ; - if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) - return 1 ; - if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) - return 1 ; - if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) - return 1 ; - break ; - - case SF_FORMAT_AIFF : - /* AIFF does allow both endian-nesses for PCM data.*/ - if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) - return 1 ; - /* For other encodings reject any endian-ness setting. */ - if (endian != 0) - return 0 ; - if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8) - return 1 ; - if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) - return 1 ; - if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) - return 1 ; - if ((subformat == SF_FORMAT_DWVW_12 || subformat == SF_FORMAT_DWVW_16 || - subformat == SF_FORMAT_DWVW_24) && info-> channels == 1) - return 1 ; - if (subformat == SF_FORMAT_GSM610 && info->channels == 1) - return 1 ; - if (subformat == SF_FORMAT_IMA_ADPCM && (info->channels == 1 || info->channels == 2)) - return 1 ; - break ; - - case SF_FORMAT_AU : - if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16) - return 1 ; - if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) - return 1 ; - if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) - return 1 ; - if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) - return 1 ; - if (subformat == SF_FORMAT_G721_32 && info->channels == 1) - return 1 ; - if (subformat == SF_FORMAT_G723_24 && info->channels == 1) - return 1 ; - if (subformat == SF_FORMAT_G723_40 && info->channels == 1) - return 1 ; - break ; - - case SF_FORMAT_CAF : - if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16) - return 1 ; - if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) - return 1 ; - if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) - return 1 ; - if (subformat == SF_FORMAT_ALAC_16 || subformat == SF_FORMAT_ALAC_20) - return 1 ; - if (subformat == SF_FORMAT_ALAC_24 || subformat == SF_FORMAT_ALAC_32) - return 1 ; - if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) - return 1 ; - break ; - - case SF_FORMAT_RAW : - if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16) - return 1 ; - if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) - return 1 ; - if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) - return 1 ; - if (subformat == SF_FORMAT_ALAW || subformat == SF_FORMAT_ULAW) - return 1 ; - if ((subformat == SF_FORMAT_DWVW_12 || subformat == SF_FORMAT_DWVW_16 || - subformat == SF_FORMAT_DWVW_24) && info-> channels == 1) - return 1 ; - if (subformat == SF_FORMAT_GSM610 && info->channels == 1) - return 1 ; - if (subformat == SF_FORMAT_VOX_ADPCM && info->channels == 1) - return 1 ; - break ; - - case SF_FORMAT_PAF : - if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24) - return 1 ; - break ; - - case SF_FORMAT_SVX : - /* SVX only supports writing mono SVX files. */ - if (info->channels > 1) - return 0 ; - /* Always big endian. */ - if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU) - return 0 ; - - if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16) - return 1 ; - break ; - - case SF_FORMAT_NIST : - if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16) - return 1 ; - if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) - return 1 ; - if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) - return 1 ; - break ; - - case SF_FORMAT_IRCAM : - if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32) - return 1 ; - if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW || subformat == SF_FORMAT_FLOAT) - return 1 ; - break ; - - case SF_FORMAT_VOC : - /* VOC is strictly little endian. */ - if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU) - return 0 ; - if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16) - return 1 ; - if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) - return 1 ; - break ; - - case SF_FORMAT_W64 : - /* W64 is strictly little endian. */ - if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU) - return 0 ; - if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16) - return 1 ; - if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) - return 1 ; - if ((subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) && info->channels <= 2) - return 1 ; - if (subformat == SF_FORMAT_GSM610 && info->channels == 1) - return 1 ; - if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) - return 1 ; - if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) - return 1 ; - break ; - - case SF_FORMAT_MAT4 : - if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32) - return 1 ; - if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) - return 1 ; - break ; - - case SF_FORMAT_MAT5 : - if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32) - return 1 ; - if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) - return 1 ; - break ; - - case SF_FORMAT_PVF : - if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32) - return 1 ; - break ; - - case SF_FORMAT_XI : - if (info->channels != 1) - return 0 ; - if (subformat == SF_FORMAT_DPCM_8 || subformat == SF_FORMAT_DPCM_16) - return 1 ; - break ; - - case SF_FORMAT_HTK : - /* HTK is strictly big endian. */ - if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU) - return 0 ; - if (info->channels != 1) - return 0 ; - if (subformat == SF_FORMAT_PCM_16) - return 1 ; - break ; - - case SF_FORMAT_SDS : - /* SDS is strictly big endian. */ - if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU) - return 0 ; - if (info->channels != 1) - return 0 ; - if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24) - return 1 ; - break ; - - case SF_FORMAT_AVR : - /* SDS is strictly big endian. */ - if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU) - return 0 ; - if (info->channels > 2) - return 0 ; - if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16) - return 1 ; - break ; - - case SF_FORMAT_FLAC : - /* FLAC can't do more than 8 channels. */ - if (info->channels > 8) - return 0 ; - if (endian != SF_ENDIAN_FILE) - return 0 ; - if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24) - return 1 ; - break ; - - case SF_FORMAT_SD2 : - /* SD2 is strictly big endian. */ - if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU) - return 0 ; - if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) - return 1 ; - break ; - - case SF_FORMAT_WVE : - /* WVE is strictly big endian. */ - if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU) - return 0 ; - if (info->channels > 1) - return 0 ; - if (subformat == SF_FORMAT_ALAW) - return 1 ; - break ; - - case SF_FORMAT_OGG : - if (endian != SF_ENDIAN_FILE) - return 0 ; - if (subformat == SF_FORMAT_VORBIS) - return 1 ; - break ; - - case SF_FORMAT_MPC2K : - /* MPC2000 is strictly little endian. */ - if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU) - return 0 ; - if (info->channels > 2) - return 0 ; - if (subformat == SF_FORMAT_PCM_16) - return 1 ; - break ; - - case SF_FORMAT_RF64 : - if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU) - return 0 ; - if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16) - return 1 ; - if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) - return 1 ; - if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) - return 1 ; - if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) - return 1 ; - break ; - default : break ; - } ; - - return 0 ; -} /* sf_format_check */ - -/*------------------------------------------------------------------------------ -*/ - -const char * -sf_version_string (void) -{ -#if ENABLE_EXPERIMENTAL_CODE - return PACKAGE_NAME "-" PACKAGE_VERSION "-exp" ; -#else - return PACKAGE_NAME "-" PACKAGE_VERSION ; -#endif -} - - -/*------------------------------------------------------------------------------ -*/ - -int -sf_command (SNDFILE *sndfile, int command, void *data, int datasize) -{ SF_PRIVATE *psf = (SF_PRIVATE *) sndfile ; - double quality ; - int old_value ; - - /* This set of commands do not need the sndfile parameter. */ - switch (command) - { case SFC_GET_LIB_VERSION : - if (data == NULL) - { if (psf) - psf->error = SFE_BAD_COMMAND_PARAM ; - return SFE_BAD_COMMAND_PARAM ; - } ; - snprintf (data, datasize, "%s", sf_version_string ()) ; - return strlen (data) ; - - case SFC_GET_SIMPLE_FORMAT_COUNT : - if (data == NULL || datasize != SIGNED_SIZEOF (int)) - return (sf_errno = SFE_BAD_COMMAND_PARAM) ; - *((int*) data) = psf_get_format_simple_count () ; - return 0 ; - - case SFC_GET_SIMPLE_FORMAT : - if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO)) - return (sf_errno = SFE_BAD_COMMAND_PARAM) ; - return psf_get_format_simple (data) ; - - case SFC_GET_FORMAT_MAJOR_COUNT : - if (data == NULL || datasize != SIGNED_SIZEOF (int)) - return (sf_errno = SFE_BAD_COMMAND_PARAM) ; - *((int*) data) = psf_get_format_major_count () ; - return 0 ; - - case SFC_GET_FORMAT_MAJOR : - if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO)) - return (sf_errno = SFE_BAD_COMMAND_PARAM) ; - return psf_get_format_major (data) ; - - case SFC_GET_FORMAT_SUBTYPE_COUNT : - if (data == NULL || datasize != SIGNED_SIZEOF (int)) - return (sf_errno = SFE_BAD_COMMAND_PARAM) ; - *((int*) data) = psf_get_format_subtype_count () ; - return 0 ; - - case SFC_GET_FORMAT_SUBTYPE : - if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO)) - return (sf_errno = SFE_BAD_COMMAND_PARAM) ; - return psf_get_format_subtype (data) ; - - case SFC_GET_FORMAT_INFO : - if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO)) - return (sf_errno = SFE_BAD_COMMAND_PARAM) ; - return psf_get_format_info (data) ; - } ; - - if (sndfile == NULL && command == SFC_GET_LOG_INFO) - { if (data == NULL) - return (sf_errno = SFE_BAD_COMMAND_PARAM) ; - snprintf (data, datasize, "%s", sf_parselog) ; - return strlen (data) ; - } ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - switch (command) - { case SFC_SET_NORM_FLOAT : - old_value = psf->norm_float ; - psf->norm_float = (datasize) ? SF_TRUE : SF_FALSE ; - return old_value ; - - case SFC_GET_CURRENT_SF_INFO : - if (data == NULL || datasize != SIGNED_SIZEOF (SF_INFO)) - return (sf_errno = SFE_BAD_COMMAND_PARAM) ; - memcpy (data, &psf->sf, sizeof (SF_INFO)) ; - break ; - - case SFC_SET_NORM_DOUBLE : - old_value = psf->norm_double ; - psf->norm_double = (datasize) ? SF_TRUE : SF_FALSE ; - return old_value ; - - case SFC_GET_NORM_FLOAT : - return psf->norm_float ; - - case SFC_GET_NORM_DOUBLE : - return psf->norm_double ; - - case SFC_SET_SCALE_FLOAT_INT_READ : - old_value = psf->float_int_mult ; - - psf->float_int_mult = (datasize != 0) ? SF_TRUE : SF_FALSE ; - if (psf->float_int_mult && psf->float_max < 0.0) - psf->float_max = psf_calc_signal_max (psf, SF_FALSE) ; - return old_value ; - - case SFC_SET_SCALE_INT_FLOAT_WRITE : - old_value = psf->scale_int_float ; - psf->scale_int_float = (datasize != 0) ? SF_TRUE : SF_FALSE ; - return old_value ; - - case SFC_SET_ADD_PEAK_CHUNK : - { int format = SF_CONTAINER (psf->sf.format) ; - - /* Only WAV and AIFF support the PEAK chunk. */ - switch (format) - { case SF_FORMAT_AIFF : - case SF_FORMAT_CAF : - case SF_FORMAT_WAV : - case SF_FORMAT_WAVEX : - break ; - - default : - return SF_FALSE ; - } ; - - format = SF_CODEC (psf->sf.format) ; - - /* Only files containg the following data types support the PEAK chunk. */ - if (format != SF_FORMAT_FLOAT && format != SF_FORMAT_DOUBLE) - return SF_FALSE ; - - } ; - /* Can only do this is in SFM_WRITE mode. */ - if (psf->file.mode != SFM_WRITE && psf->file.mode != SFM_RDWR) - return SF_FALSE ; - /* If data has already been written this must fail. */ - if (psf->have_written) - { psf->error = SFE_CMD_HAS_DATA ; - return SF_FALSE ; - } ; - /* Everything seems OK, so set psf->has_peak and re-write header. */ - if (datasize == SF_FALSE && psf->peak_info != NULL) - { free (psf->peak_info) ; - psf->peak_info = NULL ; - } - else if (psf->peak_info == NULL) - { psf->peak_info = peak_info_calloc (psf->sf.channels) ; - if (psf->peak_info != NULL) - psf->peak_info->peak_loc = SF_PEAK_START ; - } ; - - if (psf->write_header) - psf->write_header (psf, SF_TRUE) ; - return datasize ; - - case SFC_SET_ADD_HEADER_PAD_CHUNK : - return SF_FALSE ; - - case SFC_GET_LOG_INFO : - if (data == NULL) - return SFE_BAD_COMMAND_PARAM ; - snprintf (data, datasize, "%s", psf->parselog.buf) ; - break ; - - case SFC_CALC_SIGNAL_MAX : - if (data == NULL || datasize != sizeof (double)) - return (psf->error = SFE_BAD_COMMAND_PARAM) ; - *((double*) data) = psf_calc_signal_max (psf, SF_FALSE) ; - break ; - - case SFC_CALC_NORM_SIGNAL_MAX : - if (data == NULL || datasize != sizeof (double)) - return (psf->error = SFE_BAD_COMMAND_PARAM) ; - *((double*) data) = psf_calc_signal_max (psf, SF_TRUE) ; - break ; - - case SFC_CALC_MAX_ALL_CHANNELS : - if (data == NULL || datasize != SIGNED_SIZEOF (double) * psf->sf.channels) - return (psf->error = SFE_BAD_COMMAND_PARAM) ; - return psf_calc_max_all_channels (psf, (double*) data, SF_FALSE) ; - - case SFC_CALC_NORM_MAX_ALL_CHANNELS : - if (data == NULL || datasize != SIGNED_SIZEOF (double) * psf->sf.channels) - return (psf->error = SFE_BAD_COMMAND_PARAM) ; - return psf_calc_max_all_channels (psf, (double*) data, SF_TRUE) ; - - case SFC_GET_SIGNAL_MAX : - if (data == NULL || datasize != sizeof (double)) - { psf->error = SFE_BAD_COMMAND_PARAM ; - return SF_FALSE ; - } ; - return psf_get_signal_max (psf, (double *) data) ; - - case SFC_GET_MAX_ALL_CHANNELS : - if (data == NULL || datasize != SIGNED_SIZEOF (double) * psf->sf.channels) - { psf->error = SFE_BAD_COMMAND_PARAM ; - return SF_FALSE ; - } ; - return psf_get_max_all_channels (psf, (double*) data) ; - - case SFC_UPDATE_HEADER_NOW : - if (psf->write_header) - psf->write_header (psf, SF_TRUE) ; - break ; - - case SFC_SET_UPDATE_HEADER_AUTO : - psf->auto_header = datasize ? SF_TRUE : SF_FALSE ; - return psf->auto_header ; - break ; - - case SFC_SET_ADD_DITHER_ON_WRITE : - case SFC_SET_ADD_DITHER_ON_READ : - /* - ** FIXME ! - ** These are obsolete. Just return. - ** Remove some time after version 1.0.8. - */ - break ; - - case SFC_SET_DITHER_ON_WRITE : - if (data == NULL || datasize != SIGNED_SIZEOF (SF_DITHER_INFO)) - return (psf->error = SFE_BAD_COMMAND_PARAM) ; - memcpy (&psf->write_dither, data, sizeof (psf->write_dither)) ; - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - dither_init (psf, SFM_WRITE) ; - break ; - - case SFC_SET_DITHER_ON_READ : - if (data == NULL || datasize != SIGNED_SIZEOF (SF_DITHER_INFO)) - return (psf->error = SFE_BAD_COMMAND_PARAM) ; - memcpy (&psf->read_dither, data, sizeof (psf->read_dither)) ; - if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) - dither_init (psf, SFM_READ) ; - break ; - - case SFC_FILE_TRUNCATE : - if (psf->file.mode != SFM_WRITE && psf->file.mode != SFM_RDWR) - return SF_TRUE ; - if (datasize != sizeof (sf_count_t)) - return SF_TRUE ; - if (data == NULL || datasize != sizeof (sf_count_t)) - { psf->error = SFE_BAD_COMMAND_PARAM ; - return SF_FALSE ; - } - else - { sf_count_t position ; - - position = *((sf_count_t*) data) ; - - if (sf_seek (sndfile, position, SEEK_SET) != position) - return SF_TRUE ; - - psf->sf.frames = position ; - - position = psf_fseek (psf, 0, SEEK_CUR) ; - - return psf_ftruncate (psf, position) ; - } ; - break ; - - case SFC_SET_RAW_START_OFFSET : - if (data == NULL || datasize != sizeof (sf_count_t)) - return (psf->error = SFE_BAD_COMMAND_PARAM) ; - - if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_RAW) - return (psf->error = SFE_BAD_COMMAND_PARAM) ; - - psf->dataoffset = *((sf_count_t*) data) ; - sf_seek (sndfile, 0, SEEK_CUR) ; - break ; - - case SFC_GET_EMBED_FILE_INFO : - if (data == NULL || datasize != sizeof (SF_EMBED_FILE_INFO)) - return (psf->error = SFE_BAD_COMMAND_PARAM) ; - - ((SF_EMBED_FILE_INFO*) data)->offset = psf->fileoffset ; - ((SF_EMBED_FILE_INFO*) data)->length = psf->filelength ; - break ; - - /* Lite remove start */ - case SFC_TEST_IEEE_FLOAT_REPLACE : - psf->ieee_replace = (datasize) ? SF_TRUE : SF_FALSE ; - if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_FLOAT) - float32_init (psf) ; - else if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_DOUBLE) - double64_init (psf) ; - else - return (psf->error = SFE_BAD_COMMAND_PARAM) ; - break ; - /* Lite remove end */ - - case SFC_SET_CLIPPING : - psf->add_clipping = (datasize) ? SF_TRUE : SF_FALSE ; - return psf->add_clipping ; - - case SFC_GET_CLIPPING : - return psf->add_clipping ; - - case SFC_GET_LOOP_INFO : - if (datasize != sizeof (SF_LOOP_INFO) || data == NULL) - { psf->error = SFE_BAD_COMMAND_PARAM ; - return SF_FALSE ; - } ; - if (psf->loop_info == NULL) - return SF_FALSE ; - memcpy (data, psf->loop_info, sizeof (SF_LOOP_INFO)) ; - return SF_TRUE ; - - case SFC_SET_BROADCAST_INFO : - { int format = SF_CONTAINER (psf->sf.format) ; - - /* Only WAV and RF64 supports the BEXT (Broadcast) chunk. */ - if (format != SF_FORMAT_WAV && format != SF_FORMAT_WAVEX && format != SF_FORMAT_RF64) - return SF_FALSE ; - } ; - - /* Only makes sense in SFM_WRITE or SFM_RDWR mode. */ - if ((psf->file.mode != SFM_WRITE) && (psf->file.mode != SFM_RDWR)) - return SF_FALSE ; - /* If data has already been written this must fail. */ - if (psf->broadcast_16k == NULL && psf->have_written) - { psf->error = SFE_CMD_HAS_DATA ; - return SF_FALSE ; - } ; - - if (NOT (broadcast_var_set (psf, data, datasize))) - return SF_FALSE ; - - if (psf->write_header) - psf->write_header (psf, SF_TRUE) ; - return SF_TRUE ; - - case SFC_GET_BROADCAST_INFO : - if (data == NULL) - { psf->error = SFE_BAD_COMMAND_PARAM ; - return SF_FALSE ; - } ; - return broadcast_var_get (psf, data, datasize) ; - - case SFC_SET_CART_INFO : - { int format = SF_CONTAINER (psf->sf.format) ; - /* Only WAV and RF64 support cart chunk format */ - if (format != SF_FORMAT_WAV && format != SF_FORMAT_RF64) - return SF_FALSE ; - } ; - - /* Only makes sense in SFM_WRITE or SFM_RDWR mode */ - if ((psf->file.mode != SFM_WRITE) && (psf->file.mode != SFM_RDWR)) - return SF_FALSE ; - /* If data has already been written this must fail. */ - if (psf->cart_16k == NULL && psf->have_written) - { psf->error = SFE_CMD_HAS_DATA ; - return SF_FALSE ; - } ; - if (NOT (cart_var_set (psf, data, datasize))) - return SF_FALSE ; - if (psf->write_header) - psf->write_header (psf, SF_TRUE) ; - return SF_TRUE ; - - case SFC_GET_CART_INFO : - if (data == NULL) - { psf->error = SFE_BAD_COMMAND_PARAM ; - return SF_FALSE ; - } ; - return cart_var_get (psf, data, datasize) ; - - case SFC_GET_INSTRUMENT : - if (datasize != sizeof (SF_INSTRUMENT) || data == NULL) - { psf->error = SFE_BAD_COMMAND_PARAM ; - return SF_FALSE ; - } ; - if (psf->instrument == NULL) - return SF_FALSE ; - memcpy (data, psf->instrument, sizeof (SF_INSTRUMENT)) ; - return SF_TRUE ; - - case SFC_SET_INSTRUMENT : - /* If data has already been written this must fail. */ - if (psf->have_written) - { psf->error = SFE_CMD_HAS_DATA ; - return SF_FALSE ; - } ; - if (datasize != sizeof (SF_INSTRUMENT) || data == NULL) - { psf->error = SFE_BAD_COMMAND_PARAM ; - return SF_FALSE ; - } ; - - if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL) - { psf->error = SFE_MALLOC_FAILED ; - return SF_FALSE ; - } ; - memcpy (psf->instrument, data, sizeof (SF_INSTRUMENT)) ; - return SF_TRUE ; - - case SFC_RAW_DATA_NEEDS_ENDSWAP : - return psf->data_endswap ; - - case SFC_GET_CHANNEL_MAP_INFO : - if (psf->channel_map == NULL) - return SF_FALSE ; - - if (data == NULL || datasize != SIGNED_SIZEOF (psf->channel_map [0]) * psf->sf.channels) - { psf->error = SFE_BAD_COMMAND_PARAM ; - return SF_FALSE ; - } ; - - memcpy (data, psf->channel_map, datasize) ; - return SF_TRUE ; - - case SFC_SET_CHANNEL_MAP_INFO : - if (psf->have_written) - { psf->error = SFE_CMD_HAS_DATA ; - return SF_FALSE ; - } ; - if (data == NULL || datasize != SIGNED_SIZEOF (psf->channel_map [0]) * psf->sf.channels) - { psf->error = SFE_BAD_COMMAND_PARAM ; - return SF_FALSE ; - } ; - - { int *iptr ; - - for (iptr = data ; iptr < (int*) data + psf->sf.channels ; iptr++) - { if (*iptr <= SF_CHANNEL_MAP_INVALID || *iptr >= SF_CHANNEL_MAP_MAX) - { psf->error = SFE_BAD_COMMAND_PARAM ; - return SF_FALSE ; - } ; - } ; - } ; - - free (psf->channel_map) ; - if ((psf->channel_map = malloc (datasize)) == NULL) - { psf->error = SFE_MALLOC_FAILED ; - return SF_FALSE ; - } ; - - memcpy (psf->channel_map, data, datasize) ; - - /* - ** Pass the command down to the container's command handler. - ** Don't pass user data, use validated psf->channel_map data instead. - */ - if (psf->command) - return psf->command (psf, command, NULL, 0) ; - return SF_FALSE ; - - case SFC_SET_VBR_ENCODING_QUALITY : - if (data == NULL || datasize != sizeof (double)) - return SF_FALSE ; - - quality = *((double *) data) ; - quality = 1.0 - SF_MAX (0.0, SF_MIN (1.0, quality)) ; - return sf_command (sndfile, SFC_SET_COMPRESSION_LEVEL, &quality, sizeof (quality)) ; - - - default : - /* Must be a file specific command. Pass it on. */ - if (psf->command) - return psf->command (psf, command, data, datasize) ; - - psf_log_printf (psf, "*** sf_command : cmd = 0x%X\n", command) ; - return (psf->error = SFE_BAD_COMMAND_PARAM) ; - } ; - - return 0 ; -} /* sf_command */ - -/*------------------------------------------------------------------------------ -*/ - -sf_count_t -sf_seek (SNDFILE *sndfile, sf_count_t offset, int whence) -{ SF_PRIVATE *psf ; - sf_count_t seek_from_start = 0, retval ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (! psf->sf.seekable) - { psf->error = SFE_NOT_SEEKABLE ; - return PSF_SEEK_ERROR ; - } ; - - /* If the whence parameter has a mode ORed in, check to see that - ** it makes sense. - */ - if (((whence & SFM_MASK) == SFM_WRITE && psf->file.mode == SFM_READ) || - ((whence & SFM_MASK) == SFM_READ && psf->file.mode == SFM_WRITE)) - { psf->error = SFE_WRONG_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - /* Convert all SEEK_CUR and SEEK_END into seek_from_start to be - ** used with SEEK_SET. - */ - switch (whence) - { /* The SEEK_SET behaviour is independant of mode. */ - case SEEK_SET : - case SEEK_SET | SFM_READ : - case SEEK_SET | SFM_WRITE : - case SEEK_SET | SFM_RDWR : - seek_from_start = offset ; - break ; - - /* The SEEK_CUR is a little more tricky. */ - case SEEK_CUR : - if (offset == 0) - { if (psf->file.mode == SFM_READ) - return psf->read_current ; - if (psf->file.mode == SFM_WRITE) - return psf->write_current ; - } ; - if (psf->file.mode == SFM_READ) - seek_from_start = psf->read_current + offset ; - else if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - seek_from_start = psf->write_current + offset ; - else - psf->error = SFE_AMBIGUOUS_SEEK ; - break ; - - case SEEK_CUR | SFM_READ : - if (offset == 0) - return psf->read_current ; - seek_from_start = psf->read_current + offset ; - break ; - - case SEEK_CUR | SFM_WRITE : - if (offset == 0) - return psf->write_current ; - seek_from_start = psf->write_current + offset ; - break ; - - /* The SEEK_END */ - case SEEK_END : - case SEEK_END | SFM_READ : - case SEEK_END | SFM_WRITE : - seek_from_start = psf->sf.frames + offset ; - break ; - - default : - psf->error = SFE_BAD_SEEK ; - break ; - } ; - - if (psf->error) - return PSF_SEEK_ERROR ; - - if (psf->file.mode == SFM_RDWR || psf->file.mode == SFM_WRITE) - { if (seek_from_start < 0) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - } - else if (seek_from_start < 0 || seek_from_start > psf->sf.frames) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - if (psf->seek) - { int new_mode = (whence & SFM_MASK) ? (whence & SFM_MASK) : psf->file.mode ; - - retval = psf->seek (psf, new_mode, seek_from_start) ; - - switch (new_mode) - { case SFM_READ : - psf->read_current = retval ; - break ; - case SFM_WRITE : - psf->write_current = retval ; - break ; - case SFM_RDWR : - psf->read_current = retval ; - psf->write_current = retval ; - new_mode = SFM_READ ; - break ; - } ; - - psf->last_op = new_mode ; - - return retval ; - } ; - - psf->error = SFE_AMBIGUOUS_SEEK ; - return PSF_SEEK_ERROR ; -} /* sf_seek */ - -/*------------------------------------------------------------------------------ -*/ - -const char* -sf_get_string (SNDFILE *sndfile, int str_type) -{ SF_PRIVATE *psf ; - - if ((psf = (SF_PRIVATE*) sndfile) == NULL) - return NULL ; - if (psf->Magick != SNDFILE_MAGICK) - return NULL ; - - return psf_get_string (psf, str_type) ; -} /* sf_get_string */ - -int -sf_set_string (SNDFILE *sndfile, int str_type, const char* str) -{ SF_PRIVATE *psf ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - return psf_set_string (psf, str_type, str) ; -} /* sf_get_string */ - -/*------------------------------------------------------------------------------ -*/ - -int -sf_current_byterate (SNDFILE *sndfile) -{ SF_PRIVATE *psf ; - - if ((psf = (SF_PRIVATE*) sndfile) == NULL) - return -1 ; - if (psf->Magick != SNDFILE_MAGICK) - return -1 ; - - /* This should cover all PCM and floating point formats. */ - if (psf->bytewidth) - return psf->sf.samplerate * psf->sf.channels * psf->bytewidth ; - - if (psf->byterate) - return psf->byterate (psf) ; - - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_IMA_ADPCM : - case SF_FORMAT_MS_ADPCM : - case SF_FORMAT_VOX_ADPCM : - return (psf->sf.samplerate * psf->sf.channels) / 2 ; - - case SF_FORMAT_GSM610 : - return (psf->sf.samplerate * psf->sf.channels * 13000) / 8000 ; - - case SF_FORMAT_G721_32 : /* 32kbs G721 ADPCM encoding. */ - return (psf->sf.samplerate * psf->sf.channels) / 2 ; - - case SF_FORMAT_G723_24 : /* 24kbs G723 ADPCM encoding. */ - return (psf->sf.samplerate * psf->sf.channels * 3) / 8 ; - - case SF_FORMAT_G723_40 : /* 40kbs G723 ADPCM encoding. */ - return (psf->sf.samplerate * psf->sf.channels * 5) / 8 ; - - default : - break ; - } ; - - return -1 ; -} /* sf_current_byterate */ - -/*============================================================================== -*/ - -sf_count_t -sf_read_raw (SNDFILE *sndfile, void *ptr, sf_count_t bytes) -{ SF_PRIVATE *psf ; - sf_count_t count, extra ; - int bytewidth, blockwidth ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - bytewidth = (psf->bytewidth > 0) ? psf->bytewidth : 1 ; - blockwidth = (psf->blockwidth > 0) ? psf->blockwidth : 1 ; - - if (psf->file.mode == SFM_WRITE) - { psf->error = SFE_NOT_READMODE ; - return 0 ; - } ; - - if (bytes < 0 || psf->read_current >= psf->sf.frames) - { psf_memset (ptr, 0, bytes) ; - return 0 ; - } ; - - if (bytes % (psf->sf.channels * bytewidth)) - { psf->error = SFE_BAD_READ_ALIGN ; - return 0 ; - } ; - - if (psf->last_op != SFM_READ) - if (psf->seek (psf, SFM_READ, psf->read_current) < 0) - return 0 ; - - count = psf_fread (ptr, 1, bytes, psf) ; - - if (psf->read_current + count / blockwidth <= psf->sf.frames) - psf->read_current += count / blockwidth ; - else - { count = (psf->sf.frames - psf->read_current) * blockwidth ; - extra = bytes - count ; - psf_memset (((char *) ptr) + count, 0, extra) ; - psf->read_current = psf->sf.frames ; - } ; - - psf->last_op = SFM_READ ; - - return count ; -} /* sf_read_raw */ - -/*------------------------------------------------------------------------------ -*/ - -sf_count_t -sf_read_short (SNDFILE *sndfile, short *ptr, sf_count_t len) -{ SF_PRIVATE *psf ; - sf_count_t count, extra ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_WRITE) - { psf->error = SFE_NOT_READMODE ; - return 0 ; - } ; - - if (len % psf->sf.channels) - { psf->error = SFE_BAD_READ_ALIGN ; - return 0 ; - } ; - - if (len <= 0 || psf->read_current >= psf->sf.frames) - { psf_memset (ptr, 0, len * sizeof (short)) ; - return 0 ; /* End of file. */ - } ; - - if (psf->read_short == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_READ) - if (psf->seek (psf, SFM_READ, psf->read_current) < 0) - return 0 ; - - count = psf->read_short (psf, ptr, len) ; - - if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) - psf->read_current += count / psf->sf.channels ; - else - { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; - extra = len - count ; - psf_memset (ptr + count, 0, extra * sizeof (short)) ; - psf->read_current = psf->sf.frames ; - } ; - - psf->last_op = SFM_READ ; - - return count ; -} /* sf_read_short */ - -sf_count_t -sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) -{ SF_PRIVATE *psf ; - sf_count_t count, extra ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_WRITE) - { psf->error = SFE_NOT_READMODE ; - return 0 ; - } ; - - if (frames <= 0 || psf->read_current >= psf->sf.frames) - { psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (short)) ; - return 0 ; /* End of file. */ - } ; - - if (psf->read_short == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_READ) - if (psf->seek (psf, SFM_READ, psf->read_current) < 0) - return 0 ; - - count = psf->read_short (psf, ptr, frames * psf->sf.channels) ; - - if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) - psf->read_current += count / psf->sf.channels ; - else - { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; - extra = frames * psf->sf.channels - count ; - psf_memset (ptr + count, 0, extra * sizeof (short)) ; - psf->read_current = psf->sf.frames ; - } ; - - psf->last_op = SFM_READ ; - - return count / psf->sf.channels ; -} /* sf_readf_short */ - -/*------------------------------------------------------------------------------ -*/ - -sf_count_t -sf_read_int (SNDFILE *sndfile, int *ptr, sf_count_t len) -{ SF_PRIVATE *psf ; - sf_count_t count, extra ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_WRITE) - { psf->error = SFE_NOT_READMODE ; - return 0 ; - } ; - - if (len % psf->sf.channels) - { psf->error = SFE_BAD_READ_ALIGN ; - return 0 ; - } ; - - if (len <= 0 || psf->read_current >= psf->sf.frames) - { psf_memset (ptr, 0, len * sizeof (int)) ; - return 0 ; - } ; - - if (psf->read_int == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_READ) - if (psf->seek (psf, SFM_READ, psf->read_current) < 0) - return 0 ; - - count = psf->read_int (psf, ptr, len) ; - - if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) - psf->read_current += count / psf->sf.channels ; - else - { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; - extra = len - count ; - psf_memset (ptr + count, 0, extra * sizeof (int)) ; - psf->read_current = psf->sf.frames ; - } ; - - psf->last_op = SFM_READ ; - - return count ; -} /* sf_read_int */ - -sf_count_t -sf_readf_int (SNDFILE *sndfile, int *ptr, sf_count_t frames) -{ SF_PRIVATE *psf ; - sf_count_t count, extra ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_WRITE) - { psf->error = SFE_NOT_READMODE ; - return 0 ; - } ; - - if (frames <= 0 || psf->read_current >= psf->sf.frames) - { psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (int)) ; - return 0 ; - } ; - - if (psf->read_int == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_READ) - if (psf->seek (psf, SFM_READ, psf->read_current) < 0) - return 0 ; - - count = psf->read_int (psf, ptr, frames * psf->sf.channels) ; - - if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) - psf->read_current += count / psf->sf.channels ; - else - { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; - extra = frames * psf->sf.channels - count ; - psf_memset (ptr + count, 0, extra * sizeof (int)) ; - psf->read_current = psf->sf.frames ; - } ; - - psf->last_op = SFM_READ ; - - return count / psf->sf.channels ; -} /* sf_readf_int */ - -/*------------------------------------------------------------------------------ -*/ - -sf_count_t -sf_read_float (SNDFILE *sndfile, float *ptr, sf_count_t len) -{ SF_PRIVATE *psf ; - sf_count_t count, extra ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_WRITE) - { psf->error = SFE_NOT_READMODE ; - return 0 ; - } ; - - if (len % psf->sf.channels) - { psf->error = SFE_BAD_READ_ALIGN ; - return 0 ; - } ; - - if (len <= 0 || psf->read_current >= psf->sf.frames) - { psf_memset (ptr, 0, len * sizeof (float)) ; - return 0 ; - } ; - - if (psf->read_float == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_READ) - if (psf->seek (psf, SFM_READ, psf->read_current) < 0) - return 0 ; - - count = psf->read_float (psf, ptr, len) ; - - if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) - psf->read_current += count / psf->sf.channels ; - else - { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; - extra = len - count ; - psf_memset (ptr + count, 0, extra * sizeof (float)) ; - psf->read_current = psf->sf.frames ; - } ; - - psf->last_op = SFM_READ ; - - return count ; -} /* sf_read_float */ - -sf_count_t -sf_readf_float (SNDFILE *sndfile, float *ptr, sf_count_t frames) -{ SF_PRIVATE *psf ; - sf_count_t count, extra ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_WRITE) - { psf->error = SFE_NOT_READMODE ; - return 0 ; - } ; - - if (frames <= 0 || psf->read_current >= psf->sf.frames) - { psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (float)) ; - return 0 ; - } ; - - if (psf->read_float == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_READ) - if (psf->seek (psf, SFM_READ, psf->read_current) < 0) - return 0 ; - - count = psf->read_float (psf, ptr, frames * psf->sf.channels) ; - - if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) - psf->read_current += count / psf->sf.channels ; - else - { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; - extra = frames * psf->sf.channels - count ; - psf_memset (ptr + count, 0, extra * sizeof (float)) ; - psf->read_current = psf->sf.frames ; - } ; - - psf->last_op = SFM_READ ; - - return count / psf->sf.channels ; -} /* sf_readf_float */ - -/*------------------------------------------------------------------------------ -*/ - -sf_count_t -sf_read_double (SNDFILE *sndfile, double *ptr, sf_count_t len) -{ SF_PRIVATE *psf ; - sf_count_t count, extra ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_WRITE) - { psf->error = SFE_NOT_READMODE ; - return 0 ; - } ; - - if (len % psf->sf.channels) - { psf->error = SFE_BAD_READ_ALIGN ; - return 0 ; - } ; - - if (len <= 0 || psf->read_current >= psf->sf.frames) - { psf_memset (ptr, 0, len * sizeof (double)) ; - return 0 ; - } ; - - if (psf->read_double == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_READ) - if (psf->seek (psf, SFM_READ, psf->read_current) < 0) - return 0 ; - - count = psf->read_double (psf, ptr, len) ; - - if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) - psf->read_current += count / psf->sf.channels ; - else - { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; - extra = len - count ; - psf_memset (ptr + count, 0, extra * sizeof (double)) ; - psf->read_current = psf->sf.frames ; - } ; - - psf->last_op = SFM_READ ; - - return count ; -} /* sf_read_double */ - -sf_count_t -sf_readf_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) -{ SF_PRIVATE *psf ; - sf_count_t count, extra ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_WRITE) - { psf->error = SFE_NOT_READMODE ; - return 0 ; - } ; - - if (frames <= 0 || psf->read_current >= psf->sf.frames) - { psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (double)) ; - return 0 ; - } ; - - if (psf->read_double == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_READ) - if (psf->seek (psf, SFM_READ, psf->read_current) < 0) - return 0 ; - - count = psf->read_double (psf, ptr, frames * psf->sf.channels) ; - - if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) - psf->read_current += count / psf->sf.channels ; - else - { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; - extra = frames * psf->sf.channels - count ; - psf_memset (ptr + count, 0, extra * sizeof (double)) ; - psf->read_current = psf->sf.frames ; - } ; - - psf->last_op = SFM_READ ; - - return count / psf->sf.channels ; -} /* sf_readf_double */ - -/*------------------------------------------------------------------------------ -*/ - -sf_count_t -sf_write_raw (SNDFILE *sndfile, const void *ptr, sf_count_t len) -{ SF_PRIVATE *psf ; - sf_count_t count ; - int bytewidth, blockwidth ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - bytewidth = (psf->bytewidth > 0) ? psf->bytewidth : 1 ; - blockwidth = (psf->blockwidth > 0) ? psf->blockwidth : 1 ; - - if (psf->file.mode == SFM_READ) - { psf->error = SFE_NOT_WRITEMODE ; - return 0 ; - } ; - - if (len % (psf->sf.channels * bytewidth)) - { psf->error = SFE_BAD_WRITE_ALIGN ; - return 0 ; - } ; - - if (psf->last_op != SFM_WRITE) - if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) - return 0 ; - - if (psf->have_written == SF_FALSE && psf->write_header != NULL) - psf->write_header (psf, SF_FALSE) ; - psf->have_written = SF_TRUE ; - - count = psf_fwrite (ptr, 1, len, psf) ; - - psf->write_current += count / blockwidth ; - - psf->last_op = SFM_WRITE ; - - if (psf->write_current > psf->sf.frames) - { psf->sf.frames = psf->write_current ; - psf->dataend = 0 ; - } ; - - if (psf->auto_header && psf->write_header != NULL) - psf->write_header (psf, SF_TRUE) ; - - return count ; -} /* sf_write_raw */ - -/*------------------------------------------------------------------------------ -*/ - -sf_count_t -sf_write_short (SNDFILE *sndfile, const short *ptr, sf_count_t len) -{ SF_PRIVATE *psf ; - sf_count_t count ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_READ) - { psf->error = SFE_NOT_WRITEMODE ; - return 0 ; - } ; - - if (len % psf->sf.channels) - { psf->error = SFE_BAD_WRITE_ALIGN ; - return 0 ; - } ; - - if (psf->write_short == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_WRITE) - if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) - return 0 ; - - if (psf->have_written == SF_FALSE && psf->write_header != NULL) - psf->write_header (psf, SF_FALSE) ; - psf->have_written = SF_TRUE ; - - count = psf->write_short (psf, ptr, len) ; - - psf->write_current += count / psf->sf.channels ; - - psf->last_op = SFM_WRITE ; - - if (psf->write_current > psf->sf.frames) - { psf->sf.frames = psf->write_current ; - psf->dataend = 0 ; - } ; - - if (psf->auto_header && psf->write_header != NULL) - psf->write_header (psf, SF_TRUE) ; - - return count ; -} /* sf_write_short */ - -sf_count_t -sf_writef_short (SNDFILE *sndfile, const short *ptr, sf_count_t frames) -{ SF_PRIVATE *psf ; - sf_count_t count ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_READ) - { psf->error = SFE_NOT_WRITEMODE ; - return 0 ; - } ; - - if (psf->write_short == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_WRITE) - if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) - return 0 ; - - if (psf->have_written == SF_FALSE && psf->write_header != NULL) - psf->write_header (psf, SF_FALSE) ; - psf->have_written = SF_TRUE ; - - count = psf->write_short (psf, ptr, frames * psf->sf.channels) ; - - psf->write_current += count / psf->sf.channels ; - - psf->last_op = SFM_WRITE ; - - if (psf->write_current > psf->sf.frames) - { psf->sf.frames = psf->write_current ; - psf->dataend = 0 ; - } ; - - if (psf->auto_header && psf->write_header != NULL) - psf->write_header (psf, SF_TRUE) ; - - return count / psf->sf.channels ; -} /* sf_writef_short */ - -/*------------------------------------------------------------------------------ -*/ - -sf_count_t -sf_write_int (SNDFILE *sndfile, const int *ptr, sf_count_t len) -{ SF_PRIVATE *psf ; - sf_count_t count ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_READ) - { psf->error = SFE_NOT_WRITEMODE ; - return 0 ; - } ; - - if (len % psf->sf.channels) - { psf->error = SFE_BAD_WRITE_ALIGN ; - return 0 ; - } ; - - if (psf->write_int == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_WRITE) - if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) - return 0 ; - - if (psf->have_written == SF_FALSE && psf->write_header != NULL) - psf->write_header (psf, SF_FALSE) ; - psf->have_written = SF_TRUE ; - - count = psf->write_int (psf, ptr, len) ; - - psf->write_current += count / psf->sf.channels ; - - psf->last_op = SFM_WRITE ; - - if (psf->write_current > psf->sf.frames) - { psf->sf.frames = psf->write_current ; - psf->dataend = 0 ; - } ; - - if (psf->auto_header && psf->write_header != NULL) - psf->write_header (psf, SF_TRUE) ; - - return count ; -} /* sf_write_int */ - -sf_count_t -sf_writef_int (SNDFILE *sndfile, const int *ptr, sf_count_t frames) -{ SF_PRIVATE *psf ; - sf_count_t count ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_READ) - { psf->error = SFE_NOT_WRITEMODE ; - return 0 ; - } ; - - if (psf->write_int == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_WRITE) - if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) - return 0 ; - - if (psf->have_written == SF_FALSE && psf->write_header != NULL) - psf->write_header (psf, SF_FALSE) ; - psf->have_written = SF_TRUE ; - - count = psf->write_int (psf, ptr, frames * psf->sf.channels) ; - - psf->write_current += count / psf->sf.channels ; - - psf->last_op = SFM_WRITE ; - - if (psf->write_current > psf->sf.frames) - { psf->sf.frames = psf->write_current ; - psf->dataend = 0 ; - } ; - - if (psf->auto_header && psf->write_header != NULL) - psf->write_header (psf, SF_TRUE) ; - - return count / psf->sf.channels ; -} /* sf_writef_int */ - -/*------------------------------------------------------------------------------ -*/ - -sf_count_t -sf_write_float (SNDFILE *sndfile, const float *ptr, sf_count_t len) -{ SF_PRIVATE *psf ; - sf_count_t count ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_READ) - { psf->error = SFE_NOT_WRITEMODE ; - return 0 ; - } ; - - if (len % psf->sf.channels) - { psf->error = SFE_BAD_WRITE_ALIGN ; - return 0 ; - } ; - - if (psf->write_float == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_WRITE) - if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) - return 0 ; - - if (psf->have_written == SF_FALSE && psf->write_header != NULL) - psf->write_header (psf, SF_FALSE) ; - psf->have_written = SF_TRUE ; - - count = psf->write_float (psf, ptr, len) ; - - psf->write_current += count / psf->sf.channels ; - - psf->last_op = SFM_WRITE ; - - if (psf->write_current > psf->sf.frames) - { psf->sf.frames = psf->write_current ; - psf->dataend = 0 ; - } ; - - if (psf->auto_header && psf->write_header != NULL) - psf->write_header (psf, SF_TRUE) ; - - return count ; -} /* sf_write_float */ - -sf_count_t -sf_writef_float (SNDFILE *sndfile, const float *ptr, sf_count_t frames) -{ SF_PRIVATE *psf ; - sf_count_t count ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_READ) - { psf->error = SFE_NOT_WRITEMODE ; - return 0 ; - } ; - - if (psf->write_float == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_WRITE) - if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) - return 0 ; - - if (psf->have_written == SF_FALSE && psf->write_header != NULL) - psf->write_header (psf, SF_FALSE) ; - psf->have_written = SF_TRUE ; - - count = psf->write_float (psf, ptr, frames * psf->sf.channels) ; - - psf->write_current += count / psf->sf.channels ; - - psf->last_op = SFM_WRITE ; - - if (psf->write_current > psf->sf.frames) - { psf->sf.frames = psf->write_current ; - psf->dataend = 0 ; - } ; - - if (psf->auto_header && psf->write_header != NULL) - psf->write_header (psf, SF_TRUE) ; - - return count / psf->sf.channels ; -} /* sf_writef_float */ - -/*------------------------------------------------------------------------------ -*/ - -sf_count_t -sf_write_double (SNDFILE *sndfile, const double *ptr, sf_count_t len) -{ SF_PRIVATE *psf ; - sf_count_t count ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_READ) - { psf->error = SFE_NOT_WRITEMODE ; - return 0 ; - } ; - - if (len % psf->sf.channels) - { psf->error = SFE_BAD_WRITE_ALIGN ; - return 0 ; - } ; - - if (psf->write_double == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_WRITE) - if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) - return 0 ; - - if (psf->have_written == SF_FALSE && psf->write_header != NULL) - psf->write_header (psf, SF_FALSE) ; - psf->have_written = SF_TRUE ; - - count = psf->write_double (psf, ptr, len) ; - - psf->write_current += count / psf->sf.channels ; - - psf->last_op = SFM_WRITE ; - - if (psf->write_current > psf->sf.frames) - { psf->sf.frames = psf->write_current ; - psf->dataend = 0 ; - } ; - - if (psf->auto_header && psf->write_header != NULL) - psf->write_header (psf, SF_TRUE) ; - - return count ; -} /* sf_write_double */ - -sf_count_t -sf_writef_double (SNDFILE *sndfile, const double *ptr, sf_count_t frames) -{ SF_PRIVATE *psf ; - sf_count_t count ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->file.mode == SFM_READ) - { psf->error = SFE_NOT_WRITEMODE ; - return 0 ; - } ; - - if (psf->write_double == NULL || psf->seek == NULL) - { psf->error = SFE_UNIMPLEMENTED ; - return 0 ; - } ; - - if (psf->last_op != SFM_WRITE) - if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) - return 0 ; - - if (psf->have_written == SF_FALSE && psf->write_header != NULL) - psf->write_header (psf, SF_FALSE) ; - psf->have_written = SF_TRUE ; - - count = psf->write_double (psf, ptr, frames * psf->sf.channels) ; - - psf->write_current += count / psf->sf.channels ; - - psf->last_op = SFM_WRITE ; - - if (psf->write_current > psf->sf.frames) - { psf->sf.frames = psf->write_current ; - psf->dataend = 0 ; - } ; - - if (psf->auto_header && psf->write_header != NULL) - psf->write_header (psf, SF_TRUE) ; - - return count / psf->sf.channels ; -} /* sf_writef_double */ - -/*========================================================================= -** Private functions. -*/ - -static int -try_resource_fork (SF_PRIVATE * psf) -{ int old_error = psf->error ; - - /* Set READ mode now, to see if resource fork exists. */ - psf->rsrc.mode = SFM_READ ; - if (psf_open_rsrc (psf) != 0) - { psf->error = old_error ; - return 0 ; - } ; - - /* More checking here. */ - psf_log_printf (psf, "Resource fork : %s\n", psf->rsrc.path.c) ; - - return SF_FORMAT_SD2 ; -} /* try_resource_fork */ - -static int -format_from_extension (SF_PRIVATE *psf) -{ char *cptr ; - char buffer [16] ; - int format = 0 ; - - if ((cptr = strrchr (psf->file.name.c, '.')) == NULL) - return 0 ; - - cptr ++ ; - if (strlen (cptr) > sizeof (buffer) - 1) - return 0 ; - - psf_strlcpy (buffer, sizeof (buffer), cptr) ; - buffer [sizeof (buffer) - 1] = 0 ; - - /* Convert everything in the buffer to lower case. */ - cptr = buffer ; - while (*cptr) - { *cptr = tolower (*cptr) ; - cptr ++ ; - } ; - - cptr = buffer ; - - if (strcmp (cptr, "au") == 0) - { psf->sf.channels = 1 ; - psf->sf.samplerate = 8000 ; - format = SF_FORMAT_RAW | SF_FORMAT_ULAW ; - } - else if (strcmp (cptr, "snd") == 0) - { psf->sf.channels = 1 ; - psf->sf.samplerate = 8000 ; - format = SF_FORMAT_RAW | SF_FORMAT_ULAW ; - } - - else if (strcmp (cptr, "vox") == 0 || strcmp (cptr, "vox8") == 0) - { psf->sf.channels = 1 ; - psf->sf.samplerate = 8000 ; - format = SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM ; - } - else if (strcmp (cptr, "vox6") == 0) - { psf->sf.channels = 1 ; - psf->sf.samplerate = 6000 ; - format = SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM ; - } - else if (strcmp (cptr, "gsm") == 0) - { psf->sf.channels = 1 ; - psf->sf.samplerate = 8000 ; - format = SF_FORMAT_RAW | SF_FORMAT_GSM610 ; - } - - /* For RAW files, make sure the dataoffset if set correctly. */ - if ((SF_CONTAINER (format)) == SF_FORMAT_RAW) - psf->dataoffset = 0 ; - - return format ; -} /* format_from_extension */ - -static int -guess_file_type (SF_PRIVATE *psf) -{ uint32_t buffer [3], format ; - - if (psf_binheader_readf (psf, "b", &buffer, SIGNED_SIZEOF (buffer)) != SIGNED_SIZEOF (buffer)) - { psf->error = SFE_BAD_FILE_READ ; - return 0 ; - } ; - - if ((buffer [0] == MAKE_MARKER ('R', 'I', 'F', 'F') || buffer [0] == MAKE_MARKER ('R', 'I', 'F', 'X')) - && buffer [2] == MAKE_MARKER ('W', 'A', 'V', 'E')) - return SF_FORMAT_WAV ; - - if (buffer [0] == MAKE_MARKER ('F', 'O', 'R', 'M')) - { if (buffer [2] == MAKE_MARKER ('A', 'I', 'F', 'F') || buffer [2] == MAKE_MARKER ('A', 'I', 'F', 'C')) - return SF_FORMAT_AIFF ; - if (buffer [2] == MAKE_MARKER ('8', 'S', 'V', 'X') || buffer [2] == MAKE_MARKER ('1', '6', 'S', 'V')) - return SF_FORMAT_SVX ; - return 0 ; - } ; - - if (buffer [0] == MAKE_MARKER ('.', 's', 'n', 'd') || buffer [0] == MAKE_MARKER ('d', 'n', 's', '.')) - return SF_FORMAT_AU ; - - if ((buffer [0] == MAKE_MARKER ('f', 'a', 'p', ' ') || buffer [0] == MAKE_MARKER (' ', 'p', 'a', 'f'))) - return SF_FORMAT_PAF ; - - if (buffer [0] == MAKE_MARKER ('N', 'I', 'S', 'T')) - return SF_FORMAT_NIST ; - - if (buffer [0] == MAKE_MARKER ('C', 'r', 'e', 'a') && buffer [1] == MAKE_MARKER ('t', 'i', 'v', 'e')) - return SF_FORMAT_VOC ; - - if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0xF8, 0xFF)) == MAKE_MARKER (0x64, 0xA3, 0x00, 0x00) || - (buffer [0] & MAKE_MARKER (0xFF, 0xF8, 0xFF, 0xFF)) == MAKE_MARKER (0x00, 0x00, 0xA3, 0x64)) - return SF_FORMAT_IRCAM ; - - if (buffer [0] == MAKE_MARKER ('r', 'i', 'f', 'f')) - return SF_FORMAT_W64 ; - - if (buffer [0] == MAKE_MARKER (0, 0, 0x03, 0xE8) && buffer [1] == MAKE_MARKER (0, 0, 0, 1) && - buffer [2] == MAKE_MARKER (0, 0, 0, 1)) - return SF_FORMAT_MAT4 ; - - if (buffer [0] == MAKE_MARKER (0, 0, 0, 0) && buffer [1] == MAKE_MARKER (1, 0, 0, 0) && - buffer [2] == MAKE_MARKER (1, 0, 0, 0)) - return SF_FORMAT_MAT4 ; - - if (buffer [0] == MAKE_MARKER ('M', 'A', 'T', 'L') && buffer [1] == MAKE_MARKER ('A', 'B', ' ', '5')) - return SF_FORMAT_MAT5 ; - - if (buffer [0] == MAKE_MARKER ('P', 'V', 'F', '1')) - return SF_FORMAT_PVF ; - - if (buffer [0] == MAKE_MARKER ('E', 'x', 't', 'e') && buffer [1] == MAKE_MARKER ('n', 'd', 'e', 'd') && - buffer [2] == MAKE_MARKER (' ', 'I', 'n', 's')) - return SF_FORMAT_XI ; - - if (buffer [0] == MAKE_MARKER ('c', 'a', 'f', 'f') && buffer [2] == MAKE_MARKER ('d', 'e', 's', 'c')) - return SF_FORMAT_CAF ; - - if (buffer [0] == MAKE_MARKER ('O', 'g', 'g', 'S')) - return SF_FORMAT_OGG ; - - if (buffer [0] == MAKE_MARKER ('A', 'L', 'a', 'w') && buffer [1] == MAKE_MARKER ('S', 'o', 'u', 'n') - && buffer [2] == MAKE_MARKER ('d', 'F', 'i', 'l')) - return SF_FORMAT_WVE ; - - if (buffer [0] == MAKE_MARKER ('D', 'i', 'a', 'm') && buffer [1] == MAKE_MARKER ('o', 'n', 'd', 'W') - && buffer [2] == MAKE_MARKER ('a', 'r', 'e', ' ')) - return SF_FORMAT_DWD ; - - if (buffer [0] == MAKE_MARKER ('L', 'M', '8', '9') || buffer [0] == MAKE_MARKER ('5', '3', 0, 0)) - return SF_FORMAT_TXW ; - - if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0x80, 0xFF)) == MAKE_MARKER (0xF0, 0x7E, 0, 0x01)) - return SF_FORMAT_SDS ; - - if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0, 0)) == MAKE_MARKER (1, 4, 0, 0)) - return SF_FORMAT_MPC2K ; - - if (buffer [0] == MAKE_MARKER ('C', 'A', 'T', ' ') && buffer [2] == MAKE_MARKER ('R', 'E', 'X', '2')) - return SF_FORMAT_REX2 ; - - if (buffer [0] == MAKE_MARKER (0x30, 0x26, 0xB2, 0x75) && buffer [1] == MAKE_MARKER (0x8E, 0x66, 0xCF, 0x11)) - return 0 /*-SF_FORMAT_WMA-*/ ; - - /* HMM (Hidden Markov Model) Tool Kit. */ - if (2 * BE2H_32 (buffer [0]) + 12 == psf->filelength && buffer [2] == MAKE_MARKER (0, 2, 0, 0)) - return SF_FORMAT_HTK ; - - if (buffer [0] == MAKE_MARKER ('f', 'L', 'a', 'C')) - return SF_FORMAT_FLAC ; - - if (buffer [0] == MAKE_MARKER ('2', 'B', 'I', 'T')) - return SF_FORMAT_AVR ; - - if (buffer [0] == MAKE_MARKER ('R', 'F', '6', '4') && buffer [2] == MAKE_MARKER ('W', 'A', 'V', 'E')) - return SF_FORMAT_RF64 ; - - if (buffer [0] == MAKE_MARKER ('I', 'D', '3', 3)) - { psf_log_printf (psf, "Found 'ID3' marker.\n") ; - if (id3_skip (psf)) - return guess_file_type (psf) ; - return 0 ; - } ; - - /* Turtle Beach SMP 16-bit */ - if (buffer [0] == MAKE_MARKER ('S', 'O', 'U', 'N') && buffer [1] == MAKE_MARKER ('D', ' ', 'S', 'A')) - return 0 ; - - /* Yamaha sampler format. */ - if (buffer [0] == MAKE_MARKER ('S', 'Y', '8', '0') || buffer [0] == MAKE_MARKER ('S', 'Y', '8', '5')) - return 0 ; - - if (buffer [0] == MAKE_MARKER ('a', 'j', 'k', 'g')) - return 0 /*-SF_FORMAT_SHN-*/ ; - - /* This must be the last one. */ - if (psf->filelength > 0 && (format = try_resource_fork (psf)) != 0) - return format ; - - return 0 ; -} /* guess_file_type */ - - -static int -validate_sfinfo (SF_INFO *sfinfo) -{ if (sfinfo->samplerate < 1) - return 0 ; - if (sfinfo->frames < 0) - return 0 ; - if (sfinfo->channels < 1) - return 0 ; - if ((SF_CONTAINER (sfinfo->format)) == 0) - return 0 ; - if ((SF_CODEC (sfinfo->format)) == 0) - return 0 ; - if (sfinfo->sections < 1) - return 0 ; - return 1 ; -} /* validate_sfinfo */ - -static int -validate_psf (SF_PRIVATE *psf) -{ - if (psf->datalength < 0) - { psf_log_printf (psf, "Invalid SF_PRIVATE field : datalength == %D.\n", psf->datalength) ; - return 0 ; - } ; - if (psf->dataoffset < 0) - { psf_log_printf (psf, "Invalid SF_PRIVATE field : dataoffset == %D.\n", psf->dataoffset) ; - return 0 ; - } ; - if (psf->blockwidth && psf->blockwidth != psf->sf.channels * psf->bytewidth) - { psf_log_printf (psf, "Invalid SF_PRIVATE field : channels * bytewidth == %d.\n", - psf->sf.channels * psf->bytewidth) ; - return 0 ; - } ; - return 1 ; -} /* validate_psf */ - -static void -save_header_info (SF_PRIVATE *psf) -{ snprintf (sf_parselog, sizeof (sf_parselog), "%s", psf->parselog.buf) ; -} /* save_header_info */ - -static void -copy_filename (SF_PRIVATE *psf, const char *path) -{ const char *ccptr ; - char *cptr ; - - snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", path) ; - if ((ccptr = strrchr (path, '/')) || (ccptr = strrchr (path, '\\'))) - ccptr ++ ; - else - ccptr = path ; - - snprintf (psf->file.name.c, sizeof (psf->file.name.c), "%s", ccptr) ; - - /* Now grab the directory. */ - snprintf (psf->file.dir.c, sizeof (psf->file.dir.c), "%s", path) ; - if ((cptr = strrchr (psf->file.dir.c, '/')) || (cptr = strrchr (psf->file.dir.c, '\\'))) - cptr [1] = 0 ; - else - psf->file.dir.c [0] = 0 ; - - return ; -} /* copy_filename */ - -/*============================================================================== -*/ - -static int -psf_close (SF_PRIVATE *psf) -{ uint32_t k ; - int error = 0 ; - - if (psf->codec_close) - { error = psf->codec_close (psf) ; - /* To prevent it being called in psf->container_close(). */ - psf->codec_close = NULL ; - } ; - - if (psf->container_close) - error = psf->container_close (psf) ; - - error = psf_fclose (psf) ; - psf_close_rsrc (psf) ; - - /* For an ISO C compliant implementation it is ok to free a NULL pointer. */ - free (psf->container_data) ; - free (psf->codec_data) ; - free (psf->interleave) ; - free (psf->dither) ; - free (psf->peak_info) ; - free (psf->broadcast_16k) ; - free (psf->loop_info) ; - free (psf->instrument) ; - free (psf->channel_map) ; - free (psf->format_desc) ; - free (psf->strings.storage) ; - - if (psf->wchunks.chunks) - for (k = 0 ; k < psf->wchunks.used ; k++) - free (psf->wchunks.chunks [k].data) ; - free (psf->rchunks.chunks) ; - free (psf->wchunks.chunks) ; - free (psf->iterator) ; - free (psf->cart_16k) ; - - memset (psf, 0, sizeof (SF_PRIVATE)) ; - free (psf) ; - - return error ; -} /* psf_close */ - -SNDFILE * -psf_open_file (SF_PRIVATE *psf, SF_INFO *sfinfo) -{ int error, format ; - - sf_errno = error = 0 ; - sf_parselog [0] = 0 ; - - if (psf->error) - { error = psf->error ; - goto error_exit ; - } ; - - if (psf->file.mode != SFM_READ && psf->file.mode != SFM_WRITE && psf->file.mode != SFM_RDWR) - { error = SFE_BAD_OPEN_MODE ; - goto error_exit ; - } ; - - if (sfinfo == NULL) - { error = SFE_BAD_SF_INFO_PTR ; - goto error_exit ; - } ; - - /* Zero out these fields. */ - sfinfo->frames = 0 ; - sfinfo->sections = 0 ; - sfinfo->seekable = 0 ; - - if (psf->file.mode == SFM_READ) - { if ((SF_CONTAINER (sfinfo->format)) == SF_FORMAT_RAW) - { if (sf_format_check (sfinfo) == 0) - { error = SFE_RAW_BAD_FORMAT ; - goto error_exit ; - } ; - } - else - memset (sfinfo, 0, sizeof (SF_INFO)) ; - } ; - - memcpy (&psf->sf, sfinfo, sizeof (SF_INFO)) ; - - psf->Magick = SNDFILE_MAGICK ; - psf->norm_float = SF_TRUE ; - psf->norm_double = SF_TRUE ; - psf->dataoffset = -1 ; - psf->datalength = -1 ; - psf->read_current = -1 ; - psf->write_current = -1 ; - psf->auto_header = SF_FALSE ; - psf->rwf_endian = SF_ENDIAN_LITTLE ; - psf->seek = psf_default_seek ; - psf->float_int_mult = 0 ; - psf->float_max = -1.0 ; - - /* An attempt at a per SF_PRIVATE unique id. */ - psf->unique_id = psf_rand_int32 () ; - - psf->sf.sections = 1 ; - - psf->is_pipe = psf_is_pipe (psf) ; - - if (psf->is_pipe) - { psf->sf.seekable = SF_FALSE ; - psf->filelength = SF_COUNT_MAX ; - } - else - { psf->sf.seekable = SF_TRUE ; - - /* File is open, so get the length. */ - psf->filelength = psf_get_filelen (psf) ; - } ; - - if (psf->fileoffset > 0) - { switch (psf->file.mode) - { case SFM_READ : - if (psf->filelength < 44) - { psf_log_printf (psf, "Short filelength: %D (fileoffset: %D)\n", psf->filelength, psf->fileoffset) ; - error = SFE_BAD_OFFSET ; - goto error_exit ; - } ; - break ; - - case SFM_WRITE : - psf->fileoffset = 0 ; - psf_fseek (psf, 0, SEEK_END) ; - psf->fileoffset = psf_ftell (psf) ; - break ; - - case SFM_RDWR : - error = SFE_NO_EMBEDDED_RDWR ; - goto error_exit ; - } ; - - psf_log_printf (psf, "Embedded file offset : %D\n", psf->fileoffset) ; - } ; - - if (psf->filelength == SF_COUNT_MAX) - psf_log_printf (psf, "Length : unknown\n") ; - else - psf_log_printf (psf, "Length : %D\n", psf->filelength) ; - - if (psf->file.mode == SFM_WRITE || (psf->file.mode == SFM_RDWR && psf->filelength == 0)) - { /* If the file is being opened for write or RDWR and the file is currently - ** empty, then the SF_INFO struct must contain valid data. - */ - if ((SF_CONTAINER (psf->sf.format)) == 0) - { error = SFE_ZERO_MAJOR_FORMAT ; - goto error_exit ; - } ; - if ((SF_CODEC (psf->sf.format)) == 0) - { error = SFE_ZERO_MINOR_FORMAT ; - goto error_exit ; - } ; - - if (sf_format_check (&psf->sf) == 0) - { error = SFE_BAD_OPEN_FORMAT ; - goto error_exit ; - } ; - } - else if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_RAW) - { /* If type RAW has not been specified then need to figure out file type. */ - psf->sf.format = guess_file_type (psf) ; - - if (psf->sf.format == 0) - psf->sf.format = format_from_extension (psf) ; - } ; - - /* Prevent unnecessary seeks */ - psf->last_op = psf->file.mode ; - - /* Set bytewidth if known. */ - switch (SF_CODEC (psf->sf.format)) - { case SF_FORMAT_PCM_S8 : - case SF_FORMAT_PCM_U8 : - case SF_FORMAT_ULAW : - case SF_FORMAT_ALAW : - case SF_FORMAT_DPCM_8 : - psf->bytewidth = 1 ; - break ; - - case SF_FORMAT_PCM_16 : - case SF_FORMAT_DPCM_16 : - psf->bytewidth = 2 ; - break ; - - case SF_FORMAT_PCM_24 : - psf->bytewidth = 3 ; - break ; - - case SF_FORMAT_PCM_32 : - case SF_FORMAT_FLOAT : - psf->bytewidth = 4 ; - break ; - - case SF_FORMAT_DOUBLE : - psf->bytewidth = 8 ; - break ; - } ; - - /* Call the initialisation function for the relevant file type. */ - switch (SF_CONTAINER (psf->sf.format)) - { case SF_FORMAT_WAV : - case SF_FORMAT_WAVEX : - error = wav_open (psf) ; - break ; - - case SF_FORMAT_AIFF : - error = aiff_open (psf) ; - break ; - - case SF_FORMAT_AU : - error = au_open (psf) ; - break ; - - case SF_FORMAT_RAW : - error = raw_open (psf) ; - break ; - - case SF_FORMAT_W64 : - error = w64_open (psf) ; - break ; - - case SF_FORMAT_RF64 : - error = rf64_open (psf) ; - break ; - - /* Lite remove start */ - case SF_FORMAT_PAF : - error = paf_open (psf) ; - break ; - - case SF_FORMAT_SVX : - error = svx_open (psf) ; - break ; - - case SF_FORMAT_NIST : - error = nist_open (psf) ; - break ; - - case SF_FORMAT_IRCAM : - error = ircam_open (psf) ; - break ; - - case SF_FORMAT_VOC : - error = voc_open (psf) ; - break ; - - case SF_FORMAT_SDS : - error = sds_open (psf) ; - break ; - - case SF_FORMAT_OGG : - error = ogg_open (psf) ; - break ; - - case SF_FORMAT_TXW : - error = txw_open (psf) ; - break ; - - case SF_FORMAT_WVE : - error = wve_open (psf) ; - break ; - - case SF_FORMAT_DWD : - error = dwd_open (psf) ; - break ; - - case SF_FORMAT_MAT4 : - error = mat4_open (psf) ; - break ; - - case SF_FORMAT_MAT5 : - error = mat5_open (psf) ; - break ; - - case SF_FORMAT_PVF : - error = pvf_open (psf) ; - break ; - - case SF_FORMAT_XI : - error = xi_open (psf) ; - break ; - - case SF_FORMAT_HTK : - error = htk_open (psf) ; - break ; - - case SF_FORMAT_SD2 : - error = sd2_open (psf) ; - break ; - - case SF_FORMAT_REX2 : - error = rx2_open (psf) ; - break ; - - case SF_FORMAT_AVR : - error = avr_open (psf) ; - break ; - - case SF_FORMAT_FLAC : - error = flac_open (psf) ; - break ; - - case SF_FORMAT_CAF : - error = caf_open (psf) ; - break ; - - case SF_FORMAT_MPC2K : - error = mpc2k_open (psf) ; - break ; - - /* Lite remove end */ - - default : - error = SFE_UNKNOWN_FORMAT ; - } ; - - if (error) - goto error_exit ; - - /* For now, check whether embedding is supported. */ - format = SF_CONTAINER (psf->sf.format) ; - if (psf->fileoffset > 0) - { switch (format) - { case SF_FORMAT_WAV : - case SF_FORMAT_WAVEX : - case SF_FORMAT_AIFF : - case SF_FORMAT_AU : - /* Actual embedded files. */ - break ; - - case SF_FORMAT_FLAC : - /* Flac with an ID3v2 header? */ - break ; - - default : - error = SFE_NO_EMBED_SUPPORT ; - goto error_exit ; - } ; - } ; - - if (psf->fileoffset > 0) - psf_log_printf (psf, "Embedded file length : %D\n", psf->filelength) ; - - if (psf->file.mode == SFM_RDWR && sf_format_check (&psf->sf) == 0) - { error = SFE_BAD_MODE_RW ; - goto error_exit ; - } ; - - if (validate_sfinfo (&psf->sf) == 0) - { psf_log_SF_INFO (psf) ; - save_header_info (psf) ; - error = SFE_BAD_SF_INFO ; - goto error_exit ; - } ; - - if (validate_psf (psf) == 0) - { save_header_info (psf) ; - error = SFE_INTERNAL ; - goto error_exit ; - } ; - - psf->read_current = 0 ; - psf->write_current = 0 ; - if (psf->file.mode == SFM_RDWR) - { psf->write_current = psf->sf.frames ; - psf->have_written = psf->sf.frames > 0 ? SF_TRUE : SF_FALSE ; - } ; - - memcpy (sfinfo, &psf->sf, sizeof (SF_INFO)) ; - - return (SNDFILE *) psf ; - -error_exit : - sf_errno = error ; - - if (error == SFE_SYSTEM) - snprintf (sf_syserr, sizeof (sf_syserr), "%s", psf->syserr) ; - snprintf (sf_parselog, sizeof (sf_parselog), "%s", psf->parselog.buf) ; - - switch (error) - { case SF_ERR_SYSTEM : - case SF_ERR_UNSUPPORTED_ENCODING : - case SFE_UNIMPLEMENTED : - break ; - - case SFE_RAW_BAD_FORMAT : - break ; - - default : - if (psf->file.mode == SFM_READ) - { psf_log_printf (psf, "Parse error : %s\n", sf_error_number (error)) ; - error = SF_ERR_MALFORMED_FILE ; - } ; - } ; - - psf_close (psf) ; - return NULL ; -} /* psf_open_file */ - -/*============================================================================== -** Chunk getting and setting. -*/ - -int -sf_set_chunk (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) -{ SF_PRIVATE *psf ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (chunk_info == NULL || chunk_info->data == NULL) - return SFE_BAD_CHUNK_PTR ; - - if (psf->set_chunk) - return psf->set_chunk (psf, chunk_info) ; - - return SFE_BAD_CHUNK_FORMAT ; -} /* sf_set_chunk */ - -SF_CHUNK_ITERATOR * -sf_get_chunk_iterator (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) -{ SF_PRIVATE *psf ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (chunk_info) - return psf_get_chunk_iterator (psf, chunk_info->id) ; - - return psf_get_chunk_iterator (psf, NULL) ; -} /* sf_get_chunk_iterator */ - -SF_CHUNK_ITERATOR * -sf_next_chunk_iterator (SF_CHUNK_ITERATOR * iterator) -{ SF_PRIVATE *psf ; - SNDFILE *sndfile = iterator ? iterator->sndfile : NULL ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (psf->next_chunk_iterator) - return psf->next_chunk_iterator (psf, iterator) ; - - return NULL ; -} /* sf_get_chunk_iterator_next */ - -int -sf_get_chunk_size (const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) -{ SF_PRIVATE *psf ; - SNDFILE *sndfile = iterator ? iterator->sndfile : NULL ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (chunk_info == NULL) - return SFE_BAD_CHUNK_PTR ; - - if (psf->get_chunk_size) - return psf->get_chunk_size (psf, iterator, chunk_info) ; - - return SFE_BAD_CHUNK_FORMAT ; - return 0 ; -} /* sf_get_chunk_size */ - -int -sf_get_chunk_data (const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) -{ SF_PRIVATE *psf ; - SNDFILE *sndfile = iterator ? iterator->sndfile : NULL ; - - VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; - - if (chunk_info == NULL || chunk_info->data == NULL) - return SFE_BAD_CHUNK_PTR ; - - if (psf->get_chunk_data) - return psf->get_chunk_data (psf, iterator, chunk_info) ; - - return SFE_BAD_CHUNK_FORMAT ; -} /* sf_get_chunk_data */ diff --git a/libs/libsndfile/src/sndfile.h.in b/libs/libsndfile/src/sndfile.h.in deleted file mode 100644 index b1e32d7f21..0000000000 --- a/libs/libsndfile/src/sndfile.h.in +++ /dev/null @@ -1,824 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* -** sndfile.h -- system-wide definitions -** -** API documentation is in the doc/ directory of the source code tarball -** and at http://www.mega-nerd.com/libsndfile/api.html. -*/ - -#ifndef SNDFILE_H -#define SNDFILE_H - -/* This is the version 1.0.X header file. */ -#define SNDFILE_1 - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* The following file types can be read and written. -** A file type would consist of a major type (ie SF_FORMAT_WAV) bitwise -** ORed with a minor type (ie SF_FORMAT_PCM). SF_FORMAT_TYPEMASK and -** SF_FORMAT_SUBMASK can be used to separate the major and minor file -** types. -*/ - -enum -{ /* Major formats. */ - SF_FORMAT_WAV = 0x010000, /* Microsoft WAV format (little endian default). */ - SF_FORMAT_AIFF = 0x020000, /* Apple/SGI AIFF format (big endian). */ - SF_FORMAT_AU = 0x030000, /* Sun/NeXT AU format (big endian). */ - SF_FORMAT_RAW = 0x040000, /* RAW PCM data. */ - SF_FORMAT_PAF = 0x050000, /* Ensoniq PARIS file format. */ - SF_FORMAT_SVX = 0x060000, /* Amiga IFF / SVX8 / SV16 format. */ - SF_FORMAT_NIST = 0x070000, /* Sphere NIST format. */ - SF_FORMAT_VOC = 0x080000, /* VOC files. */ - SF_FORMAT_IRCAM = 0x0A0000, /* Berkeley/IRCAM/CARL */ - SF_FORMAT_W64 = 0x0B0000, /* Sonic Foundry's 64 bit RIFF/WAV */ - SF_FORMAT_MAT4 = 0x0C0000, /* Matlab (tm) V4.2 / GNU Octave 2.0 */ - SF_FORMAT_MAT5 = 0x0D0000, /* Matlab (tm) V5.0 / GNU Octave 2.1 */ - SF_FORMAT_PVF = 0x0E0000, /* Portable Voice Format */ - SF_FORMAT_XI = 0x0F0000, /* Fasttracker 2 Extended Instrument */ - SF_FORMAT_HTK = 0x100000, /* HMM Tool Kit format */ - SF_FORMAT_SDS = 0x110000, /* Midi Sample Dump Standard */ - SF_FORMAT_AVR = 0x120000, /* Audio Visual Research */ - SF_FORMAT_WAVEX = 0x130000, /* MS WAVE with WAVEFORMATEX */ - SF_FORMAT_SD2 = 0x160000, /* Sound Designer 2 */ - SF_FORMAT_FLAC = 0x170000, /* FLAC lossless file format */ - SF_FORMAT_CAF = 0x180000, /* Core Audio File format */ - SF_FORMAT_WVE = 0x190000, /* Psion WVE format */ - SF_FORMAT_OGG = 0x200000, /* Xiph OGG container */ - SF_FORMAT_MPC2K = 0x210000, /* Akai MPC 2000 sampler */ - SF_FORMAT_RF64 = 0x220000, /* RF64 WAV file */ - - /* Subtypes from here on. */ - - SF_FORMAT_PCM_S8 = 0x0001, /* Signed 8 bit data */ - SF_FORMAT_PCM_16 = 0x0002, /* Signed 16 bit data */ - SF_FORMAT_PCM_24 = 0x0003, /* Signed 24 bit data */ - SF_FORMAT_PCM_32 = 0x0004, /* Signed 32 bit data */ - - SF_FORMAT_PCM_U8 = 0x0005, /* Unsigned 8 bit data (WAV and RAW only) */ - - SF_FORMAT_FLOAT = 0x0006, /* 32 bit float data */ - SF_FORMAT_DOUBLE = 0x0007, /* 64 bit float data */ - - SF_FORMAT_ULAW = 0x0010, /* U-Law encoded. */ - SF_FORMAT_ALAW = 0x0011, /* A-Law encoded. */ - SF_FORMAT_IMA_ADPCM = 0x0012, /* IMA ADPCM. */ - SF_FORMAT_MS_ADPCM = 0x0013, /* Microsoft ADPCM. */ - - SF_FORMAT_GSM610 = 0x0020, /* GSM 6.10 encoding. */ - SF_FORMAT_VOX_ADPCM = 0x0021, /* OKI / Dialogix ADPCM */ - - SF_FORMAT_G721_32 = 0x0030, /* 32kbs G721 ADPCM encoding. */ - SF_FORMAT_G723_24 = 0x0031, /* 24kbs G723 ADPCM encoding. */ - SF_FORMAT_G723_40 = 0x0032, /* 40kbs G723 ADPCM encoding. */ - - SF_FORMAT_DWVW_12 = 0x0040, /* 12 bit Delta Width Variable Word encoding. */ - SF_FORMAT_DWVW_16 = 0x0041, /* 16 bit Delta Width Variable Word encoding. */ - SF_FORMAT_DWVW_24 = 0x0042, /* 24 bit Delta Width Variable Word encoding. */ - SF_FORMAT_DWVW_N = 0x0043, /* N bit Delta Width Variable Word encoding. */ - - SF_FORMAT_DPCM_8 = 0x0050, /* 8 bit differential PCM (XI only) */ - SF_FORMAT_DPCM_16 = 0x0051, /* 16 bit differential PCM (XI only) */ - - SF_FORMAT_VORBIS = 0x0060, /* Xiph Vorbis encoding. */ - - SF_FORMAT_ALAC_16 = 0x0070, /* Apple Lossless Audio Codec (16 bit). */ - SF_FORMAT_ALAC_20 = 0x0071, /* Apple Lossless Audio Codec (20 bit). */ - SF_FORMAT_ALAC_24 = 0x0072, /* Apple Lossless Audio Codec (24 bit). */ - SF_FORMAT_ALAC_32 = 0x0073, /* Apple Lossless Audio Codec (32 bit). */ - - /* Endian-ness options. */ - - SF_ENDIAN_FILE = 0x00000000, /* Default file endian-ness. */ - SF_ENDIAN_LITTLE = 0x10000000, /* Force little endian-ness. */ - SF_ENDIAN_BIG = 0x20000000, /* Force big endian-ness. */ - SF_ENDIAN_CPU = 0x30000000, /* Force CPU endian-ness. */ - - SF_FORMAT_SUBMASK = 0x0000FFFF, - SF_FORMAT_TYPEMASK = 0x0FFF0000, - SF_FORMAT_ENDMASK = 0x30000000 -} ; - -/* -** The following are the valid command numbers for the sf_command() -** interface. The use of these commands is documented in the file -** command.html in the doc directory of the source code distribution. -*/ - -enum -{ SFC_GET_LIB_VERSION = 0x1000, - SFC_GET_LOG_INFO = 0x1001, - SFC_GET_CURRENT_SF_INFO = 0x1002, - - - SFC_GET_NORM_DOUBLE = 0x1010, - SFC_GET_NORM_FLOAT = 0x1011, - SFC_SET_NORM_DOUBLE = 0x1012, - SFC_SET_NORM_FLOAT = 0x1013, - SFC_SET_SCALE_FLOAT_INT_READ = 0x1014, - SFC_SET_SCALE_INT_FLOAT_WRITE = 0x1015, - - SFC_GET_SIMPLE_FORMAT_COUNT = 0x1020, - SFC_GET_SIMPLE_FORMAT = 0x1021, - - SFC_GET_FORMAT_INFO = 0x1028, - - SFC_GET_FORMAT_MAJOR_COUNT = 0x1030, - SFC_GET_FORMAT_MAJOR = 0x1031, - SFC_GET_FORMAT_SUBTYPE_COUNT = 0x1032, - SFC_GET_FORMAT_SUBTYPE = 0x1033, - - SFC_CALC_SIGNAL_MAX = 0x1040, - SFC_CALC_NORM_SIGNAL_MAX = 0x1041, - SFC_CALC_MAX_ALL_CHANNELS = 0x1042, - SFC_CALC_NORM_MAX_ALL_CHANNELS = 0x1043, - SFC_GET_SIGNAL_MAX = 0x1044, - SFC_GET_MAX_ALL_CHANNELS = 0x1045, - - SFC_SET_ADD_PEAK_CHUNK = 0x1050, - SFC_SET_ADD_HEADER_PAD_CHUNK = 0x1051, - - SFC_UPDATE_HEADER_NOW = 0x1060, - SFC_SET_UPDATE_HEADER_AUTO = 0x1061, - - SFC_FILE_TRUNCATE = 0x1080, - - SFC_SET_RAW_START_OFFSET = 0x1090, - - SFC_SET_DITHER_ON_WRITE = 0x10A0, - SFC_SET_DITHER_ON_READ = 0x10A1, - - SFC_GET_DITHER_INFO_COUNT = 0x10A2, - SFC_GET_DITHER_INFO = 0x10A3, - - SFC_GET_EMBED_FILE_INFO = 0x10B0, - - SFC_SET_CLIPPING = 0x10C0, - SFC_GET_CLIPPING = 0x10C1, - - SFC_GET_INSTRUMENT = 0x10D0, - SFC_SET_INSTRUMENT = 0x10D1, - - SFC_GET_LOOP_INFO = 0x10E0, - - SFC_GET_BROADCAST_INFO = 0x10F0, - SFC_SET_BROADCAST_INFO = 0x10F1, - - SFC_GET_CHANNEL_MAP_INFO = 0x1100, - SFC_SET_CHANNEL_MAP_INFO = 0x1101, - - SFC_RAW_DATA_NEEDS_ENDSWAP = 0x1110, - - /* Support for Wavex Ambisonics Format */ - SFC_WAVEX_SET_AMBISONIC = 0x1200, - SFC_WAVEX_GET_AMBISONIC = 0x1201, - - SFC_SET_VBR_ENCODING_QUALITY = 0x1300, - SFC_SET_COMPRESSION_LEVEL = 0x1301, - - /* Cart Chunk support */ - SFC_SET_CART_INFO = 0x1400, - SFC_GET_CART_INFO = 0x1401, - - /* Following commands for testing only. */ - SFC_TEST_IEEE_FLOAT_REPLACE = 0x6001, - - /* - ** SFC_SET_ADD_* values are deprecated and will disappear at some - ** time in the future. They are guaranteed to be here up to and - ** including version 1.0.8 to avoid breakage of existing software. - ** They currently do nothing and will continue to do nothing. - */ - SFC_SET_ADD_DITHER_ON_WRITE = 0x1070, - SFC_SET_ADD_DITHER_ON_READ = 0x1071 -} ; - - -/* -** String types that can be set and read from files. Not all file types -** support this and even the file types which support one, may not support -** all string types. -*/ - -enum -{ SF_STR_TITLE = 0x01, - SF_STR_COPYRIGHT = 0x02, - SF_STR_SOFTWARE = 0x03, - SF_STR_ARTIST = 0x04, - SF_STR_COMMENT = 0x05, - SF_STR_DATE = 0x06, - SF_STR_ALBUM = 0x07, - SF_STR_LICENSE = 0x08, - SF_STR_TRACKNUMBER = 0x09, - SF_STR_GENRE = 0x10 -} ; - -/* -** Use the following as the start and end index when doing metadata -** transcoding. -*/ - -#define SF_STR_FIRST SF_STR_TITLE -#define SF_STR_LAST SF_STR_GENRE - -enum -{ /* True and false */ - SF_FALSE = 0, - SF_TRUE = 1, - - /* Modes for opening files. */ - SFM_READ = 0x10, - SFM_WRITE = 0x20, - SFM_RDWR = 0x30, - - SF_AMBISONIC_NONE = 0x40, - SF_AMBISONIC_B_FORMAT = 0x41 -} ; - -/* Public error values. These are guaranteed to remain unchanged for the duration -** of the library major version number. -** There are also a large number of private error numbers which are internal to -** the library which can change at any time. -*/ - -enum -{ SF_ERR_NO_ERROR = 0, - SF_ERR_UNRECOGNISED_FORMAT = 1, - SF_ERR_SYSTEM = 2, - SF_ERR_MALFORMED_FILE = 3, - SF_ERR_UNSUPPORTED_ENCODING = 4 -} ; - - -/* Channel map values (used with SFC_SET/GET_CHANNEL_MAP). -*/ - -enum -{ SF_CHANNEL_MAP_INVALID = 0, - SF_CHANNEL_MAP_MONO = 1, - SF_CHANNEL_MAP_LEFT, /* Apple calls this 'Left' */ - SF_CHANNEL_MAP_RIGHT, /* Apple calls this 'Right' */ - SF_CHANNEL_MAP_CENTER, /* Apple calls this 'Center' */ - SF_CHANNEL_MAP_FRONT_LEFT, - SF_CHANNEL_MAP_FRONT_RIGHT, - SF_CHANNEL_MAP_FRONT_CENTER, - SF_CHANNEL_MAP_REAR_CENTER, /* Apple calls this 'Center Surround', Msft calls this 'Back Center' */ - SF_CHANNEL_MAP_REAR_LEFT, /* Apple calls this 'Left Surround', Msft calls this 'Back Left' */ - SF_CHANNEL_MAP_REAR_RIGHT, /* Apple calls this 'Right Surround', Msft calls this 'Back Right' */ - SF_CHANNEL_MAP_LFE, /* Apple calls this 'LFEScreen', Msft calls this 'Low Frequency' */ - SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER, /* Apple calls this 'Left Center' */ - SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER, /* Apple calls this 'Right Center */ - SF_CHANNEL_MAP_SIDE_LEFT, /* Apple calls this 'Left Surround Direct' */ - SF_CHANNEL_MAP_SIDE_RIGHT, /* Apple calls this 'Right Surround Direct' */ - SF_CHANNEL_MAP_TOP_CENTER, /* Apple calls this 'Top Center Surround' */ - SF_CHANNEL_MAP_TOP_FRONT_LEFT, /* Apple calls this 'Vertical Height Left' */ - SF_CHANNEL_MAP_TOP_FRONT_RIGHT, /* Apple calls this 'Vertical Height Right' */ - SF_CHANNEL_MAP_TOP_FRONT_CENTER, /* Apple calls this 'Vertical Height Center' */ - SF_CHANNEL_MAP_TOP_REAR_LEFT, /* Apple and MS call this 'Top Back Left' */ - SF_CHANNEL_MAP_TOP_REAR_RIGHT, /* Apple and MS call this 'Top Back Right' */ - SF_CHANNEL_MAP_TOP_REAR_CENTER, /* Apple and MS call this 'Top Back Center' */ - - SF_CHANNEL_MAP_AMBISONIC_B_W, - SF_CHANNEL_MAP_AMBISONIC_B_X, - SF_CHANNEL_MAP_AMBISONIC_B_Y, - SF_CHANNEL_MAP_AMBISONIC_B_Z, - - SF_CHANNEL_MAP_MAX -} ; - - -/* A SNDFILE* pointer can be passed around much like stdio.h's FILE* pointer. */ - -typedef struct SNDFILE_tag SNDFILE ; - -/* The following typedef is system specific and is defined when libsndfile is -** compiled. sf_count_t will be a 64 bit value when the underlying OS allows -** 64 bit file offsets. -** On windows, we need to allow the same header file to be compiler by both GCC -** and the Microsoft compiler. -*/ - -#if (defined (_MSCVER) || defined (_MSC_VER)) -typedef __int64 sf_count_t ; -#define SF_COUNT_MAX 0x7fffffffffffffffi64 -#else -typedef @TYPEOF_SF_COUNT_T@ sf_count_t ; -#define SF_COUNT_MAX @SF_COUNT_MAX@ -#endif - - -/* A pointer to a SF_INFO structure is passed to sf_open () and filled in. -** On write, the SF_INFO structure is filled in by the user and passed into -** sf_open (). -*/ - -struct SF_INFO -{ sf_count_t frames ; /* Used to be called samples. Changed to avoid confusion. */ - int samplerate ; - int channels ; - int format ; - int sections ; - int seekable ; -} ; - -typedef struct SF_INFO SF_INFO ; - -/* The SF_FORMAT_INFO struct is used to retrieve information about the sound -** file formats libsndfile supports using the sf_command () interface. -** -** Using this interface will allow applications to support new file formats -** and encoding types when libsndfile is upgraded, without requiring -** re-compilation of the application. -** -** Please consult the libsndfile documentation (particularly the information -** on the sf_command () interface) for examples of its use. -*/ - -typedef struct -{ int format ; - const char *name ; - const char *extension ; -} SF_FORMAT_INFO ; - -/* -** Enums and typedefs for adding dither on read and write. -** See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE -** and SFC_SET_DITHER_ON_READ. -*/ - -enum -{ SFD_DEFAULT_LEVEL = 0, - SFD_CUSTOM_LEVEL = 0x40000000, - - SFD_NO_DITHER = 500, - SFD_WHITE = 501, - SFD_TRIANGULAR_PDF = 502 -} ; - -typedef struct -{ int type ; - double level ; - const char *name ; -} SF_DITHER_INFO ; - -/* Struct used to retrieve information about a file embedded within a -** larger file. See SFC_GET_EMBED_FILE_INFO. -*/ - -typedef struct -{ sf_count_t offset ; - sf_count_t length ; -} SF_EMBED_FILE_INFO ; - -/* -** Structs used to retrieve music sample information from a file. -*/ - -enum -{ /* - ** The loop mode field in SF_INSTRUMENT will be one of the following. - */ - SF_LOOP_NONE = 800, - SF_LOOP_FORWARD, - SF_LOOP_BACKWARD, - SF_LOOP_ALTERNATING -} ; - -typedef struct -{ int gain ; - char basenote, detune ; - char velocity_lo, velocity_hi ; - char key_lo, key_hi ; - int loop_count ; - - struct - { int mode ; - uint32_t start ; - uint32_t end ; - uint32_t count ; - } loops [16] ; /* make variable in a sensible way */ -} SF_INSTRUMENT ; - - - -/* Struct used to retrieve loop information from a file.*/ -typedef struct -{ - short time_sig_num ; /* any positive integer > 0 */ - short time_sig_den ; /* any positive power of 2 > 0 */ - int loop_mode ; /* see SF_LOOP enum */ - - int num_beats ; /* this is NOT the amount of quarter notes !!!*/ - /* a full bar of 4/4 is 4 beats */ - /* a full bar of 7/8 is 7 beats */ - - float bpm ; /* suggestion, as it can be calculated using other fields:*/ - /* file's length, file's sampleRate and our time_sig_den*/ - /* -> bpms are always the amount of _quarter notes_ per minute */ - - int root_key ; /* MIDI note, or -1 for None */ - int future [6] ; -} SF_LOOP_INFO ; - - -/* Struct used to retrieve broadcast (EBU) information from a file. -** Strongly (!) based on EBU "bext" chunk format used in Broadcast WAVE. -*/ -#define SF_BROADCAST_INFO_VAR(coding_hist_size) \ - struct \ - { char description [256] ; \ - char originator [32] ; \ - char originator_reference [32] ; \ - char origination_date [10] ; \ - char origination_time [8] ; \ - uint32_t time_reference_low ; \ - uint32_t time_reference_high ; \ - short version ; \ - char umid [64] ; \ - char reserved [190] ; \ - uint32_t coding_history_size ; \ - char coding_history [coding_hist_size] ; \ - } - -/* SF_BROADCAST_INFO is the above struct with coding_history field of 256 bytes. */ -typedef SF_BROADCAST_INFO_VAR (256) SF_BROADCAST_INFO ; - -struct SF_CART_TIMER -{ char usage[4] ; - int32_t value ; -} ; - -typedef struct SF_CART_TIMER SF_CART_TIMER ; - -#define SF_CART_INFO_VAR(p_tag_text_size) \ - struct \ - { char version [4] ; \ - char title [64] ; \ - char artist [64] ; \ - char cut_id [64] ; \ - char client_id [64] ; \ - char category [64] ; \ - char classification [64] ; \ - char out_cue [64] ; \ - char start_date [10] ; \ - char start_time [8] ; \ - char end_date [10] ; \ - char end_time [8] ; \ - char producer_app_id [64] ; \ - char producer_app_version [64] ; \ - char user_def [64] ; \ - int32_t level_reference ; \ - SF_CART_TIMER post_timers [8] ; \ - char reserved [276] ; \ - char url [1024] ; \ - uint32_t tag_text_size ; \ - char tag_text[p_tag_text_size] ; \ - } - -typedef SF_CART_INFO_VAR (256) SF_CART_INFO ; - -/* Virtual I/O functionality. */ - -typedef sf_count_t (*sf_vio_get_filelen) (void *user_data) ; -typedef sf_count_t (*sf_vio_seek) (sf_count_t offset, int whence, void *user_data) ; -typedef sf_count_t (*sf_vio_read) (void *ptr, sf_count_t count, void *user_data) ; -typedef sf_count_t (*sf_vio_write) (const void *ptr, sf_count_t count, void *user_data) ; -typedef sf_count_t (*sf_vio_tell) (void *user_data) ; - -struct SF_VIRTUAL_IO -{ sf_vio_get_filelen get_filelen ; - sf_vio_seek seek ; - sf_vio_read read ; - sf_vio_write write ; - sf_vio_tell tell ; -} ; - -typedef struct SF_VIRTUAL_IO SF_VIRTUAL_IO ; - - -/* Open the specified file for read, write or both. On error, this will -** return a NULL pointer. To find the error number, pass a NULL SNDFILE -** to sf_strerror (). -** All calls to sf_open() should be matched with a call to sf_close(). -*/ - -SNDFILE* sf_open (const char *path, int mode, SF_INFO *sfinfo) ; - - -/* Use the existing file descriptor to create a SNDFILE object. If close_desc -** is TRUE, the file descriptor will be closed when sf_close() is called. If -** it is FALSE, the descriptor will not be closed. -** When passed a descriptor like this, the library will assume that the start -** of file header is at the current file offset. This allows sound files within -** larger container files to be read and/or written. -** On error, this will return a NULL pointer. To find the error number, pass a -** NULL SNDFILE to sf_strerror (). -** All calls to sf_open_fd() should be matched with a call to sf_close(). - -*/ - -SNDFILE* sf_open_fd (int fd, int mode, SF_INFO *sfinfo, int close_desc) ; - -SNDFILE* sf_open_virtual (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ; - - -/* sf_error () returns a error number which can be translated to a text -** string using sf_error_number(). -*/ - -int sf_error (SNDFILE *sndfile) ; - - -/* sf_strerror () returns to the caller a pointer to the current error message for -** the given SNDFILE. -*/ - -const char* sf_strerror (SNDFILE *sndfile) ; - - -/* sf_error_number () allows the retrieval of the error string for each internal -** error number. -** -*/ - -const char* sf_error_number (int errnum) ; - - -/* The following two error functions are deprecated but they will remain in the -** library for the foreseeable future. The function sf_strerror() should be used -** in their place. -*/ - -int sf_perror (SNDFILE *sndfile) ; -int sf_error_str (SNDFILE *sndfile, char* str, size_t len) ; - - -/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */ - -int sf_command (SNDFILE *sndfile, int command, void *data, int datasize) ; - - -/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */ - -int sf_format_check (const SF_INFO *info) ; - - -/* Seek within the waveform data chunk of the SNDFILE. sf_seek () uses -** the same values for whence (SEEK_SET, SEEK_CUR and SEEK_END) as -** stdio.h function fseek (). -** An offset of zero with whence set to SEEK_SET will position the -** read / write pointer to the first data sample. -** On success sf_seek returns the current position in (multi-channel) -** samples from the start of the file. -** Please see the libsndfile documentation for moving the read pointer -** separately from the write pointer on files open in mode SFM_RDWR. -** On error all of these functions return -1. -*/ - -enum -{ SF_SEEK_SET = SEEK_SET, - SF_SEEK_CUR = SEEK_CUR, - SF_SEEK_END = SEEK_END -} ; - -sf_count_t sf_seek (SNDFILE *sndfile, sf_count_t frames, int whence) ; - - -/* Functions for retrieving and setting string data within sound files. -** Not all file types support this features; AIFF and WAV do. For both -** functions, the str_type parameter must be one of the SF_STR_* values -** defined above. -** On error, sf_set_string() returns non-zero while sf_get_string() -** returns NULL. -*/ - -int sf_set_string (SNDFILE *sndfile, int str_type, const char* str) ; - -const char* sf_get_string (SNDFILE *sndfile, int str_type) ; - - -/* Return the library version string. */ - -const char * sf_version_string (void) ; - -/* Return the current byterate at this point in the file. The byte rate in this -** case is the number of bytes per second of audio data. For instance, for a -** stereo, 18 bit PCM encoded file with an 16kHz sample rate, the byte rate -** would be 2 (stereo) * 2 (two bytes per sample) * 16000 => 64000 bytes/sec. -** For some file formats the returned value will be accurate and exact, for some -** it will be a close approximation, for some it will be the average bitrate for -** the whole file and for some it will be a time varying value that was accurate -** when the file was most recently read or written. -** To get the bitrate, multiple this value by 8. -** Returns -1 for unknown. -*/ -int sf_current_byterate (SNDFILE *sndfile) ; - -/* Functions for reading/writing the waveform data of a sound file. -*/ - -sf_count_t sf_read_raw (SNDFILE *sndfile, void *ptr, sf_count_t bytes) ; -sf_count_t sf_write_raw (SNDFILE *sndfile, const void *ptr, sf_count_t bytes) ; - - -/* Functions for reading and writing the data chunk in terms of frames. -** The number of items actually read/written = frames * number of channels. -** sf_xxxx_raw read/writes the raw data bytes from/to the file -** sf_xxxx_short passes data in the native short format -** sf_xxxx_int passes data in the native int format -** sf_xxxx_float passes data in the native float format -** sf_xxxx_double passes data in the native double format -** All of these read/write function return number of frames read/written. -*/ - -sf_count_t sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) ; -sf_count_t sf_writef_short (SNDFILE *sndfile, const short *ptr, sf_count_t frames) ; - -sf_count_t sf_readf_int (SNDFILE *sndfile, int *ptr, sf_count_t frames) ; -sf_count_t sf_writef_int (SNDFILE *sndfile, const int *ptr, sf_count_t frames) ; - -sf_count_t sf_readf_float (SNDFILE *sndfile, float *ptr, sf_count_t frames) ; -sf_count_t sf_writef_float (SNDFILE *sndfile, const float *ptr, sf_count_t frames) ; - -sf_count_t sf_readf_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) ; -sf_count_t sf_writef_double (SNDFILE *sndfile, const double *ptr, sf_count_t frames) ; - - -/* Functions for reading and writing the data chunk in terms of items. -** Otherwise similar to above. -** All of these read/write function return number of items read/written. -*/ - -sf_count_t sf_read_short (SNDFILE *sndfile, short *ptr, sf_count_t items) ; -sf_count_t sf_write_short (SNDFILE *sndfile, const short *ptr, sf_count_t items) ; - -sf_count_t sf_read_int (SNDFILE *sndfile, int *ptr, sf_count_t items) ; -sf_count_t sf_write_int (SNDFILE *sndfile, const int *ptr, sf_count_t items) ; - -sf_count_t sf_read_float (SNDFILE *sndfile, float *ptr, sf_count_t items) ; -sf_count_t sf_write_float (SNDFILE *sndfile, const float *ptr, sf_count_t items) ; - -sf_count_t sf_read_double (SNDFILE *sndfile, double *ptr, sf_count_t items) ; -sf_count_t sf_write_double (SNDFILE *sndfile, const double *ptr, sf_count_t items) ; - - -/* Close the SNDFILE and clean up all memory allocations associated with this -** file. -** Returns 0 on success, or an error number. -*/ - -int sf_close (SNDFILE *sndfile) ; - - -/* If the file is opened SFM_WRITE or SFM_RDWR, call fsync() on the file -** to force the writing of data to disk. If the file is opened SFM_READ -** no action is taken. -*/ - -void sf_write_sync (SNDFILE *sndfile) ; - - - -/* The function sf_wchar_open() is Windows Only! -** Open a file passing in a Windows Unicode filename. Otherwise, this is -** the same as sf_open(). -** -** In order for this to work, you need to do the following: -** -** #include -** #define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 -** #including -*/ - -#if (defined (ENABLE_SNDFILE_WINDOWS_PROTOTYPES) && ENABLE_SNDFILE_WINDOWS_PROTOTYPES) -SNDFILE* sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) ; -#endif - - - - -/* Getting and setting of chunks from within a sound file. -** -** These functions allow the getting and setting of chunks within a sound file -** (for those formats which allow it). -** -** These functions fail safely. Specifically, they will not allow you to overwrite -** existing chunks or add extra versions of format specific reserved chunks but -** should allow you to retrieve any and all chunks (may not be implemented for -** all chunks or all file formats). -*/ - -struct SF_CHUNK_INFO -{ char id [64] ; /* The chunk identifier. */ - unsigned id_size ; /* The size of the chunk identifier. */ - unsigned datalen ; /* The size of that data. */ - void *data ; /* Pointer to the data. */ -} ; - -typedef struct SF_CHUNK_INFO SF_CHUNK_INFO ; - -/* Set the specified chunk info (must be done before any audio data is written -** to the file). This will fail for format specific reserved chunks. -** The chunk_info->data pointer must be valid until the file is closed. -** Returns SF_ERR_NO_ERROR on success or non-zero on failure. -*/ -int sf_set_chunk (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) ; - -/* -** An opaque structure to an iterator over the all chunks of a given id -*/ -typedef struct SF_CHUNK_ITERATOR SF_CHUNK_ITERATOR ; - -/* Get an iterator for all chunks matching chunk_info. -** The iterator will point to the first chunk matching chunk_info. -** Chunks are matching, if (chunk_info->id) matches the first -** (chunk_info->id_size) bytes of a chunk found in the SNDFILE* handle. -** If chunk_info is NULL, an iterator to all chunks in the SNDFILE* handle -** is returned. -** The values of chunk_info->datalen and chunk_info->data are ignored. -** If no matching chunks are found in the sndfile, NULL is returned. -** The returned iterator will stay valid until one of the following occurs: -** a) The sndfile is closed. -** b) A new chunk is added using sf_set_chunk(). -** c) Another chunk iterator function is called on the same SNDFILE* handle -** that causes the iterator to be modified. -** The memory for the iterator belongs to the SNDFILE* handle and is freed when -** sf_close() is called. -*/ -SF_CHUNK_ITERATOR * -sf_get_chunk_iterator (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) ; - -/* Iterate through chunks by incrementing the iterator. -** Increments the iterator and returns a handle to the new one. -** After this call, iterator will no longer be valid, and you must use the -** newly returned handle from now on. -** The returned handle can be used to access the next chunk matching -** the criteria as defined in sf_get_chunk_iterator(). -** If iterator points to the last chunk, this will free all resources -** associated with iterator and return NULL. -** The returned iterator will stay valid until sf_get_chunk_iterator_next -** is called again, the sndfile is closed or a new chunk us added. -*/ -SF_CHUNK_ITERATOR * -sf_next_chunk_iterator (SF_CHUNK_ITERATOR * iterator) ; - - -/* Get the size of the specified chunk. -** If the specified chunk exists, the size will be returned in the -** datalen field of the SF_CHUNK_INFO struct. -** Additionally, the id of the chunk will be copied to the id -** field of the SF_CHUNK_INFO struct and it's id_size field will -** be updated accordingly. -** If the chunk doesn't exist chunk_info->datalen will be zero, and the -** id and id_size fields will be undefined. -** The function will return SF_ERR_NO_ERROR on success or non-zero on -** failure. -*/ -int -sf_get_chunk_size (const SF_CHUNK_ITERATOR * it, SF_CHUNK_INFO * chunk_info) ; - -/* Get the specified chunk data. -** If the specified chunk exists, up to chunk_info->datalen bytes of -** the chunk data will be copied into the chunk_info->data buffer -** (allocated by the caller) and the chunk_info->datalen field -** updated to reflect the size of the data. The id and id_size -** field will be updated according to the retrieved chunk -** If the chunk doesn't exist chunk_info->datalen will be zero, and the -** id and id_size fields will be undefined. -** The function will return SF_ERR_NO_ERROR on success or non-zero on -** failure. -*/ -int -sf_get_chunk_data (const SF_CHUNK_ITERATOR * it, SF_CHUNK_INFO * chunk_info) ; - - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* SNDFILE_H */ - diff --git a/libs/libsndfile/src/sndfile.hh b/libs/libsndfile/src/sndfile.hh deleted file mode 100644 index 0a0c62d7f6..0000000000 --- a/libs/libsndfile/src/sndfile.hh +++ /dev/null @@ -1,446 +0,0 @@ -/* -** Copyright (C) 2005-2012 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* -** The above modified BSD style license (GPL and LGPL compatible) applies to -** this file. It does not apply to libsndfile itself which is released under -** the GNU LGPL or the libsndfile test suite which is released under the GNU -** GPL. -** This means that this header file can be used under this modified BSD style -** license, but the LGPL still holds for the libsndfile library itself. -*/ - -/* -** sndfile.hh -- A lightweight C++ wrapper for the libsndfile API. -** -** All the methods are inlines and all functionality is contained in this -** file. There is no separate implementation file. -** -** API documentation is in the doc/ directory of the source code tarball -** and at http://www.mega-nerd.com/libsndfile/api.html. -*/ - -#ifndef SNDFILE_HH -#define SNDFILE_HH - -#include - -#include -#include // for std::nothrow - -class SndfileHandle -{ private : - struct SNDFILE_ref - { SNDFILE_ref (void) ; - ~SNDFILE_ref (void) ; - - SNDFILE *sf ; - SF_INFO sfinfo ; - int ref ; - } ; - - SNDFILE_ref *p ; - - public : - /* Default constructor */ - SndfileHandle (void) : p (NULL) {} ; - SndfileHandle (const char *path, int mode = SFM_READ, - int format = 0, int channels = 0, int samplerate = 0) ; - SndfileHandle (std::string const & path, int mode = SFM_READ, - int format = 0, int channels = 0, int samplerate = 0) ; - SndfileHandle (int fd, bool close_desc, int mode = SFM_READ, - int format = 0, int channels = 0, int samplerate = 0) ; - SndfileHandle (SF_VIRTUAL_IO &sfvirtual, void *user_data, int mode = SFM_READ, - int format = 0, int channels = 0, int samplerate = 0) ; - -#ifdef ENABLE_SNDFILE_WINDOWS_PROTOTYPES - SndfileHandle (LPCWSTR wpath, int mode = SFM_READ, - int format = 0, int channels = 0, int samplerate = 0) ; -#endif - - ~SndfileHandle (void) ; - - SndfileHandle (const SndfileHandle &orig) ; - SndfileHandle & operator = (const SndfileHandle &rhs) ; - - /* Mainly for debugging/testing. */ - int refCount (void) const { return (p == NULL) ? 0 : p->ref ; } - - operator bool () const { return (p != NULL) ; } - - bool operator == (const SndfileHandle &rhs) const { return (p == rhs.p) ; } - - sf_count_t frames (void) const { return p ? p->sfinfo.frames : 0 ; } - int format (void) const { return p ? p->sfinfo.format : 0 ; } - int channels (void) const { return p ? p->sfinfo.channels : 0 ; } - int samplerate (void) const { return p ? p->sfinfo.samplerate : 0 ; } - - int error (void) const ; - const char * strError (void) const ; - - int command (int cmd, void *data, int datasize) ; - - sf_count_t seek (sf_count_t frames, int whence) ; - - void writeSync (void) ; - - int setString (int str_type, const char* str) ; - - const char* getString (int str_type) const ; - - static int formatCheck (int format, int channels, int samplerate) ; - - sf_count_t read (short *ptr, sf_count_t items) ; - sf_count_t read (int *ptr, sf_count_t items) ; - sf_count_t read (float *ptr, sf_count_t items) ; - sf_count_t read (double *ptr, sf_count_t items) ; - - sf_count_t write (const short *ptr, sf_count_t items) ; - sf_count_t write (const int *ptr, sf_count_t items) ; - sf_count_t write (const float *ptr, sf_count_t items) ; - sf_count_t write (const double *ptr, sf_count_t items) ; - - sf_count_t readf (short *ptr, sf_count_t frames) ; - sf_count_t readf (int *ptr, sf_count_t frames) ; - sf_count_t readf (float *ptr, sf_count_t frames) ; - sf_count_t readf (double *ptr, sf_count_t frames) ; - - sf_count_t writef (const short *ptr, sf_count_t frames) ; - sf_count_t writef (const int *ptr, sf_count_t frames) ; - sf_count_t writef (const float *ptr, sf_count_t frames) ; - sf_count_t writef (const double *ptr, sf_count_t frames) ; - - sf_count_t readRaw (void *ptr, sf_count_t bytes) ; - sf_count_t writeRaw (const void *ptr, sf_count_t bytes) ; - - /**< Raw access to the handle. SndfileHandle keeps ownership. */ - SNDFILE * rawHandle (void) ; - - /**< Take ownership of handle, if reference count is 1. */ - SNDFILE * takeOwnership (void) ; -} ; - -/*============================================================================== -** Nothing but implementation below. -*/ - -inline -SndfileHandle::SNDFILE_ref::SNDFILE_ref (void) -: ref (1) -{} - -inline -SndfileHandle::SNDFILE_ref::~SNDFILE_ref (void) -{ if (sf != NULL) sf_close (sf) ; } - -inline -SndfileHandle::SndfileHandle (const char *path, int mode, int fmt, int chans, int srate) -: p (NULL) -{ - p = new (std::nothrow) SNDFILE_ref () ; - - if (p != NULL) - { p->ref = 1 ; - - p->sfinfo.frames = 0 ; - p->sfinfo.channels = chans ; - p->sfinfo.format = fmt ; - p->sfinfo.samplerate = srate ; - p->sfinfo.sections = 0 ; - p->sfinfo.seekable = 0 ; - - p->sf = sf_open (path, mode, &p->sfinfo) ; - } ; - - return ; -} /* SndfileHandle const char * constructor */ - -inline -SndfileHandle::SndfileHandle (std::string const & path, int mode, int fmt, int chans, int srate) -: p (NULL) -{ - p = new (std::nothrow) SNDFILE_ref () ; - - if (p != NULL) - { p->ref = 1 ; - - p->sfinfo.frames = 0 ; - p->sfinfo.channels = chans ; - p->sfinfo.format = fmt ; - p->sfinfo.samplerate = srate ; - p->sfinfo.sections = 0 ; - p->sfinfo.seekable = 0 ; - - p->sf = sf_open (path.c_str (), mode, &p->sfinfo) ; - } ; - - return ; -} /* SndfileHandle std::string constructor */ - -inline -SndfileHandle::SndfileHandle (int fd, bool close_desc, int mode, int fmt, int chans, int srate) -: p (NULL) -{ - if (fd < 0) - return ; - - p = new (std::nothrow) SNDFILE_ref () ; - - if (p != NULL) - { p->ref = 1 ; - - p->sfinfo.frames = 0 ; - p->sfinfo.channels = chans ; - p->sfinfo.format = fmt ; - p->sfinfo.samplerate = srate ; - p->sfinfo.sections = 0 ; - p->sfinfo.seekable = 0 ; - - p->sf = sf_open_fd (fd, mode, &p->sfinfo, close_desc) ; - } ; - - return ; -} /* SndfileHandle fd constructor */ - -inline -SndfileHandle::SndfileHandle (SF_VIRTUAL_IO &sfvirtual, void *user_data, int mode, int fmt, int chans, int srate) -: p (NULL) -{ - p = new (std::nothrow) SNDFILE_ref () ; - - if (p != NULL) - { p->ref = 1 ; - - p->sfinfo.frames = 0 ; - p->sfinfo.channels = chans ; - p->sfinfo.format = fmt ; - p->sfinfo.samplerate = srate ; - p->sfinfo.sections = 0 ; - p->sfinfo.seekable = 0 ; - - p->sf = sf_open_virtual (&sfvirtual, mode, &p->sfinfo, user_data) ; - } ; - - return ; -} /* SndfileHandle std::string constructor */ - -inline -SndfileHandle::~SndfileHandle (void) -{ if (p != NULL && --p->ref == 0) - delete p ; -} /* SndfileHandle destructor */ - - -inline -SndfileHandle::SndfileHandle (const SndfileHandle &orig) -: p (orig.p) -{ if (p != NULL) - ++p->ref ; -} /* SndfileHandle copy constructor */ - -inline SndfileHandle & -SndfileHandle::operator = (const SndfileHandle &rhs) -{ - if (&rhs == this) - return *this ; - if (p != NULL && --p->ref == 0) - delete p ; - - p = rhs.p ; - if (p != NULL) - ++p->ref ; - - return *this ; -} /* SndfileHandle assignment operator */ - -inline int -SndfileHandle::error (void) const -{ return sf_error (p->sf) ; } - -inline const char * -SndfileHandle::strError (void) const -{ return sf_strerror (p->sf) ; } - -inline int -SndfileHandle::command (int cmd, void *data, int datasize) -{ return sf_command (p->sf, cmd, data, datasize) ; } - -inline sf_count_t -SndfileHandle::seek (sf_count_t frame_count, int whence) -{ return sf_seek (p->sf, frame_count, whence) ; } - -inline void -SndfileHandle::writeSync (void) -{ sf_write_sync (p->sf) ; } - -inline int -SndfileHandle::setString (int str_type, const char* str) -{ return sf_set_string (p->sf, str_type, str) ; } - -inline const char* -SndfileHandle::getString (int str_type) const -{ return sf_get_string (p->sf, str_type) ; } - -inline int -SndfileHandle::formatCheck (int fmt, int chans, int srate) -{ - SF_INFO sfinfo ; - - sfinfo.frames = 0 ; - sfinfo.channels = chans ; - sfinfo.format = fmt ; - sfinfo.samplerate = srate ; - sfinfo.sections = 0 ; - sfinfo.seekable = 0 ; - - return sf_format_check (&sfinfo) ; -} - -/*---------------------------------------------------------------------*/ - -inline sf_count_t -SndfileHandle::read (short *ptr, sf_count_t items) -{ return sf_read_short (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::read (int *ptr, sf_count_t items) -{ return sf_read_int (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::read (float *ptr, sf_count_t items) -{ return sf_read_float (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::read (double *ptr, sf_count_t items) -{ return sf_read_double (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::write (const short *ptr, sf_count_t items) -{ return sf_write_short (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::write (const int *ptr, sf_count_t items) -{ return sf_write_int (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::write (const float *ptr, sf_count_t items) -{ return sf_write_float (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::write (const double *ptr, sf_count_t items) -{ return sf_write_double (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::readf (short *ptr, sf_count_t frame_count) -{ return sf_readf_short (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::readf (int *ptr, sf_count_t frame_count) -{ return sf_readf_int (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::readf (float *ptr, sf_count_t frame_count) -{ return sf_readf_float (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::readf (double *ptr, sf_count_t frame_count) -{ return sf_readf_double (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::writef (const short *ptr, sf_count_t frame_count) -{ return sf_writef_short (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::writef (const int *ptr, sf_count_t frame_count) -{ return sf_writef_int (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::writef (const float *ptr, sf_count_t frame_count) -{ return sf_writef_float (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::writef (const double *ptr, sf_count_t frame_count) -{ return sf_writef_double (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::readRaw (void *ptr, sf_count_t bytes) -{ return sf_read_raw (p->sf, ptr, bytes) ; } - -inline sf_count_t -SndfileHandle::writeRaw (const void *ptr, sf_count_t bytes) -{ return sf_write_raw (p->sf, ptr, bytes) ; } - -inline SNDFILE * -SndfileHandle::rawHandle (void) -{ return (p ? p->sf : NULL) ; } - -inline SNDFILE * -SndfileHandle::takeOwnership (void) -{ - if (p == NULL || (p->ref != 1)) - return NULL ; - - SNDFILE * sf = p->sf ; - p->sf = NULL ; - delete p ; - p = NULL ; - return sf ; -} - -#ifdef ENABLE_SNDFILE_WINDOWS_PROTOTYPES - -inline -SndfileHandle::SndfileHandle (LPCWSTR wpath, int mode, int fmt, int chans, int srate) -: p (NULL) -{ - p = new (std::nothrow) SNDFILE_ref () ; - - if (p != NULL) - { p->ref = 1 ; - - p->sfinfo.frames = 0 ; - p->sfinfo.channels = chans ; - p->sfinfo.format = fmt ; - p->sfinfo.samplerate = srate ; - p->sfinfo.sections = 0 ; - p->sfinfo.seekable = 0 ; - - p->sf = sf_wchar_open (wpath, mode, &p->sfinfo) ; - } ; - - return ; -} /* SndfileHandle const wchar_t * constructor */ - -#endif - -#endif /* SNDFILE_HH */ - diff --git a/libs/libsndfile/src/strings.c b/libs/libsndfile/src/strings.c deleted file mode 100644 index c587e9b736..0000000000 --- a/libs/libsndfile/src/strings.c +++ /dev/null @@ -1,222 +0,0 @@ -/* -** Copyright (C) 2001-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#include "sndfile.h" -#include "common.h" - -#define STRINGS_DEBUG 0 -#if STRINGS_DEBUG -static void hexdump (void *data, int len) ; -#endif - -int -psf_store_string (SF_PRIVATE *psf, int str_type, const char *str) -{ char new_str [128] ; - size_t str_len ; - int k, str_flags ; - - if (str == NULL) - return SFE_STR_BAD_STRING ; - - str_len = strlen (str) ; - - /* A few extra checks for write mode. */ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if ((psf->strings.flags & SF_STR_ALLOW_START) == 0) - return SFE_STR_NO_SUPPORT ; - if (psf->have_written && (psf->strings.flags & SF_STR_ALLOW_END) == 0) - return SFE_STR_NO_SUPPORT ; - /* Only allow zero length strings for software. */ - if (str_type != SF_STR_SOFTWARE && str_len == 0) - return SFE_STR_BAD_STRING ; - } ; - - /* Find the next free slot in table. */ - for (k = 0 ; k < SF_MAX_STRINGS ; k++) - { /* If we find a matching entry clear it. */ - if (psf->strings.data [k].type == str_type) - psf->strings.data [k].type = -1 ; - - if (psf->strings.data [k].type == 0) - break ; - } ; - - /* Determine flags */ - str_flags = SF_STR_LOCATE_START ; - if (psf->file.mode == SFM_RDWR || psf->have_written) - { if ((psf->strings.flags & SF_STR_ALLOW_END) == 0) - return SFE_STR_NO_ADD_END ; - str_flags = SF_STR_LOCATE_END ; - } ; - - /* More sanity checking. */ - if (k >= SF_MAX_STRINGS) - return SFE_STR_MAX_COUNT ; - - if (k == 0 && psf->strings.storage_used != 0) - { psf_log_printf (psf, "SFE_STR_WEIRD : k == 0 && psf->strings.storage_used != 0\n") ; - return SFE_STR_WEIRD ; - } ; - - if (k != 0 && psf->strings.storage_used == 0) - { psf_log_printf (psf, "SFE_STR_WEIRD : k != 0 && psf->strings.storage_used == 0\n") ; - return SFE_STR_WEIRD ; - } ; - - /* Special case for the first string. */ - if (k == 0) - psf->strings.storage_used = 0 ; - - switch (str_type) - { case SF_STR_SOFTWARE : - /* In write mode, want to append libsndfile-version to string. */ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if (strstr (str, PACKAGE) == NULL) - { /* - ** If the supplied string does not already contain a - ** libsndfile-X.Y.Z component, then add it. - */ - if (strlen (str) == 0) - snprintf (new_str, sizeof (new_str), "%s-%s", PACKAGE, VERSION) ; - else - snprintf (new_str, sizeof (new_str), "%s (%s-%s)", str, PACKAGE, VERSION) ; - } - else - snprintf (new_str, sizeof (new_str), "%s", str) ; - - str = new_str ; - } ; - break ; - - case SF_STR_TITLE : - case SF_STR_COPYRIGHT : - case SF_STR_ARTIST : - case SF_STR_COMMENT : - case SF_STR_DATE : - case SF_STR_ALBUM : - case SF_STR_LICENSE : - case SF_STR_TRACKNUMBER : - case SF_STR_GENRE : - break ; - - default : - psf_log_printf (psf, "%s : SFE_STR_BAD_TYPE\n", __func__) ; - return SFE_STR_BAD_TYPE ; - } ; - - /* Plus one to catch string terminator. */ - str_len = strlen (str) + 1 ; - - if (psf->strings.storage_used + str_len + 1 > psf->strings.storage_len) - { char * temp = psf->strings.storage ; - size_t newlen = 2 * psf->strings.storage_len + str_len + 1 ; - - newlen = newlen < 256 ? 256 : newlen ; - - if ((psf->strings.storage = realloc (temp, newlen)) == NULL) - { psf->strings.storage = temp ; - return SFE_MALLOC_FAILED ; - } ; - - psf->strings.storage_len = newlen ; - } ; - - psf->strings.data [k].type = str_type ; - psf->strings.data [k].offset = psf->strings.storage_used ; - psf->strings.data [k].flags = str_flags ; - - memcpy (psf->strings.storage + psf->strings.storage_used, str, str_len) ; - psf->strings.storage_used += str_len ; - - psf->strings.flags |= str_flags ; - -#if STRINGS_DEBUG - psf_log_printf (psf, "str_storage : %p\n", psf->strings.storage) ; - psf_log_printf (psf, "storage_used : %u\n", psf->strings.storage_used) ; - psf_log_printf (psf, "used : %d\n", psf->strings.storage_used) ; - psf_log_printf (psf, "remaining : %d\n", psf->strings.storage_len - psf->strings.storage_used ; - - hexdump (psf->strings.storage, 300) ; -#endif - - return 0 ; -} /* psf_store_string */ - -int -psf_set_string (SF_PRIVATE *psf, int str_type, const char *str) -{ if (psf->file.mode == SFM_READ) - return SFE_STR_NOT_WRITE ; - - return psf_store_string (psf, str_type, str) ; -} /* psf_set_string */ - -const char* -psf_get_string (SF_PRIVATE *psf, int str_type) -{ int k ; - - for (k = 0 ; k < SF_MAX_STRINGS ; k++) - if (str_type == psf->strings.data [k].type) - return psf->strings.storage + psf->strings.data [k].offset ; - - return NULL ; -} /* psf_get_string */ - -int -psf_location_string_count (const SF_PRIVATE * psf, int location) -{ int k, count = 0 ; - - for (k = 0 ; k < SF_MAX_STRINGS ; k++) - if (psf->strings.data [k].type > 0 && psf->strings.data [k].flags & location) - count ++ ; - - return count ; -} /* psf_location_string_count */ - -/*============================================================================== -*/ - -#if STRINGS_DEBUG - -#include -static void -hexdump (void *data, int len) -{ unsigned char *ptr ; - int k ; - - ptr = data ; - - puts ("---------------------------------------------------------") ; - while (len >= 16) - { for (k = 0 ; k < 16 ; k++) - printf ("%02X ", ptr [k] & 0xFF) ; - printf (" ") ; - for (k = 0 ; k < 16 ; k++) - printf ("%c", psf_isprint (ptr [k]) ? ptr [k] : '.') ; - puts ("") ; - ptr += 16 ; - len -= 16 ; - } ; -} /* hexdump */ - -#endif diff --git a/libs/libsndfile/src/svx.c b/libs/libsndfile/src/svx.c deleted file mode 100644 index b611f760af..0000000000 --- a/libs/libsndfile/src/svx.c +++ /dev/null @@ -1,416 +0,0 @@ -/* -** Copyright (C) 1999-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - - -/*------------------------------------------------------------------------------ - * Macros to handle big/little endian issues. -*/ - -#define FORM_MARKER (MAKE_MARKER ('F', 'O', 'R', 'M')) -#define SVX8_MARKER (MAKE_MARKER ('8', 'S', 'V', 'X')) -#define SV16_MARKER (MAKE_MARKER ('1', '6', 'S', 'V')) -#define VHDR_MARKER (MAKE_MARKER ('V', 'H', 'D', 'R')) -#define BODY_MARKER (MAKE_MARKER ('B', 'O', 'D', 'Y')) - -#define ATAK_MARKER (MAKE_MARKER ('A', 'T', 'A', 'K')) -#define RLSE_MARKER (MAKE_MARKER ('R', 'L', 'S', 'E')) - -#define c_MARKER (MAKE_MARKER ('(', 'c', ')', ' ')) -#define NAME_MARKER (MAKE_MARKER ('N', 'A', 'M', 'E')) -#define AUTH_MARKER (MAKE_MARKER ('A', 'U', 'T', 'H')) -#define ANNO_MARKER (MAKE_MARKER ('A', 'N', 'N', 'O')) -#define CHAN_MARKER (MAKE_MARKER ('C', 'H', 'A', 'N')) - -/*------------------------------------------------------------------------------ - * Typedefs for file chunks. -*/ - -typedef struct -{ unsigned int oneShotHiSamples, repeatHiSamples, samplesPerHiCycle ; - unsigned short samplesPerSec ; - unsigned char octave, compression ; - unsigned int volume ; -} VHDR_CHUNK ; - -enum { - HAVE_FORM = 0x01, - - HAVE_SVX = 0x02, - HAVE_VHDR = 0x04, - HAVE_BODY = 0x08 -} ; - -/*------------------------------------------------------------------------------ - * Private static functions. -*/ - -static int svx_close (SF_PRIVATE *psf) ; -static int svx_write_header (SF_PRIVATE *psf, int calc_length) ; -static int svx_read_header (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -svx_open (SF_PRIVATE *psf) -{ int error ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = svx_read_header (psf))) - return error ; - - psf->endian = SF_ENDIAN_BIG ; /* All SVX files are big endian. */ - - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - if (psf->blockwidth) - psf->sf.frames = psf->datalength / psf->blockwidth ; - - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - } ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if (psf->is_pipe) - return SFE_NO_PIPE_WRITE ; - - if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_SVX) - return SFE_BAD_OPEN_FORMAT ; - - psf->endian = SF_ENDIAN (psf->sf.format) ; - - if (psf->endian == SF_ENDIAN_LITTLE || (CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_CPU)) - return SFE_BAD_ENDIAN ; - - psf->endian = SF_ENDIAN_BIG ; /* All SVX files are big endian. */ - - error = svx_write_header (psf, SF_FALSE) ; - if (error) - return error ; - - psf->write_header = svx_write_header ; - } ; - - psf->container_close = svx_close ; - - if ((error = pcm_init (psf))) - return error ; - - return 0 ; -} /* svx_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -svx_read_header (SF_PRIVATE *psf) -{ VHDR_CHUNK vhdr ; - unsigned int FORMsize, vhdrsize, dword, marker ; - int filetype = 0, parsestage = 0, done = 0 ; - int bytecount = 0, channels ; - - if (psf->filelength > SF_PLATFORM_S64 (0xffffffff)) - psf_log_printf (psf, "Warning : filelength > 0xffffffff. This is bad!!!!\n") ; - - memset (&vhdr, 0, sizeof (vhdr)) ; - psf_binheader_readf (psf, "p", 0) ; - - /* Set default number of channels. Modify later if necessary */ - psf->sf.channels = 1 ; - - psf->sf.format = SF_FORMAT_SVX ; - - while (! done) - { psf_binheader_readf (psf, "m", &marker) ; - switch (marker) - { case FORM_MARKER : - if (parsestage) - return SFE_SVX_NO_FORM ; - - psf_binheader_readf (psf, "E4", &FORMsize) ; - - if (FORMsize != psf->filelength - 2 * sizeof (dword)) - { dword = psf->filelength - 2 * sizeof (dword) ; - psf_log_printf (psf, "FORM : %d (should be %d)\n", FORMsize, dword) ; - FORMsize = dword ; - } - else - psf_log_printf (psf, "FORM : %d\n", FORMsize) ; - parsestage |= HAVE_FORM ; - break ; - - case SVX8_MARKER : - case SV16_MARKER : - if (! (parsestage & HAVE_FORM)) - return SFE_SVX_NO_FORM ; - filetype = marker ; - psf_log_printf (psf, " %M\n", marker) ; - parsestage |= HAVE_SVX ; - break ; - - case VHDR_MARKER : - if (! (parsestage & (HAVE_FORM | HAVE_SVX))) - return SFE_SVX_NO_FORM ; - - psf_binheader_readf (psf, "E4", &vhdrsize) ; - - psf_log_printf (psf, " VHDR : %d\n", vhdrsize) ; - - psf_binheader_readf (psf, "E4442114", &(vhdr.oneShotHiSamples), &(vhdr.repeatHiSamples), - &(vhdr.samplesPerHiCycle), &(vhdr.samplesPerSec), &(vhdr.octave), &(vhdr.compression), - &(vhdr.volume)) ; - - psf_log_printf (psf, " OneShotHiSamples : %d\n", vhdr.oneShotHiSamples) ; - psf_log_printf (psf, " RepeatHiSamples : %d\n", vhdr.repeatHiSamples) ; - psf_log_printf (psf, " samplesPerHiCycle : %d\n", vhdr.samplesPerHiCycle) ; - psf_log_printf (psf, " Sample Rate : %d\n", vhdr.samplesPerSec) ; - psf_log_printf (psf, " Octave : %d\n", vhdr.octave) ; - - psf_log_printf (psf, " Compression : %d => ", vhdr.compression) ; - - switch (vhdr.compression) - { case 0 : psf_log_printf (psf, "None.\n") ; - break ; - case 1 : psf_log_printf (psf, "Fibonacci delta\n") ; - break ; - case 2 : psf_log_printf (psf, "Exponential delta\n") ; - break ; - } ; - - psf_log_printf (psf, " Volume : %d\n", vhdr.volume) ; - - psf->sf.samplerate = vhdr.samplesPerSec ; - - if (filetype == SVX8_MARKER) - { psf->sf.format |= SF_FORMAT_PCM_S8 ; - psf->bytewidth = 1 ; - } - else if (filetype == SV16_MARKER) - { psf->sf.format |= SF_FORMAT_PCM_16 ; - psf->bytewidth = 2 ; - } ; - - parsestage |= HAVE_VHDR ; - break ; - - case BODY_MARKER : - if (! (parsestage & HAVE_VHDR)) - return SFE_SVX_NO_BODY ; - - psf_binheader_readf (psf, "E4", &dword) ; - psf->datalength = dword ; - - psf->dataoffset = psf_ftell (psf) ; - if (psf->dataoffset < 0) - return SFE_SVX_NO_BODY ; - - if (psf->datalength > psf->filelength - psf->dataoffset) - { psf_log_printf (psf, " BODY : %D (should be %D)\n", psf->datalength, psf->filelength - psf->dataoffset) ; - psf->datalength = psf->filelength - psf->dataoffset ; - } - else - psf_log_printf (psf, " BODY : %D\n", psf->datalength) ; - - parsestage |= HAVE_BODY ; - - if (! psf->sf.seekable) - break ; - - psf_fseek (psf, psf->datalength, SEEK_CUR) ; - break ; - - case NAME_MARKER : - if (! (parsestage & HAVE_SVX)) - return SFE_SVX_NO_FORM ; - - psf_binheader_readf (psf, "E4", &dword) ; - - psf_log_printf (psf, " %M : %d\n", marker, dword) ; - - if (strlen (psf->file.name.c) != dword) - { if (dword > sizeof (psf->file.name.c) - 1) - return SFE_SVX_BAD_NAME_LENGTH ; - - psf_binheader_readf (psf, "b", psf->file.name.c, dword) ; - psf->file.name.c [dword] = 0 ; - } - else - psf_binheader_readf (psf, "j", dword) ; - break ; - - case ANNO_MARKER : - if (! (parsestage & HAVE_SVX)) - return SFE_SVX_NO_FORM ; - - psf_binheader_readf (psf, "E4", &dword) ; - - psf_log_printf (psf, " %M : %d\n", marker, dword) ; - - psf_binheader_readf (psf, "j", dword) ; - break ; - - case CHAN_MARKER : - if (! (parsestage & HAVE_SVX)) - return SFE_SVX_NO_FORM ; - - psf_binheader_readf (psf, "E4", &dword) ; - - psf_log_printf (psf, " %M : %d\n", marker, dword) ; - - bytecount += psf_binheader_readf (psf, "E4", &channels) ; - - if (channels == 2 || channels == 4) - psf_log_printf (psf, " Channels : %d => mono\n", channels) ; - else if (channels == 6) - { psf->sf.channels = 2 ; - psf_log_printf (psf, " Channels : %d => stereo\n", channels) ; - } - else - psf_log_printf (psf, " Channels : %d *** assuming mono\n", channels) ; - - psf_binheader_readf (psf, "j", dword - bytecount) ; - break ; - - - case AUTH_MARKER : - case c_MARKER : - if (! (parsestage & HAVE_SVX)) - return SFE_SVX_NO_FORM ; - - psf_binheader_readf (psf, "E4", &dword) ; - - psf_log_printf (psf, " %M : %d\n", marker, dword) ; - - psf_binheader_readf (psf, "j", dword) ; - break ; - - default : - if (psf_isprint ((marker >> 24) & 0xFF) && psf_isprint ((marker >> 16) & 0xFF) - && psf_isprint ((marker >> 8) & 0xFF) && psf_isprint (marker & 0xFF)) - { psf_binheader_readf (psf, "E4", &dword) ; - - psf_log_printf (psf, "%M : %d (unknown marker)\n", marker, dword) ; - - psf_binheader_readf (psf, "j", dword) ; - break ; - } ; - if ((dword = psf_ftell (psf)) & 0x03) - { psf_log_printf (psf, " Unknown chunk marker at position %d. Resynching.\n", dword - 4) ; - - psf_binheader_readf (psf, "j", -3) ; - break ; - } ; - psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ; - done = 1 ; - } ; /* switch (marker) */ - - if (! psf->sf.seekable && (parsestage & HAVE_BODY)) - break ; - - if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (dword)) - break ; - } ; /* while (1) */ - - if (vhdr.compression) - return SFE_SVX_BAD_COMP ; - - if (psf->dataoffset <= 0) - return SFE_SVX_NO_DATA ; - - return 0 ; -} /* svx_read_header */ - -static int -svx_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - svx_write_header (psf, SF_TRUE) ; - - return 0 ; -} /* svx_close */ - -static int -svx_write_header (SF_PRIVATE *psf, int calc_length) -{ static char annotation [] = "libsndfile by Erik de Castro Lopo\0\0\0" ; - sf_count_t current ; - - current = psf_ftell (psf) ; - - if (calc_length) - { psf->filelength = psf_get_filelen (psf) ; - - psf->datalength = psf->filelength - psf->dataoffset ; - - if (psf->dataend) - psf->datalength -= psf->filelength - psf->dataend ; - - psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; - } ; - - psf->header [0] = 0 ; - psf->headindex = 0 ; - psf_fseek (psf, 0, SEEK_SET) ; - - /* FORM marker and FORM size. */ - psf_binheader_writef (psf, "Etm8", FORM_MARKER, (psf->filelength < 8) ? - psf->filelength * 0 : psf->filelength - 8) ; - - psf_binheader_writef (psf, "m", (psf->bytewidth == 1) ? SVX8_MARKER : SV16_MARKER) ; - - /* VHDR chunk. */ - psf_binheader_writef (psf, "Em4", VHDR_MARKER, sizeof (VHDR_CHUNK)) ; - /* VHDR : oneShotHiSamples, repeatHiSamples, samplesPerHiCycle */ - psf_binheader_writef (psf, "E444", psf->sf.frames, 0, 0) ; - /* VHDR : samplesPerSec, octave, compression */ - psf_binheader_writef (psf, "E211", psf->sf.samplerate, 1, 0) ; - /* VHDR : volume */ - psf_binheader_writef (psf, "E4", (psf->bytewidth == 1) ? 0xFF : 0xFFFF) ; - - if (psf->sf.channels == 2) - psf_binheader_writef (psf, "Em44", CHAN_MARKER, 4, 6) ; - - /* Filename and annotation strings. */ - psf_binheader_writef (psf, "Emsms", NAME_MARKER, psf->file.name.c, ANNO_MARKER, annotation) ; - - /* BODY marker and size. */ - psf_binheader_writef (psf, "Etm8", BODY_MARKER, (psf->datalength < 0) ? - psf->datalength * 0 : psf->datalength) ; - - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - psf->dataoffset = psf->headindex ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* svx_write_header */ - diff --git a/libs/libsndfile/src/test_audio_detect.c b/libs/libsndfile/src/test_audio_detect.c deleted file mode 100644 index 9706249eae..0000000000 --- a/libs/libsndfile/src/test_audio_detect.c +++ /dev/null @@ -1,111 +0,0 @@ -/* -** Copyright (C) 2007-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include -#include - -#include "common.h" -#include "sfendian.h" - -#include "test_main.h" - -static unsigned char float_le_mono [] = -{ 0x36, 0x86, 0x21, 0x44, 0xB5, 0xB4, 0x49, 0x44, 0xA2, 0xC0, 0x71, 0x44, 0x7B, 0xD1, 0x8C, 0x44, - 0x54, 0xAA, 0xA0, 0x44, 0x60, 0x67, 0xB4, 0x44, 0x22, 0x05, 0xC8, 0x44, 0x29, 0x80, 0xDB, 0x44, - 0x04, 0xD5, 0xEE, 0x44, 0x27, 0x00, 0x01, 0x45, 0x50, 0x7F, 0x0A, 0x45, 0x53, 0xE6, 0x13, 0x45, - 0x85, 0x33, 0x1D, 0x45, 0x43, 0x65, 0x26, 0x45, 0xEC, 0x79, 0x2F, 0x45, 0xE3, 0x6F, 0x38, 0x45, - 0x98, 0x45, 0x41, 0x45, 0x77, 0xF9, 0x49, 0x45, 0xF6, 0x89, 0x52, 0x45, 0x8F, 0xF5, 0x5A, 0x45, - 0xC9, 0x3A, 0x63, 0x45, 0x28, 0x58, 0x6B, 0x45, 0x3C, 0x4C, 0x73, 0x45, 0x9F, 0x15, 0x7B, 0x45, - 0x75, 0x59, 0x81, 0x45, 0x64, 0x11, 0x85, 0x45, 0xF1, 0xB1, 0x88, 0x45, 0x78, 0x3A, 0x8C, 0x45, - 0x58, 0xAA, 0x8F, 0x45, 0xF2, 0x00, 0x93, 0x45, 0xB2, 0x3D, 0x96, 0x45, 0x01, 0x60, 0x99, 0x45, - 0x50, 0x67, 0x9C, 0x45, 0x15, 0x53, 0x9F, 0x45, 0xCC, 0x22, 0xA2, 0x45, 0xF0, 0xD5, 0xA4, 0x45, - 0x07, 0x6C, 0xA7, 0x45, 0x9C, 0xE4, 0xA9, 0x45, 0x3D, 0x3F, 0xAC, 0x45, 0x7A, 0x7B, 0xAE, 0x45, - 0xF2, 0x98, 0xB0, 0x45, 0x3C, 0x97, 0xB2, 0x45, 0x02, 0x76, 0xB4, 0x45, 0xEC, 0x34, 0xB6, 0x45, - 0xA8, 0xD3, 0xB7, 0x45, 0xEB, 0x51, 0xB9, 0x45, 0x6F, 0xAF, 0xBA, 0x45, 0xF5, 0xEB, 0xBB, 0x45, - 0x41, 0x07, 0xBD, 0x45, 0x21, 0x01, 0xBE, 0x45, 0x64, 0xD9, 0xBE, 0x45, 0xE3, 0x8F, 0xBF, 0x45, - 0x7E, 0x24, 0xC0, 0x45, 0x15, 0x97, 0xC0, 0x45, 0x92, 0xE7, 0xC0, 0x45, 0xE8, 0x15, 0xC1, 0x45, - 0x7E, 0x24, 0xC0, 0x45, 0x15, 0x97, 0xC0, 0x45, 0x92, 0xE7, 0xC0, 0x45, 0xE8, 0x15, 0xC1, 0x45, - 0x7E, 0x24, 0xC0, 0x45, 0x15, 0x97, 0xC0, 0x45, 0x92, 0xE7, 0xC0, 0x45, 0xE8, 0x15, 0xC1, 0x45, -} ; - -static unsigned char int24_32_le_stereo [] = -{ - 0x00, 0xE7, 0xFB, 0xFF, 0x00, 0x7C, 0xFD, 0xFF, 0x00, 0xA2, 0xFC, 0xFF, 0x00, 0x2B, 0xFC, 0xFF, - 0x00, 0xF3, 0xFD, 0xFF, 0x00, 0x19, 0xFB, 0xFF, 0x00, 0xA5, 0xFE, 0xFF, 0x00, 0x8D, 0xFA, 0xFF, - 0x00, 0x91, 0xFF, 0xFF, 0x00, 0xB5, 0xFA, 0xFF, 0x00, 0x91, 0x00, 0x00, 0x00, 0x5E, 0xFB, 0xFF, - 0x00, 0xD9, 0x01, 0x00, 0x00, 0x82, 0xFB, 0xFF, 0x00, 0xDF, 0x03, 0x00, 0x00, 0x44, 0xFC, 0xFF, - 0x00, 0x1C, 0x05, 0x00, 0x00, 0x77, 0xFC, 0xFF, 0x00, 0x8D, 0x06, 0x00, 0x00, 0x4F, 0xFC, 0xFF, - 0x00, 0x84, 0x07, 0x00, 0x00, 0x74, 0xFC, 0xFF, 0x00, 0x98, 0x08, 0x00, 0x00, 0x33, 0xFD, 0xFF, - 0x00, 0xB9, 0x09, 0x00, 0x00, 0x48, 0xFF, 0xFF, 0x00, 0xD1, 0x0A, 0x00, 0x00, 0x10, 0x02, 0x00, - 0x00, 0x28, 0x0C, 0x00, 0x00, 0xA2, 0x05, 0x00, 0x00, 0xA7, 0x0C, 0x00, 0x00, 0x45, 0x08, 0x00, - 0x00, 0x44, 0x0D, 0x00, 0x00, 0x1A, 0x0A, 0x00, 0x00, 0x65, 0x0D, 0x00, 0x00, 0x51, 0x0B, 0x00, - 0x00, 0x8B, 0x0D, 0x00, 0x00, 0x18, 0x0B, 0x00, 0x00, 0x37, 0x0E, 0x00, 0x00, 0x24, 0x0B, 0x00, - 0x00, 0x00, 0x0F, 0x00, 0x00, 0xDD, 0x0A, 0x00, 0x00, 0x83, 0x10, 0x00, 0x00, 0x31, 0x0A, 0x00, - 0x00, 0x07, 0x12, 0x00, 0x00, 0xC0, 0x08, 0x00, 0x00, 0xF7, 0x12, 0x00, 0x00, 0x47, 0x06, 0x00, - 0x00, 0xDD, 0x12, 0x00, 0x00, 0x6A, 0x03, 0x00, 0x00, 0xD5, 0x11, 0x00, 0x00, 0x99, 0x00, 0x00, - 0x00, 0x01, 0x10, 0x00, 0x00, 0xC5, 0xFE, 0xFF, 0x00, 0xF4, 0x0D, 0x00, 0x00, 0x97, 0xFD, 0xFF, - 0x00, 0x62, 0x0B, 0x00, 0x00, 0x75, 0xFC, 0xFF, 0x00, 0xE9, 0x08, 0x00, 0x00, 0xC0, 0xFB, 0xFF, - 0x00, 0x80, 0x06, 0x00, 0x00, 0x3C, 0xFB, 0xFF, 0x00, 0xDA, 0x03, 0x00, 0x00, 0xE4, 0xFA, 0xFF, - 0x00, 0xEB, 0x01, 0x00, 0x00, 0x21, 0xFB, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0xE7, 0xFB, 0xFF, -} ; - - -void -test_audio_detect (void) -{ - SF_PRIVATE psf ; - AUDIO_DETECT ad ; - int errors = 0 ; - - print_test_name ("Testing audio detect") ; - - memset (&psf, 0, sizeof (psf)) ; - - ad.endianness = SF_ENDIAN_LITTLE ; - ad.channels = 1 ; - if (audio_detect (&psf, &ad, float_le_mono, sizeof (float_le_mono)) != SF_FORMAT_FLOAT) - { puts (" float_le_mono") ; - errors ++ ; - } ; - - ad.endianness = SF_ENDIAN_LITTLE ; - ad.channels = 2 ; - if (audio_detect (&psf, &ad, int24_32_le_stereo, sizeof (int24_32_le_stereo)) != SF_FORMAT_PCM_32) - { if (errors == 0) puts ("\nFailed tests :\n") ; - puts (" int24_32_le_stereo") ; - errors ++ ; - } ; - - if (errors != 0) - { printf ("\n Errors : %d\n\n", errors) ; - exit (1) ; - } ; - - puts ("ok") ; - - return ; -} /* test_audio_detect */ diff --git a/libs/libsndfile/src/test_broadcast_var.c b/libs/libsndfile/src/test_broadcast_var.c deleted file mode 100644 index dbea943124..0000000000 --- a/libs/libsndfile/src/test_broadcast_var.c +++ /dev/null @@ -1,119 +0,0 @@ -/* -** Copyright (C) 2010-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#include "common.h" - -#include "test_main.h" - -#define BCAST_MAX 512 - -typedef SF_BROADCAST_INFO_VAR (BCAST_MAX) SF_BROADCAST_INFO_512 ; - -static void -fill_coding_history (SF_BROADCAST_INFO_512 * bi) -{ static const char *lines [] = - { "Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit.", - "Donec dignissim erat\nvehicula libero condimentum\ndictum porta augue faucibus.", - "Maecenas nec turpis\nsit amet quam\nfaucibus adipiscing.", - "Mauris aliquam,\nlectus interdum\ntincidunt luctus.", - "\n\n\n\n\n\n\n\n\n\n\n\n", - "In auctor lorem\nvel est euismod\ncondimentum.", - "\n\n\n\n\n\n\n\n\n\n\n\n", - "Ut vitae magna\nid dui placerat vehicula\nin id lectus.", - "\n\n\n\n\n\n\n\n\n\n\n\n", - "Sed lacus leo,\nmolestie et luctus ac,\ntincidunt sit amet nisi.", - "\n\n\n\n\n\n\n\n\n\n\n\n", - "Sed ligula neque,\ngravida semper vulputate laoreet,\ngravida eu tellus.", - "Donec dolor dolor,\nscelerisque in consequat ornare,\ntempor nec nisl." - } ; - int k ; - - bi->coding_history [0] = 0 ; - - for (k = 0 ; strlen (bi->coding_history) < bi->coding_history_size - 1 ; k ++) - append_snprintf (bi->coding_history, bi->coding_history_size, "%s\n", lines [k % ARRAY_LEN (lines)]) ; - - return ; -} /* fill_coding_listory */ - -static void -test_broadcast_var_set (void) -{ SF_PRIVATE sf_private, *psf ; - int k ; - - psf = &sf_private ; - memset (psf, 0, sizeof (sf_private)) ; - - print_test_name ("Testing broadcast_var_set ") ; - - for (k = 64 ; k < BCAST_MAX ; k++) - { - SF_BROADCAST_INFO_512 bi ; - - memset (&bi, 0, sizeof (bi)) ; - - bi.coding_history_size = k ; - fill_coding_history (&bi) ; - bi.coding_history_size -- ; - - broadcast_var_set (psf, (SF_BROADCAST_INFO*) &bi, sizeof (bi)) ; - } ; - - if (psf->broadcast_16k != NULL) - free (psf->broadcast_16k) ; - - puts ("ok") ; -} /* test_broadcast_var_set */ - -static void -test_broadcast_var_zero (void) -{ SF_PRIVATE sf_private, *psf ; - SF_BROADCAST_INFO_VAR (0) bi ; - - psf = &sf_private ; - memset (psf, 0, sizeof (sf_private)) ; - psf->file.mode = SFM_RDWR ; - - print_test_name ("Testing broadcast_var_zero ") ; - - memset (&bi, 0, sizeof (bi)) ; - - broadcast_var_set (psf, (SF_BROADCAST_INFO*) &bi, sizeof (bi)) ; - - if (psf->broadcast_16k->coding_history_size != 0) - { printf ("\n\nLine %d: coding_history_size %d should be zero.\n\n", __LINE__, psf->broadcast_16k->coding_history_size) ; - exit (1) ; - } ; - - if (psf->broadcast_16k != NULL) - free (psf->broadcast_16k) ; - - puts ("ok") ; -} /* test_broadcast_var_zero */ - -void -test_broadcast_var (void) -{ test_broadcast_var_set () ; - test_broadcast_var_zero () ; -} /* test_broadcast_var */ diff --git a/libs/libsndfile/src/test_cart_var.c b/libs/libsndfile/src/test_cart_var.c deleted file mode 100644 index 532a755876..0000000000 --- a/libs/libsndfile/src/test_cart_var.c +++ /dev/null @@ -1,91 +0,0 @@ -/* -** Copyright (C) 2010-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#include "common.h" - -#include "test_main.h" - -#define CART_MAX 512 - -typedef SF_CART_INFO_VAR (CART_MAX) SF_CART_INFO_512 ; - -static void -fill_tag_text (SF_CART_INFO_512 * ci) -{ static const char *lines [] = - { "Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit.", - "Donec dignissim erat\nvehicula libero condimentum\ndictum porta augue faucibus.", - "Maecenas nec turpis\nsit amet quam\nfaucibus adipiscing.", - "Mauris aliquam,\nlectus interdum\ntincidunt luctus.", - "\n\n\n\n\n\n\n\n\n\n\n\n", - "In auctor lorem\nvel est euismod\ncondimentum.", - "\n\n\n\n\n\n\n\n\n\n\n\n", - "Ut vitae magna\nid dui placerat vehicula\nin id lectus.", - "\n\n\n\n\n\n\n\n\n\n\n\n", - "Sed lacus leo,\nmolestie et luctus ac,\ntincidunt sit amet nisi.", - "\n\n\n\n\n\n\n\n\n\n\n\n", - "Sed ligula neque,\ngravida semper vulputate laoreet,\ngravida eu tellus.", - "Donec dolor dolor,\nscelerisque in consequat ornare,\ntempor nec nisl." - } ; - int k ; - - ci->tag_text [0] = 0 ; - - for (k = 0 ; strlen (ci->tag_text) < ci->tag_text_size - 1 ; k ++) - append_snprintf (ci->tag_text, ci->tag_text_size, "%s\n", lines [k % ARRAY_LEN (lines)]) ; - - return ; -} /* fill_tag_text */ - -void -test_cart_var (void) -{ SF_PRIVATE sf_private, *psf ; - SF_CART_TIMER timer ; - int k ; - - psf = &sf_private ; - memset (psf, 0, sizeof (sf_private)) ; - - print_test_name ("Testing cart_var_set ") ; - - for (k = 64 ; k < CART_MAX ; k++) - { - SF_CART_INFO_512 ci ; - - memset (&ci, 0, sizeof (ci)) ; - - memset (&timer, 0, sizeof (timer)) ; - memcpy (ci.post_timers, &timer, sizeof (timer)) ; - - ci.tag_text_size = k ; - fill_tag_text (&ci) ; - ci.tag_text_size -- ; - - cart_var_set (psf, (SF_CART_INFO*) &ci, sizeof (ci)) ; - } ; - - if (psf->cart_16k != NULL) - free (psf->cart_16k) ; - - puts ("ok") ; -} /* test_cart_var */ diff --git a/libs/libsndfile/src/test_conversions.c b/libs/libsndfile/src/test_conversions.c deleted file mode 100644 index 7e8c2edee0..0000000000 --- a/libs/libsndfile/src/test_conversions.c +++ /dev/null @@ -1,110 +0,0 @@ -/* -** Copyright (C) 2006-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#include - -#include "common.h" -#include "test_main.h" - - -/* -** This is a bit rough, but it is the nicest way to do it. -*/ - -#define cmp_test(line, ival, tval, str) \ - if (ival != tval) \ - { printf (str, line, ival, tval) ; \ - exit (1) ; \ - } ; - -static void -conversion_test (char endian) -{ - SF_PRIVATE sf_private, *psf ; - const char * filename = "conversion.bin" ; - int64_t i64 = SF_PLATFORM_S64 (0x0123456789abcdef), t64 = 0 ; - char format_str [16] ; - char test_name [64] ; - char i8 = 12, t8 = 0 ; - short i16 = 0x123, t16 = 0 ; - int i24 = 0x23456, t24 = 0 ; - int i32 = 0x0a0b0c0d, t32 = 0 ; - int bytes ; - - snprintf (format_str, sizeof (format_str), "%c12348", endian) ; - - snprintf (test_name, sizeof (test_name), "Testing %s conversions", endian == 'e' ? "little endian" : "big endian") ; - print_test_name (test_name) ; - - psf = &sf_private ; - memset (psf, 0, sizeof (sf_private)) ; - - psf->file.mode = SFM_WRITE ; - snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ; - - if (psf_fopen (psf) != 0) - { printf ("\n\nError : failed to open file '%s' for write.\n\n", filename) ; - exit (1) ; - } ; - - psf_binheader_writef (psf, format_str, i8, i16, i24, i32, i64) ; - psf_fwrite (psf->header, 1, psf->headindex, psf) ; - psf_fclose (psf) ; - - memset (psf, 0, sizeof (sf_private)) ; - - psf->file.mode = SFM_READ ; - snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ; - - if (psf_fopen (psf) != 0) - { printf ("\n\nError : failed to open file '%s' for read.\n\n", filename) ; - exit (1) ; - } ; - - bytes = psf_binheader_readf (psf, format_str, &t8, &t16, &t24, &t32, &t64) ; - psf_fclose (psf) ; - - if (bytes != 18) - { printf ("\n\nLine %d : read %d bytes.\n\n", __LINE__, bytes) ; - exit (1) ; - } ; - - cmp_test (__LINE__, i8, t8, "\n\nLine %d : 8 bit int failed %d -> %d.\n\n") ; - cmp_test (__LINE__, i16, t16, "\n\nLine %d : 16 bit int failed 0x%x -> 0x%x.\n\n") ; - cmp_test (__LINE__, i24, t24, "\n\nLine %d : 24 bit int failed 0x%x -> 0x%x.\n\n") ; - cmp_test (__LINE__, i32, t32, "\n\nLine %d : 32 bit int failed 0x%x -> 0x%x.\n\n") ; - cmp_test (__LINE__, i64, t64, "\n\nLine %d : 64 bit int failed 0x%" PRIx64 "x -> 0x%" PRIx64 "x.\n\n") ; - - remove (filename) ; - puts ("ok") ; -} /* conversion_test */ - -void -test_conversions (void) -{ - conversion_test ('E') ; - conversion_test ('e') ; -} /* test_conversion */ - diff --git a/libs/libsndfile/src/test_endswap.c b/libs/libsndfile/src/test_endswap.c deleted file mode 100644 index 4931650c87..0000000000 --- a/libs/libsndfile/src/test_endswap.c +++ /dev/null @@ -1,235 +0,0 @@ -/* -** Copyright (C) 2002-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include "common.h" -#include "sfendian.h" - -#include "test_main.h" - -#define FMT_SHORT "0x%04x\n" -#define FMT_INT "0x%08x\n" -#define FMT_INT64 "0x%016" PRIx64 "\n" - -/*============================================================================== -** Test functions. -*/ - - -static void -dump_short_array (const char * name, short * data, int datalen) -{ int k ; - - printf ("%-6s : ", name) ; - for (k = 0 ; k < datalen ; k++) - printf (FMT_SHORT, data [k]) ; - putchar ('\n') ; -} /* dump_short_array */ - -static void -test_endswap_short (void) -{ short orig [4], first [4], second [4] ; - int k ; - - printf (" %-40s : ", "test_endswap_short") ; - fflush (stdout) ; - - for (k = 0 ; k < ARRAY_LEN (orig) ; k++) - orig [k] = 0x3210 + k ; - - endswap_short_copy (first, orig, ARRAY_LEN (first)) ; - endswap_short_copy (second, first, ARRAY_LEN (second)) ; - - if (memcmp (orig, first, sizeof (orig)) == 0) - { printf ("\n\nLine %d : test 1 : these two array should not be the same:\n\n", __LINE__) ; - dump_short_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_short_array ("first", first, ARRAY_LEN (first)) ; - exit (1) ; - } ; - - if (memcmp (orig, second, sizeof (orig)) != 0) - { printf ("\n\nLine %d : test 2 : these two array should be the same:\n\n", __LINE__) ; - dump_short_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_short_array ("second", second, ARRAY_LEN (second)) ; - exit (1) ; - } ; - - endswap_short_array (first, ARRAY_LEN (first)) ; - - if (memcmp (orig, first, sizeof (orig)) != 0) - { printf ("\n\nLine %d : test 3 : these two array should be the same:\n\n", __LINE__) ; - dump_short_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_short_array ("first", first, ARRAY_LEN (first)) ; - exit (1) ; - } ; - - endswap_short_copy (first, orig, ARRAY_LEN (first)) ; - endswap_short_copy (first, first, ARRAY_LEN (first)) ; - - if (memcmp (orig, first, sizeof (orig)) != 0) - { printf ("\n\nLine %d : test 4 : these two array should be the same:\n\n", __LINE__) ; - dump_short_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_short_array ("first", first, ARRAY_LEN (first)) ; - exit (1) ; - } ; - - puts ("ok") ; -} /* test_endswap_short */ - -static void -dump_int_array (const char * name, int * data, int datalen) -{ int k ; - - printf ("%-6s : ", name) ; - for (k = 0 ; k < datalen ; k++) - printf (FMT_INT, data [k]) ; - putchar ('\n') ; -} /* dump_int_array */ - -static void -test_endswap_int (void) -{ int orig [4], first [4], second [4] ; - int k ; - - printf (" %-40s : ", "test_endswap_int") ; - fflush (stdout) ; - - for (k = 0 ; k < ARRAY_LEN (orig) ; k++) - orig [k] = 0x76543210 + k ; - - endswap_int_copy (first, orig, ARRAY_LEN (first)) ; - endswap_int_copy (second, first, ARRAY_LEN (second)) ; - - if (memcmp (orig, first, sizeof (orig)) == 0) - { printf ("\n\nLine %d : test 1 : these two array should not be the same:\n\n", __LINE__) ; - dump_int_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_int_array ("first", first, ARRAY_LEN (first)) ; - exit (1) ; - } ; - - if (memcmp (orig, second, sizeof (orig)) != 0) - { printf ("\n\nLine %d : test 2 : these two array should be the same:\n\n", __LINE__) ; - dump_int_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_int_array ("second", second, ARRAY_LEN (second)) ; - exit (1) ; - } ; - - endswap_int_array (first, ARRAY_LEN (first)) ; - - if (memcmp (orig, first, sizeof (orig)) != 0) - { printf ("\n\nLine %d : test 3 : these two array should be the same:\n\n", __LINE__) ; - dump_int_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_int_array ("first", first, ARRAY_LEN (first)) ; - exit (1) ; - } ; - - endswap_int_copy (first, orig, ARRAY_LEN (first)) ; - endswap_int_copy (first, first, ARRAY_LEN (first)) ; - - if (memcmp (orig, first, sizeof (orig)) != 0) - { printf ("\n\nLine %d : test 4 : these two array should be the same:\n\n", __LINE__) ; - dump_int_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_int_array ("first", first, ARRAY_LEN (first)) ; - exit (1) ; - } ; - - puts ("ok") ; -} /* test_endswap_int */ - -static void -dump_int64_t_array (const char * name, int64_t * data, int datalen) -{ int k ; - - printf ("%-6s : ", name) ; - for (k = 0 ; k < datalen ; k++) - printf (FMT_INT64, data [k]) ; - putchar ('\n') ; -} /* dump_int64_t_array */ - -static void -test_endswap_int64_t (void) -{ int64_t orig [4], first [4], second [4] ; - int k ; - - printf (" %-40s : ", "test_endswap_int64_t") ; - fflush (stdout) ; - - for (k = 0 ; k < ARRAY_LEN (orig) ; k++) - orig [k] = 0x0807050540302010LL + k ; - - endswap_int64_t_copy (first, orig, ARRAY_LEN (first)) ; - endswap_int64_t_copy (second, first, ARRAY_LEN (second)) ; - - if (memcmp (orig, first, sizeof (orig)) == 0) - { printf ("\n\nLine %d : test 1 : these two array should not be the same:\n\n", __LINE__) ; - dump_int64_t_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_int64_t_array ("first", first, ARRAY_LEN (first)) ; - exit (1) ; - } ; - - if (memcmp (orig, second, sizeof (orig)) != 0) - { printf ("\n\nLine %d : test 2 : these two array should be the same:\n\n", __LINE__) ; - dump_int64_t_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_int64_t_array ("second", second, ARRAY_LEN (second)) ; - exit (1) ; - } ; - - endswap_int64_t_array (first, ARRAY_LEN (first)) ; - - if (memcmp (orig, first, sizeof (orig)) != 0) - { printf ("\n\nLine %d : test 3 : these two array should be the same:\n\n", __LINE__) ; - dump_int64_t_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_int64_t_array ("first", first, ARRAY_LEN (first)) ; - exit (1) ; - } ; - - endswap_int64_t_copy (first, orig, ARRAY_LEN (first)) ; - endswap_int64_t_copy (first, first, ARRAY_LEN (first)) ; - - if (memcmp (orig, first, sizeof (orig)) != 0) - { printf ("\n\nLine %d : test 4 : these two array should be the same:\n\n", __LINE__) ; - dump_int64_t_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_int64_t_array ("first", first, ARRAY_LEN (first)) ; - exit (1) ; - } ; - - puts ("ok") ; -} /* test_endswap_int64_t */ - - - -void -test_endswap (void) -{ - test_endswap_short () ; - test_endswap_int () ; - test_endswap_int64_t () ; - -} /* test_endswap */ - diff --git a/libs/libsndfile/src/test_endswap.def b/libs/libsndfile/src/test_endswap.def deleted file mode 100644 index 9516e4d67c..0000000000 --- a/libs/libsndfile/src/test_endswap.def +++ /dev/null @@ -1,40 +0,0 @@ -autogen definitions test_endswap.tpl; - -int_type = { - name = short ; - value = 0x3210 ; - format = FMT_SHORT ; - } ; - -int_type = { - name = int ; - value = 0x76543210 ; - format = FMT_INT ; - } ; - -int_type = { - name = int64_t ; - value = "0x0807050540302010LL" ; - format = FMT_INT64 ; - } ; - -int_size = { - name = 16 ; - typename = int16_t ; - value = 0x4142 ; - strval = "AB" ; - } ; - -int_size = { - name = 32 ; - typename = int32_t ; - value = 0x30313233 ; - strval = "0123" ; - } ; - -int_size = { - name = 64 ; - typename = int64_t ; - value = 0x3031323334353637 ; - strval = "01234567" ; - } ; diff --git a/libs/libsndfile/src/test_endswap.tpl b/libs/libsndfile/src/test_endswap.tpl deleted file mode 100644 index 89b7d1473a..0000000000 --- a/libs/libsndfile/src/test_endswap.tpl +++ /dev/null @@ -1,151 +0,0 @@ -[+ AutoGen5 template c +] -/* -** Copyright (C) 2002-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include "common.h" -#include "sfendian.h" - -#include "test_main.h" - -#define FMT_SHORT "0x%04x\n" -#define FMT_INT "0x%08x\n" -#define FMT_INT64 "0x%016" PRIx64 "\n" - -/*============================================================================== -** Test functions. -*/ - -[+ FOR int_type +] -static void -dump_[+ (get "name") +]_array (const char * name, [+ (get "name") +] * data, int datalen) -{ int k ; - - printf ("%-6s : ", name) ; - for (k = 0 ; k < datalen ; k++) - printf ([+ (get "format") +], data [k]) ; - putchar ('\n') ; -} /* dump_[+ (get "name") +]_array */ - -static void -test_endswap_[+ (get "name") +] (void) -{ [+ (get "name") +] orig [4], first [4], second [4] ; - int k ; - - printf (" %-40s : ", "test_endswap_[+ (get "name") +]") ; - fflush (stdout) ; - - for (k = 0 ; k < ARRAY_LEN (orig) ; k++) - orig [k] = [+ (get "value") +] + k ; - - endswap_[+ (get "name") +]_copy (first, orig, ARRAY_LEN (first)) ; - endswap_[+ (get "name") +]_copy (second, first, ARRAY_LEN (second)) ; - - if (memcmp (orig, first, sizeof (orig)) == 0) - { printf ("\n\nLine %d : test 1 : these two array should not be the same:\n\n", __LINE__) ; - dump_[+ (get "name") +]_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_[+ (get "name") +]_array ("first", first, ARRAY_LEN (first)) ; - exit (1) ; - } ; - - if (memcmp (orig, second, sizeof (orig)) != 0) - { printf ("\n\nLine %d : test 2 : these two array should be the same:\n\n", __LINE__) ; - dump_[+ (get "name") +]_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_[+ (get "name") +]_array ("second", second, ARRAY_LEN (second)) ; - exit (1) ; - } ; - - endswap_[+ (get "name") +]_array (first, ARRAY_LEN (first)) ; - - if (memcmp (orig, first, sizeof (orig)) != 0) - { printf ("\n\nLine %d : test 3 : these two array should be the same:\n\n", __LINE__) ; - dump_[+ (get "name") +]_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_[+ (get "name") +]_array ("first", first, ARRAY_LEN (first)) ; - exit (1) ; - } ; - - endswap_[+ (get "name") +]_copy (first, orig, ARRAY_LEN (first)) ; - endswap_[+ (get "name") +]_copy (first, first, ARRAY_LEN (first)) ; - - if (memcmp (orig, first, sizeof (orig)) != 0) - { printf ("\n\nLine %d : test 4 : these two array should be the same:\n\n", __LINE__) ; - dump_[+ (get "name") +]_array ("orig", orig, ARRAY_LEN (orig)) ; - dump_[+ (get "name") +]_array ("first", first, ARRAY_LEN (first)) ; - exit (1) ; - } ; - - puts ("ok") ; -} /* test_endswap_[+ (get "name") +] */ -[+ ENDFOR int_type -+] - -[+ FOR int_size +] -static void -test_psf_put_be[+ (get "name") +] (void) -{ const char *test = "[+ (get "strval") +]" ; - uint8_t array [32] ; - int k ; - - printf (" %-40s : ", __func__) ; - fflush (stdout) ; - - for (k = 0 ; k < 10 ; k++) - { memset (array, 0, sizeof (array)) ; - - psf_put_be[+ (get "name") +] (array, k, [+ (get "value") +]) ; - if (memcmp (array + k, test, sizeof ([+ (get "typename") +])) != 0) - { printf ("\n\nLine %d : Put failed at index %d.\n", __LINE__, k) ; - exit (1) ; - } ; - if (psf_get_be[+ (get "name") +] (array, k) != [+ (get "value") +]) - { printf ("\n\nLine %d : Get failed at index %d.\n", __LINE__, k) ; - exit (1) ; - } ; - } ; - - puts ("ok") ; -} /* test_psf_put_be[+ (get "name") +] */ -[+ ENDFOR int_size -+] - -void -test_endswap (void) -{ -[+ FOR int_type -+] test_endswap_[+ (get "name") +] () ; -[+ ENDFOR int_type -+] - -[+ FOR int_size -+] test_psf_put_be[+ (get "name") +] () ; -[+ ENDFOR int_endsize -+] - -} /* test_endswap */ - diff --git a/libs/libsndfile/src/test_file_io.c b/libs/libsndfile/src/test_file_io.c deleted file mode 100644 index 08fccebd21..0000000000 --- a/libs/libsndfile/src/test_file_io.c +++ /dev/null @@ -1,438 +0,0 @@ -/* -** Copyright (C) 2002-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include -#include -#include - -#include "common.h" - -#include "test_main.h" - -static void make_data (int *data, int len, int seed) ; - -static void file_open_test (const char *filename) ; -static void file_read_write_test (const char *filename) ; -static void file_truncate_test (const char *filename) ; - -static void test_open_or_die (SF_PRIVATE *psf, int linenum) ; -static void test_close_or_die (SF_PRIVATE *psf, int linenum) ; - -static void test_write_or_die (SF_PRIVATE *psf, void *data, sf_count_t bytes, sf_count_t items, sf_count_t new_position, int linenum) ; -static void test_read_or_die (SF_PRIVATE *psf, void *data, sf_count_t bytes, sf_count_t items, sf_count_t new_position, int linenum) ; -static void test_equal_or_die (int *array1, int *array2, int len, int linenum) ; -static void test_seek_or_die (SF_PRIVATE *psf, sf_count_t offset, int whence, sf_count_t new_position, int linenum) ; - - - -/*============================================================================== -** Actual test functions. -*/ - -static void -file_open_test (const char *filename) -{ SF_PRIVATE sf_data, *psf ; - int error ; - - print_test_name ("Testing file open") ; - - memset (&sf_data, 0, sizeof (sf_data)) ; - psf = &sf_data ; - - /* Ensure that the file doesn't already exist. */ - if (unlink (filename) != 0 && errno != ENOENT) - { printf ("\n\nLine %d: unlink failed (%d) : %s\n\n", __LINE__, errno, strerror (errno)) ; - exit (1) ; - } ; - - psf->file.mode = SFM_READ ; - snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ; - - /* Test that open for read fails if the file doesn't exist. */ - error = psf_fopen (psf) ; - if (error == 0) - { printf ("\n\nLine %d: psf_fopen() should have failed.\n\n", __LINE__) ; - exit (1) ; - } ; - - /* Reset error to zero. */ - psf->error = SFE_NO_ERROR ; - - /* Test file open in write mode. */ - psf->file.mode = SFM_WRITE ; - test_open_or_die (psf, __LINE__) ; - - test_close_or_die (psf, __LINE__) ; - - unlink (psf->file.path.c) ; - - /* Test file open in read/write mode for a non-existant file. */ - psf->file.mode = SFM_RDWR ; - test_open_or_die (psf, __LINE__) ; - - test_close_or_die (psf, __LINE__) ; - - /* Test file open in read/write mode for an existing file. */ - psf->file.mode = SFM_RDWR ; - test_open_or_die (psf, __LINE__) ; - - test_close_or_die (psf, __LINE__) ; - - unlink (psf->file.path.c) ; - puts ("ok") ; -} /* file_open_test */ - -static void -file_read_write_test (const char *filename) -{ static int data_out [512] ; - static int data_in [512] ; - - SF_PRIVATE sf_data, *psf ; - sf_count_t retval ; - - /* - ** Open a new file and write two blocks of data to the file. After each - ** write, test that psf_get_filelen() returns the new length. - */ - - print_test_name ("Testing file write") ; - - memset (&sf_data, 0, sizeof (sf_data)) ; - psf = &sf_data ; - snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ; - - /* Test file open in write mode. */ - psf->file.mode = SFM_WRITE ; - test_open_or_die (psf, __LINE__) ; - - make_data (data_out, ARRAY_LEN (data_out), 1) ; - test_write_or_die (psf, data_out, sizeof (data_out [0]), ARRAY_LEN (data_out), sizeof (data_out), __LINE__) ; - - if ((retval = psf_get_filelen (psf)) != sizeof (data_out)) - { printf ("\n\nLine %d: file length after write is not correct (%" PRId64 " should be %zd).\n\n", __LINE__, retval, sizeof (data_out)) ; - if (retval == 0) - printf ("An fsync() may be necessary before fstat() in psf_get_filelen().\n\n") ; - exit (1) ; - } ; - - make_data (data_out, ARRAY_LEN (data_out), 2) ; - test_write_or_die (psf, data_out, ARRAY_LEN (data_out), sizeof (data_out [0]), 2 * sizeof (data_out), __LINE__) ; - - if ((retval = psf_get_filelen (psf)) != 2 * sizeof (data_out)) - { printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %zd)\n\n", __LINE__, retval, 2 * sizeof (data_out)) ; - exit (1) ; - } ; - - test_close_or_die (psf, __LINE__) ; - puts ("ok") ; - - /* - ** Now open the file in read mode, check the file length and check - ** that the data is correct. - */ - - print_test_name ("Testing file read") ; - - /* Test file open in write mode. */ - psf->file.mode = SFM_READ ; - test_open_or_die (psf, __LINE__) ; - - make_data (data_out, ARRAY_LEN (data_out), 1) ; - test_read_or_die (psf, data_in, 1, sizeof (data_in), sizeof (data_in), __LINE__) ; - test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; - - make_data (data_out, ARRAY_LEN (data_out), 2) ; - test_read_or_die (psf, data_in, sizeof (data_in [0]), ARRAY_LEN (data_in), 2 * sizeof (data_in), __LINE__) ; - test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; - - test_close_or_die (psf, __LINE__) ; - - puts ("ok") ; - - /* - ** Open the file in read/write mode, seek around a bit and then seek to - ** the end of the file and write another block of data (3rd block). Then - ** go back and check that all three blocks are correct. - */ - - print_test_name ("Testing file seek") ; - - /* Test file open in read/write mode. */ - psf->file.mode = SFM_RDWR ; - test_open_or_die (psf, __LINE__) ; - - test_seek_or_die (psf, 0, SEEK_SET, 0, __LINE__) ; - test_seek_or_die (psf, 0, SEEK_END, 2 * SIGNED_SIZEOF (data_out), __LINE__) ; - test_seek_or_die (psf, -1 * SIGNED_SIZEOF (data_out), SEEK_CUR, (sf_count_t) sizeof (data_out), __LINE__) ; - - test_seek_or_die (psf, SIGNED_SIZEOF (data_out), SEEK_CUR, 2 * SIGNED_SIZEOF (data_out), __LINE__) ; - make_data (data_out, ARRAY_LEN (data_out), 3) ; - test_write_or_die (psf, data_out, sizeof (data_out [0]), ARRAY_LEN (data_out), 3 * sizeof (data_out), __LINE__) ; - - test_seek_or_die (psf, 0, SEEK_SET, 0, __LINE__) ; - make_data (data_out, ARRAY_LEN (data_out), 1) ; - test_read_or_die (psf, data_in, 1, sizeof (data_in), sizeof (data_in), __LINE__) ; - test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; - - test_seek_or_die (psf, 2 * SIGNED_SIZEOF (data_out), SEEK_SET, 2 * SIGNED_SIZEOF (data_out), __LINE__) ; - make_data (data_out, ARRAY_LEN (data_out), 3) ; - test_read_or_die (psf, data_in, 1, sizeof (data_in), 3 * sizeof (data_in), __LINE__) ; - test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; - - test_seek_or_die (psf, SIGNED_SIZEOF (data_out), SEEK_SET, SIGNED_SIZEOF (data_out), __LINE__) ; - make_data (data_out, ARRAY_LEN (data_out), 2) ; - test_read_or_die (psf, data_in, 1, sizeof (data_in), 2 * sizeof (data_in), __LINE__) ; - test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; - - test_close_or_die (psf, __LINE__) ; - puts ("ok") ; - - /* - ** Now test operations with a non-zero psf->fileoffset field. This field - ** sets an artificial file start positions so that a seek to the start of - ** the file will actually be a seek to the value given by psf->fileoffset. - */ - - print_test_name ("Testing file offset") ; - - /* Test file open in read/write mode. */ - psf->file.mode = SFM_RDWR ; - psf->fileoffset = sizeof (data_out [0]) * ARRAY_LEN (data_out) ; - test_open_or_die (psf, __LINE__) ; - - if ((retval = psf_get_filelen (psf)) != 3 * sizeof (data_out)) - { printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %zd)\n\n", __LINE__, retval, 3 * sizeof (data_out)) ; - exit (1) ; - } ; - - test_seek_or_die (psf, SIGNED_SIZEOF (data_out), SEEK_SET, SIGNED_SIZEOF (data_out), __LINE__) ; - make_data (data_out, ARRAY_LEN (data_out), 5) ; - test_write_or_die (psf, data_out, sizeof (data_out [0]), ARRAY_LEN (data_out), 2 * sizeof (data_out), __LINE__) ; - test_close_or_die (psf, __LINE__) ; - - /* final test with psf->fileoffset == 0. */ - - psf->file.mode = SFM_RDWR ; - psf->fileoffset = 0 ; - test_open_or_die (psf, __LINE__) ; - - if ((retval = psf_get_filelen (psf)) != 3 * sizeof (data_out)) - { printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %zd)\n\n", __LINE__, retval, 3 * sizeof (data_out)) ; - exit (1) ; - } ; - - make_data (data_out, ARRAY_LEN (data_out), 1) ; - test_read_or_die (psf, data_in, 1, sizeof (data_in), sizeof (data_in), __LINE__) ; - test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; - - make_data (data_out, ARRAY_LEN (data_out), 2) ; - test_read_or_die (psf, data_in, 1, sizeof (data_in), 2 * sizeof (data_in), __LINE__) ; - test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; - - make_data (data_out, ARRAY_LEN (data_out), 5) ; - test_read_or_die (psf, data_in, 1, sizeof (data_in), 3 * sizeof (data_in), __LINE__) ; - test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; - - test_close_or_die (psf, __LINE__) ; - - puts ("ok") ; -} /* file_read_write_test */ - -static void -file_truncate_test (const char *filename) -{ SF_PRIVATE sf_data, *psf ; - unsigned char buffer [256] ; - int k ; - - /* - ** Open a new file and write two blocks of data to the file. After each - ** write, test that psf_get_filelen() returns the new length. - */ - - print_test_name ("Testing file truncate") ; - - memset (&sf_data, 0, sizeof (sf_data)) ; - memset (buffer, 0xEE, sizeof (buffer)) ; - - psf = &sf_data ; - snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ; - - /* - ** Open the file write mode, write 0xEE data and then extend the file - ** using truncate (the extended data should be 0x00). - */ - psf->file.mode = SFM_WRITE ; - test_open_or_die (psf, __LINE__) ; - test_write_or_die (psf, buffer, sizeof (buffer) / 2, 1, sizeof (buffer) / 2, __LINE__) ; - psf_ftruncate (psf, sizeof (buffer)) ; - test_close_or_die (psf, __LINE__) ; - - /* Open the file in read mode and check the data. */ - psf->file.mode = SFM_READ ; - test_open_or_die (psf, __LINE__) ; - test_read_or_die (psf, buffer, sizeof (buffer), 1, sizeof (buffer), __LINE__) ; - test_close_or_die (psf, __LINE__) ; - - for (k = 0 ; k < SIGNED_SIZEOF (buffer) / 2 ; k++) - if (buffer [k] != 0xEE) - { printf ("\n\nLine %d : buffer [%d] = %d (should be 0xEE)\n\n", __LINE__, k, buffer [k]) ; - exit (1) ; - } ; - - for (k = SIGNED_SIZEOF (buffer) / 2 ; k < SIGNED_SIZEOF (buffer) ; k++) - if (buffer [k] != 0) - { printf ("\n\nLine %d : buffer [%d] = %d (should be 0)\n\n", __LINE__, k, buffer [k]) ; - exit (1) ; - } ; - - /* Open the file in read/write and shorten the file using truncate. */ - psf->file.mode = SFM_RDWR ; - test_open_or_die (psf, __LINE__) ; - psf_ftruncate (psf, sizeof (buffer) / 4) ; - test_close_or_die (psf, __LINE__) ; - - /* Check the file length. */ - psf->file.mode = SFM_READ ; - test_open_or_die (psf, __LINE__) ; - test_seek_or_die (psf, 0, SEEK_END, SIGNED_SIZEOF (buffer) / 4, __LINE__) ; - test_close_or_die (psf, __LINE__) ; - - puts ("ok") ; -} /* file_truncate_test */ - -/*============================================================================== -** Testing helper functions. -*/ - -static void -test_open_or_die (SF_PRIVATE *psf, int linenum) -{ int error ; - - /* Test that open for read fails if the file doesn't exist. */ - error = psf_fopen (psf) ; - if (error) - { printf ("\n\nLine %d: psf_fopen() failed : %s\n\n", linenum, strerror (errno)) ; - exit (1) ; - } ; - -} /* test_open_or_die */ - -static void -test_close_or_die (SF_PRIVATE *psf, int linenum) -{ - psf_fclose (psf) ; - if (psf_file_valid (psf)) - { printf ("\n\nLine %d: psf->file.filedes should not be valid.\n\n", linenum) ; - exit (1) ; - } ; - -} /* test_close_or_die */ - -static void -test_write_or_die (SF_PRIVATE *psf, void *data, sf_count_t bytes, sf_count_t items, sf_count_t new_position, int linenum) -{ sf_count_t retval ; - - retval = psf_fwrite (data, bytes, items, psf) ; - if (retval != items) - { printf ("\n\nLine %d: psf_write() returned %" PRId64 " (should be %" PRId64 ")\n\n", linenum, retval, items) ; - exit (1) ; - } ; - - if ((retval = psf_ftell (psf)) != new_position) - { printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %" PRId64 ")\n\n", linenum, retval, new_position) ; - exit (1) ; - } ; - - return ; -} /* test_write_or_die */ - -static void -test_read_or_die (SF_PRIVATE *psf, void *data, sf_count_t bytes, sf_count_t items, sf_count_t new_position, int linenum) -{ sf_count_t retval ; - - retval = psf_fread (data, bytes, items, psf) ; - if (retval != items) - { printf ("\n\nLine %d: psf_write() returned %" PRId64 " (should be %" PRId64 ")\n\n", linenum, retval, items) ; - exit (1) ; - } ; - - if ((retval = psf_ftell (psf)) != new_position) - { printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %" PRId64 ")\n\n", linenum, retval, new_position) ; - exit (1) ; - } ; - - return ; -} /* test_write_or_die */ - -static void -test_seek_or_die (SF_PRIVATE *psf, sf_count_t offset, int whence, sf_count_t new_position, int linenum) -{ sf_count_t retval ; - - retval = psf_fseek (psf, offset, whence) ; - - if (retval != new_position) - { printf ("\n\nLine %d: psf_fseek() failed. New position is %" PRId64 " (should be %" PRId64 ").\n\n", - linenum, retval, new_position) ; - exit (1) ; - } ; - -} /* test_seek_or_die */ - -static void -test_equal_or_die (int *array1, int *array2, int len, int linenum) -{ int k ; - - for (k = 0 ; k < len ; k++) - if (array1 [k] != array2 [k]) - printf ("\n\nLine %d: error at index %d (%d != %d).\n\n", - linenum, k, array1 [k], array2 [k]) ; - - return ; -} /* test_equal_or_die */ - -static void -make_data (int *data, int len, int seed) -{ int k ; - - srand (seed * 3333333 + 14756123) ; - - for (k = 0 ; k < len ; k++) - data [k] = rand () ; - -} /* make_data */ - -void -test_file_io (void) -{ const char *filename = "file_io.dat" ; - - file_open_test (filename) ; - file_read_write_test (filename) ; - file_truncate_test (filename) ; - - unlink (filename) ; -} /* main */ - diff --git a/libs/libsndfile/src/test_float.c b/libs/libsndfile/src/test_float.c deleted file mode 100644 index 07879896e5..0000000000 --- a/libs/libsndfile/src/test_float.c +++ /dev/null @@ -1,104 +0,0 @@ -/* -** Copyright (C) 2006-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#include - -#include "common.h" -#include "test_main.h" - -void -test_float_convert (void) -{ static float data [] = - { 0.0, 1.0, -1.0, 1.0 * M_PI, -1.0 * M_PI, - 1e9, -1e9, 1e-9, -1e-9, 1e-10, -1e-10, - 1e-19, -1e-19, 1e19, -1e19, 1e-20, -1e-20, - } ; - - int k ; - - print_test_name (__func__) ; - - for (k = 0 ; k < ARRAY_LEN (data) ; k++) - { unsigned char bytes [4] ; - float test ; - - float32_le_write (data [k], bytes) ; - test = float32_le_read (bytes) ; - - if (fabs (data [k] - test) > 1e-20) - { printf ("\n\nLine %d : Test %d, little endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test) ; - exit (1) ; - } ; - - float32_be_write (data [k], bytes) ; - test = float32_be_read (bytes) ; - - if (fabs (data [k] - test) > 1e-20) - { printf ("\n\nLine %d : Test %d, big endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test) ; - exit (1) ; - } ; - - } ; - - puts ("ok") ; -} /* test_float_convert */ - -void -test_double_convert (void) -{ static double data [] = - { 0.0, 1.0, -1.0, 1.0 * M_PI, -1.0 * M_PI, - 1e9, -1e9, 1e-9, -1e-9, 1e-10, -1e-10, - 1e-19, -1e-19, 1e19, -1e19, 1e-20, -1e-20, - } ; - - int k ; - - print_test_name (__func__) ; - - for (k = 0 ; k < ARRAY_LEN (data) ; k++) - { unsigned char bytes [8] ; - double test ; - - double64_le_write (data [k], bytes) ; - test = double64_le_read (bytes) ; - - if (fabs (data [k] - test) > 1e-20) - { printf ("\n\nLine %d : Test %d, little endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test) ; - exit (1) ; - } ; - - double64_be_write (data [k], bytes) ; - test = double64_be_read (bytes) ; - - if (fabs (data [k] - test) > 1e-20) - { printf ("\n\nLine %d : Test %d, big endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test) ; - exit (1) ; - } ; - - } ; - - puts ("ok") ; -} /* test_double_convert */ - diff --git a/libs/libsndfile/src/test_ima_oki_adpcm.c b/libs/libsndfile/src/test_ima_oki_adpcm.c deleted file mode 100644 index 6c937d1173..0000000000 --- a/libs/libsndfile/src/test_ima_oki_adpcm.c +++ /dev/null @@ -1,157 +0,0 @@ -/* -** Copyright (C) 2007-2011 Erik de Castro Lopo -** Copyright (c) 2007 -** -** 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 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, -** Fifth Floor, 51 Franklin Street, Boston, MA 02111-1301, USA. -*/ - -#include "sfconfig.h" - -#include - -#include "test_main.h" - -#include "ima_oki_adpcm.c" - -static const unsigned char test_codes [] = -{ 0x08, 0x08, 0x04, 0x7f, 0x72, 0xf7, 0x9f, 0x7c, 0xd7, 0xbc, 0x7a, 0xa7, 0xb8, - 0x4b, 0x0b, 0x38, 0xf6, 0x9d, 0x7a, 0xd7, 0xbc, 0x7a, 0xd7, 0xa8, 0x6c, 0x81, - 0x98, 0xe4, 0x0e, 0x7a, 0xd7, 0x9e, 0x7b, 0xc7, 0xab, 0x7a, 0x85, 0xc0, 0xb3, - 0x8f, 0x58, 0xd7, 0xad, 0x7a, 0xd7, 0xad, 0x7a, 0x87, 0xd0, 0x2b, 0x0e, 0x48, - 0xd7, 0xad, 0x78, 0xf7, 0xbc, 0x7a, 0xb7, 0xa8, 0x4b, 0x88, 0x18, 0xd5, 0x8d, - 0x6a, 0xa4, 0x98, 0x08, 0x00, 0x80, 0x88, -} ; - -static const short test_pcm [] = -{ 32, 0, 32, 0, 32, 320, 880, -336, 2304, 4192, -992, 10128, 5360, -16352, - 30208, 2272, -31872, 14688, -7040, -32432, 14128, -1392, -15488, 22960, - 1232, -1584, 21488, -240, 2576, -15360, 960, -1152, -30032, 10320, 1008, - -30032, 16528, 1008, -30032, 16528, -5200, -30592, 15968, 448, -30592, - 15968, 448, -2368, 30960, 3024, -80, 8384, 704, -1616, -29168, -1232, 1872, - -32768, 13792, -1728, -32768, 13792, 4480, -32192, 14368, -7360, -32752, - 13808, -1712, -21456, 16992, 1472, -1344, 26848, -1088, 2016, -17728, 208, - -2112, -32768, 1376, -1728, -32768, 13792, -1728, -32768, 13792, -1728, - -32768, 13792, -1728, -32768, 13792, -1728, -4544, 32767, -1377, 1727, - 15823, -2113, 207, -27345, 591, -2513, -32768, 13792, -1728, -32768, 13792, - 10688, -31632, 14928, -6800, -32192, 14368, -1152, -20896, 17552, 2032, - -784, 22288, 560, -2256, -4816, 2176, 64, -21120, 9920, 6816, -24224, 16128, - 608, -13488, 9584, 272, -2544, 16, -2304, -192, 1728, -16, 1568, 128, -1184, -} ; - - -static void -test_oki_adpcm (void) -{ - IMA_OKI_ADPCM adpcm ; - unsigned char code ; - int i, j ; - - print_test_name ("Testing ima/oki encoder") ; - - ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; - for (i = 0 ; i < ARRAY_LEN (test_codes) ; i++) - for (j = 0, code = test_codes [i] ; j < 2 ; j++, code <<= 4) - if (adpcm_decode (&adpcm, code >> 4) != test_pcm [2 * i + j]) - { printf ("\n\nFail at i = %d, j = %d.\n\n", i, j) ; - exit (1) ; - } ; - - puts ("ok") ; - - print_test_name ("Testing ima/oki decoder") ; - - ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; - for (i = 0 ; i < ARRAY_LEN (test_pcm) - 1 ; i += 2) - { code = adpcm_encode (&adpcm, test_pcm [i]) ; - code = (code << 4) | adpcm_encode (&adpcm, test_pcm [i + 1]) ; - if (code != test_codes [i / 2]) - { printf ("\n\nFail at i = %d, %d should be %d\n\n", i, code, test_codes [i / 2]) ; - exit (1) ; - } ; - } ; - - puts ("ok") ; -} /* test_oki_adpcm */ - -static void -test_oki_adpcm_block (void) -{ - IMA_OKI_ADPCM adpcm ; - int k ; - - if (ARRAY_LEN (adpcm.pcm) < ARRAY_LEN (test_pcm)) - { printf ("\n\nLine %d : ARRAY_LEN (adpcm->pcm) > ARRAY_LEN (test_pcm) (%d > %d).\n\n", __LINE__, ARRAY_LEN (adpcm.pcm), ARRAY_LEN (test_pcm)) ; - exit (1) ; - } ; - - if (ARRAY_LEN (adpcm.codes) < ARRAY_LEN (test_codes)) - { printf ("\n\nLine %d : ARRAY_LEN (adcodes->codes) > ARRAY_LEN (test_codes).n", __LINE__) ; - exit (1) ; - } ; - - print_test_name ("Testing ima/oki block encoder") ; - - ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; - - memcpy (adpcm.pcm, test_pcm, sizeof (adpcm.pcm [0]) * ARRAY_LEN (test_pcm)) ; - adpcm.pcm_count = ARRAY_LEN (test_pcm) ; - adpcm.code_count = 13 ; - - ima_oki_adpcm_encode_block (&adpcm) ; - - if (adpcm.code_count * 2 != ARRAY_LEN (test_pcm)) - { printf ("\n\nLine %d : %d * 2 != %d\n\n", __LINE__, adpcm.code_count * 2, ARRAY_LEN (test_pcm)) ; - exit (1) ; - } ; - - for (k = 0 ; k < ARRAY_LEN (test_codes) ; k++) - if (adpcm.codes [k] != test_codes [k]) - { printf ("\n\nLine %d : Fail at k = %d, %d should be %d\n\n", __LINE__, k, adpcm.codes [k], test_codes [k]) ; - exit (1) ; - } ; - - puts ("ok") ; - - print_test_name ("Testing ima/oki block decoder") ; - - ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; - - memcpy (adpcm.codes, test_codes, sizeof (adpcm.codes [0]) * ARRAY_LEN (test_codes)) ; - adpcm.code_count = ARRAY_LEN (test_codes) ; - adpcm.pcm_count = 13 ; - - ima_oki_adpcm_decode_block (&adpcm) ; - - if (adpcm.pcm_count != 2 * ARRAY_LEN (test_codes)) - { printf ("\n\nLine %d : %d * 2 != %d\n\n", __LINE__, adpcm.pcm_count, 2 * ARRAY_LEN (test_codes)) ; - exit (1) ; - } ; - - for (k = 0 ; k < ARRAY_LEN (test_pcm) ; k++) - if (adpcm.pcm [k] != test_pcm [k]) - { printf ("\n\nLine %d : Fail at i = %d, %d should be %d.\n\n", __LINE__, k, adpcm.pcm [k], test_pcm [k]) ; - exit (1) ; - } ; - - puts ("ok") ; -} /* test_oki_adpcm_block */ - -void -test_ima_oki_adpcm (void) -{ - test_oki_adpcm () ; - test_oki_adpcm_block () ; -} /* main */ - diff --git a/libs/libsndfile/src/test_log_printf.c b/libs/libsndfile/src/test_log_printf.c deleted file mode 100644 index e1806a1484..0000000000 --- a/libs/libsndfile/src/test_log_printf.c +++ /dev/null @@ -1,123 +0,0 @@ -/* -** Copyright (C) 2003-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#include "common.h" - -#include "test_main.h" - -#define CMP_0_ARGS(line, err, fmt) \ - { psf->parselog.indx = 0 ; \ - snprintf (buffer, sizeof (buffer), (fmt)) ; \ - psf_log_printf (psf, (fmt)) ; \ - err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ; \ - } - -#define CMP_2_ARGS(line, err, fmt, a) \ - { psf->parselog.indx = 0 ; \ - snprintf (buffer, sizeof (buffer), (fmt), (a), (a)) ; \ - psf_log_printf (psf, (fmt), (a), (a)) ; \ - err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ; \ - } - -#define CMP_4_ARGS(line, err, fmt, a) \ - { psf->parselog.indx = 0 ; \ - snprintf (buffer, sizeof (buffer), (fmt), (a), (a), (a), (a)) ; \ - psf_log_printf (psf, (fmt), (a), (a), (a), (a)) ; \ - err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ; \ - } - -#define CMP_5_ARGS(line, err, fmt, a) \ - { psf->parselog.indx = 0 ; \ - snprintf (buffer, sizeof (buffer), (fmt), (a), (a), (a), (a), (a)) ; \ - psf_log_printf (psf, (fmt), (a), (a), (a), (a), (a)) ; \ - err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ; \ - } - -#define CMP_6_ARGS(line, err, fmt, a) \ - { psf->parselog.indx = 0 ; \ - snprintf (buffer, sizeof (buffer), (fmt), (a), (a), (a), (a), (a), (a)) ; \ - psf_log_printf (psf, (fmt), (a), (a), (a), (a), (a), (a)) ; \ - err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ; \ - } - -static int -compare_strings_or_die (int linenum, const char *fmt, const char* s1, const char* s2) -{ int errors = 0 ; -/*-puts (s1) ;puts (s2) ;-*/ - - if (strcmp (s1, s2) != 0) - { printf ("\n\nLine %d: string compare mismatch:\n\t", linenum) ; - printf ("\"%s\"\n", fmt) ; - printf ("\t\"%s\"\n\t\"%s\"\n", s1, s2) ; - errors ++ ; - } ; - - return errors ; -} /* compare_strings_or_die */ - -void -test_log_printf (void) -{ static char buffer [2048] ; - SF_PRIVATE sf_private, *psf ; - int k, errors = 0 ; - int int_values [] = { 0, 1, 12, 123, 1234, 123456, -1, -12, -123, -1234, -123456 } ; - - print_test_name ("Testing psf_log_printf") ; - - psf = &sf_private ; - memset (psf, 0, sizeof (sf_private)) ; - - CMP_0_ARGS (__LINE__, errors, " ->%%<- ") ; - - /* Test printing of ints. */ - for (k = 0 ; k < ARRAY_LEN (int_values) ; k++) - CMP_6_ARGS (__LINE__, errors, "int A : %d, % d, %4d, % 4d, %04d, % 04d", int_values [k]) ; - - for (k = 0 ; k < ARRAY_LEN (int_values) ; k++) - CMP_5_ARGS (__LINE__, errors, "int B : %+d, %+4d, %+04d, %-d, %-4d", int_values [k]) ; - - for (k = 0 ; k < ARRAY_LEN (int_values) ; k++) - CMP_2_ARGS (__LINE__, errors, "int C : %- d, %- 4d", int_values [k]) ; - - /* Test printing of unsigned ints. */ - for (k = 0 ; k < ARRAY_LEN (int_values) ; k++) - CMP_4_ARGS (__LINE__, errors, "D : %u, %4u, %04u, %0u", int_values [k]) ; - - /* Test printing of hex ints. */ - for (k = 0 ; k < ARRAY_LEN (int_values) ; k++) - CMP_4_ARGS (__LINE__, errors, "E : %X, %4X, %04X, %0X", int_values [k]) ; - - /* Test printing of strings. */ - CMP_4_ARGS (__LINE__, errors, "B %s, %3s, %8s, %-8s", "str") ; - - if (errors) - { puts ("\nExiting due to errors.\n") ; - exit (1) ; - } ; - - puts ("ok") ; -} /* test_log_printf */ - diff --git a/libs/libsndfile/src/test_main.c b/libs/libsndfile/src/test_main.c deleted file mode 100644 index f51f7c9ee6..0000000000 --- a/libs/libsndfile/src/test_main.c +++ /dev/null @@ -1,49 +0,0 @@ -/* -** Copyright (C) 2008-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#include "test_main.h" - -int -main (void) -{ - test_conversions () ; - test_endswap () ; - test_float_convert () ; - test_double_convert () ; - - test_log_printf () ; - test_file_io () ; - - test_audio_detect () ; - test_ima_oki_adpcm () ; - - test_psf_strlcpy_crlf () ; - test_broadcast_var () ; - test_cart_var () ; - - return 0 ; -} /* main */ - diff --git a/libs/libsndfile/src/test_main.h b/libs/libsndfile/src/test_main.h deleted file mode 100644 index 6b2f28f4cd..0000000000 --- a/libs/libsndfile/src/test_main.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -** Copyright (C) 2008-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -static inline void -print_test_name (const char * name) -{ printf (" %-40s : ", name) ; - fflush (stdout) ; -} /* print_test_name */ - - - -void test_conversions (void) ; -void test_endswap (void) ; -void test_log_printf (void) ; -void test_file_io (void) ; - -void test_float_convert (void) ; -void test_double_convert (void) ; - -void test_audio_detect (void) ; -void test_ima_oki_adpcm (void) ; - -void test_psf_strlcpy_crlf (void) ; -void test_broadcast_var (void) ; - -void test_cart_var (void) ; diff --git a/libs/libsndfile/src/test_strncpy_crlf.c b/libs/libsndfile/src/test_strncpy_crlf.c deleted file mode 100644 index 774ced1083..0000000000 --- a/libs/libsndfile/src/test_strncpy_crlf.c +++ /dev/null @@ -1,56 +0,0 @@ -/* -** Copyright (C) 2010-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include - -#include "common.h" - -#include "test_main.h" - -void -test_psf_strlcpy_crlf (void) -{ const char *src = "a\nb\nc\n" ; - char *dest ; - int dest_len ; - - print_test_name ("Testing psf_strlcpy_crlf") ; - - for (dest_len = 3 ; dest_len < 30 ; dest_len++) - { dest = calloc (1, dest_len + 1) ; - if (dest == NULL) - { printf ("\n\nLine %d: calloc failed!\n\n", __LINE__) ; - exit (1) ; - } ; - - dest [dest_len] = '\xea' ; - - psf_strlcpy_crlf (dest, src, dest_len, sizeof (*src)) ; - - if (dest [dest_len] != '\xea') - { printf ("\n\nLine %d: buffer overrun for dest_len == %d\n\n", __LINE__, dest_len) ; - exit (1) ; - } ; - - free (dest) ; - } ; - - puts ("ok") ; -} /* test_psf_strlcpy_crlf */ diff --git a/libs/libsndfile/src/txw.c b/libs/libsndfile/src/txw.c deleted file mode 100644 index 16525dfe29..0000000000 --- a/libs/libsndfile/src/txw.c +++ /dev/null @@ -1,377 +0,0 @@ -/* -** Copyright (C) 2002-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/*=========================================================================== -** Yamaha TX16 Sampler Files. -** -** This header parser was written using information from the SoX source code -** and trial and error experimentation. The code here however is all original. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#if (ENABLE_EXPERIMENTAL_CODE == 0) - -int -txw_open (SF_PRIVATE *psf) -{ if (psf) - return SFE_UNIMPLEMENTED ; - return 0 ; -} /* txw_open */ - -#else - -/*------------------------------------------------------------------------------ -** Markers. -*/ - -#define TXW_DATA_OFFSET 32 - -#define TXW_LOOPED 0x49 -#define TXW_NO_LOOP 0xC9 - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int txw_read_header (SF_PRIVATE *psf) ; - -static sf_count_t txw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t txw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t txw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t txw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t txw_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; - -/*------------------------------------------------------------------------------ -** Public functions. -*/ - -/* - * ftp://ftp.t0.or.at/pub/sound/tx16w/samples.yamaha - * ftp://ftp.t0.or.at/pub/sound/tx16w/faq/tx16w.tec - * http://www.t0.or.at/~mpakesch/tx16w/ - * - * from tx16w.c sox 12.15: (7-Oct-98) (Mark Lakata and Leigh Smith) - * char filetype[6] "LM8953" - * nulls[10], - * dummy_aeg[6] - * format 0x49 = looped, 0xC9 = non-looped - * sample_rate 1 = 33 kHz, 2 = 50 kHz, 3 = 16 kHz - * atc_length[3] if sample rate 0, [2]&0xfe = 6: 33kHz, 0x10:50, 0xf6: 16, - * depending on [5] but to heck with it - * rpt_length[3] (these are for looped samples, attack and loop lengths) - * unused[2] - */ - -typedef struct -{ unsigned char format, srate, sr2, sr3 ; - unsigned short srhash ; - unsigned int attacklen, repeatlen ; -} TXW_HEADER ; - -#define ERROR_666 666 - -int -txw_open (SF_PRIVATE *psf) -{ int error ; - - if (psf->file.mode != SFM_READ) - return SFE_UNIMPLEMENTED ; - - if ((error = txw_read_header (psf))) - return error ; - - if (psf_fseek (psf, psf->dataoffset, SEEK_SET) != psf->dataoffset) - return SFE_BAD_SEEK ; - - psf->read_short = txw_read_s ; - psf->read_int = txw_read_i ; - psf->read_float = txw_read_f ; - psf->read_double = txw_read_d ; - - psf->seek = txw_seek ; - - return 0 ; -} /* txw_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -txw_read_header (SF_PRIVATE *psf) -{ BUF_UNION ubuf ; - TXW_HEADER txwh ; - const char *strptr ; - - memset (&txwh, 0, sizeof (txwh)) ; - memset (ubuf.cbuf, 0, sizeof (ubuf.cbuf)) ; - psf_binheader_readf (psf, "pb", 0, ubuf.cbuf, 16) ; - - if (memcmp (ubuf.cbuf, "LM8953\0\0\0\0\0\0\0\0\0\0", 16) != 0) - return ERROR_666 ; - - psf_log_printf (psf, "Read only : Yamaha TX-16 Sampler (.txw)\nLM8953\n") ; - - /* Jump 6 bytes (dummp_aeg), read format, read sample rate. */ - psf_binheader_readf (psf, "j11", 6, &txwh.format, &txwh.srate) ; - - /* 8 bytes (atc_length[3], rpt_length[3], unused[2]). */ - psf_binheader_readf (psf, "e33j", &txwh.attacklen, &txwh.repeatlen, 2) ; - txwh.sr2 = (txwh.attacklen >> 16) & 0xFE ; - txwh.sr3 = (txwh.repeatlen >> 16) & 0xFE ; - txwh.attacklen &= 0x1FFFF ; - txwh.repeatlen &= 0x1FFFF ; - - switch (txwh.format) - { case TXW_LOOPED : - strptr = "looped" ; - break ; - - case TXW_NO_LOOP : - strptr = "non-looped" ; - break ; - - default : - psf_log_printf (psf, " Format : 0x%02x => ?????\n", txwh.format) ; - return ERROR_666 ; - } ; - - psf_log_printf (psf, " Format : 0x%02X => %s\n", txwh.format, strptr) ; - - strptr = NULL ; - - switch (txwh.srate) - { case 1 : - psf->sf.samplerate = 33333 ; - break ; - - case 2 : - psf->sf.samplerate = 50000 ; - break ; - - case 3 : - psf->sf.samplerate = 16667 ; - break ; - - default : - /* This is ugly and braindead. */ - txwh.srhash = ((txwh.sr2 & 0xFE) << 8) | (txwh.sr3 & 0xFE) ; - switch (txwh.srhash) - { case ((0x6 << 8) | 0x52) : - psf->sf.samplerate = 33333 ; - break ; - - case ((0x10 << 8) | 0x52) : - psf->sf.samplerate = 50000 ; - break ; - - case ((0xF6 << 8) | 0x52) : - psf->sf.samplerate = 166667 ; - break ; - - default : - strptr = " Sample Rate : Unknown : forcing to 33333\n" ; - psf->sf.samplerate = 33333 ; - break ; - } ; - } ; - - - if (strptr) - psf_log_printf (psf, strptr) ; - else if (txwh.srhash) - psf_log_printf (psf, " Sample Rate : %d (0x%X) => %d\n", txwh.srate, txwh.srhash, psf->sf.samplerate) ; - else - psf_log_printf (psf, " Sample Rate : %d => %d\n", txwh.srate, psf->sf.samplerate) ; - - if (txwh.format == TXW_LOOPED) - { psf_log_printf (psf, " Attack Len : %d\n", txwh.attacklen) ; - psf_log_printf (psf, " Repeat Len : %d\n", txwh.repeatlen) ; - } ; - - psf->dataoffset = TXW_DATA_OFFSET ; - psf->datalength = psf->filelength - TXW_DATA_OFFSET ; - psf->sf.frames = 2 * psf->datalength / 3 ; - - - if (psf->datalength % 3 == 1) - psf_log_printf (psf, "*** File seems to be truncated, %d extra bytes.\n", - (int) (psf->datalength % 3)) ; - - if (txwh.attacklen + txwh.repeatlen > psf->sf.frames) - psf_log_printf (psf, "*** File has been truncated.\n") ; - - psf->sf.format = SF_FORMAT_TXW | SF_FORMAT_PCM_16 ; - psf->sf.channels = 1 ; - psf->sf.sections = 1 ; - psf->sf.seekable = SF_TRUE ; - - return 0 ; -} /* txw_read_header */ - -static sf_count_t -txw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - unsigned char *ucptr ; - short sample ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - - bufferlen = sizeof (ubuf.cbuf) / 3 ; - bufferlen -= (bufferlen & 1) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = psf_fread (ubuf.cbuf, 3, readcount, psf) ; - - ucptr = ubuf.ucbuf ; - for (k = 0 ; k < readcount ; k += 2) - { sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ; - ptr [total + k] = sample ; - sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ; - ptr [total + k + 1] = sample ; - ucptr += 3 ; - } ; - - total += count ; - len -= readcount ; - } ; - - return total ; -} /* txw_read_s */ - -static sf_count_t -txw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - unsigned char *ucptr ; - short sample ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - - bufferlen = sizeof (ubuf.cbuf) / 3 ; - bufferlen -= (bufferlen & 1) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = psf_fread (ubuf.cbuf, 3, readcount, psf) ; - - ucptr = ubuf.ucbuf ; - for (k = 0 ; k < readcount ; k += 2) - { sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ; - ptr [total + k] = sample << 16 ; - sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ; - ptr [total + k + 1] = sample << 16 ; - ucptr += 3 ; - } ; - - total += count ; - len -= readcount ; - } ; - - return total ; -} /* txw_read_i */ - -static sf_count_t -txw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - unsigned char *ucptr ; - short sample ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - float normfact ; - - if (psf->norm_float == SF_TRUE) - normfact = 1.0 / 0x8000 ; - else - normfact = 1.0 / 0x10 ; - - bufferlen = sizeof (ubuf.cbuf) / 3 ; - bufferlen -= (bufferlen & 1) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = psf_fread (ubuf.cbuf, 3, readcount, psf) ; - - ucptr = ubuf.ucbuf ; - for (k = 0 ; k < readcount ; k += 2) - { sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ; - ptr [total + k] = normfact * sample ; - sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ; - ptr [total + k + 1] = normfact * sample ; - ucptr += 3 ; - } ; - - total += count ; - len -= readcount ; - } ; - - return total ; -} /* txw_read_f */ - -static sf_count_t -txw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - unsigned char *ucptr ; - short sample ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - double normfact ; - - if (psf->norm_double == SF_TRUE) - normfact = 1.0 / 0x8000 ; - else - normfact = 1.0 / 0x10 ; - - bufferlen = sizeof (ubuf.cbuf) / 3 ; - bufferlen -= (bufferlen & 1) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : len ; - count = psf_fread (ubuf.cbuf, 3, readcount, psf) ; - - ucptr = ubuf.ucbuf ; - for (k = 0 ; k < readcount ; k += 2) - { sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ; - ptr [total + k] = normfact * sample ; - sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ; - ptr [total + k + 1] = normfact * sample ; - ucptr += 3 ; - } ; - - total += count ; - len -= readcount ; - } ; - - return total ; -} /* txw_read_d */ - -static sf_count_t -txw_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) -{ if (psf && mode) - return offset ; - - return 0 ; -} /* txw_seek */ - -#endif diff --git a/libs/libsndfile/src/ulaw.c b/libs/libsndfile/src/ulaw.c deleted file mode 100644 index ded46e929c..0000000000 --- a/libs/libsndfile/src/ulaw.c +++ /dev/null @@ -1,1051 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include - -#include "sndfile.h" -#include "common.h" - -static sf_count_t ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t ulaw_write_s2ulaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t ulaw_write_i2ulaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t ulaw_write_f2ulaw (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t ulaw_write_d2ulaw (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -int -ulaw_init (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) - { psf->read_short = ulaw_read_ulaw2s ; - psf->read_int = ulaw_read_ulaw2i ; - psf->read_float = ulaw_read_ulaw2f ; - psf->read_double = ulaw_read_ulaw2d ; - } ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { psf->write_short = ulaw_write_s2ulaw ; - psf->write_int = ulaw_write_i2ulaw ; - psf->write_float = ulaw_write_f2ulaw ; - psf->write_double = ulaw_write_d2ulaw ; - } ; - - psf->bytewidth = 1 ; - psf->blockwidth = psf->sf.channels ; - - if (psf->filelength > psf->dataoffset) - psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : - psf->filelength - psf->dataoffset ; - else - psf->datalength = 0 ; - - psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ; - - return 0 ; -} /* ulaw_init */ - -/*============================================================================== -*/ - -static short ulaw_decode [256] = -{ -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956, - -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764, - -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412, - -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316, - -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140, - -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092, - -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004, - -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980, - -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436, - -1372, -1308, -1244, -1180, -1116, -1052, -988, -924, - -876, -844, -812, -780, -748, -716, -684, -652, - -620, -588, -556, -524, -492, -460, -428, -396, - -372, -356, -340, -324, -308, -292, -276, -260, - -244, -228, -212, -196, -180, -164, -148, -132, - -120, -112, -104, -96, -88, -80, -72, -64, - -56, -48, -40, -32, -24, -16, -8, 0, - - 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956, - 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764, - 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412, - 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316, - 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140, - 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092, - 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004, - 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980, - 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436, - 1372, 1308, 1244, 1180, 1116, 1052, 988, 924, - 876, 844, 812, 780, 748, 716, 684, 652, - 620, 588, 556, 524, 492, 460, 428, 396, - 372, 356, 340, 324, 308, 292, 276, 260, - 244, 228, 212, 196, 180, 164, 148, 132, - 120, 112, 104, 96, 88, 80, 72, 64, - 56, 48, 40, 32, 24, 16, 8, 0 -} ; - -static -unsigned char ulaw_encode [8193] = -{ 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfb, 0xfb, 0xfa, 0xfa, 0xf9, - 0xf9, 0xf8, 0xf8, 0xf7, 0xf7, 0xf6, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, - 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xee, - 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xeb, - 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, - 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, - 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, - 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, - 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xde, 0xde, 0xde, 0xde, 0xde, - 0xde, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, - 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, - 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xd9, - 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, - 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd6, - 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, - 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd3, - 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, - 0xd2, 0xd2, 0xd2, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd0, - 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, - 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, - 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, - 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, - 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, - 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, - 0xcb, 0xcb, 0xcb, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, - 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, - 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc8, - 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, - 0xc8, 0xc8, 0xc8, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, - 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, - 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc5, - 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, - 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, - 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, - 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc2, - 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, - 0xc2, 0xc2, 0xc2, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, - 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, - 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xbf, - 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, - 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, - 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, - 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, - 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, - 0xbe, 0xbe, 0xbe, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, - 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, - 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, - 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, - 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, - 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, - 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, - 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, - 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, - 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, - 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, - 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, - 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, - 0xb8, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, - 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, - 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, - 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, - 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, - 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, - 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, - 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, - 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, - 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, - 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb3, - 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, - 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, - 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, - 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, - 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, - 0xb2, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, - 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, - 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, - 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, - 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, - 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, - 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, - 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, - 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, - 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, - 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xae, - 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, - 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, - 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, - 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, - 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, - 0xae, 0xae, 0xae, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, - 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, - 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, - 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, - 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, - 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, - 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, - 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, - 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, - 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, - 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, - 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, - 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, - 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, - 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, - 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, - 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, - 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, - 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, - 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, - 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, - 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, - 0xa8, 0xa8, 0xa8, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, - 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, - 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, - 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, - 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, - 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, - 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, - 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, - 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, - 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, - 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa5, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, - 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, - 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, - 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, - 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, - 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, - 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, - 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, - 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, - 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, - 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, - 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, - 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, - 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, - 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, - 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, - 0xa2, 0xa2, 0xa2, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, - 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, - 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, - 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, - 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, - 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, - 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, - 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, - 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, - 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, - 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x9f, - 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, - 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, - 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, - 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, - 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, - 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, - 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, - 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, - 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, - 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, - 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, - 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, - 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, - 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, - 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, - 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, - 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, - 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, - 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, - 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, - 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, - 0x9e, 0x9e, 0x9e, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, - 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, - 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, - 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, - 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, - 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, - 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, - 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, - 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, - 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, - 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, - 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, - 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, - 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, - 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, - 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, - 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, - 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, - 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, - 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, - 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, - 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, - 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, - 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, - 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, - 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, - 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, - 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, - 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, - 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, - 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, - 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, - 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, - 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, - 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, - 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, - 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, - 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, - 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, - 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, - 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, - 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, - 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, - 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, - 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, - 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, - 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, - 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, - 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, - 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, - 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, - 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, - 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, - 0x98, 0x98, 0x98, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, - 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, - 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, - 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, - 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, - 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, - 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, - 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, - 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, - 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, - 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, - 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, - 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, - 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, - 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, - 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, - 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, - 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, - 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, - 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, - 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, - 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, - 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, - 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, - 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, - 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, - 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, - 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, - 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, - 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, - 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, - 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x93, - 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, - 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, - 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, - 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, - 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, - 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, - 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, - 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, - 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, - 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, - 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, - 0x92, 0x92, 0x92, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, - 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, - 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, - 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, - 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, - 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, - 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, - 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, - 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, - 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, - 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x90, - 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, - 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, - 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, - 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, - 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, - 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, - 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, - 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, - 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, - 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, - 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, - 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, - 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, - 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, - 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, - 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, - 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 -} ; - -static inline void -ulaw2s_array (unsigned char *buffer, int count, short *ptr) -{ while (--count >= 0) - ptr [count] = ulaw_decode [(int) buffer [count]] ; -} /* ulaw2s_array */ - -static inline void -ulaw2i_array (unsigned char *buffer, int count, int *ptr) -{ while (--count >= 0) - ptr [count] = ulaw_decode [buffer [count]] << 16 ; -} /* ulaw2i_array */ - -static inline void -ulaw2f_array (unsigned char *buffer, int count, float *ptr, float normfact) -{ while (--count >= 0) - ptr [count] = normfact * ulaw_decode [(int) buffer [count]] ; -} /* ulaw2f_array */ - -static inline void -ulaw2d_array (const unsigned char *buffer, int count, double *ptr, double normfact) -{ while (--count >= 0) - ptr [count] = normfact * ulaw_decode [(int) buffer [count]] ; -} /* ulaw2d_array */ - -static inline void -s2ulaw_array (const short *ptr, int count, unsigned char *buffer) -{ while (--count >= 0) - { if (ptr [count] >= 0) - buffer [count] = ulaw_encode [ptr [count] / 4] ; - else - buffer [count] = 0x7F & ulaw_encode [ptr [count] / -4] ; - } ; -} /* s2ulaw_array */ - -static inline void -i2ulaw_array (const int *ptr, int count, unsigned char *buffer) -{ while (--count >= 0) - { if (ptr [count] >= 0) - buffer [count] = ulaw_encode [ptr [count] >> (16 + 2)] ; - else - buffer [count] = 0x7F & ulaw_encode [-ptr [count] >> (16 + 2)] ; - } ; -} /* i2ulaw_array */ - -static inline void -f2ulaw_array (const float *ptr, int count, unsigned char *buffer, float normfact) -{ while (--count >= 0) - { if (ptr [count] >= 0) - buffer [count] = ulaw_encode [lrintf (normfact * ptr [count])] ; - else - buffer [count] = 0x7F & ulaw_encode [- lrintf (normfact * ptr [count])] ; - } ; -} /* f2ulaw_array */ - -static inline void -d2ulaw_array (const double *ptr, int count, unsigned char *buffer, double normfact) -{ while (--count >= 0) - { if (ptr [count] >= 0) - buffer [count] = ulaw_encode [lrint (normfact * ptr [count])] ; - else - buffer [count] = 0x7F & ulaw_encode [- lrint (normfact * ptr [count])] ; - } ; -} /* d2ulaw_array */ - -/*============================================================================== -*/ - -static sf_count_t -ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; - ulaw2s_array (ubuf.ucbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* ulaw_read_ulaw2s */ - -static sf_count_t -ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; - ulaw2i_array (ubuf.ucbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* ulaw_read_ulaw2i */ - -static sf_count_t -ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float normfact ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; - ulaw2f_array (ubuf.ucbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* ulaw_read_ulaw2f */ - -static sf_count_t -ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double normfact ; - - normfact = (psf->norm_double) ? 1.0 / ((double) 0x8000) : 1.0 ; - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; - ulaw2d_array (ubuf.ucbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* ulaw_read_ulaw2d */ - -/*============================================================================================= -*/ - -static sf_count_t -ulaw_write_s2ulaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - s2ulaw_array (ptr + total, bufferlen, ubuf.ucbuf) ; - writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* ulaw_write_s2ulaw */ - -static sf_count_t -ulaw_write_i2ulaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - i2ulaw_array (ptr + total, bufferlen, ubuf.ucbuf) ; - writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* ulaw_write_i2ulaw */ - -static sf_count_t -ulaw_write_f2ulaw (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - float normfact ; - - /* Factor in a divide by 4. */ - normfact = (psf->norm_float == SF_TRUE) ? (0.25 * 0x7FFF) : 0.25 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - f2ulaw_array (ptr + total, bufferlen, ubuf.ucbuf, normfact) ; - writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* ulaw_write_f2ulaw */ - -static sf_count_t -ulaw_write_d2ulaw (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - double normfact ; - - /* Factor in a divide by 4. */ - normfact = (psf->norm_double) ? (0.25 * 0x7FFF) : 0.25 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - d2ulaw_array (ptr + total, bufferlen, ubuf.ucbuf, normfact) ; - writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* ulaw_write_d2ulaw */ - diff --git a/libs/libsndfile/src/version-metadata.rc.in b/libs/libsndfile/src/version-metadata.rc.in deleted file mode 100644 index ed79b22ad1..0000000000 --- a/libs/libsndfile/src/version-metadata.rc.in +++ /dev/null @@ -1,32 +0,0 @@ -#include - -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS -1 VERSIONINFO - FILEVERSION @WIN_RC_VERSION@,0 - PRODUCTVERSION @WIN_RC_VERSION@,0 - FILEOS VOS__WINDOWS32 - FILETYPE VFT_DLL - FILESUBTYPE VFT2_UNKNOWN - FILEFLAGSMASK 0x00000000 - FILEFLAGS 0x00000000 -{ - BLOCK "StringFileInfo" - { - BLOCK "040904e4" - { - VALUE "FileDescription", "A library for reading and writing audio files." - VALUE "FileVersion", "@CLEAN_VERSION@.0\0" - VALUE "Full Version", "@PACKAGE_VERSION@" - VALUE "InternalName", "libsndfile" - VALUE "LegalCopyright", "Copyright (C) 1999-2012, Licensed LGPL" - VALUE "OriginalFilename", "libsndfile-1.dll" - VALUE "ProductName", "libsndfile-1 DLL" - VALUE "ProductVersion", "@CLEAN_VERSION@.0\0" - VALUE "Language", "Language Neutral" - } - } - BLOCK "VarFileInfo" - { - VALUE "Translation", 0x0409, 0x04E4 - } -} diff --git a/libs/libsndfile/src/voc.c b/libs/libsndfile/src/voc.c deleted file mode 100644 index d13b03311b..0000000000 --- a/libs/libsndfile/src/voc.c +++ /dev/null @@ -1,882 +0,0 @@ -/* -** Copyright (C) 2001-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* RANT: -** The VOC file format is the most brain damaged format I have yet had to deal -** with. No one programmer could have bee stupid enough to put this together. -** Instead it looks like a series of manic, dyslexic assembly language programmers -** hacked it to fit their needs. -** Utterly woeful. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - - -/*------------------------------------------------------------------------------ - * Typedefs for file chunks. -*/ - -#define VOC_MAX_SECTIONS 200 - -enum -{ VOC_TERMINATOR = 0, - VOC_SOUND_DATA = 1, - VOC_SOUND_CONTINUE = 2, - VOC_SILENCE = 3, - VOC_MARKER = 4, - VOC_ASCII = 5, - VOC_REPEAT = 6, - VOC_END_REPEAT = 7, - VOC_EXTENDED = 8, - VOC_EXTENDED_II = 9 -} ; - -typedef struct -{ int samples ; - int offset ; /* Offset of zero => silence. */ -} SND_DATA_BLOCKS ; - -typedef struct -{ unsigned int sections, section_types ; - int samplerate, channels, bitwidth ; - SND_DATA_BLOCKS blocks [VOC_MAX_SECTIONS] ; -} VOC_DATA ; - -/*------------------------------------------------------------------------------ - * Private static functions. -*/ - -static int voc_close (SF_PRIVATE *psf) ; -static int voc_write_header (SF_PRIVATE *psf, int calc_length) ; -static int voc_read_header (SF_PRIVATE *psf) ; - -static const char* voc_encoding2str (int encoding) ; - -#if 0 - -/* These functions would be required for files with more than one VOC_SOUND_DATA -** segment. Not sure whether to bother implementing this. -*/ - -static int voc_multi_init (SF_PRIVATE *psf, VOC_DATA *pvoc) ; - -static int voc_multi_read_uc2s (SF_PRIVATE *psf, short *ptr, int len) ; -static int voc_multi_read_les2s (SF_PRIVATE *psf, short *ptr, int len) ; - -static int voc_multi_read_uc2i (SF_PRIVATE *psf, int *ptr, int len) ; -static int voc_multi_read_les2i (SF_PRIVATE *psf, int *ptr, int len) ; - -static int voc_multi_read_uc2f (SF_PRIVATE *psf, float *ptr, int len) ; -static int voc_multi_read_les2f (SF_PRIVATE *psf, float *ptr, int len) ; - -static int voc_multi_read_uc2d (SF_PRIVATE *psf, double *ptr, int len) ; -static int voc_multi_read_les2d (SF_PRIVATE *psf, double *ptr, int len) ; -#endif - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -voc_open (SF_PRIVATE *psf) -{ int subformat, error = 0 ; - - if (psf->is_pipe) - return SFE_VOC_NO_PIPE ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = voc_read_header (psf))) - return error ; - } ; - - subformat = SF_CODEC (psf->sf.format) ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_VOC) - return SFE_BAD_OPEN_FORMAT ; - - psf->endian = SF_ENDIAN_LITTLE ; - - if ((error = voc_write_header (psf, SF_FALSE))) - return error ; - - psf->write_header = voc_write_header ; - } ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - psf->container_close = voc_close ; - - switch (subformat) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_16 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_ALAW : - error = alaw_init (psf) ; - break ; - - case SF_FORMAT_ULAW : - error = ulaw_init (psf) ; - break ; - - default : return SFE_UNIMPLEMENTED ; - } ; - - return error ; -} /* voc_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -voc_read_header (SF_PRIVATE *psf) -{ VOC_DATA *pvoc ; - char creative [20] ; - unsigned char block_type, rate_byte ; - short version, checksum, encoding, dataoffset ; - int offset ; - - /* Set position to start of file to begin reading header. */ - offset = psf_binheader_readf (psf, "pb", 0, creative, SIGNED_SIZEOF (creative)) ; - - if (creative [sizeof (creative) - 1] != 0x1A) - return SFE_VOC_NO_CREATIVE ; - - /* Terminate the string. */ - creative [sizeof (creative) - 1] = 0 ; - - if (strcmp ("Creative Voice File", creative)) - return SFE_VOC_NO_CREATIVE ; - - psf_log_printf (psf, "%s\n", creative) ; - - offset += psf_binheader_readf (psf, "e222", &dataoffset, &version, &checksum) ; - - psf->dataoffset = dataoffset ; - - psf_log_printf (psf, "dataoffset : %d\n" - "version : 0x%X\n" - "checksum : 0x%X\n", psf->dataoffset, version, checksum) ; - - if (version != 0x010A && version != 0x0114) - return SFE_VOC_BAD_VERSION ; - - if (! (psf->codec_data = malloc (sizeof (VOC_DATA)))) - return SFE_MALLOC_FAILED ; - - pvoc = (VOC_DATA*) psf->codec_data ; - - memset (pvoc, 0, sizeof (VOC_DATA)) ; - - /* Set the default encoding now. */ - psf->sf.format = SF_FORMAT_VOC ; /* Major format */ - encoding = SF_FORMAT_PCM_U8 ; /* Minor format */ - psf->endian = SF_ENDIAN_LITTLE ; - - while (1) - { unsigned size ; - short count ; - - block_type = 0 ; - offset += psf_binheader_readf (psf, "1", &block_type) ; - - switch (block_type) - { case VOC_ASCII : - offset += psf_binheader_readf (psf, "e3", &size) ; - - psf_log_printf (psf, " ASCII : %d\n", size) ; - - if (size < sizeof (psf->header) - 1) - { offset += psf_binheader_readf (psf, "b", psf->header, size) ; - psf->header [size] = 0 ; - psf_log_printf (psf, " text : %s\n", psf->header) ; - continue ; - } - - offset += psf_binheader_readf (psf, "j", size) ; - continue ; - - case VOC_REPEAT : - offset += psf_binheader_readf (psf, "e32", &size, &count) ; - psf_log_printf (psf, " Repeat : %d\n", count) ; - continue ; - - case VOC_SOUND_DATA : - case VOC_EXTENDED : - case VOC_EXTENDED_II : - break ; - - default : psf_log_printf (psf, "*** Weird block marker (%d)\n", block_type) ; - } ; - - break ; - } ; - - if (block_type == VOC_SOUND_DATA) - { unsigned char compression ; - int size ; - - offset += psf_binheader_readf (psf, "e311", &size, &rate_byte, &compression) ; - - psf->sf.samplerate = 1000000 / (256 - (rate_byte & 0xFF)) ; - - psf_log_printf (psf, " Sound Data : %d\n sr : %d => %dHz\n comp : %d\n", - size, rate_byte, psf->sf.samplerate, compression) ; - - if (offset + size - 1 > psf->filelength) - { psf_log_printf (psf, "Seems to be a truncated file.\n") ; - psf_log_printf (psf, "offset: %d size: %d sum: %d filelength: %D\n", offset, size, offset + size, psf->filelength) ; - return SFE_VOC_BAD_SECTIONS ; - } - else if (psf->filelength - offset - size > 4) - { psf_log_printf (psf, "Seems to be a multi-segment file (#1).\n") ; - psf_log_printf (psf, "offset: %d size: %d sum: %d filelength: %D\n", offset, size, offset + size, psf->filelength) ; - return SFE_VOC_BAD_SECTIONS ; - } ; - - psf->dataoffset = offset ; - psf->dataend = psf->filelength - 1 ; - - psf->sf.channels = 1 ; - psf->bytewidth = 1 ; - - psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_U8 ; - - return 0 ; - } ; - - if (block_type == VOC_EXTENDED) - { unsigned char pack, stereo, compression ; - unsigned short rate_short ; - int size ; - - offset += psf_binheader_readf (psf, "e3211", &size, &rate_short, &pack, &stereo) ; - - psf_log_printf (psf, " Extended : %d\n", size) ; - if (size == 4) - psf_log_printf (psf, " size : 4\n") ; - else - psf_log_printf (psf, " size : %d (should be 4)\n", size) ; - - psf_log_printf (psf, " pack : %d\n" - " stereo : %s\n", pack, (stereo ? "yes" : "no")) ; - - if (stereo) - { psf->sf.channels = 2 ; - psf->sf.samplerate = 128000000 / (65536 - rate_short) ; - } - else - { psf->sf.channels = 1 ; - psf->sf.samplerate = 256000000 / (65536 - rate_short) ; - } ; - - psf_log_printf (psf, " sr : %d => %dHz\n", (rate_short & 0xFFFF), psf->sf.samplerate) ; - - offset += psf_binheader_readf (psf, "1", &block_type) ; - - if (block_type != VOC_SOUND_DATA) - { psf_log_printf (psf, "*** Expecting VOC_SOUND_DATA section.\n") ; - return SFE_VOC_BAD_FORMAT ; - } ; - - offset += psf_binheader_readf (psf, "e311", &size, &rate_byte, &compression) ; - - psf_log_printf (psf, " Sound Data : %d\n" - " sr : %d\n" - " comp : %d\n", size, rate_byte, compression) ; - - - if (offset + size - 1 > psf->filelength) - { psf_log_printf (psf, "Seems to be a truncated file.\n") ; - psf_log_printf (psf, "offset: %d size: %d sum: %d filelength: %D\n", offset, size, offset + size, psf->filelength) ; - return SFE_VOC_BAD_SECTIONS ; - } - else if (offset + size - 1 < psf->filelength) - { psf_log_printf (psf, "Seems to be a multi-segment file (#2).\n") ; - psf_log_printf (psf, "offset: %d size: %d sum: %d filelength: %D\n", offset, size, offset + size, psf->filelength) ; - return SFE_VOC_BAD_SECTIONS ; - } ; - - psf->dataoffset = offset ; - psf->dataend = psf->filelength - 1 ; - - psf->bytewidth = 1 ; - - psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_U8 ; - - return 0 ; - } - - if (block_type == VOC_EXTENDED_II) - { unsigned char bitwidth, channels ; - int size, fourbytes ; - - offset += psf_binheader_readf (psf, "e341124", &size, &psf->sf.samplerate, - &bitwidth, &channels, &encoding, &fourbytes) ; - - if (size * 2 == psf->filelength - 39) - { int temp_size = psf->filelength - 31 ; - - psf_log_printf (psf, " Extended II : %d (SoX bug: should be %d)\n", size, temp_size) ; - size = temp_size ; - } - else - psf_log_printf (psf, " Extended II : %d\n", size) ; - - psf_log_printf (psf, " sample rate : %d\n" - " bit width : %d\n" - " channels : %d\n", psf->sf.samplerate, bitwidth, channels) ; - - if (bitwidth == 16 && encoding == 0) - { encoding = 4 ; - psf_log_printf (psf, " encoding : 0 (SoX bug: should be 4 for 16 bit signed PCM)\n") ; - } - else - psf_log_printf (psf, " encoding : %d => %s\n", encoding, voc_encoding2str (encoding)) ; - - - psf_log_printf (psf, " fourbytes : %X\n", fourbytes) ; - - psf->sf.channels = channels ; - - psf->dataoffset = offset ; - psf->dataend = psf->filelength - 1 ; - - if (size + 31 == psf->filelength + 1) - { /* Hack for reading files produced using - ** sf_command (SFC_UPDATE_HEADER_NOW). - */ - psf_log_printf (psf, "Missing zero byte at end of file.\n") ; - size = psf->filelength - 30 ; - psf->dataend = 0 ; - } - else if (size + 31 > psf->filelength) - { psf_log_printf (psf, "Seems to be a truncated file.\n") ; - size = psf->filelength - 31 ; - } - else if (size + 31 < psf->filelength) - psf_log_printf (psf, "Seems to be a multi-segment file (#3).\n") ; - - switch (encoding) - { case 0 : - psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_U8 ; - psf->bytewidth = 1 ; - break ; - - case 4 : - psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_16 ; - psf->bytewidth = 2 ; - break ; - - case 6 : - psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_ALAW ; - psf->bytewidth = 1 ; - break ; - - case 7 : - psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_ULAW ; - psf->bytewidth = 1 ; - break ; - - default : /* Unknown */ - return SFE_UNKNOWN_FORMAT ; - break ; - } ; - - } ; - - return 0 ; -} /* voc_read_header */ - -/*==================================================================================== -*/ - -static int -voc_write_header (SF_PRIVATE *psf, int calc_length) -{ sf_count_t current ; - int rate_const, subformat ; - - current = psf_ftell (psf) ; - - if (calc_length) - { psf->filelength = psf_get_filelen (psf) ; - - psf->datalength = psf->filelength - psf->dataoffset ; - if (psf->dataend) - psf->datalength -= psf->filelength - psf->dataend ; - - psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; - } ; - - subformat = SF_CODEC (psf->sf.format) ; - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - psf_fseek (psf, 0, SEEK_SET) ; - - /* VOC marker and 0x1A byte. */ - psf_binheader_writef (psf, "eb1", "Creative Voice File", make_size_t (19), 0x1A) ; - - /* Data offset, version and other. */ - psf_binheader_writef (psf, "e222", 26, 0x0114, 0x111F) ; - - /* Use same logic as SOX. - ** If the file is mono 8 bit data, use VOC_SOUND_DATA. - ** If the file is mono 16 bit data, use VOC_EXTENED. - ** Otherwise use VOC_EXTENED_2. - */ - - if (subformat == SF_FORMAT_PCM_U8 && psf->sf.channels == 1) - { /* samplerate = 1000000 / (256 - rate_const) ; */ - rate_const = 256 - 1000000 / psf->sf.samplerate ; - - /* First type marker, length, rate_const and compression */ - psf_binheader_writef (psf, "e1311", VOC_SOUND_DATA, (int) (psf->datalength + 1), rate_const, 0) ; - } - else if (subformat == SF_FORMAT_PCM_U8 && psf->sf.channels == 2) - { /* sample_rate = 128000000 / (65536 - rate_short) ; */ - rate_const = 65536 - 128000000 / psf->sf.samplerate ; - - /* First write the VOC_EXTENDED section - ** marker, length, rate_const and compression - */ - psf_binheader_writef (psf, "e13211", VOC_EXTENDED, 4, rate_const, 0, 1) ; - - /* samplerate = 1000000 / (256 - rate_const) ; */ - rate_const = 256 - 1000000 / psf->sf.samplerate ; - - /* Now write the VOC_SOUND_DATA section - ** marker, length, rate_const and compression - */ - psf_binheader_writef (psf, "e1311", VOC_SOUND_DATA, (int) (psf->datalength + 1), rate_const, 0) ; - } - else - { int length ; - - if (psf->sf.channels < 1 || psf->sf.channels > 2) - return SFE_CHANNEL_COUNT ; - - switch (subformat) - { case SF_FORMAT_PCM_U8 : - psf->bytewidth = 1 ; - length = psf->sf.frames * psf->sf.channels * psf->bytewidth + 12 ; - /* Marker, length, sample rate, bitwidth, stereo flag, encoding and fourt zero bytes. */ - psf_binheader_writef (psf, "e1341124", VOC_EXTENDED_II, length, psf->sf.samplerate, 16, psf->sf.channels, 4, 0) ; - break ; - - case SF_FORMAT_PCM_16 : - psf->bytewidth = 2 ; - length = psf->sf.frames * psf->sf.channels * psf->bytewidth + 12 ; - /* Marker, length, sample rate, bitwidth, stereo flag, encoding and fourt zero bytes. */ - psf_binheader_writef (psf, "e1341124", VOC_EXTENDED_II, length, psf->sf.samplerate, 16, psf->sf.channels, 4, 0) ; - break ; - - case SF_FORMAT_ALAW : - psf->bytewidth = 1 ; - length = psf->sf.frames * psf->sf.channels * psf->bytewidth + 12 ; - psf_binheader_writef (psf, "e1341124", VOC_EXTENDED_II, length, psf->sf.samplerate, 8, psf->sf.channels, 6, 0) ; - break ; - - case SF_FORMAT_ULAW : - psf->bytewidth = 1 ; - length = psf->sf.frames * psf->sf.channels * psf->bytewidth + 12 ; - psf_binheader_writef (psf, "e1341124", VOC_EXTENDED_II, length, psf->sf.samplerate, 8, psf->sf.channels, 7, 0) ; - break ; - - default : return SFE_UNIMPLEMENTED ; - } ; - } ; - - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - psf->dataoffset = psf->headindex ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* voc_write_header */ - -static int -voc_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { /* Now we know for certain the length of the file we can re-write - ** correct values for the FORM, 8SVX and BODY chunks. - */ - unsigned char byte = VOC_TERMINATOR ; - - - psf_fseek (psf, 0, SEEK_END) ; - - /* Write terminator */ - psf_fwrite (&byte, 1, 1, psf) ; - - voc_write_header (psf, SF_TRUE) ; - } ; - - return 0 ; -} /* voc_close */ - -static const char* -voc_encoding2str (int encoding) -{ - switch (encoding) - { case 0 : return "8 bit unsigned PCM" ; - case 4 : return "16 bit signed PCM" ; - case 6 : return "A-law" ; - case 7 : return "u-law" ; - default : break ; - } - return "*** Unknown ***" ; -} /* voc_encoding2str */ - -/*==================================================================================== -*/ - -#if 0 -static int -voc_multi_init (SF_PRIVATE *psf, VOC_DATA *pvoc) -{ - psf->sf.frames = 0 ; - - if (pvoc->bitwidth == 8) - { psf->read_short = voc_multi_read_uc2s ; - psf->read_int = voc_multi_read_uc2i ; - psf->read_float = voc_multi_read_uc2f ; - psf->read_double = voc_multi_read_uc2d ; - return 0 ; - } ; - - if (pvoc->bitwidth == 16) - { psf->read_short = voc_multi_read_les2s ; - psf->read_int = voc_multi_read_les2i ; - psf->read_float = voc_multi_read_les2f ; - psf->read_double = voc_multi_read_les2d ; - return 0 ; - } ; - - psf_log_printf (psf, "Error : bitwith != 8 && bitwidth != 16.\n") ; - - return SFE_UNIMPLEMENTED ; -} /* voc_multi_read_int */ - -/*------------------------------------------------------------------------------------ -*/ - -static int -voc_multi_read_uc2s (SF_PRIVATE *psf, short *ptr, int len) -{ - - return 0 ; -} /* voc_multi_read_uc2s */ - -static int -voc_multi_read_les2s (SF_PRIVATE *psf, short *ptr, int len) -{ - - return 0 ; -} /* voc_multi_read_les2s */ - - -static int -voc_multi_read_uc2i (SF_PRIVATE *psf, int *ptr, int len) -{ - - return 0 ; -} /* voc_multi_read_uc2i */ - -static int -voc_multi_read_les2i (SF_PRIVATE *psf, int *ptr, int len) -{ - - return 0 ; -} /* voc_multi_read_les2i */ - - -static int -voc_multi_read_uc2f (SF_PRIVATE *psf, float *ptr, int len) -{ - - return 0 ; -} /* voc_multi_read_uc2f */ - -static int -voc_multi_read_les2f (SF_PRIVATE *psf, float *ptr, int len) -{ - - return 0 ; -} /* voc_multi_read_les2f */ - - -static int -voc_multi_read_uc2d (SF_PRIVATE *psf, double *ptr, int len) -{ - - return 0 ; -} /* voc_multi_read_uc2d */ - -static int -voc_multi_read_les2d (SF_PRIVATE *psf, double *ptr, int len) -{ - - return 0 ; -} /* voc_multi_read_les2d */ - -#endif - -/*------------------------------------------------------------------------------------ - -Creative Voice (VOC) file format --------------------------------- - -~From: galt@dsd.es.com - -(byte numbers are hex!) - - HEADER (bytes 00-19) - Series of DATA BLOCKS (bytes 1A+) [Must end w/ Terminator Block] - -- --------------------------------------------------------------- - -HEADER: -======= - byte # Description - ------ ------------------------------------------ - 00-12 "Creative Voice File" - 13 1A (eof to abort printing of file) - 14-15 Offset of first datablock in .voc file (std 1A 00 - in Intel Notation) - 16-17 Version number (minor,major) (VOC-HDR puts 0A 01) - 18-19 1's Comp of Ver. # + 1234h (VOC-HDR puts 29 11) - -- --------------------------------------------------------------- - -DATA BLOCK: -=========== - - Data Block: TYPE(1-byte), SIZE(3-bytes), INFO(0+ bytes) - NOTE: Terminator Block is an exception -- it has only the TYPE byte. - - TYPE Description Size (3-byte int) Info - ---- ----------- ----------------- ----------------------- - 00 Terminator (NONE) (NONE) - 01 Sound data 2+length of data * - 02 Sound continue length of data Voice Data - 03 Silence 3 ** - 04 Marker 2 Marker# (2 bytes) - 05 ASCII length of string null terminated string - 06 Repeat 2 Count# (2 bytes) - 07 End repeat 0 (NONE) - 08 Extended 4 *** - - *Sound Info Format: - --------------------- - 00 Sample Rate - 01 Compression Type - 02+ Voice Data - - **Silence Info Format: - ---------------------------- - 00-01 Length of silence - 1 - 02 Sample Rate - - - ***Extended Info Format: - --------------------- - 00-01 Time Constant: Mono: 65536 - (256000000/sample_rate) - Stereo: 65536 - (25600000/(2*sample_rate)) - 02 Pack - 03 Mode: 0 = mono - 1 = stereo - - - Marker# -- Driver keeps the most recent marker in a status byte - Count# -- Number of repetitions + 1 - Count# may be 1 to FFFE for 0 - FFFD repetitions - or FFFF for endless repetitions - Sample Rate -- SR byte = 256-(1000000/sample_rate) - Length of silence -- in units of sampling cycle - Compression Type -- of voice data - 8-bits = 0 - 4-bits = 1 - 2.6-bits = 2 - 2-bits = 3 - Multi DAC = 3+(# of channels) [interesting-- - this isn't in the developer's manual] - - ---------------------------------------------------------------------------------- -Addendum submitted by Votis Kokavessis: - -After some experimenting with .VOC files I found out that there is a Data Block -Type 9, which is not covered in the VOC.TXT file. Here is what I was able to discover -about this block type: - - -TYPE: 09 -SIZE: 12 + length of data -INFO: 12 (twelve) bytes - -INFO STRUCTURE: - -Bytes 0-1: (Word) Sample Rate (e.g. 44100) -Bytes 2-3: zero (could be that bytes 0-3 are a DWord for Sample Rate) -Byte 4: Sample Size in bits (e.g. 16) -Byte 5: Number of channels (e.g. 1 for mono, 2 for stereo) -Byte 6: Unknown (equal to 4 in all files I examined) -Bytes 7-11: zero - - --------------------------------------------------------------------------------------*/ - -/*===================================================================================== -**===================================================================================== -**===================================================================================== -**===================================================================================== -*/ - -/*------------------------------------------------------------------------ -The following is taken from the Audio File Formats FAQ dated 2-Jan-1995 -and submitted by Guido van Rossum . --------------------------------------------------------------------------- -Creative Voice (VOC) file format --------------------------------- - -From: galt@dsd.es.com - -(byte numbers are hex!) - - HEADER (bytes 00-19) - Series of DATA BLOCKS (bytes 1A+) [Must end w/ Terminator Block] - -- --------------------------------------------------------------- - -HEADER: -------- - byte # Description - ------ ------------------------------------------ - 00-12 "Creative Voice File" - 13 1A (eof to abort printing of file) - 14-15 Offset of first datablock in .voc file (std 1A 00 - in Intel Notation) - 16-17 Version number (minor,major) (VOC-HDR puts 0A 01) - 18-19 2's Comp of Ver. # + 1234h (VOC-HDR puts 29 11) - -- --------------------------------------------------------------- - -DATA BLOCK: ------------ - - Data Block: TYPE(1-byte), SIZE(3-bytes), INFO(0+ bytes) - NOTE: Terminator Block is an exception -- it has only the TYPE byte. - - TYPE Description Size (3-byte int) Info - ---- ----------- ----------------- ----------------------- - 00 Terminator (NONE) (NONE) - 01 Sound data 2+length of data * - 02 Sound continue length of data Voice Data - 03 Silence 3 ** - 04 Marker 2 Marker# (2 bytes) - 05 ASCII length of string null terminated string - 06 Repeat 2 Count# (2 bytes) - 07 End repeat 0 (NONE) - 08 Extended 4 *** - - *Sound Info Format: **Silence Info Format: - --------------------- ---------------------------- - 00 Sample Rate 00-01 Length of silence - 1 - 01 Compression Type 02 Sample Rate - 02+ Voice Data - - ***Extended Info Format: - --------------------- - 00-01 Time Constant: Mono: 65536 - (256000000/sample_rate) - Stereo: 65536 - (25600000/(2*sample_rate)) - 02 Pack - 03 Mode: 0 = mono - 1 = stereo - - - Marker# -- Driver keeps the most recent marker in a status byte - Count# -- Number of repetitions + 1 - Count# may be 1 to FFFE for 0 - FFFD repetitions - or FFFF for endless repetitions - Sample Rate -- SR byte = 256-(1000000/sample_rate) - Length of silence -- in units of sampling cycle - Compression Type -- of voice data - 8-bits = 0 - 4-bits = 1 - 2.6-bits = 2 - 2-bits = 3 - Multi DAC = 3+(# of channels) [interesting-- - this isn't in the developer's manual] - -Detailed description of new data blocks (VOC files version 1.20 and above): - - (Source is fax from Barry Boone at Creative Labs, 405/742-6622) - -BLOCK 8 - digitized sound attribute extension, must preceed block 1. - Used to define stereo, 8 bit audio - BYTE bBlockID; // = 8 - BYTE nBlockLen[3]; // 3 byte length - WORD wTimeConstant; // time constant = same as block 1 - BYTE bPackMethod; // same as in block 1 - BYTE bVoiceMode; // 0-mono, 1-stereo - - Data is stored left, right - -BLOCK 9 - data block that supersedes blocks 1 and 8. - Used for stereo, 16 bit. - - BYTE bBlockID; // = 9 - BYTE nBlockLen[3]; // length 12 plus length of sound - DWORD dwSamplesPerSec; // samples per second, not time const. - BYTE bBitsPerSample; // e.g., 8 or 16 - BYTE bChannels; // 1 for mono, 2 for stereo - WORD wFormat; // see below - BYTE reserved[4]; // pad to make block w/o data - // have a size of 16 bytes - - Valid values of wFormat are: - - 0x0000 8-bit unsigned PCM - 0x0001 Creative 8-bit to 4-bit ADPCM - 0x0002 Creative 8-bit to 3-bit ADPCM - 0x0003 Creative 8-bit to 2-bit ADPCM - 0x0004 16-bit signed PCM - 0x0006 CCITT a-Law - 0x0007 CCITT u-Law - 0x02000 Creative 16-bit to 4-bit ADPCM - - Data is stored left, right - -------------------------------------------------------------------------*/ diff --git a/libs/libsndfile/src/vox_adpcm.c b/libs/libsndfile/src/vox_adpcm.c deleted file mode 100644 index 9abd42b0d7..0000000000 --- a/libs/libsndfile/src/vox_adpcm.c +++ /dev/null @@ -1,400 +0,0 @@ -/* -** Copyright (C) 2002-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* -** This is the OKI / Dialogic ADPCM encoder/decoder. It converts from -** 12 bit linear sample data to a 4 bit ADPCM. -*/ - -/* - * Note: some early Dialogic hardware does not always reset the ADPCM encoder - * at the start of each vox file. This can result in clipping and/or DC offset - * problems when it comes to decoding the audio. Whilst little can be done - * about the clipping, a DC offset can be removed by passing the decoded audio - * through a high-pass filter at e.g. 10Hz. - */ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" -#include "ima_oki_adpcm.h" - - -static sf_count_t vox_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t vox_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t vox_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t vox_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t vox_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t vox_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t vox_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t vox_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static int vox_read_block (SF_PRIVATE *psf, IMA_OKI_ADPCM *pvox, short *ptr, int len) ; - -/*------------------------------------------------------------------------------ -*/ - -static int -codec_close (SF_PRIVATE * psf) -{ - IMA_OKI_ADPCM * p = (IMA_OKI_ADPCM *) psf->codec_data ; - - if (p->errors) - psf_log_printf (psf, "*** Warning : ADPCM state errors: %d\n", p->errors) ; - return p->errors ; -} /* code_close */ - -int -vox_adpcm_init (SF_PRIVATE *psf) -{ IMA_OKI_ADPCM *pvox = NULL ; - - if (psf->file.mode == SFM_RDWR) - return SFE_BAD_MODE_RW ; - - if (psf->file.mode == SFM_WRITE && psf->sf.channels != 1) - return SFE_CHANNEL_COUNT ; - - if ((pvox = malloc (sizeof (IMA_OKI_ADPCM))) == NULL) - return SFE_MALLOC_FAILED ; - - psf->codec_data = (void*) pvox ; - memset (pvox, 0, sizeof (IMA_OKI_ADPCM)) ; - - if (psf->file.mode == SFM_WRITE) - { psf->write_short = vox_write_s ; - psf->write_int = vox_write_i ; - psf->write_float = vox_write_f ; - psf->write_double = vox_write_d ; - } - else - { psf_log_printf (psf, "Header-less OKI Dialogic ADPCM encoded file.\n") ; - psf_log_printf (psf, "Setting up for 8kHz, mono, Vox ADPCM.\n") ; - - psf->read_short = vox_read_s ; - psf->read_int = vox_read_i ; - psf->read_float = vox_read_f ; - psf->read_double = vox_read_d ; - } ; - - /* Standard sample rate chennels etc. */ - if (psf->sf.samplerate < 1) - psf->sf.samplerate = 8000 ; - psf->sf.channels = 1 ; - - psf->sf.frames = psf->filelength * 2 ; - - psf->sf.seekable = SF_FALSE ; - psf->codec_close = codec_close ; - - /* Seek back to start of data. */ - if (psf_fseek (psf, 0 , SEEK_SET) == -1) - return SFE_BAD_SEEK ; - - ima_oki_adpcm_init (pvox, IMA_OKI_ADPCM_TYPE_OKI) ; - - return 0 ; -} /* vox_adpcm_init */ - -/*============================================================================== -*/ - -static int -vox_read_block (SF_PRIVATE *psf, IMA_OKI_ADPCM *pvox, short *ptr, int len) -{ int indx = 0, k ; - - while (indx < len) - { pvox->code_count = (len - indx > IMA_OKI_ADPCM_PCM_LEN) ? IMA_OKI_ADPCM_CODE_LEN : (len - indx + 1) / 2 ; - - if ((k = psf_fread (pvox->codes, 1, pvox->code_count, psf)) != pvox->code_count) - { if (psf_ftell (psf) != psf->filelength) - psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pvox->code_count) ; - if (k == 0) - break ; - } ; - - pvox->code_count = k ; - - ima_oki_adpcm_decode_block (pvox) ; - - memcpy (&(ptr [indx]), pvox->pcm, pvox->pcm_count * sizeof (short)) ; - indx += pvox->pcm_count ; - } ; - - return indx ; -} /* vox_read_block */ - - -static sf_count_t -vox_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ IMA_OKI_ADPCM *pvox ; - int readcount, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pvox = (IMA_OKI_ADPCM*) psf->codec_data ; - - while (len > 0) - { readcount = (len > 0x10000000) ? 0x10000000 : (int) len ; - - count = vox_read_block (psf, pvox, ptr, readcount) ; - - total += count ; - len -= count ; - if (count != readcount) - break ; - } ; - - return total ; -} /* vox_read_s */ - -static sf_count_t -vox_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ IMA_OKI_ADPCM *pvox ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pvox = (IMA_OKI_ADPCM*) psf->codec_data ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : (int) len ; - count = vox_read_block (psf, pvox, sptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = ((int) sptr [k]) << 16 ; - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - - return total ; -} /* vox_read_i */ - -static sf_count_t -vox_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ IMA_OKI_ADPCM *pvox ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - float normfact ; - - if (! psf->codec_data) - return 0 ; - pvox = (IMA_OKI_ADPCM*) psf->codec_data ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : (int) len ; - count = vox_read_block (psf, pvox, sptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * (float) (sptr [k]) ; - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - - return total ; -} /* vox_read_f */ - -static sf_count_t -vox_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ IMA_OKI_ADPCM *pvox ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, readcount, count ; - sf_count_t total = 0 ; - double normfact ; - - if (! psf->codec_data) - return 0 ; - pvox = (IMA_OKI_ADPCM*) psf->codec_data ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { readcount = (len >= bufferlen) ? bufferlen : (int) len ; - count = vox_read_block (psf, pvox, sptr, readcount) ; - for (k = 0 ; k < readcount ; k++) - ptr [total + k] = normfact * (double) (sptr [k]) ; - total += count ; - len -= readcount ; - if (count != readcount) - break ; - } ; - - return total ; -} /* vox_read_d */ - -/*------------------------------------------------------------------------------ -*/ - -static int -vox_write_block (SF_PRIVATE *psf, IMA_OKI_ADPCM *pvox, const short *ptr, int len) -{ int indx = 0, k ; - - while (indx < len) - { pvox->pcm_count = (len - indx > IMA_OKI_ADPCM_PCM_LEN) ? IMA_OKI_ADPCM_PCM_LEN : len - indx ; - - memcpy (pvox->pcm, &(ptr [indx]), pvox->pcm_count * sizeof (short)) ; - - ima_oki_adpcm_encode_block (pvox) ; - - if ((k = psf_fwrite (pvox->codes, 1, pvox->code_count, psf)) != pvox->code_count) - psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pvox->code_count) ; - - indx += pvox->pcm_count ; - } ; - - return indx ; -} /* vox_write_block */ - -static sf_count_t -vox_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ IMA_OKI_ADPCM *pvox ; - int writecount, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pvox = (IMA_OKI_ADPCM*) psf->codec_data ; - - while (len) - { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; - - count = vox_write_block (psf, pvox, ptr, writecount) ; - - total += count ; - len -= count ; - if (count != writecount) - break ; - } ; - - return total ; -} /* vox_write_s */ - -static sf_count_t -vox_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ IMA_OKI_ADPCM *pvox ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, writecount, count ; - sf_count_t total = 0 ; - - if (! psf->codec_data) - return 0 ; - pvox = (IMA_OKI_ADPCM*) psf->codec_data ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : (int) len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = ptr [total + k] >> 16 ; - count = vox_write_block (psf, pvox, sptr, writecount) ; - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - - return total ; -} /* vox_write_i */ - -static sf_count_t -vox_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ IMA_OKI_ADPCM *pvox ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, writecount, count ; - sf_count_t total = 0 ; - float normfact ; - - if (! psf->codec_data) - return 0 ; - pvox = (IMA_OKI_ADPCM*) psf->codec_data ; - - normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : (int) len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = lrintf (normfact * ptr [total + k]) ; - count = vox_write_block (psf, pvox, sptr, writecount) ; - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - - return total ; -} /* vox_write_f */ - -static sf_count_t -vox_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ IMA_OKI_ADPCM *pvox ; - BUF_UNION ubuf ; - short *sptr ; - int k, bufferlen, writecount, count ; - sf_count_t total = 0 ; - double normfact ; - - if (! psf->codec_data) - return 0 ; - pvox = (IMA_OKI_ADPCM*) psf->codec_data ; - - normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; - - sptr = ubuf.sbuf ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (len > 0) - { writecount = (len >= bufferlen) ? bufferlen : (int) len ; - for (k = 0 ; k < writecount ; k++) - sptr [k] = lrint (normfact * ptr [total + k]) ; - count = vox_write_block (psf, pvox, sptr, writecount) ; - total += count ; - len -= writecount ; - if (count != writecount) - break ; - } ; - - return total ; -} /* vox_write_d */ - diff --git a/libs/libsndfile/src/w64.c b/libs/libsndfile/src/w64.c deleted file mode 100644 index 2dbc962e13..0000000000 --- a/libs/libsndfile/src/w64.c +++ /dev/null @@ -1,639 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" -#include "wav_w64.h" - -/*------------------------------------------------------------------------------ -** W64 files use 16 byte markers as opposed to the four byte marker of -** WAV files. -** For comparison purposes, an integer is required, so make an integer -** hash for the 16 bytes using MAKE_HASH16 macro, but also create a 16 -** byte array containing the complete 16 bytes required when writing the -** header. -*/ - -#define MAKE_HASH16(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, xa, xb, xc, xd, xe, xf) \ - ( (x0) ^ ((x1) << 1) ^ ((x2) << 2) ^ ((x3) << 3) ^ \ - ((x4) << 4) ^ ((x5) << 5) ^ ((x6) << 6) ^ ((x7) << 7) ^ \ - ((x8) << 8) ^ ((x9) << 9) ^ ((xa) << 10) ^ ((xb) << 11) ^ \ - ((xc) << 12) ^ ((xd) << 13) ^ ((xe) << 14) ^ ((xf) << 15) ) - -#define MAKE_MARKER16(name, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, xa, xb, xc, xd, xe, xf) \ - static unsigned char name [16] = { (x0), (x1), (x2), (x3), (x4), (x5), \ - (x6), (x7), (x8), (x9), (xa), (xb), (xc), (xd), (xe), (xf) } - -#define riff_HASH16 MAKE_HASH16 ('r', 'i', 'f', 'f', 0x2E, 0x91, 0xCF, 0x11, \ - 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00) - -#define wave_HASH16 MAKE_HASH16 ('w', 'a', 'v', 'e', 0xF3, 0xAC, 0xD3, 0x11, \ - 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) - -#define fmt_HASH16 MAKE_HASH16 ('f', 'm', 't', ' ', 0xF3, 0xAC, 0xD3, 0x11, \ - 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) - -#define fact_HASH16 MAKE_HASH16 ('f', 'a', 'c', 't', 0xF3, 0xAC, 0xD3, 0x11, \ - 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) - -#define data_HASH16 MAKE_HASH16 ('d', 'a', 't', 'a', 0xF3, 0xAC, 0xD3, 0x11, \ - 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) - -#define ACID_HASH16 MAKE_HASH16 (0x6D, 0x07, 0x1C, 0xEA, 0xA3, 0xEF, 0x78, 0x4C, \ - 0x90, 0x57, 0x7F, 0x79, 0xEE, 0x25, 0x2A, 0xAE) - -#define levl_HASH16 MAKE_HASH16 (0x6c, 0x65, 0x76, 0x6c, 0xf3, 0xac, 0xd3, 0x11, \ - 0xd1, 0x8c, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) - -#define list_HASH16 MAKE_HASH16 (0x6C, 0x69, 0x73, 0x74, 0x2F, 0x91, 0xCF, 0x11, \ - 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00) - -#define junk_HASH16 MAKE_HASH16 (0x6A, 0x75, 0x6E, 0x6b, 0xF3, 0xAC, 0xD3, 0x11, \ - 0x8C, 0xD1, 0x00, 0xC0, 0x4f, 0x8E, 0xDB, 0x8A) - -#define bext_MARKER MAKE_HASH16 (0x62, 0x65, 0x78, 0x74, 0xf3, 0xac, 0xd3, 0xaa, \ - 0xd1, 0x8c, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) - -#define MARKER_HASH16 MAKE_HASH16 (0x56, 0x62, 0xf7, 0xab, 0x2d, 0x39, 0xd2, 0x11, \ - 0x86, 0xc7, 0x00, 0xc0, 0x4f, 0x8e, 0xdb, 0x8a) - -#define SUMLIST_HASH16 MAKE_HASH16 (0xBC, 0x94, 0x5F, 0x92, 0x5A, 0x52, 0xD2, 0x11, \ - 0x86, 0xDC, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) - - -MAKE_MARKER16 (riff_MARKER16, 'r', 'i', 'f', 'f', 0x2E, 0x91, 0xCF, 0x11, - 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00) ; - - -MAKE_MARKER16 (wave_MARKER16, 'w', 'a', 'v', 'e', 0xF3, 0xAC, 0xD3, 0x11, - 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ; - -MAKE_MARKER16 (fmt_MARKER16, 'f', 'm', 't', ' ', 0xF3, 0xAC, 0xD3, 0x11, - 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ; - -MAKE_MARKER16 (fact_MARKER16, 'f', 'a', 'c', 't', 0xF3, 0xAC, 0xD3, 0x11, - 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ; - -MAKE_MARKER16 (data_MARKER16, 'd', 'a', 't', 'a', 0xF3, 0xAC, 0xD3, 0x11, - 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ; - -enum -{ HAVE_riff = 0x01, - HAVE_wave = 0x02, - HAVE_fmt = 0x04, - HAVE_fact = 0x08, - HAVE_data = 0x20 -} ; - -/*------------------------------------------------------------------------------ - * Private static functions. - */ - -static int w64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) ; -static int w64_write_header (SF_PRIVATE *psf, int calc_length) ; -static int w64_close (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -w64_open (SF_PRIVATE *psf) -{ WAV_PRIVATE * wpriv ; - int subformat, error, blockalign = 0, framesperblock = 0 ; - - if ((wpriv = calloc (1, sizeof (WAV_PRIVATE))) == NULL) - return SFE_MALLOC_FAILED ; - psf->container_data = wpriv ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR &&psf->filelength > 0)) - { if ((error = w64_read_header (psf, &blockalign, &framesperblock))) - return error ; - } ; - - if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_W64) - return SFE_BAD_OPEN_FORMAT ; - - subformat = SF_CODEC (psf->sf.format) ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if (psf->is_pipe) - return SFE_NO_PIPE_WRITE ; - - psf->endian = SF_ENDIAN_LITTLE ; /* All W64 files are little endian. */ - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - if (subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) - { blockalign = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ; - framesperblock = -1 ; - - /* FIXME : This block must go */ - psf->filelength = SF_COUNT_MAX ; - psf->datalength = psf->filelength ; - if (psf->sf.frames <= 0) - psf->sf.frames = (psf->blockwidth) ? psf->filelength / psf->blockwidth : psf->filelength ; - /* EMXIF : This block must go */ - } ; - - if ((error = w64_write_header (psf, SF_FALSE))) - return error ; - - psf->write_header = w64_write_header ; - } ; - - psf->container_close = w64_close ; - - switch (subformat) - { case SF_FORMAT_PCM_U8 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_ULAW : - error = ulaw_init (psf) ; - break ; - - case SF_FORMAT_ALAW : - error = alaw_init (psf) ; - break ; - - /* Lite remove start */ - case SF_FORMAT_FLOAT : - error = float32_init (psf) ; - break ; - - case SF_FORMAT_DOUBLE : - error = double64_init (psf) ; - break ; - - case SF_FORMAT_IMA_ADPCM : - error = wav_w64_ima_init (psf, blockalign, framesperblock) ; - break ; - - case SF_FORMAT_MS_ADPCM : - error = wav_w64_msadpcm_init (psf, blockalign, framesperblock) ; - break ; - /* Lite remove end */ - - case SF_FORMAT_GSM610 : - error = gsm610_init (psf) ; - break ; - - default : return SFE_UNIMPLEMENTED ; - } ; - - return error ; -} /* w64_open */ - -/*========================================================================= -** Private functions. -*/ - -static int -w64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) -{ WAV_PRIVATE *wpriv ; - WAV_FMT *wav_fmt ; - int dword = 0, marker, format = 0 ; - sf_count_t chunk_size, bytesread = 0 ; - int parsestage = 0, error, done = 0 ; - - if ((wpriv = psf->container_data) == NULL) - return SFE_INTERNAL ; - wav_fmt = &wpriv->wav_fmt ; - - /* Set position to start of file to begin reading header. */ - psf_binheader_readf (psf, "p", 0) ; - - while (! done) - { /* Each new chunk must start on an 8 byte boundary, so jump if needed. */ - if (psf->headindex & 0x7) - psf_binheader_readf (psf, "j", 8 - (psf->headindex & 0x7)) ; - - /* Generate hash of 16 byte marker. */ - bytesread += psf_binheader_readf (psf, "h", &marker) ; - chunk_size = 0 ; - - switch (marker) - { case riff_HASH16 : - if (parsestage) - return SFE_W64_NO_RIFF ; - - bytesread += psf_binheader_readf (psf, "e8", &chunk_size) ; - - if (psf->filelength != chunk_size) - psf_log_printf (psf, "riff : %D (should be %D)\n", chunk_size, psf->filelength) ; - else - psf_log_printf (psf, "riff : %D\n", chunk_size) ; - - parsestage |= HAVE_riff ; - break ; - - case ACID_HASH16: - psf_log_printf (psf, "Looks like an ACID file. Exiting.\n") ; - return SFE_UNIMPLEMENTED ; - - case wave_HASH16 : - if ((parsestage & HAVE_riff) != HAVE_riff) - return SFE_W64_NO_WAVE ; - psf_log_printf (psf, "wave\n") ; - parsestage |= HAVE_wave ; - break ; - - case fmt_HASH16 : - if ((parsestage & (HAVE_riff | HAVE_wave)) != (HAVE_riff | HAVE_wave)) - return SFE_WAV_NO_FMT ; - - bytesread += psf_binheader_readf (psf, "e8", &chunk_size) ; - psf_log_printf (psf, " fmt : %D\n", chunk_size) ; - - /* size of 16 byte marker and 8 byte chunk_size value. */ - chunk_size -= 24 ; - - if ((error = wav_w64_read_fmt_chunk (psf, (int) chunk_size))) - return error ; - - if (chunk_size % 8) - psf_binheader_readf (psf, "j", 8 - (chunk_size % 8)) ; - - format = wav_fmt->format ; - parsestage |= HAVE_fmt ; - break ; - - case fact_HASH16: - { sf_count_t frames ; - - psf_binheader_readf (psf, "e88", &chunk_size, &frames) ; - psf_log_printf (psf, " fact : %D\n frames : %D\n", - chunk_size, frames) ; - } ; - break ; - - - case data_HASH16 : - if ((parsestage & (HAVE_riff | HAVE_wave | HAVE_fmt)) != (HAVE_riff | HAVE_wave | HAVE_fmt)) - return SFE_W64_NO_DATA ; - - psf_binheader_readf (psf, "e8", &chunk_size) ; - - psf->dataoffset = psf_ftell (psf) ; - - psf->datalength = chunk_size - 24 ; - - if (chunk_size % 8) - chunk_size += 8 - (chunk_size % 8) ; - - psf_log_printf (psf, "data : %D\n", chunk_size) ; - - parsestage |= HAVE_data ; - - if (! psf->sf.seekable) - break ; - - /* Seek past data and continue reading header. */ - psf_fseek (psf, chunk_size, SEEK_CUR) ; - break ; - - case levl_HASH16 : - psf_binheader_readf (psf, "e8", &chunk_size) ; - psf_log_printf (psf, "levl : %D\n", chunk_size) ; - dword = chunk_size ; - psf_binheader_readf (psf, "j", dword - 24) ; - break ; - - case list_HASH16 : - psf_binheader_readf (psf, "e8", &chunk_size) ; - psf_log_printf (psf, "list : %D\n", chunk_size) ; - dword = chunk_size ; - psf_binheader_readf (psf, "j", dword - 24) ; - break ; - - case junk_HASH16 : - psf_binheader_readf (psf, "e8", &chunk_size) ; - psf_log_printf (psf, "junk : %D\n", chunk_size) ; - dword = chunk_size ; - psf_binheader_readf (psf, "j", dword - 24) ; - break ; - - case bext_MARKER : - psf_binheader_readf (psf, "e8", &chunk_size) ; - psf_log_printf (psf, "bext : %D\n", chunk_size) ; - dword = chunk_size ; - psf_binheader_readf (psf, "j", dword - 24) ; - break ; - - case MARKER_HASH16 : - psf_binheader_readf (psf, "e8", &chunk_size) ; - psf_log_printf (psf, "marker : %D\n", chunk_size) ; - dword = chunk_size ; - psf_binheader_readf (psf, "j", dword - 24) ; - break ; - - case SUMLIST_HASH16 : - psf_binheader_readf (psf, "e8", &chunk_size) ; - psf_log_printf (psf, "summary list : %D\n", chunk_size) ; - dword = chunk_size ; - psf_binheader_readf (psf, "j", dword - 24) ; - break ; - - default : - psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ; - done = SF_TRUE ; - break ; - } ; /* switch (dword) */ - - if (psf->sf.seekable == 0 && (parsestage & HAVE_data)) - break ; - - if (psf_ftell (psf) >= (psf->filelength - (2 * SIGNED_SIZEOF (dword)))) - break ; - } ; /* while (1) */ - - if (psf->dataoffset <= 0) - return SFE_W64_NO_DATA ; - - psf->endian = SF_ENDIAN_LITTLE ; /* All W64 files are little endian. */ - - if (psf_ftell (psf) != psf->dataoffset) - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - - if (psf->blockwidth) - { if (psf->filelength - psf->dataoffset < psf->datalength) - psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; - else - psf->sf.frames = psf->datalength / psf->blockwidth ; - } ; - - switch (format) - { case WAVE_FORMAT_PCM : - case WAVE_FORMAT_EXTENSIBLE : - /* extensible might be FLOAT, MULAW, etc as well! */ - psf->sf.format = SF_FORMAT_W64 | u_bitwidth_to_subformat (psf->bytewidth * 8) ; - break ; - - case WAVE_FORMAT_MULAW : - psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_ULAW) ; - break ; - - case WAVE_FORMAT_ALAW : - psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_ALAW) ; - break ; - - case WAVE_FORMAT_MS_ADPCM : - psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM) ; - *blockalign = wav_fmt->msadpcm.blockalign ; - *framesperblock = wav_fmt->msadpcm.samplesperblock ; - break ; - - case WAVE_FORMAT_IMA_ADPCM : - psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM) ; - *blockalign = wav_fmt->ima.blockalign ; - *framesperblock = wav_fmt->ima.samplesperblock ; - break ; - - case WAVE_FORMAT_GSM610 : - psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_GSM610) ; - break ; - - case WAVE_FORMAT_IEEE_FLOAT : - psf->sf.format = SF_FORMAT_W64 ; - psf->sf.format |= (psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT ; - break ; - - default : return SFE_UNIMPLEMENTED ; - } ; - - return 0 ; -} /* w64_read_header */ - -static int -w64_write_header (SF_PRIVATE *psf, int calc_length) -{ sf_count_t fmt_size, current ; - size_t fmt_pad = 0 ; - int subformat, add_fact_chunk = SF_FALSE ; - - current = psf_ftell (psf) ; - - if (calc_length) - { psf->filelength = psf_get_filelen (psf) ; - - psf->datalength = psf->filelength - psf->dataoffset ; - if (psf->dataend) - psf->datalength -= psf->filelength - psf->dataend ; - - if (psf->bytewidth) - psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; - } ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - psf_fseek (psf, 0, SEEK_SET) ; - - /* riff marker, length, wave and 'fmt ' markers. */ - psf_binheader_writef (psf, "eh8hh", riff_MARKER16, psf->filelength, wave_MARKER16, fmt_MARKER16) ; - - subformat = SF_CODEC (psf->sf.format) ; - - switch (subformat) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ; - fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ; - fmt_size += fmt_pad ; - - /* fmt : format, channels, samplerate */ - psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_PCM, psf->sf.channels, psf->sf.samplerate) ; - /* fmt : bytespersec */ - psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ; - /* fmt : blockalign, bitwidth */ - psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ; - break ; - - case SF_FORMAT_FLOAT : - case SF_FORMAT_DOUBLE : - fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ; - fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ; - fmt_size += fmt_pad ; - - /* fmt : format, channels, samplerate */ - psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_IEEE_FLOAT, psf->sf.channels, psf->sf.samplerate) ; - /* fmt : bytespersec */ - psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ; - /* fmt : blockalign, bitwidth */ - psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ; - - add_fact_chunk = SF_TRUE ; - break ; - - case SF_FORMAT_ULAW : - fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ; - fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ; - fmt_size += fmt_pad ; - - /* fmt : format, channels, samplerate */ - psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_MULAW, psf->sf.channels, psf->sf.samplerate) ; - /* fmt : bytespersec */ - psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ; - /* fmt : blockalign, bitwidth */ - psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, 8) ; - - add_fact_chunk = SF_TRUE ; - break ; - - case SF_FORMAT_ALAW : - fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ; - fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ; - fmt_size += fmt_pad ; - - /* fmt : format, channels, samplerate */ - psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_ALAW, psf->sf.channels, psf->sf.samplerate) ; - /* fmt : bytespersec */ - psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ; - /* fmt : blockalign, bitwidth */ - psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, 8) ; - - add_fact_chunk = SF_TRUE ; - break ; - - /* Lite remove start */ - case SF_FORMAT_IMA_ADPCM : - { int blockalign, framesperblock, bytespersec ; - - blockalign = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ; - framesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ; - bytespersec = (psf->sf.samplerate * blockalign) / framesperblock ; - - /* fmt chunk. */ - fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ; - fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ; - fmt_size += fmt_pad ; - - /* fmt : size, WAV format type, channels. */ - psf_binheader_writef (psf, "e822", fmt_size, WAVE_FORMAT_IMA_ADPCM, psf->sf.channels) ; - - /* fmt : samplerate, bytespersec. */ - psf_binheader_writef (psf, "e44", psf->sf.samplerate, bytespersec) ; - - /* fmt : blockalign, bitwidth, extrabytes, framesperblock. */ - psf_binheader_writef (psf, "e2222", blockalign, 4, 2, framesperblock) ; - } ; - - add_fact_chunk = SF_TRUE ; - break ; - - case SF_FORMAT_MS_ADPCM : - { int blockalign, framesperblock, bytespersec, extrabytes ; - - blockalign = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ; - framesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ; - bytespersec = (psf->sf.samplerate * blockalign) / framesperblock ; - - /* fmt chunk. */ - extrabytes = 2 + 2 + MSADPCM_ADAPT_COEFF_COUNT * (2 + 2) ; - fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + extrabytes ; - fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ; - fmt_size += fmt_pad ; - - /* fmt : size, W64 format type, channels. */ - psf_binheader_writef (psf, "e822", fmt_size, WAVE_FORMAT_MS_ADPCM, psf->sf.channels) ; - - /* fmt : samplerate, bytespersec. */ - psf_binheader_writef (psf, "e44", psf->sf.samplerate, bytespersec) ; - - /* fmt : blockalign, bitwidth, extrabytes, framesperblock. */ - psf_binheader_writef (psf, "e22222", blockalign, 4, extrabytes, framesperblock, 7) ; - - msadpcm_write_adapt_coeffs (psf) ; - } ; - - add_fact_chunk = SF_TRUE ; - break ; - /* Lite remove end */ - - case SF_FORMAT_GSM610 : - { int bytespersec ; - - bytespersec = (psf->sf.samplerate * WAV_W64_GSM610_BLOCKSIZE) / WAV_W64_GSM610_SAMPLES ; - - /* fmt chunk. */ - fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ; - fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ; - fmt_size += fmt_pad ; - - /* fmt : size, WAV format type, channels. */ - psf_binheader_writef (psf, "e822", fmt_size, WAVE_FORMAT_GSM610, psf->sf.channels) ; - - /* fmt : samplerate, bytespersec. */ - psf_binheader_writef (psf, "e44", psf->sf.samplerate, bytespersec) ; - - /* fmt : blockalign, bitwidth, extrabytes, framesperblock. */ - psf_binheader_writef (psf, "e2222", WAV_W64_GSM610_BLOCKSIZE, 0, 2, WAV_W64_GSM610_SAMPLES) ; - } ; - - add_fact_chunk = SF_TRUE ; - break ; - - default : return SFE_UNIMPLEMENTED ; - } ; - - /* Pad to 8 bytes with zeros. */ - if (fmt_pad > 0) - psf_binheader_writef (psf, "z", fmt_pad) ; - - if (add_fact_chunk) - psf_binheader_writef (psf, "eh88", fact_MARKER16, (sf_count_t) (16 + 8 + 8), psf->sf.frames) ; - - psf_binheader_writef (psf, "eh8", data_MARKER16, psf->datalength + 24) ; - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - psf->dataoffset = psf->headindex ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* w64_write_header */ - -static int -w64_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - w64_write_header (psf, SF_TRUE) ; - - return 0 ; -} /* w64_close */ - diff --git a/libs/libsndfile/src/wav.c b/libs/libsndfile/src/wav.c deleted file mode 100644 index 6e616b70ff..0000000000 --- a/libs/libsndfile/src/wav.c +++ /dev/null @@ -1,2048 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** Copyright (C) 2004-2005 David Viens -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#ifdef HAVE_INTTYPES_H -#include -#endif - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" -#include "wav_w64.h" - -/*------------------------------------------------------------------------------ - * Macros to handle big/little endian issues. - */ - -#define RIFF_MARKER (MAKE_MARKER ('R', 'I', 'F', 'F')) -#define RIFX_MARKER (MAKE_MARKER ('R', 'I', 'F', 'X')) -#define WAVE_MARKER (MAKE_MARKER ('W', 'A', 'V', 'E')) -#define fmt_MARKER (MAKE_MARKER ('f', 'm', 't', ' ')) -#define data_MARKER (MAKE_MARKER ('d', 'a', 't', 'a')) -#define fact_MARKER (MAKE_MARKER ('f', 'a', 'c', 't')) -#define PEAK_MARKER (MAKE_MARKER ('P', 'E', 'A', 'K')) - -#define cue_MARKER (MAKE_MARKER ('c', 'u', 'e', ' ')) -#define LIST_MARKER (MAKE_MARKER ('L', 'I', 'S', 'T')) -#define slnt_MARKER (MAKE_MARKER ('s', 'l', 'n', 't')) -#define wavl_MARKER (MAKE_MARKER ('w', 'a', 'v', 'l')) -#define INFO_MARKER (MAKE_MARKER ('I', 'N', 'F', 'O')) -#define plst_MARKER (MAKE_MARKER ('p', 'l', 's', 't')) -#define adtl_MARKER (MAKE_MARKER ('a', 'd', 't', 'l')) -#define labl_MARKER (MAKE_MARKER ('l', 'a', 'b', 'l')) -#define ltxt_MARKER (MAKE_MARKER ('l', 't', 'x', 't')) -#define note_MARKER (MAKE_MARKER ('n', 'o', 't', 'e')) -#define smpl_MARKER (MAKE_MARKER ('s', 'm', 'p', 'l')) -#define bext_MARKER (MAKE_MARKER ('b', 'e', 'x', 't')) -#define iXML_MARKER (MAKE_MARKER ('i', 'X', 'M', 'L')) -#define levl_MARKER (MAKE_MARKER ('l', 'e', 'v', 'l')) -#define MEXT_MARKER (MAKE_MARKER ('M', 'E', 'X', 'T')) -#define DISP_MARKER (MAKE_MARKER ('D', 'I', 'S', 'P')) -#define acid_MARKER (MAKE_MARKER ('a', 'c', 'i', 'd')) -#define strc_MARKER (MAKE_MARKER ('s', 't', 'r', 'c')) -#define PAD_MARKER (MAKE_MARKER ('P', 'A', 'D', ' ')) -#define afsp_MARKER (MAKE_MARKER ('a', 'f', 's', 'p')) -#define clm_MARKER (MAKE_MARKER ('c', 'l', 'm', ' ')) -#define elmo_MARKER (MAKE_MARKER ('e', 'l', 'm', 'o')) -#define cart_MARKER (MAKE_MARKER ('c', 'a', 'r', 't')) -#define FLLR_MARKER (MAKE_MARKER ('F', 'L', 'L', 'R')) - -#define exif_MARKER (MAKE_MARKER ('e', 'x', 'i', 'f')) -#define ever_MARKER (MAKE_MARKER ('e', 'v', 'e', 'r')) -#define etim_MARKER (MAKE_MARKER ('e', 't', 'i', 'm')) -#define ecor_MARKER (MAKE_MARKER ('e', 'c', 'o', 'r')) -#define emdl_MARKER (MAKE_MARKER ('e', 'm', 'd', 'l')) -#define emnt_MARKER (MAKE_MARKER ('e', 'm', 'n', 't')) -#define erel_MARKER (MAKE_MARKER ('e', 'r', 'e', 'l')) -#define eucm_MARKER (MAKE_MARKER ('e', 'u', 'c', 'm')) -#define olym_MARKER (MAKE_MARKER ('o', 'l', 'y', 'm')) -#define minf_MARKER (MAKE_MARKER ('m', 'i', 'n', 'f')) -#define elm1_MARKER (MAKE_MARKER ('e', 'l', 'm', '1')) -#define regn_MARKER (MAKE_MARKER ('r', 'e', 'g', 'n')) -#define ovwf_MARKER (MAKE_MARKER ('o', 'v', 'w', 'f')) -#define umid_MARKER (MAKE_MARKER ('u', 'm', 'i', 'd')) -#define SyLp_MARKER (MAKE_MARKER ('S', 'y', 'L', 'p')) -#define Cr8r_MARKER (MAKE_MARKER ('C', 'r', '8', 'r')) -#define JUNK_MARKER (MAKE_MARKER ('J', 'U', 'N', 'K')) -#define PMX_MARKER (MAKE_MARKER ('_', 'P', 'M', 'X')) -#define inst_MARKER (MAKE_MARKER ('i', 'n', 's', 't')) -#define AFAn_MARKER (MAKE_MARKER ('A', 'F', 'A', 'n')) - - -#define ISFT_MARKER (MAKE_MARKER ('I', 'S', 'F', 'T')) -#define ICRD_MARKER (MAKE_MARKER ('I', 'C', 'R', 'D')) -#define ICOP_MARKER (MAKE_MARKER ('I', 'C', 'O', 'P')) -#define IARL_MARKER (MAKE_MARKER ('I', 'A', 'R', 'L')) -#define IART_MARKER (MAKE_MARKER ('I', 'A', 'R', 'T')) -#define INAM_MARKER (MAKE_MARKER ('I', 'N', 'A', 'M')) -#define IENG_MARKER (MAKE_MARKER ('I', 'E', 'N', 'G')) -#define IGNR_MARKER (MAKE_MARKER ('I', 'G', 'N', 'R')) -#define ICOP_MARKER (MAKE_MARKER ('I', 'C', 'O', 'P')) -#define IPRD_MARKER (MAKE_MARKER ('I', 'P', 'R', 'D')) -#define ISRC_MARKER (MAKE_MARKER ('I', 'S', 'R', 'C')) -#define ISBJ_MARKER (MAKE_MARKER ('I', 'S', 'B', 'J')) -#define ICMT_MARKER (MAKE_MARKER ('I', 'C', 'M', 'T')) -#define IAUT_MARKER (MAKE_MARKER ('I', 'A', 'U', 'T')) -#define ITRK_MARKER (MAKE_MARKER ('I', 'T', 'R', 'K')) - -/* Weird WAVPACK marker which can show up at the start of the DATA section. */ -#define wvpk_MARKER (MAKE_MARKER ('w', 'v', 'p', 'k')) -#define OggS_MARKER (MAKE_MARKER ('O', 'g', 'g', 'S')) - -#define WAV_PEAK_CHUNK_SIZE(ch) (2 * sizeof (int) + ch * (sizeof (float) + sizeof (int))) -#define WAV_BEXT_MIN_CHUNK_SIZE 602 -#define WAV_BEXT_MAX_CHUNK_SIZE (10 * 1024) - -#define WAV_CART_MIN_CHUNK_SIZE 2048 -#define WAV_CART_MAX_CHUNK_SIZE 0xffffffff - - -enum -{ HAVE_RIFF = 0x01, - HAVE_WAVE = 0x02, - HAVE_fmt = 0x04, - HAVE_fact = 0x08, - HAVE_PEAK = 0x10, - HAVE_data = 0x20, - HAVE_other = 0x80000000 -} ; - - - -/* known WAVEFORMATEXTENSIBLE GUIDS */ -static const EXT_SUBFORMAT MSGUID_SUBTYPE_PCM = -{ 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_MS_ADPCM = -{ 0x00000002, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_IEEE_FLOAT = -{ 0x00000003, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_ALAW = -{ 0x00000006, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_MULAW = -{ 0x00000007, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -/* -** the next two are from -** http://dream.cs.bath.ac.uk/researchdev/wave-ex/bformat.html -*/ -static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM = -{ 0x00000001, 0x0721, 0x11d3, { 0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT = -{ 0x00000003, 0x0721, 0x11d3, { 0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 } -} ; - - -#if 0 -/* maybe interesting one day to read the following through sf_read_raw */ -/* http://www.bath.ac.uk/~masrwd/pvocex/pvocex.html */ -static const EXT_SUBFORMAT MSGUID_SUBTYPE_PVOCEX = -{ 0x8312B9C2, 0x2E6E, 0x11d4, { 0xA8, 0x24, 0xDE, 0x5B, 0x96, 0xC3, 0xAB, 0x21 } -} ; -#endif - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int wav_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) ; -static int wav_write_header (SF_PRIVATE *psf, int calc_length) ; - -static int wav_write_tailer (SF_PRIVATE *psf) ; -static void wav_write_strings (SF_PRIVATE *psf, int location) ; -static int wav_command (SF_PRIVATE *psf, int command, void *data, int datasize) ; -static int wav_close (SF_PRIVATE *psf) ; - -static int wav_subchunk_parse (SF_PRIVATE *psf, int chunk, uint32_t length) ; -static int exif_subchunk_parse (SF_PRIVATE *psf, uint32_t length) ; -static int wav_read_smpl_chunk (SF_PRIVATE *psf, uint32_t chunklen) ; -static int wav_read_acid_chunk (SF_PRIVATE *psf, uint32_t chunklen) ; - -static int wav_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) ; -static SF_CHUNK_ITERATOR * wav_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) ; -static int wav_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; -static int wav_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -wav_open (SF_PRIVATE *psf) -{ WAV_PRIVATE * wpriv ; - int format, subformat, error, blockalign = 0, framesperblock = 0 ; - - if ((wpriv = calloc (1, sizeof (WAV_PRIVATE))) == NULL) - return SFE_MALLOC_FAILED ; - psf->container_data = wpriv ; - - wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ; - psf->strings.flags = SF_STR_ALLOW_START | SF_STR_ALLOW_END ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = wav_read_header (psf, &blockalign, &framesperblock))) - return error ; - - psf->next_chunk_iterator = wav_next_chunk_iterator ; - psf->get_chunk_size = wav_get_chunk_size ; - psf->get_chunk_data = wav_get_chunk_data ; - } ; - - subformat = SF_CODEC (psf->sf.format) ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if (psf->is_pipe) - return SFE_NO_PIPE_WRITE ; - - wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ; - - format = SF_CONTAINER (psf->sf.format) ; - if (format != SF_FORMAT_WAV && format != SF_FORMAT_WAVEX) - return SFE_BAD_OPEN_FORMAT ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - /* RIFF WAVs are little-endian, RIFX WAVs are big-endian, default to little */ - psf->endian = SF_ENDIAN (psf->sf.format) ; - if (CPU_IS_BIG_ENDIAN && psf->endian == SF_ENDIAN_CPU) - psf->endian = SF_ENDIAN_BIG ; - else if (psf->endian != SF_ENDIAN_BIG) - psf->endian = SF_ENDIAN_LITTLE ; - - if (psf->file.mode != SFM_RDWR || psf->filelength < 44) - { psf->filelength = 0 ; - psf->datalength = 0 ; - psf->dataoffset = 0 ; - psf->sf.frames = 0 ; - } ; - - if (subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) - { blockalign = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ; - framesperblock = -1 ; /* Corrected later. */ - } ; - - /* By default, add the peak chunk to floating point files. Default behaviour - ** can be switched off using sf_command (SFC_SET_PEAK_CHUNK, SF_FALSE). - */ - if (psf->file.mode == SFM_WRITE && (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)) - { if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL) - return SFE_MALLOC_FAILED ; - psf->peak_info->peak_loc = SF_PEAK_START ; - } ; - - psf->write_header = wav_write_header ; - psf->set_chunk = wav_set_chunk ; - } ; - - psf->container_close = wav_close ; - psf->command = wav_command ; - - switch (subformat) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - error = pcm_init (psf) ; - break ; - - case SF_FORMAT_ULAW : - error = ulaw_init (psf) ; - break ; - - case SF_FORMAT_ALAW : - error = alaw_init (psf) ; - break ; - - /* Lite remove start */ - case SF_FORMAT_FLOAT : - error = float32_init (psf) ; - break ; - - case SF_FORMAT_DOUBLE : - error = double64_init (psf) ; - break ; - - case SF_FORMAT_IMA_ADPCM : - error = wav_w64_ima_init (psf, blockalign, framesperblock) ; - break ; - - case SF_FORMAT_MS_ADPCM : - error = wav_w64_msadpcm_init (psf, blockalign, framesperblock) ; - break ; - - case SF_FORMAT_G721_32 : - error = g72x_init (psf) ; - break ; - /* Lite remove end */ - - case SF_FORMAT_GSM610 : - error = gsm610_init (psf) ; - break ; - - default : return SFE_UNIMPLEMENTED ; - } ; - - if (psf->file.mode == SFM_WRITE || (psf->file.mode == SFM_RDWR && psf->filelength == 0)) - return psf->write_header (psf, SF_FALSE) ; - - return error ; -} /* wav_open */ - -/*========================================================================= -** Private functions. -*/ - -static int -wav_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) -{ WAV_PRIVATE *wpriv ; - WAV_FMT *wav_fmt ; - FACT_CHUNK fact_chunk ; - uint32_t marker, chunk_size = 0, RIFFsize = 0, done = 0, uk ; - int parsestage = 0, error, format = 0 ; - char buffer [256] ; - - if (psf->filelength > SF_PLATFORM_S64 (0xffffffff)) - psf_log_printf (psf, "Warning : filelength > 0xffffffff. This is bad!!!!\n") ; - - if ((wpriv = psf->container_data) == NULL) - return SFE_INTERNAL ; - wav_fmt = &wpriv->wav_fmt ; - - /* Set position to start of file to begin reading header. */ - psf_binheader_readf (psf, "pmj", 0, &marker, -4) ; - psf->headindex = 0 ; - - /* RIFX signifies big-endian format for all header and data to prevent - ** lots of code copying here, we'll set the psf->rwf_endian flag once here, - ** and never specify endian-ness for all other header ops/ - */ - psf->rwf_endian = (marker == RIFF_MARKER) ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ; - - while (! done) - { size_t jump = chunk_size & 1 ; - - marker = chunk_size = 0 ; - psf_binheader_readf (psf, "jm4", jump, &marker, &chunk_size) ; - if (marker == 0) - { psf_log_printf (psf, "Have 0 marker.\n") ; - break ; - } ; - - psf_store_read_chunk_u32 (&psf->rchunks, marker, psf_ftell (psf), chunk_size) ; - - switch (marker) - { case RIFF_MARKER : - case RIFX_MARKER : - if (parsestage) - return SFE_WAV_NO_RIFF ; - - parsestage |= HAVE_RIFF ; - - RIFFsize = chunk_size ; - - if (psf->fileoffset > 0 && psf->filelength > RIFFsize + 8) - { /* Set file length. */ - psf->filelength = RIFFsize + 8 ; - if (marker == RIFF_MARKER) - psf_log_printf (psf, "RIFF : %u\n", RIFFsize) ; - else - psf_log_printf (psf, "RIFX : %u\n", RIFFsize) ; - } - else if (psf->filelength < RIFFsize + 2 * SIGNED_SIZEOF (marker)) - { if (marker == RIFF_MARKER) - psf_log_printf (psf, "RIFF : %u (should be %D)\n", RIFFsize, psf->filelength - 2 * SIGNED_SIZEOF (marker)) ; - else - psf_log_printf (psf, "RIFX : %u (should be %D)\n", RIFFsize, psf->filelength - 2 * SIGNED_SIZEOF (marker)) ; - - RIFFsize = psf->filelength - 2 * SIGNED_SIZEOF (RIFFsize) ; - } - else - { if (marker == RIFF_MARKER) - psf_log_printf (psf, "RIFF : %u\n", RIFFsize) ; - else - psf_log_printf (psf, "RIFX : %u\n", RIFFsize) ; - } ; - - psf_binheader_readf (psf, "m", &marker) ; - if (marker != WAVE_MARKER) - return SFE_WAV_NO_WAVE ; - parsestage |= HAVE_WAVE ; - psf_log_printf (psf, "WAVE\n") ; - chunk_size = 0 ; - break ; - - case fmt_MARKER : - if ((parsestage & (HAVE_RIFF | HAVE_WAVE)) != (HAVE_RIFF | HAVE_WAVE)) - return SFE_WAV_NO_FMT ; - - /* If this file has a SECOND fmt chunk, I don't want to know about it. */ - if (parsestage & HAVE_fmt) - break ; - - parsestage |= HAVE_fmt ; - - psf_log_printf (psf, "fmt : %d\n", chunk_size) ; - - if ((error = wav_w64_read_fmt_chunk (psf, chunk_size))) - return error ; - - format = wav_fmt->format ; - break ; - - case data_MARKER : - if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) - return SFE_WAV_NO_DATA ; - - if (psf->file.mode == SFM_RDWR && (parsestage & HAVE_other) != 0) - return SFE_RDWR_BAD_HEADER ; - - parsestage |= HAVE_data ; - - psf->datalength = chunk_size ; - psf->dataoffset = psf_ftell (psf) ; - - if (psf->dataoffset > 0) - { if (chunk_size == 0 && RIFFsize == 8 && psf->filelength > 44) - { psf_log_printf (psf, "*** Looks like a WAV file which wasn't closed properly. Fixing it.\n") ; - psf->datalength = psf->filelength - psf->dataoffset ; - } ; - - if (psf->datalength > psf->filelength - psf->dataoffset) - { psf_log_printf (psf, "data : %D (should be %D)\n", psf->datalength, psf->filelength - psf->dataoffset) ; - psf->datalength = psf->filelength - psf->dataoffset ; - } - else - psf_log_printf (psf, "data : %D\n", psf->datalength) ; - - /* Only set dataend if there really is data at the end. */ - if (psf->datalength + psf->dataoffset < psf->filelength) - psf->dataend = psf->datalength + psf->dataoffset ; - - psf->datalength += chunk_size & 1 ; - chunk_size = 0 ; - } ; - - if (! psf->sf.seekable || psf->dataoffset < 0) - break ; - - /* Seek past data and continue reading header. */ - psf_fseek (psf, psf->datalength, SEEK_CUR) ; - - if (psf_ftell (psf) != psf->datalength + psf->dataoffset) - psf_log_printf (psf, "*** psf_fseek past end error ***\n") ; - break ; - - case fact_MARKER : - if ((parsestage & (HAVE_RIFF | HAVE_WAVE)) != (HAVE_RIFF | HAVE_WAVE)) - return SFE_WAV_BAD_FACT ; - - parsestage |= HAVE_fact ; - - if ((parsestage & HAVE_fmt) != HAVE_fmt) - psf_log_printf (psf, "*** Should have 'fmt ' chunk before 'fact'\n") ; - - psf_binheader_readf (psf, "4", & (fact_chunk.frames)) ; - - if (chunk_size > SIGNED_SIZEOF (fact_chunk)) - psf_binheader_readf (psf, "j", (int) (chunk_size - SIGNED_SIZEOF (fact_chunk))) ; - - if (chunk_size) - psf_log_printf (psf, "%M : %d\n", marker, chunk_size) ; - else - psf_log_printf (psf, "%M : %d (should not be zero)\n", marker, chunk_size) ; - - psf_log_printf (psf, " frames : %d\n", fact_chunk.frames) ; - break ; - - case PEAK_MARKER : - if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) - return SFE_WAV_PEAK_B4_FMT ; - - parsestage |= HAVE_PEAK ; - - psf_log_printf (psf, "%M : %d\n", marker, chunk_size) ; - if (chunk_size != WAV_PEAK_CHUNK_SIZE (psf->sf.channels)) - { psf_binheader_readf (psf, "j", chunk_size) ; - psf_log_printf (psf, "*** File PEAK chunk size doesn't fit with number of channels (%d).\n", psf->sf.channels) ; - return SFE_WAV_BAD_PEAK ; - } ; - - if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL) - return SFE_MALLOC_FAILED ; - - /* read in rest of PEAK chunk. */ - psf_binheader_readf (psf, "44", & (psf->peak_info->version), & (psf->peak_info->timestamp)) ; - - if (psf->peak_info->version != 1) - psf_log_printf (psf, " version : %d *** (should be version 1)\n", psf->peak_info->version) ; - else - psf_log_printf (psf, " version : %d\n", psf->peak_info->version) ; - - psf_log_printf (psf, " time stamp : %d\n", psf->peak_info->timestamp) ; - psf_log_printf (psf, " Ch Position Value\n") ; - - for (uk = 0 ; uk < (uint32_t) psf->sf.channels ; uk++) - { float value ; - uint32_t position ; - - psf_binheader_readf (psf, "f4", &value, &position) ; - psf->peak_info->peaks [uk].value = value ; - psf->peak_info->peaks [uk].position = position ; - - snprintf (buffer, sizeof (buffer), " %2d %-12" PRId64 " %g\n", - uk, psf->peak_info->peaks [uk].position, psf->peak_info->peaks [uk].value) ; - buffer [sizeof (buffer) - 1] = 0 ; - psf_log_printf (psf, "%s", buffer) ; - } ; - - psf->peak_info->peak_loc = ((parsestage & HAVE_data) == 0) ? SF_PEAK_START : SF_PEAK_END ; - break ; - - case cue_MARKER : - parsestage |= HAVE_other ; - - { uint32_t bytesread, cue_count ; - int id, position, chunk_id, chunk_start, block_start, offset ; - - bytesread = psf_binheader_readf (psf, "4", &cue_count) ; - psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ; - - if (cue_count > 10) - { psf_log_printf (psf, " Count : %d (skipping)\n", cue_count) ; - psf_binheader_readf (psf, "j", cue_count * 24) ; - break ; - } ; - - psf_log_printf (psf, " Count : %d\n", cue_count) ; - - while (cue_count) - { bytesread += psf_binheader_readf (psf, "444444", &id, &position, - &chunk_id, &chunk_start, &block_start, &offset) ; - psf_log_printf (psf, " Cue ID : %2d" - " Pos : %5u Chunk : %M" - " Chk Start : %d Blk Start : %d" - " Offset : %5d\n", - id, position, chunk_id, chunk_start, block_start, offset) ; - cue_count -- ; - } ; - - if (bytesread != chunk_size) - { psf_log_printf (psf, "**** Chunk size weirdness (%d != %d)\n", chunk_size, bytesread) ; - psf_binheader_readf (psf, "j", chunk_size - bytesread) ; - } ; - } ; - break ; - - case smpl_MARKER : - parsestage |= HAVE_other ; - - psf_log_printf (psf, "smpl : %u\n", chunk_size) ; - - if ((error = wav_read_smpl_chunk (psf, chunk_size))) - return error ; - break ; - - case acid_MARKER : - parsestage |= HAVE_other ; - - psf_log_printf (psf, "acid : %u\n", chunk_size) ; - - if ((error = wav_read_acid_chunk (psf, chunk_size))) - return error ; - break ; - - case INFO_MARKER : - case LIST_MARKER : - parsestage |= HAVE_other ; - - if ((error = wav_subchunk_parse (psf, marker, chunk_size)) != 0) - return error ; - break ; - - case bext_MARKER : - /* - The 'bext' chunk can actually be updated, so don't need to set this. - parsestage |= HAVE_other ; - */ - if ((error = wav_read_bext_chunk (psf, chunk_size))) - return error ; - break ; - - case PAD_MARKER : - /* - We can eat into a 'PAD ' chunk if we need to. - parsestage |= HAVE_other ; - */ - psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ; - psf_binheader_readf (psf, "j", chunk_size) ; - break ; - - case cart_MARKER: - if ((error = wav_read_cart_chunk (psf, chunk_size))) - return error ; - break ; - - case iXML_MARKER : /* See http://en.wikipedia.org/wiki/IXML */ - case strc_MARKER : /* Multiple of 32 bytes. */ - case afsp_MARKER : - case clm_MARKER : - case elmo_MARKER : - case levl_MARKER : - case plst_MARKER : - case minf_MARKER : - case elm1_MARKER : - case regn_MARKER : - case ovwf_MARKER : - case inst_MARKER : - case AFAn_MARKER : - case umid_MARKER : - case SyLp_MARKER : - case Cr8r_MARKER : - case JUNK_MARKER : - case PMX_MARKER : - case DISP_MARKER : - case MEXT_MARKER : - case FLLR_MARKER : - psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ; - psf_binheader_readf (psf, "j", chunk_size) ; - break ; - - default : - if (psf_isprint ((marker >> 24) & 0xFF) && psf_isprint ((marker >> 16) & 0xFF) - && psf_isprint ((marker >> 8) & 0xFF) && psf_isprint (marker & 0xFF)) - { psf_log_printf (psf, "*** %M : %d (unknown marker)\n", marker, chunk_size) ; - psf_binheader_readf (psf, "j", chunk_size) ; - break ; - } ; - if (psf_ftell (psf) & 0x03) - { psf_log_printf (psf, " Unknown chunk marker at position %D. Resynching.\n", psf_ftell (psf) - 8) ; - psf_binheader_readf (psf, "j", -3) ; - /* File is too messed up so we prevent editing in RDWR mode here. */ - parsestage |= HAVE_other ; - break ; - } ; - psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D. Exiting parser.\n", marker, psf_ftell (psf) - 8) ; - done = SF_TRUE ; - break ; - } ; /* switch (marker) */ - - if (! psf->sf.seekable && (parsestage & HAVE_data)) - break ; - - if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (chunk_size)) - { psf_log_printf (psf, "End\n") ; - break ; - } ; - } ; /* while (1) */ - - if (psf->dataoffset <= 0) - return SFE_WAV_NO_DATA ; - - /* WAVs can be little or big endian */ - psf->endian = psf->rwf_endian ; - - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - - if (psf->is_pipe == 0) - { /* - ** Check for 'wvpk' at the start of the DATA section. Not able to - ** handle this. - */ - psf_binheader_readf (psf, "4", &marker) ; - if (marker == wvpk_MARKER || marker == OggS_MARKER) - return SFE_WAV_WVPK_DATA ; - } ; - - /* Seek to start of DATA section. */ - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - - if (psf->blockwidth) - { if (psf->filelength - psf->dataoffset < psf->datalength) - psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; - else - psf->sf.frames = psf->datalength / psf->blockwidth ; - } ; - - switch (format) - { case WAVE_FORMAT_EXTENSIBLE : - if (psf->sf.format == (SF_FORMAT_WAVEX | SF_FORMAT_MS_ADPCM)) - { *blockalign = wav_fmt->msadpcm.blockalign ; - *framesperblock = wav_fmt->msadpcm.samplesperblock ; - } ; - break ; - - case WAVE_FORMAT_PCM : - psf->sf.format = SF_FORMAT_WAV | u_bitwidth_to_subformat (psf->bytewidth * 8) ; - break ; - - case WAVE_FORMAT_MULAW : - case IBM_FORMAT_MULAW : - psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_ULAW) ; - break ; - - case WAVE_FORMAT_ALAW : - case IBM_FORMAT_ALAW : - psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_ALAW) ; - break ; - - case WAVE_FORMAT_MS_ADPCM : - psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM) ; - *blockalign = wav_fmt->msadpcm.blockalign ; - *framesperblock = wav_fmt->msadpcm.samplesperblock ; - break ; - - case WAVE_FORMAT_IMA_ADPCM : - psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM) ; - *blockalign = wav_fmt->ima.blockalign ; - *framesperblock = wav_fmt->ima.samplesperblock ; - break ; - - case WAVE_FORMAT_GSM610 : - psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_GSM610) ; - break ; - - case WAVE_FORMAT_IEEE_FLOAT : - psf->sf.format = SF_FORMAT_WAV ; - psf->sf.format |= (psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT ; - break ; - - case WAVE_FORMAT_G721_ADPCM : - psf->sf.format = SF_FORMAT_WAV | SF_FORMAT_G721_32 ; - break ; - - default : return SFE_UNIMPLEMENTED ; - } ; - - if (wpriv->fmt_is_broken) - wav_w64_analyze (psf) ; - - /* Only set the format endian-ness if its non-standard big-endian. */ - if (psf->endian == SF_ENDIAN_BIG) - psf->sf.format |= SF_ENDIAN_BIG ; - - return 0 ; -} /* wav_read_header */ - -static int -wav_write_fmt_chunk (SF_PRIVATE *psf) -{ int subformat, fmt_size, add_fact_chunk = 0 ; - - subformat = SF_CODEC (psf->sf.format) ; - - switch (subformat) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ; - - /* fmt : format, channels, samplerate */ - psf_binheader_writef (psf, "4224", fmt_size, WAVE_FORMAT_PCM, psf->sf.channels, psf->sf.samplerate) ; - /* fmt : bytespersec */ - psf_binheader_writef (psf, "4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ; - /* fmt : blockalign, bitwidth */ - psf_binheader_writef (psf, "22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ; - break ; - - case SF_FORMAT_FLOAT : - case SF_FORMAT_DOUBLE : - fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ; - - /* fmt : format, channels, samplerate */ - psf_binheader_writef (psf, "4224", fmt_size, WAVE_FORMAT_IEEE_FLOAT, psf->sf.channels, psf->sf.samplerate) ; - /* fmt : bytespersec */ - psf_binheader_writef (psf, "4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ; - /* fmt : blockalign, bitwidth */ - psf_binheader_writef (psf, "22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ; - - add_fact_chunk = SF_TRUE ; - break ; - - case SF_FORMAT_ULAW : - fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 ; - - /* fmt : format, channels, samplerate */ - psf_binheader_writef (psf, "4224", fmt_size, WAVE_FORMAT_MULAW, psf->sf.channels, psf->sf.samplerate) ; - /* fmt : bytespersec */ - psf_binheader_writef (psf, "4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ; - /* fmt : blockalign, bitwidth, extrabytes */ - psf_binheader_writef (psf, "222", psf->bytewidth * psf->sf.channels, 8, 0) ; - - add_fact_chunk = SF_TRUE ; - break ; - - case SF_FORMAT_ALAW : - fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 ; - - /* fmt : format, channels, samplerate */ - psf_binheader_writef (psf, "4224", fmt_size, WAVE_FORMAT_ALAW, psf->sf.channels, psf->sf.samplerate) ; - /* fmt : bytespersec */ - psf_binheader_writef (psf, "4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ; - /* fmt : blockalign, bitwidth, extrabytes */ - psf_binheader_writef (psf, "222", psf->bytewidth * psf->sf.channels, 8, 0) ; - - add_fact_chunk = SF_TRUE ; - break ; - - /* Lite remove start */ - case SF_FORMAT_IMA_ADPCM : - { int blockalign, framesperblock, bytespersec ; - - blockalign = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ; - framesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ; - bytespersec = (psf->sf.samplerate * blockalign) / framesperblock ; - - /* fmt chunk. */ - fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ; - - /* fmt : size, WAV format type, channels, samplerate, bytespersec */ - psf_binheader_writef (psf, "42244", fmt_size, WAVE_FORMAT_IMA_ADPCM, - psf->sf.channels, psf->sf.samplerate, bytespersec) ; - - /* fmt : blockalign, bitwidth, extrabytes, framesperblock. */ - psf_binheader_writef (psf, "2222", blockalign, 4, 2, framesperblock) ; - } ; - - add_fact_chunk = SF_TRUE ; - break ; - - case SF_FORMAT_MS_ADPCM : - { int blockalign, framesperblock, bytespersec, extrabytes ; - - blockalign = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ; - framesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ; - bytespersec = (psf->sf.samplerate * blockalign) / framesperblock ; - - /* fmt chunk. */ - extrabytes = 2 + 2 + MSADPCM_ADAPT_COEFF_COUNT * (2 + 2) ; - fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + extrabytes ; - - /* fmt : size, WAV format type, channels. */ - psf_binheader_writef (psf, "422", fmt_size, WAVE_FORMAT_MS_ADPCM, psf->sf.channels) ; - - /* fmt : samplerate, bytespersec. */ - psf_binheader_writef (psf, "44", psf->sf.samplerate, bytespersec) ; - - /* fmt : blockalign, bitwidth, extrabytes, framesperblock. */ - psf_binheader_writef (psf, "22222", blockalign, 4, extrabytes, framesperblock, 7) ; - - msadpcm_write_adapt_coeffs (psf) ; - } ; - - add_fact_chunk = SF_TRUE ; - break ; - - - case SF_FORMAT_G721_32 : - /* fmt chunk. */ - fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ; - - /* fmt : size, WAV format type, channels, samplerate, bytespersec */ - psf_binheader_writef (psf, "42244", fmt_size, WAVE_FORMAT_G721_ADPCM, - psf->sf.channels, psf->sf.samplerate, psf->sf.samplerate * psf->sf.channels / 2) ; - - /* fmt : blockalign, bitwidth, extrabytes, auxblocksize. */ - psf_binheader_writef (psf, "2222", 64, 4, 2, 0) ; - - add_fact_chunk = SF_TRUE ; - break ; - - /* Lite remove end */ - - case SF_FORMAT_GSM610 : - { int blockalign, framesperblock, bytespersec ; - - blockalign = WAV_W64_GSM610_BLOCKSIZE ; - framesperblock = WAV_W64_GSM610_SAMPLES ; - bytespersec = (psf->sf.samplerate * blockalign) / framesperblock ; - - /* fmt chunk. */ - fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ; - - /* fmt : size, WAV format type, channels. */ - psf_binheader_writef (psf, "422", fmt_size, WAVE_FORMAT_GSM610, psf->sf.channels) ; - - /* fmt : samplerate, bytespersec. */ - psf_binheader_writef (psf, "44", psf->sf.samplerate, bytespersec) ; - - /* fmt : blockalign, bitwidth, extrabytes, framesperblock. */ - psf_binheader_writef (psf, "2222", blockalign, 0, 2, framesperblock) ; - } ; - - add_fact_chunk = SF_TRUE ; - break ; - - default : return SFE_UNIMPLEMENTED ; - } ; - - if (add_fact_chunk) - psf_binheader_writef (psf, "tm48", fact_MARKER, 4, psf->sf.frames) ; - - return 0 ; -} /* wav_write_fmt_chunk */ - -static int -wavex_write_fmt_chunk (SF_PRIVATE *psf) -{ WAV_PRIVATE *wpriv ; - int subformat, fmt_size, add_fact_chunk = 0 ; - - if ((wpriv = psf->container_data) == NULL) - return SFE_INTERNAL ; - - subformat = SF_CODEC (psf->sf.format) ; - - /* initial section (same for all, it appears) */ - switch (subformat) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - case SF_FORMAT_FLOAT : - case SF_FORMAT_DOUBLE : - case SF_FORMAT_ULAW : - case SF_FORMAT_ALAW : - fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 + 4 + 4 + 2 + 2 + 8 ; - - /* fmt : format, channels, samplerate */ - psf_binheader_writef (psf, "4224", fmt_size, WAVE_FORMAT_EXTENSIBLE, psf->sf.channels, psf->sf.samplerate) ; - /* fmt : bytespersec */ - psf_binheader_writef (psf, "4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ; - /* fmt : blockalign, bitwidth */ - psf_binheader_writef (psf, "22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ; - - /* cbSize 22 is sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX) */ - psf_binheader_writef (psf, "2", 22) ; - - /* wValidBitsPerSample, for our use same as bitwidth as we use it fully */ - psf_binheader_writef (psf, "2", psf->bytewidth * 8) ; - - /* For an Ambisonic file set the channel mask to zero. - ** Otherwise use a default based on the channel count. - */ - if (wpriv->wavex_ambisonic != SF_AMBISONIC_NONE) - psf_binheader_writef (psf, "4", 0) ; - else if (wpriv->wavex_channelmask != 0) - psf_binheader_writef (psf, "4", wpriv->wavex_channelmask) ; - else - { /* - ** Ok some liberty is taken here to use the most commonly used channel masks - ** instead of "no mapping". If you really want to use "no mapping" for 8 channels and less - ** please don't use wavex. (otherwise we'll have to create a new SF_COMMAND) - */ - switch (psf->sf.channels) - { case 1 : /* center channel mono */ - psf_binheader_writef (psf, "4", 0x4) ; - break ; - - case 2 : /* front left and right */ - psf_binheader_writef (psf, "4", 0x1 | 0x2) ; - break ; - - case 4 : /* Quad */ - psf_binheader_writef (psf, "4", 0x1 | 0x2 | 0x10 | 0x20) ; - break ; - - case 6 : /* 5.1 */ - psf_binheader_writef (psf, "4", 0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20) ; - break ; - - case 8 : /* 7.1 */ - psf_binheader_writef (psf, "4", 0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20 | 0x40 | 0x80) ; - break ; - - default : /* 0 when in doubt , use direct out, ie NO mapping*/ - psf_binheader_writef (psf, "4", 0x0) ; - break ; - } ; - } ; - break ; - - case SF_FORMAT_MS_ADPCM : /* Todo, GUID exists might have different header as per wav_write_header */ - default : - return SFE_UNIMPLEMENTED ; - } ; - - /* GUID section, different for each */ - - switch (subformat) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - wavex_write_guid (psf, wpriv->wavex_ambisonic == SF_AMBISONIC_NONE ? - &MSGUID_SUBTYPE_PCM : &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM) ; - break ; - - case SF_FORMAT_FLOAT : - case SF_FORMAT_DOUBLE : - wavex_write_guid (psf, wpriv->wavex_ambisonic == SF_AMBISONIC_NONE ? - &MSGUID_SUBTYPE_IEEE_FLOAT : &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT) ; - add_fact_chunk = SF_TRUE ; - break ; - - case SF_FORMAT_ULAW : - wavex_write_guid (psf, &MSGUID_SUBTYPE_MULAW) ; - add_fact_chunk = SF_TRUE ; - break ; - - case SF_FORMAT_ALAW : - wavex_write_guid (psf, &MSGUID_SUBTYPE_ALAW) ; - add_fact_chunk = SF_TRUE ; - break ; - -#if 0 - /* This is dead code due to return in previous switch statement. */ - case SF_FORMAT_MS_ADPCM : /* todo, GUID exists */ - wavex_write_guid (psf, &MSGUID_SUBTYPE_MS_ADPCM) ; - add_fact_chunk = SF_TRUE ; - break ; - return SFE_UNIMPLEMENTED ; -#endif - - default : return SFE_UNIMPLEMENTED ; - } ; - - if (add_fact_chunk) - psf_binheader_writef (psf, "tm48", fact_MARKER, 4, psf->sf.frames) ; - - return 0 ; -} /* wavex_write_fmt_chunk */ - - -static int -wav_write_header (SF_PRIVATE *psf, int calc_length) -{ sf_count_t current ; - uint32_t uk ; - int k, error, has_data = SF_FALSE ; - - current = psf_ftell (psf) ; - - if (current > psf->dataoffset) - has_data = SF_TRUE ; - - if (calc_length) - { psf->filelength = psf_get_filelen (psf) ; - - psf->datalength = psf->filelength - psf->dataoffset ; - - if (psf->dataend) - psf->datalength -= psf->filelength - psf->dataend ; - else if (psf->bytewidth > 0 && psf->sf.seekable == SF_TRUE) - psf->datalength = psf->sf.frames * psf->bytewidth * psf->sf.channels ; - } ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - psf_fseek (psf, 0, SEEK_SET) ; - - /* - ** RIFX signifies big-endian format for all header and data. - ** To prevent lots of code copying here, we'll set the psf->rwf_endian flag - ** once here, and never specify endian-ness for all other header operations. - */ - - /* RIFF/RIFX marker, length, WAVE and 'fmt ' markers. */ - - if (psf->endian == SF_ENDIAN_LITTLE) - psf_binheader_writef (psf, "etm8", RIFF_MARKER, (psf->filelength < 8) ? 8 : psf->filelength - 8) ; - else - psf_binheader_writef (psf, "Etm8", RIFX_MARKER, (psf->filelength < 8) ? 8 : psf->filelength - 8) ; - - /* WAVE and 'fmt ' markers. */ - psf_binheader_writef (psf, "mm", WAVE_MARKER, fmt_MARKER) ; - - /* Write the 'fmt ' chunk. */ - switch (SF_CONTAINER (psf->sf.format)) - { case SF_FORMAT_WAV : - if ((error = wav_write_fmt_chunk (psf)) != 0) - return error ; - break ; - - case SF_FORMAT_WAVEX : - if ((error = wavex_write_fmt_chunk (psf)) != 0) - return error ; - break ; - - default : - return SFE_UNIMPLEMENTED ; - } ; - - /* The LIST/INFO chunk. */ - if (psf->strings.flags & SF_STR_LOCATE_START) - wav_write_strings (psf, SF_STR_LOCATE_START) ; - - if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_START) - { psf_binheader_writef (psf, "m4", PEAK_MARKER, WAV_PEAK_CHUNK_SIZE (psf->sf.channels)) ; - psf_binheader_writef (psf, "44", 1, time (NULL)) ; - for (k = 0 ; k < psf->sf.channels ; k++) - psf_binheader_writef (psf, "ft8", (float) psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ; - } ; - - if (psf->broadcast_16k != NULL) - wav_write_bext_chunk (psf) ; - - if (psf->cart_16k != NULL) - wav_write_cart_chunk (psf) ; - - if (psf->instrument != NULL) - { int tmp ; - double dtune = (double) (0x40000000) / 25.0 ; - - psf_binheader_writef (psf, "m4", smpl_MARKER, 9 * 4 + psf->instrument->loop_count * 6 * 4) ; - psf_binheader_writef (psf, "44", 0, 0) ; /* Manufacturer zero is everyone */ - tmp = (int) (1.0e9 / psf->sf.samplerate) ; /* Sample period in nano seconds */ - psf_binheader_writef (psf, "44", tmp, psf->instrument->basenote) ; - tmp = (uint32_t) (psf->instrument->detune * dtune + 0.5) ; - psf_binheader_writef (psf, "4", tmp) ; - psf_binheader_writef (psf, "44", 0, 0) ; /* SMTPE format */ - psf_binheader_writef (psf, "44", psf->instrument->loop_count, 0) ; - - for (tmp = 0 ; tmp < psf->instrument->loop_count ; tmp++) - { int type ; - - type = psf->instrument->loops [tmp].mode ; - type = (type == SF_LOOP_FORWARD ? 0 : type == SF_LOOP_BACKWARD ? 2 : type == SF_LOOP_ALTERNATING ? 1 : 32) ; - - psf_binheader_writef (psf, "44", tmp, type) ; - psf_binheader_writef (psf, "44", psf->instrument->loops [tmp].start, psf->instrument->loops [tmp].end - 1) ; - psf_binheader_writef (psf, "44", 0, psf->instrument->loops [tmp].count) ; - } ; - } ; - - /* Write custom headers. */ - for (uk = 0 ; uk < psf->wchunks.used ; uk++) - psf_binheader_writef (psf, "m4b", (int) psf->wchunks.chunks [uk].mark32, psf->wchunks.chunks [uk].len, psf->wchunks.chunks [uk].data, make_size_t (psf->wchunks.chunks [uk].len)) ; - - if (psf->headindex + 16 < psf->dataoffset) - { /* Add PAD data if necessary. */ - k = psf->dataoffset - (psf->headindex + 16) ; - psf_binheader_writef (psf, "m4z", PAD_MARKER, k, make_size_t (k)) ; - } ; - - psf_binheader_writef (psf, "tm8", data_MARKER, psf->datalength) ; - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - if (psf->error) - return psf->error ; - - if (has_data && psf->dataoffset != psf->headindex) - { psf_log_printf (psf, "Oooops : has_data && psf->dataoffset != psf->headindex\n") ; - return psf->error = SFE_INTERNAL ; - } ; - - psf->dataoffset = psf->headindex ; - - if (! has_data) - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - else if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* wav_write_header */ - - -static int -wav_write_tailer (SF_PRIVATE *psf) -{ int k ; - - /* Reset the current header buffer length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - - if (psf->bytewidth > 0 && psf->sf.seekable == SF_TRUE) - { psf->datalength = psf->sf.frames * psf->bytewidth * psf->sf.channels ; - psf->dataend = psf->dataoffset + psf->datalength ; - } ; - - if (psf->dataend > 0) - psf_fseek (psf, psf->dataend, SEEK_SET) ; - else - psf->dataend = psf_fseek (psf, 0, SEEK_END) ; - - /* Add a PEAK chunk if requested. */ - if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_END) - { psf_binheader_writef (psf, "m4", PEAK_MARKER, WAV_PEAK_CHUNK_SIZE (psf->sf.channels)) ; - psf_binheader_writef (psf, "44", 1, time (NULL)) ; - for (k = 0 ; k < psf->sf.channels ; k++) - psf_binheader_writef (psf, "f4", psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ; - } ; - - if (psf->strings.flags & SF_STR_LOCATE_END) - wav_write_strings (psf, SF_STR_LOCATE_END) ; - - /* Write the tailer. */ - if (psf->headindex > 0) - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - return 0 ; -} /* wav_write_tailer */ - -static void -wav_write_strings (SF_PRIVATE *psf, int location) -{ int k, prev_head_index, saved_head_index ; - - if (psf_location_string_count (psf, location) == 0) - return ; - - prev_head_index = psf->headindex + 4 ; - - psf_binheader_writef (psf, "m4m", LIST_MARKER, 0xBADBAD, INFO_MARKER) ; - - for (k = 0 ; k < SF_MAX_STRINGS ; k++) - { if (psf->strings.data [k].type == 0) - break ; - if (psf->strings.data [k].type < 0 || psf->strings.data [k].flags != location) - continue ; - - switch (psf->strings.data [k].type) - { case SF_STR_SOFTWARE : - psf_binheader_writef (psf, "ms", ISFT_MARKER, psf->strings.storage + psf->strings.data [k].offset) ; - break ; - - case SF_STR_TITLE : - psf_binheader_writef (psf, "ms", INAM_MARKER, psf->strings.storage + psf->strings.data [k].offset) ; - break ; - - case SF_STR_COPYRIGHT : - psf_binheader_writef (psf, "ms", ICOP_MARKER, psf->strings.storage + psf->strings.data [k].offset) ; - break ; - - case SF_STR_ARTIST : - psf_binheader_writef (psf, "ms", IART_MARKER, psf->strings.storage + psf->strings.data [k].offset) ; - break ; - - case SF_STR_COMMENT : - psf_binheader_writef (psf, "ms", ICMT_MARKER, psf->strings.storage + psf->strings.data [k].offset) ; - break ; - - case SF_STR_DATE : - psf_binheader_writef (psf, "ms", ICRD_MARKER, psf->strings.storage + psf->strings.data [k].offset) ; - break ; - - case SF_STR_GENRE : - psf_binheader_writef (psf, "ms", IGNR_MARKER, psf->strings.storage + psf->strings.data [k].offset) ; - break ; - - case SF_STR_ALBUM : - psf_binheader_writef (psf, "ms", IPRD_MARKER, psf->strings.storage + psf->strings.data [k].offset) ; - break ; - - case SF_STR_TRACKNUMBER : - psf_binheader_writef (psf, "ms", ITRK_MARKER, psf->strings.storage + psf->strings.data [k].offset) ; - break ; - - default : - break ; - } ; - } ; - - saved_head_index = psf->headindex ; - psf->headindex = prev_head_index ; - psf_binheader_writef (psf, "4", saved_head_index - prev_head_index - 4) ; - psf->headindex = saved_head_index ; - -} /* wav_write_strings */ - -static int -wav_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { wav_write_tailer (psf) ; - - if (psf->file.mode == SFM_RDWR) - { sf_count_t current = psf_ftell (psf) ; - - /* - ** If the mode is RDWR and the current position is less than the - ** filelength, truncate the file. - */ - - if (current < psf->filelength) - { psf_ftruncate (psf, current) ; - psf->filelength = current ; - } ; - } ; - - psf->write_header (psf, SF_TRUE) ; - } ; - - return 0 ; -} /* wav_close */ - -static int -wav_command (SF_PRIVATE *psf, int command, void * UNUSED (data), int datasize) -{ WAV_PRIVATE *wpriv ; - - if ((wpriv = psf->container_data) == NULL) - return SFE_INTERNAL ; - - switch (command) - { case SFC_WAVEX_SET_AMBISONIC : - if ((SF_CONTAINER (psf->sf.format)) == SF_FORMAT_WAVEX) - { if (datasize == SF_AMBISONIC_NONE) - wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ; - else if (datasize == SF_AMBISONIC_B_FORMAT) - wpriv->wavex_ambisonic = SF_AMBISONIC_B_FORMAT ; - else - return 0 ; - } ; - return wpriv->wavex_ambisonic ; - - case SFC_WAVEX_GET_AMBISONIC : - return wpriv->wavex_ambisonic ; - - case SFC_SET_CHANNEL_MAP_INFO : - wpriv->wavex_channelmask = wavex_gen_channel_mask (psf->channel_map, psf->sf.channels) ; - return (wpriv->wavex_channelmask != 0) ; - - default : - break ; - } ; - - return 0 ; -} /* wav_command */ - -static int -wav_subchunk_parse (SF_PRIVATE *psf, int chunk, uint32_t chunk_length) -{ sf_count_t current_pos ; - char buffer [512] ; - uint32_t dword, bytesread ; - - current_pos = psf_fseek (psf, 0, SEEK_CUR) - 4 ; - - bytesread = sizeof (chunk_length) ; - - if (chunk_length <= 8) - { /* This case is for broken files generated by PEAK. */ - psf_log_printf (psf, "%M : %d (weird length)\n", chunk, chunk_length) ; - psf_binheader_readf (psf, "mj", &chunk, chunk_length - 4) ; - psf_log_printf (psf, " %M\n", chunk) ; - return 0 ; - } ; - - if (psf->headindex + chunk_length > SIGNED_SIZEOF (psf->header)) - { psf_log_printf (psf, "%M : %d (too long)\n", chunk, chunk_length) ; - psf_binheader_readf (psf, "j", chunk_length) ; - return 0 ; - } ; - - if (current_pos + chunk_length > psf->filelength) - { psf_log_printf (psf, "%M : %d (should be %d)\n", chunk, chunk_length, (int) (psf->filelength - current_pos)) ; - chunk_length = psf->filelength - current_pos ; - } - else - psf_log_printf (psf, "%M : %d\n", chunk, chunk_length) ; - - while (bytesread < chunk_length) - { bytesread += psf_binheader_readf (psf, "m", &chunk) ; - - switch (chunk) - { case adtl_MARKER : - case INFO_MARKER : - /* These markers don't contain anything, not even a chunk lebgth. */ - psf_log_printf (psf, " %M\n", chunk) ; - continue ; - - case exif_MARKER : - psf_log_printf (psf, " %M\n", chunk) ; - bytesread += exif_subchunk_parse (psf, chunk_length - bytesread) ; - continue ; - - case data_MARKER : - psf_log_printf (psf, " %M inside a LIST block??? Backing out.\n", chunk) ; - /* Jump back four bytes and return to caller. */ - psf_binheader_readf (psf, "j", -4) ; - return 0 ; - - case 0 : - /* - ** Four zero bytes where a marker was expected. Assume this means - ** the rest of the chunk is garbage. - */ - psf_log_printf (psf, " *** Found weird-ass zero marker. Jumping to end of chunk.\n") ; - if (bytesread < chunk_length) - bytesread += psf_binheader_readf (psf, "j", chunk_length - bytesread + 4) ; - psf_log_printf (psf, " *** Offset is now : 0x%X\n", psf_fseek (psf, 0, SEEK_CUR)) ; - return 0 ; - - default : - break ; - } ; - - switch (chunk) - { case ISFT_MARKER : - case ICOP_MARKER : - case IARL_MARKER : - case IART_MARKER : - case ICMT_MARKER : - case ICRD_MARKER : - case IENG_MARKER : - case IGNR_MARKER : - case INAM_MARKER : - case IPRD_MARKER : - case ISBJ_MARKER : - case ISRC_MARKER : - case IAUT_MARKER : - case ITRK_MARKER : - bytesread += psf_binheader_readf (psf, "4", &dword) ; - dword += (dword & 1) ; - if (dword >= SIGNED_SIZEOF (buffer)) - { psf_log_printf (psf, " *** %M : %d (too big)\n", chunk, dword) ; - psf_binheader_readf (psf, "j", dword) ; - break ; - } ; - - bytesread += psf_binheader_readf (psf, "b", buffer, dword) ; - buffer [dword] = 0 ; - psf_log_printf (psf, " %M : %s\n", chunk, buffer) ; - break ; - - case labl_MARKER : - { int mark_id ; - - bytesread += psf_binheader_readf (psf, "44", &dword, &mark_id) ; - dword -= 4 ; - dword += (dword & 1) ; - if (dword < 1 || dword >= SIGNED_SIZEOF (buffer)) - { psf_log_printf (psf, " *** %M : %d (too big)\n", chunk, dword) ; - psf_binheader_readf (psf, "j", dword) ; - break ; - } ; - - bytesread += psf_binheader_readf (psf, "b", buffer, dword) ; - buffer [dword] = 0 ; - psf_log_printf (psf, " %M : %d : %s\n", chunk, mark_id, buffer) ; - } ; - break ; - - - case DISP_MARKER : - case ltxt_MARKER : - case note_MARKER : - bytesread += psf_binheader_readf (psf, "4", &dword) ; - dword += (dword & 1) ; - bytesread += psf_binheader_readf (psf, "j", dword) ; - psf_log_printf (psf, " %M : %d\n", chunk, dword) ; - break ; - - default : - bytesread += psf_binheader_readf (psf, "4", &dword) ; - dword += (dword & 1) ; - psf_log_printf (psf, " *** %M : %d\n", chunk, dword) ; - if (bytesread + dword > chunk_length) - { bytesread += psf_binheader_readf (psf, "j", chunk_length - bytesread + 4) ; - continue ; - } - else - bytesread += psf_binheader_readf (psf, "j", dword) ; - - if (dword >= chunk_length) - return 0 ; - break ; - } ; - - switch (chunk) - { case ISFT_MARKER : - psf_store_string (psf, SF_STR_SOFTWARE, buffer) ; - break ; - case ICOP_MARKER : - psf_store_string (psf, SF_STR_COPYRIGHT, buffer) ; - break ; - case INAM_MARKER : - psf_store_string (psf, SF_STR_TITLE, buffer) ; - break ; - case IART_MARKER : - psf_store_string (psf, SF_STR_ARTIST, buffer) ; - break ; - case ICMT_MARKER : - psf_store_string (psf, SF_STR_COMMENT, buffer) ; - break ; - case ICRD_MARKER : - psf_store_string (psf, SF_STR_DATE, buffer) ; - break ; - case IGNR_MARKER : - psf_store_string (psf, SF_STR_GENRE, buffer) ; - break ; - case IPRD_MARKER : - psf_store_string (psf, SF_STR_ALBUM, buffer) ; - break ; - case ITRK_MARKER : - psf_store_string (psf, SF_STR_TRACKNUMBER, buffer) ; - break ; - } ; - } ; - - current_pos = psf_fseek (psf, 0, SEEK_CUR) - current_pos ; - - if (current_pos - 4 != chunk_length) - psf_log_printf (psf, "**** Bad chunk length %d sbould be %D\n", chunk_length, current_pos - 4) ; - - return 0 ; -} /* wav_subchunk_parse */ - -static int -wav_read_smpl_chunk (SF_PRIVATE *psf, uint32_t chunklen) -{ char buffer [512] ; - uint32_t bytesread = 0, dword, sampler_data, loop_count ; - uint32_t note, start, end, type = -1, count ; - int j, k ; - - chunklen += (chunklen & 1) ; - - bytesread += psf_binheader_readf (psf, "4", &dword) ; - psf_log_printf (psf, " Manufacturer : %X\n", dword) ; - - bytesread += psf_binheader_readf (psf, "4", &dword) ; - psf_log_printf (psf, " Product : %u\n", dword) ; - - bytesread += psf_binheader_readf (psf, "4", &dword) ; - psf_log_printf (psf, " Period : %u nsec\n", dword) ; - - bytesread += psf_binheader_readf (psf, "4", ¬e) ; - psf_log_printf (psf, " Midi Note : %u\n", note) ; - - bytesread += psf_binheader_readf (psf, "4", &dword) ; - if (dword != 0) - { snprintf (buffer, sizeof (buffer), "%f", - (1.0 * 0x80000000) / ((uint32_t) dword)) ; - psf_log_printf (psf, " Pitch Fract. : %s\n", buffer) ; - } - else - psf_log_printf (psf, " Pitch Fract. : 0\n") ; - - bytesread += psf_binheader_readf (psf, "4", &dword) ; - psf_log_printf (psf, " SMPTE Format : %u\n", dword) ; - - bytesread += psf_binheader_readf (psf, "4", &dword) ; - snprintf (buffer, sizeof (buffer), "%02d:%02d:%02d %02d", - (dword >> 24) & 0x7F, (dword >> 16) & 0x7F, (dword >> 8) & 0x7F, dword & 0x7F) ; - psf_log_printf (psf, " SMPTE Offset : %s\n", buffer) ; - - bytesread += psf_binheader_readf (psf, "4", &loop_count) ; - psf_log_printf (psf, " Loop Count : %u\n", loop_count) ; - - /* Sampler Data holds the number of data bytes after the CUE chunks which - ** is not actually CUE data. Display value after CUE data. - */ - bytesread += psf_binheader_readf (psf, "4", &sampler_data) ; - - if ((psf->instrument = psf_instrument_alloc ()) == NULL) - return SFE_MALLOC_FAILED ; - - psf->instrument->loop_count = loop_count ; - - for (j = 0 ; loop_count > 0 && chunklen - bytesread >= 24 ; j ++) - { bytesread += psf_binheader_readf (psf, "4", &dword) ; - psf_log_printf (psf, " Cue ID : %2u", dword) ; - - bytesread += psf_binheader_readf (psf, "4", &type) ; - psf_log_printf (psf, " Type : %2u", type) ; - - bytesread += psf_binheader_readf (psf, "4", &start) ; - psf_log_printf (psf, " Start : %5u", start) ; - - bytesread += psf_binheader_readf (psf, "4", &end) ; - psf_log_printf (psf, " End : %5u", end) ; - - bytesread += psf_binheader_readf (psf, "4", &dword) ; - psf_log_printf (psf, " Fraction : %5u", dword) ; - - bytesread += psf_binheader_readf (psf, "4", &count) ; - psf_log_printf (psf, " Count : %5u\n", count) ; - - if (j < ARRAY_LEN (psf->instrument->loops)) - { psf->instrument->loops [j].start = start ; - psf->instrument->loops [j].end = end + 1 ; - psf->instrument->loops [j].count = count ; - - switch (type) - { case 0 : - psf->instrument->loops [j].mode = SF_LOOP_FORWARD ; - break ; - case 1 : - psf->instrument->loops [j].mode = SF_LOOP_ALTERNATING ; - break ; - case 2 : - psf->instrument->loops [j].mode = SF_LOOP_BACKWARD ; - break ; - default: - psf->instrument->loops [j].mode = SF_LOOP_NONE ; - break ; - } ; - } ; - - loop_count -- ; - } ; - - if (chunklen - bytesread == 0) - { if (sampler_data != 0) - psf_log_printf (psf, " Sampler Data : %u (should be 0)\n", sampler_data) ; - else - psf_log_printf (psf, " Sampler Data : %u\n", sampler_data) ; - } - else - { if (sampler_data != chunklen - bytesread) - { psf_log_printf (psf, " Sampler Data : %u (should have been %u)\n", sampler_data, chunklen - bytesread) ; - sampler_data = chunklen - bytesread ; - } - else - psf_log_printf (psf, " Sampler Data : %u\n", sampler_data) ; - - psf_log_printf (psf, " ") ; - for (k = 0 ; k < (int) sampler_data ; k++) - { char ch ; - - if (k > 0 && (k % 20) == 0) - psf_log_printf (psf, "\n ") ; - - bytesread += psf_binheader_readf (psf, "1", &ch) ; - psf_log_printf (psf, "%02X ", ch & 0xFF) ; - } ; - - psf_log_printf (psf, "\n") ; - } ; - - psf->instrument->basenote = note ; - psf->instrument->gain = 1 ; - psf->instrument->velocity_lo = psf->instrument->key_lo = 0 ; - psf->instrument->velocity_hi = psf->instrument->key_hi = 127 ; - - return 0 ; -} /* wav_read_smpl_chunk */ - -/* -** The acid chunk goes a little something like this: -** -** 4 bytes 'acid' -** 4 bytes (int) length of chunk starting at next byte -** -** 4 bytes (int) type of file: -** this appears to be a bit mask,however some combinations -** are probably impossible and/or qualified as "errors" -** -** 0x01 On: One Shot Off: Loop -** 0x02 On: Root note is Set Off: No root -** 0x04 On: Stretch is On, Off: Strech is OFF -** 0x08 On: Disk Based Off: Ram based -** 0x10 On: ?????????? Off: ????????? (Acidizer puts that ON) -** -** 2 bytes (short) root note -** if type 0x10 is OFF : [C,C#,(...),B] -> [0x30 to 0x3B] -** if type 0x10 is ON : [C,C#,(...),B] -> [0x3C to 0x47] -** (both types fit on same MIDI pitch albeit different octaves, so who cares) -** -** 2 bytes (short) ??? always set to 0x8000 -** 4 bytes (float) ??? seems to be always 0 -** 4 bytes (int) number of beats -** 2 bytes (short) meter denominator //always 4 in SF/ACID -** 2 bytes (short) meter numerator //always 4 in SF/ACID -** //are we sure about the order?? usually its num/denom -** 4 bytes (float) tempo -** -*/ - -static int -wav_read_acid_chunk (SF_PRIVATE *psf, uint32_t chunklen) -{ char buffer [512] ; - uint32_t bytesread = 0 ; - int beats, flags ; - short rootnote, q1, meter_denom, meter_numer ; - float q2, tempo ; - - chunklen += (chunklen & 1) ; - - bytesread += psf_binheader_readf (psf, "422f", &flags, &rootnote, &q1, &q2) ; - - snprintf (buffer, sizeof (buffer), "%f", q2) ; - - psf_log_printf (psf, " Flags : 0x%04x (%s,%s,%s,%s,%s)\n", flags, - (flags & 0x01) ? "OneShot" : "Loop", - (flags & 0x02) ? "RootNoteValid" : "RootNoteInvalid", - (flags & 0x04) ? "StretchOn" : "StretchOff", - (flags & 0x08) ? "DiskBased" : "RAMBased", - (flags & 0x10) ? "??On" : "??Off") ; - - psf_log_printf (psf, " Root note : 0x%x\n ???? : 0x%04x\n ???? : %s\n", - rootnote, q1, buffer) ; - - bytesread += psf_binheader_readf (psf, "422f", &beats, &meter_denom, &meter_numer, &tempo) ; - snprintf (buffer, sizeof (buffer), "%f", tempo) ; - psf_log_printf (psf, " Beats : %d\n Meter : %d/%d\n Tempo : %s\n", - beats, meter_numer, meter_denom, buffer) ; - - psf_binheader_readf (psf, "j", chunklen - bytesread) ; - - if ((psf->loop_info = calloc (1, sizeof (SF_LOOP_INFO))) == NULL) - return SFE_MALLOC_FAILED ; - - psf->loop_info->time_sig_num = meter_numer ; - psf->loop_info->time_sig_den = meter_denom ; - psf->loop_info->loop_mode = (flags & 0x01) ? SF_LOOP_NONE : SF_LOOP_FORWARD ; - psf->loop_info->num_beats = beats ; - psf->loop_info->bpm = tempo ; - psf->loop_info->root_key = (flags & 0x02) ? rootnote : -1 ; - - return 0 ; -} /* wav_read_acid_chunk */ - -int -wav_read_bext_chunk (SF_PRIVATE *psf, uint32_t chunksize) -{ - SF_BROADCAST_INFO_16K * b ; - uint32_t bytes = 0 ; - - if (chunksize < WAV_BEXT_MIN_CHUNK_SIZE) - { psf_log_printf (psf, "bext : %u (should be >= %d)\n", chunksize, WAV_BEXT_MIN_CHUNK_SIZE) ; - psf_binheader_readf (psf, "j", chunksize) ; - return 0 ; - } ; - - if (chunksize > WAV_BEXT_MAX_CHUNK_SIZE) - { psf_log_printf (psf, "bext : %u (should be < %d)\n", chunksize, WAV_BEXT_MAX_CHUNK_SIZE) ; - psf_binheader_readf (psf, "j", chunksize) ; - return 0 ; - } ; - - if (chunksize >= sizeof (SF_BROADCAST_INFO_16K)) - { psf_log_printf (psf, "bext : %u too big to be handled\n", chunksize) ; - psf_binheader_readf (psf, "j", chunksize) ; - return 0 ; - } ; - - psf_log_printf (psf, "bext : %u\n", chunksize) ; - - if ((psf->broadcast_16k = broadcast_var_alloc ()) == NULL) - { psf->error = SFE_MALLOC_FAILED ; - return psf->error ; - } ; - - b = psf->broadcast_16k ; - - bytes += psf_binheader_readf (psf, "b", b->description, sizeof (b->description)) ; - bytes += psf_binheader_readf (psf, "b", b->originator, sizeof (b->originator)) ; - bytes += psf_binheader_readf (psf, "b", b->originator_reference, sizeof (b->originator_reference)) ; - bytes += psf_binheader_readf (psf, "b", b->origination_date, sizeof (b->origination_date)) ; - bytes += psf_binheader_readf (psf, "b", b->origination_time, sizeof (b->origination_time)) ; - bytes += psf_binheader_readf (psf, "442", &b->time_reference_low, &b->time_reference_high, &b->version) ; - bytes += psf_binheader_readf (psf, "bj", &b->umid, sizeof (b->umid), 190) ; - - if (chunksize > WAV_BEXT_MIN_CHUNK_SIZE) - { /* File has coding history data. */ - - b->coding_history_size = chunksize - WAV_BEXT_MIN_CHUNK_SIZE ; - - /* We do not parse the coding history */ - bytes += psf_binheader_readf (psf, "b", b->coding_history, b->coding_history_size) ; - } ; - - if (bytes < chunksize) - psf_binheader_readf (psf, "j", chunksize - bytes) ; - - return 0 ; -} /* wav_read_bext_chunk */ - -int -wav_write_bext_chunk (SF_PRIVATE *psf) -{ SF_BROADCAST_INFO_16K *b ; - - if (psf->broadcast_16k == NULL) - return -1 ; - - b = psf->broadcast_16k ; - - psf_binheader_writef (psf, "m4", bext_MARKER, WAV_BEXT_MIN_CHUNK_SIZE + b->coding_history_size) ; - - /* - ** Note that it is very important the the field widths of the SF_BROADCAST_INFO - ** struct match those for the bext chunk fields. - */ - - psf_binheader_writef (psf, "b", b->description, sizeof (b->description)) ; - psf_binheader_writef (psf, "b", b->originator, sizeof (b->originator)) ; - psf_binheader_writef (psf, "b", b->originator_reference, sizeof (b->originator_reference)) ; - psf_binheader_writef (psf, "b", b->origination_date, sizeof (b->origination_date)) ; - psf_binheader_writef (psf, "b", b->origination_time, sizeof (b->origination_time)) ; - psf_binheader_writef (psf, "442", b->time_reference_low, b->time_reference_high, b->version) ; - psf_binheader_writef (psf, "b", b->umid, sizeof (b->umid)) ; - psf_binheader_writef (psf, "z", make_size_t (190)) ; - - if (b->coding_history_size > 0) - psf_binheader_writef (psf, "b", b->coding_history, make_size_t (b->coding_history_size)) ; - - return 0 ; -} /* wav_write_bext_chunk */ - -int -wav_read_cart_chunk (SF_PRIVATE *psf, uint32_t chunksize) -{ SF_CART_INFO_16K *c ; - uint32_t bytes = 0 ; - int k ; - - if (chunksize < WAV_CART_MIN_CHUNK_SIZE) - { psf_log_printf (psf, "cart : %u (should be >= %d)\n", chunksize, WAV_CART_MIN_CHUNK_SIZE) ; - psf_binheader_readf (psf, "j", chunksize) ; - return 0 ; - } ; - if (chunksize > WAV_CART_MAX_CHUNK_SIZE) - { psf_log_printf (psf, "cart : %u (should be < %d)\n", chunksize, WAV_CART_MAX_CHUNK_SIZE) ; - psf_binheader_readf (psf, "j", chunksize) ; - return 0 ; - } ; - - if (chunksize >= sizeof (SF_CART_INFO_16K)) - { psf_log_printf (psf, "cart : %u too big to be handled\n", chunksize) ; - psf_binheader_readf (psf, "j", chunksize) ; - return 0 ; - } ; - - psf_log_printf (psf, "cart : %u\n", chunksize) ; - - if ((psf->cart_16k = cart_var_alloc ()) == NULL) - { psf->error = SFE_MALLOC_FAILED ; - return psf->error ; - } ; - - c = psf->cart_16k ; - bytes += psf_binheader_readf (psf, "b", c->version, sizeof (c->version)) ; - bytes += psf_binheader_readf (psf, "b", c->title, sizeof (c->title)) ; - bytes += psf_binheader_readf (psf, "b", c->artist, sizeof (c->artist)) ; - bytes += psf_binheader_readf (psf, "b", c->cut_id, sizeof (c->cut_id)) ; - bytes += psf_binheader_readf (psf, "b", c->client_id, sizeof (c->client_id)) ; - bytes += psf_binheader_readf (psf, "b", c->category, sizeof (c->category)) ; - bytes += psf_binheader_readf (psf, "b", c->classification, sizeof (c->classification)) ; - bytes += psf_binheader_readf (psf, "b", c->out_cue, sizeof (c->out_cue)) ; - bytes += psf_binheader_readf (psf, "b", c->start_date, sizeof (c->start_date)) ; - bytes += psf_binheader_readf (psf, "b", c->start_time, sizeof (c->start_time)) ; - bytes += psf_binheader_readf (psf, "b", c->end_date, sizeof (c->end_date)) ; - bytes += psf_binheader_readf (psf, "b", c->end_time, sizeof (c->end_time)) ; - bytes += psf_binheader_readf (psf, "b", c->producer_app_id, sizeof (c->producer_app_id)) ; - bytes += psf_binheader_readf (psf, "b", c->producer_app_version, sizeof (c->producer_app_version)) ; - bytes += psf_binheader_readf (psf, "b", c->user_def, sizeof (c->user_def)) ; - bytes += psf_binheader_readf (psf, "e4", &c->level_reference, sizeof (c->level_reference)) ; - - for (k = 0 ; k < ARRAY_LEN (c->post_timers) ; k++) - bytes += psf_binheader_readf (psf, "b4", &c->post_timers [k].usage, make_size_t (4), &c->post_timers [k].value) ; - - bytes += psf_binheader_readf (psf, "b", c->reserved, sizeof (c->reserved)) ; - bytes += psf_binheader_readf (psf, "b", c->url, sizeof (c->url)) ; - - if (chunksize > WAV_CART_MIN_CHUNK_SIZE) - { /* File has tag text. */ - c->tag_text_size = chunksize - WAV_CART_MIN_CHUNK_SIZE ; - bytes += psf_binheader_readf (psf, "b", c->tag_text, make_size_t (c->tag_text_size)) ; - } ; - - return 0 ; -} /* wav_read_cart_chunk */ - -int -wav_write_cart_chunk (SF_PRIVATE *psf) -{ SF_CART_INFO_16K *c ; - int k ; - - if (psf->cart_16k == NULL) - return -1 ; - - c = psf->cart_16k ; - psf_binheader_writef (psf, "m4", cart_MARKER, WAV_CART_MIN_CHUNK_SIZE + c->tag_text_size) ; - /* - ** Note that it is very important the the field widths of the SF_CART_INFO - ** struct match those for the cart chunk fields. - */ - psf_binheader_writef (psf, "b", c->version, sizeof (c->version)) ; - psf_binheader_writef (psf, "b", c->title, sizeof (c->title)) ; - psf_binheader_writef (psf, "b", c->artist, sizeof (c->artist)) ; - psf_binheader_writef (psf, "b", c->cut_id, sizeof (c->cut_id)) ; - psf_binheader_writef (psf, "b", c->client_id, sizeof (c->client_id)) ; - psf_binheader_writef (psf, "b", c->category, sizeof (c->category)) ; - psf_binheader_writef (psf, "b", c->classification, sizeof (c->classification)) ; - psf_binheader_writef (psf, "b", c->out_cue, sizeof (c->out_cue)) ; - psf_binheader_writef (psf, "b", c->start_date, sizeof (c->start_date)) ; - psf_binheader_writef (psf, "b", c->start_time, sizeof (c->start_time)) ; - psf_binheader_writef (psf, "b", c->end_date, sizeof (c->end_date)) ; - psf_binheader_writef (psf, "b", c->end_time, sizeof (c->end_time)) ; - psf_binheader_writef (psf, "b", c->producer_app_id, sizeof (c->producer_app_id)) ; - psf_binheader_writef (psf, "b", c->producer_app_version, sizeof (c->producer_app_version)) ; - psf_binheader_writef (psf, "b", c->user_def, sizeof (c->user_def)) ; - psf_binheader_writef (psf, "4", c->level_reference, sizeof (c->level_reference)) ; - - for (k = 0 ; k < ARRAY_LEN (c->post_timers) ; k++) - psf_binheader_writef (psf, "b4", c->post_timers [k].usage, make_size_t (4), c->post_timers [k].value) ; - - psf_binheader_writef (psf, "z", sizeof (c->reserved)) ; // just write zeros, we don't have any other use for it - psf_binheader_writef (psf, "b", c->url, sizeof (c->url)) ; - - if (c->tag_text_size > 0) - psf_binheader_writef (psf, "b", c->tag_text, make_size_t (c->tag_text_size)) ; - - return 0 ; -} /* wav_write_cart_chunk */ - -static int -exif_fill_and_sink (SF_PRIVATE *psf, char* buf, size_t bufsz, size_t toread) -{ - size_t bytesread = 0 ; - - buf [0] = 0 ; - bufsz -= 1 ; - if (toread < bufsz) - bufsz = toread ; - bytesread = psf_binheader_readf (psf, "b", buf, bufsz) ; - buf [bufsz] = 0 ; - - if (bytesread == bufsz && toread > bufsz) - bytesread += psf_binheader_readf (psf, "j", toread - bufsz) ; - - return bytesread ; -} /* exif_fill_and_sink */ - -/* -** Exif specification for audio files, at JEITA CP-3451 Exif 2.2 section 5 -** (Exif Audio File Specification) http://www.exif.org/Exif2-2.PDF -*/ -static int -exif_subchunk_parse (SF_PRIVATE *psf, uint32_t length) -{ uint32_t marker, dword, vmajor = -1, vminor = -1, bytesread = 0 ; - char buf [4096] ; - - while (bytesread < length) - { - bytesread += psf_binheader_readf (psf, "m", &marker) ; - - switch (marker) - { - case 0 : /* camera padding? */ - break ; - - case ever_MARKER : - bytesread += psf_binheader_readf (psf, "j4", 4, &dword) ; - vmajor = 10 * (((dword >> 24) & 0xff) - '0') + (((dword >> 16) & 0xff) - '0') ; - vminor = 10 * (((dword >> 8) & 0xff) - '0') + ((dword & 0xff) - '0') ; - psf_log_printf (psf, " EXIF Version : %u.%02u\n", vmajor, vminor) ; - break ; - - case olym_MARKER : - bytesread += psf_binheader_readf (psf, "4", &dword) ; - psf_log_printf (psf, "%M : %u\n", marker, dword) ; - dword += (dword & 1) ; - bytesread += psf_binheader_readf (psf, "j", dword) ; - break ; - - case emnt_MARKER : /* design information: null-terminated string */ - case emdl_MARKER : /* model name ; null-terminated string */ - case ecor_MARKER : /* manufacturer: null-terminated string */ - case etim_MARKER : /* creation time: null-terminated string in the format "hour:minute:second.subsecond" */ - case erel_MARKER : /* relation info: null-terminated string (filename) */ - case eucm_MARKER : /* user comment: 4-byte size follows, then possibly unicode data */ - bytesread += psf_binheader_readf (psf, "4", &dword) ; - bytesread += sizeof (dword) ; - dword += (dword & 1) ; - - if (dword >= sizeof (buf)) - { psf_log_printf (psf, "*** Marker '%M' is too big %u\n\n", marker, dword) ; - return bytesread ; - } ; - - bytesread += exif_fill_and_sink (psf, buf, sizeof (buf), dword) ; - - /* BAD - don't know what's going on here -- maybe a bug in the camera */ - /* field should be NULL-terminated but there's no room for it with the reported number */ - /* example output: emdl : 8 (EX-Z1050) */ - if (marker == emdl_MARKER && dword == strlen (buf) /* should be >= strlen+1*/) - { psf_log_printf (psf, " *** field size too small for string (sinking 2 bytes)\n") ; - bytesread += psf_binheader_readf (psf, "j", 2) ; - } ; - - psf_log_printf (psf, " %M : %d (%s)\n", marker, dword, buf) ; - if (dword > length) - return bytesread ; - break ; - - default : - psf_log_printf (psf, " *** %M (%d): -- ignored --\n", marker, marker) ; - break ; - } ; - } ; - - return bytesread ; -} /* exif_subchunk_parse */ - -/*============================================================================== -*/ - -static int -wav_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) -{ return psf_save_write_chunk (&psf->wchunks, chunk_info) ; -} /* wav_set_chunk */ - -static SF_CHUNK_ITERATOR * -wav_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) -{ return psf_next_chunk_iterator (&psf->rchunks, iterator) ; -} /* wav_next_chunk_iterator */ - -static int -wav_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) -{ int indx ; - - if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0) - return SFE_UNKNOWN_CHUNK ; - - chunk_info->datalen = psf->rchunks.chunks [indx].len ; - - return SFE_NO_ERROR ; -} /* wav_get_chunk_size */ - -static int -wav_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) -{ int indx ; - sf_count_t pos ; - - if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0) - return SFE_UNKNOWN_CHUNK ; - - if (chunk_info->data == NULL) - return SFE_BAD_CHUNK_DATA_PTR ; - - chunk_info->id_size = psf->rchunks.chunks [indx].id_size ; - memcpy (chunk_info->id, psf->rchunks.chunks [indx].id, sizeof (chunk_info->id) / sizeof (*chunk_info->id)) ; - - pos = psf_ftell (psf) ; - psf_fseek (psf, psf->rchunks.chunks [indx].offset, SEEK_SET) ; - psf_fread (chunk_info->data, SF_MIN (chunk_info->datalen, psf->rchunks.chunks [indx].len), 1, psf) ; - psf_fseek (psf, pos, SEEK_SET) ; - - return SFE_NO_ERROR ; -} /* wav_get_chunk_data */ diff --git a/libs/libsndfile/src/wav_w64.c b/libs/libsndfile/src/wav_w64.c deleted file mode 100644 index cf0d3ef2b1..0000000000 --- a/libs/libsndfile/src/wav_w64.c +++ /dev/null @@ -1,678 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** Copyright (C) 2004-2005 David Viens -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" -#include "wav_w64.h" - -/* Known WAVEFORMATEXTENSIBLE GUIDS. */ -static const EXT_SUBFORMAT MSGUID_SUBTYPE_PCM = -{ 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_MS_ADPCM = -{ 0x00000002, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_IEEE_FLOAT = -{ 0x00000003, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_ALAW = -{ 0x00000006, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_MULAW = -{ 0x00000007, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } -} ; - -/* -** the next two are from -** http://dream.cs.bath.ac.uk/researchdev/wave-ex/bformat.html -*/ - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM = -{ 0x00000001, 0x0721, 0x11d3, { 0x86, 0x44, 0xc8, 0xc1, 0xca, 0x00, 0x00, 0x00 } -} ; - -static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT = -{ 0x00000003, 0x0721, 0x11d3, { 0x86, 0x44, 0xc8, 0xc1, 0xca, 0x00, 0x00, 0x00 } -} ; - - -#if 0 -/* maybe interesting one day to read the following through sf_read_raw */ -/* http://www.bath.ac.uk/~masrwd/pvocex/pvocex.html */ -static const EXT_SUBFORMAT MSGUID_SUBTYPE_PVOCEX = -{ 0x8312b9c2, 0x2e6e, 0x11d4, { 0xa8, 0x24, 0xde, 0x5b, 0x96, 0xc3, 0xab, 0x21 } -} ; -#endif - -/* This stores which bit in dwChannelMask maps to which channel */ -static const struct chanmap_s -{ int id ; - const char * name ; -} channel_mask_bits [] = -{ /* WAVEFORMATEXTENSIBLE doesn't distuingish FRONT_LEFT from LEFT */ - { SF_CHANNEL_MAP_LEFT, "L" }, - { SF_CHANNEL_MAP_RIGHT, "R" }, - { SF_CHANNEL_MAP_CENTER, "C" }, - { SF_CHANNEL_MAP_LFE, "LFE" }, - { SF_CHANNEL_MAP_REAR_LEFT, "Ls" }, - { SF_CHANNEL_MAP_REAR_RIGHT, "Rs" }, - { SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER, "Lc" }, - { SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER, "Rc" }, - { SF_CHANNEL_MAP_REAR_CENTER, "Cs" }, - { SF_CHANNEL_MAP_SIDE_LEFT, "Sl" }, - { SF_CHANNEL_MAP_SIDE_RIGHT, "Sr" }, - { SF_CHANNEL_MAP_TOP_CENTER, "Tc" }, - { SF_CHANNEL_MAP_TOP_FRONT_LEFT, "Tfl" }, - { SF_CHANNEL_MAP_TOP_FRONT_CENTER, "Tfc" }, - { SF_CHANNEL_MAP_TOP_FRONT_RIGHT, "Tfr" }, - { SF_CHANNEL_MAP_TOP_REAR_LEFT, "Trl" }, - { SF_CHANNEL_MAP_TOP_REAR_CENTER, "Trc" }, - { SF_CHANNEL_MAP_TOP_REAR_RIGHT, "Trr" }, -} ; - -/*------------------------------------------------------------------------------ - * Private static functions. - */ - -static int -wavex_guid_equal (const EXT_SUBFORMAT * first, const EXT_SUBFORMAT * second) -{ return !memcmp (first, second, sizeof (EXT_SUBFORMAT)) ; -} /* wavex_guid_equal */ - - - -int -wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize) -{ WAV_PRIVATE * wpriv ; - WAV_FMT *wav_fmt ; - int bytesread, k, bytespersec = 0 ; - - if ((wpriv = psf->container_data) == NULL) - return SFE_INTERNAL ; - wav_fmt = &wpriv->wav_fmt ; - - memset (wav_fmt, 0, sizeof (WAV_FMT)) ; - - if (fmtsize < 16) - return SFE_WAV_FMT_SHORT ; - - /* assume psf->rwf_endian is already properly set */ - - /* Read the minimal WAV file header here. */ - bytesread = psf_binheader_readf (psf, "224422", - &(wav_fmt->format), &(wav_fmt->min.channels), - &(wav_fmt->min.samplerate), &(wav_fmt->min.bytespersec), - &(wav_fmt->min.blockalign), &(wav_fmt->min.bitwidth)) ; - - psf_log_printf (psf, " Format : 0x%X => %s\n", wav_fmt->format, wav_w64_format_str (wav_fmt->format)) ; - psf_log_printf (psf, " Channels : %d\n", wav_fmt->min.channels) ; - psf_log_printf (psf, " Sample Rate : %d\n", wav_fmt->min.samplerate) ; - - if (wav_fmt->format == WAVE_FORMAT_PCM && wav_fmt->min.blockalign == 0 - && wav_fmt->min.bitwidth > 0 && wav_fmt->min.channels > 0) - { wav_fmt->min.blockalign = wav_fmt->min.bitwidth / 8 + (wav_fmt->min.bitwidth % 8 > 0 ? 1 : 0) ; - wav_fmt->min.blockalign *= wav_fmt->min.channels ; - psf_log_printf (psf, " Block Align : 0 (should be %d)\n", wav_fmt->min.blockalign) ; - } - else - psf_log_printf (psf, " Block Align : %d\n", wav_fmt->min.blockalign) ; - - if (wav_fmt->format == WAVE_FORMAT_PCM && wav_fmt->min.bitwidth == 24 && - wav_fmt->min.blockalign == 4 * wav_fmt->min.channels) - { psf_log_printf (psf, " Bit Width : 24\n") ; - - psf_log_printf (psf, "\n" - " Ambiguous information in 'fmt ' chunk. Possibile file types:\n" - " 0) Invalid IEEE float file generated by Syntrillium's Cooledit!\n" - " 1) File generated by ALSA's arecord containing 24 bit samples in 32 bit containers.\n" - " 2) 24 bit file with incorrect Block Align value.\n" - "\n") ; - - wpriv->fmt_is_broken = 1 ; - } - else if (wav_fmt->min.bitwidth == 0) - { switch (wav_fmt->format) - { case WAVE_FORMAT_GSM610 : - case WAVE_FORMAT_IPP_ITU_G_723_1 : - psf_log_printf (psf, " Bit Width : %d\n", wav_fmt->min.bitwidth) ; - break ; - default : - psf_log_printf (psf, " Bit Width : %d (should not be 0)\n", wav_fmt->min.bitwidth) ; - } - } - else - { switch (wav_fmt->format) - { case WAVE_FORMAT_GSM610 : - case WAVE_FORMAT_IPP_ITU_G_723_1 : - psf_log_printf (psf, " Bit Width : %d (should be 0)\n", wav_fmt->min.bitwidth) ; - break ; - default : - psf_log_printf (psf, " Bit Width : %d\n", wav_fmt->min.bitwidth) ; - } - } ; - - psf->sf.samplerate = wav_fmt->min.samplerate ; - psf->sf.frames = 0 ; /* Correct this when reading data chunk. */ - psf->sf.channels = wav_fmt->min.channels ; - - switch (wav_fmt->format) - { case WAVE_FORMAT_PCM : - case WAVE_FORMAT_IEEE_FLOAT : - bytespersec = wav_fmt->min.samplerate * wav_fmt->min.blockalign ; - if (wav_fmt->min.bytespersec != (unsigned) bytespersec) - psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ; - else - psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ; - - psf->bytewidth = BITWIDTH2BYTES (wav_fmt->min.bitwidth) ; - break ; - - case WAVE_FORMAT_ALAW : - case WAVE_FORMAT_MULAW : - if (wav_fmt->min.bytespersec / wav_fmt->min.blockalign != wav_fmt->min.samplerate) - psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->min.bytespersec, wav_fmt->min.samplerate * wav_fmt->min.blockalign) ; - else - psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ; - - psf->bytewidth = 1 ; - if (fmtsize >= 18) - { bytesread += psf_binheader_readf (psf, "2", &(wav_fmt->size20.extrabytes)) ; - psf_log_printf (psf, " Extra Bytes : %d\n", wav_fmt->size20.extrabytes) ; - } ; - break ; - - case WAVE_FORMAT_IMA_ADPCM : - if (wav_fmt->min.bitwidth != 4) - return SFE_WAV_ADPCM_NOT4BIT ; - if (wav_fmt->min.channels < 1 || wav_fmt->min.channels > 2) - return SFE_WAV_ADPCM_CHANNELS ; - - bytesread += - psf_binheader_readf (psf, "22", &(wav_fmt->ima.extrabytes), &(wav_fmt->ima.samplesperblock)) ; - - bytespersec = (wav_fmt->ima.samplerate * wav_fmt->ima.blockalign) / wav_fmt->ima.samplesperblock ; - if (wav_fmt->ima.bytespersec != (unsigned) bytespersec) - psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->ima.bytespersec, bytespersec) ; - else - psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->ima.bytespersec) ; - - psf_log_printf (psf, " Extra Bytes : %d\n", wav_fmt->ima.extrabytes) ; - psf_log_printf (psf, " Samples/Block : %d\n", wav_fmt->ima.samplesperblock) ; - break ; - - case WAVE_FORMAT_MS_ADPCM : - if (wav_fmt->msadpcm.bitwidth != 4) - return SFE_WAV_ADPCM_NOT4BIT ; - if (wav_fmt->msadpcm.channels < 1 || wav_fmt->msadpcm.channels > 2) - return SFE_WAV_ADPCM_CHANNELS ; - - bytesread += - psf_binheader_readf (psf, "222", &(wav_fmt->msadpcm.extrabytes), - &(wav_fmt->msadpcm.samplesperblock), &(wav_fmt->msadpcm.numcoeffs)) ; - - bytespersec = (wav_fmt->min.samplerate * wav_fmt->min.blockalign) / wav_fmt->msadpcm.samplesperblock ; - if (wav_fmt->min.bytespersec == (unsigned) bytespersec) - psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ; - else if (wav_fmt->min.bytespersec == (wav_fmt->min.samplerate / wav_fmt->msadpcm.samplesperblock) * wav_fmt->min.blockalign) - psf_log_printf (psf, " Bytes/sec : %d (should be %d (MS BUG!))\n", wav_fmt->min.bytespersec, bytespersec) ; - else - psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ; - - psf_log_printf (psf, " Extra Bytes : %d\n", wav_fmt->msadpcm.extrabytes) ; - psf_log_printf (psf, " Samples/Block : %d\n", wav_fmt->msadpcm.samplesperblock) ; - if (wav_fmt->msadpcm.numcoeffs > ARRAY_LEN (wav_fmt->msadpcm.coeffs)) - { psf_log_printf (psf, " No. of Coeffs : %d (should be <= %d)\n", wav_fmt->msadpcm.numcoeffs, ARRAY_LEN (wav_fmt->msadpcm.coeffs)) ; - wav_fmt->msadpcm.numcoeffs = ARRAY_LEN (wav_fmt->msadpcm.coeffs) ; - } - else - psf_log_printf (psf, " No. of Coeffs : %d\n", wav_fmt->msadpcm.numcoeffs) ; - - psf_log_printf (psf, " Index Coeffs1 Coeffs2\n") ; - for (k = 0 ; k < wav_fmt->msadpcm.numcoeffs ; k++) - { char buffer [128] ; - - bytesread += - psf_binheader_readf (psf, "22", &(wav_fmt->msadpcm.coeffs [k].coeff1), &(wav_fmt->msadpcm.coeffs [k].coeff2)) ; - snprintf (buffer, sizeof (buffer), " %2d %7d %7d\n", k, wav_fmt->msadpcm.coeffs [k].coeff1, wav_fmt->msadpcm.coeffs [k].coeff2) ; - psf_log_printf (psf, buffer) ; - } ; - break ; - - case WAVE_FORMAT_GSM610 : - if (wav_fmt->gsm610.channels != 1 || wav_fmt->gsm610.blockalign != 65) - return SFE_WAV_GSM610_FORMAT ; - - bytesread += - psf_binheader_readf (psf, "22", &(wav_fmt->gsm610.extrabytes), &(wav_fmt->gsm610.samplesperblock)) ; - - if (wav_fmt->gsm610.samplesperblock != 320) - return SFE_WAV_GSM610_FORMAT ; - - bytespersec = (wav_fmt->gsm610.samplerate * wav_fmt->gsm610.blockalign) / wav_fmt->gsm610.samplesperblock ; - if (wav_fmt->gsm610.bytespersec != (unsigned) bytespersec) - psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->gsm610.bytespersec, bytespersec) ; - else - psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->gsm610.bytespersec) ; - - psf_log_printf (psf, " Extra Bytes : %d\n", wav_fmt->gsm610.extrabytes) ; - psf_log_printf (psf, " Samples/Block : %d\n", wav_fmt->gsm610.samplesperblock) ; - break ; - - case WAVE_FORMAT_EXTENSIBLE : - if (wav_fmt->ext.bytespersec / wav_fmt->ext.blockalign != wav_fmt->ext.samplerate) - psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->ext.bytespersec, wav_fmt->ext.samplerate * wav_fmt->ext.blockalign) ; - else - psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->ext.bytespersec) ; - - bytesread += - psf_binheader_readf (psf, "224", &(wav_fmt->ext.extrabytes), &(wav_fmt->ext.validbits), - &(wav_fmt->ext.channelmask)) ; - - psf_log_printf (psf, " Valid Bits : %d\n", wav_fmt->ext.validbits) ; - - if (wav_fmt->ext.channelmask == 0) - psf_log_printf (psf, " Channel Mask : 0x0 (should not be zero)\n") ; - else - { char buffer [512] ; - unsigned bit ; - - wpriv->wavex_channelmask = wav_fmt->ext.channelmask ; - - /* It's probably wise to ignore the channel mask if it is all zero */ - free (psf->channel_map) ; - - if ((psf->channel_map = calloc (psf->sf.channels, sizeof (psf->channel_map [0]))) == NULL) - return SFE_MALLOC_FAILED ; - - /* Terminate the buffer we're going to append_snprintf into. */ - buffer [0] = 0 ; - - for (bit = k = 0 ; bit < ARRAY_LEN (channel_mask_bits) ; bit++) - { - if (wav_fmt->ext.channelmask & (1 << bit)) - { if (k > psf->sf.channels) - { psf_log_printf (psf, "*** More channel map bits than there are channels.\n") ; - break ; - } ; - - psf->channel_map [k++] = channel_mask_bits [bit].id ; - append_snprintf (buffer, sizeof (buffer), "%s, ", channel_mask_bits [bit].name) ; - } ; - } ; - - /* Remove trailing ", ". */ - bit = strlen (buffer) ; - buffer [--bit] = 0 ; - buffer [--bit] = 0 ; - - if (k != psf->sf.channels) - { psf_log_printf (psf, " Channel Mask : 0x%X\n", wav_fmt->ext.channelmask) ; - psf_log_printf (psf, "*** Less channel map bits than there are channels.\n") ; - } - else - psf_log_printf (psf, " Channel Mask : 0x%X (%s)\n", wav_fmt->ext.channelmask, buffer) ; - } ; - - bytesread += psf_binheader_readf (psf, "422", &(wav_fmt->ext.esf.esf_field1), &(wav_fmt->ext.esf.esf_field2), &(wav_fmt->ext.esf.esf_field3)) ; - - /* compare the esf_fields with each known GUID? and print? */ - psf_log_printf (psf, " Subformat\n") ; - psf_log_printf (psf, " esf_field1 : 0x%X\n", wav_fmt->ext.esf.esf_field1) ; - psf_log_printf (psf, " esf_field2 : 0x%X\n", wav_fmt->ext.esf.esf_field2) ; - psf_log_printf (psf, " esf_field3 : 0x%X\n", wav_fmt->ext.esf.esf_field3) ; - psf_log_printf (psf, " esf_field4 : ") ; - for (k = 0 ; k < 8 ; k++) - { bytesread += psf_binheader_readf (psf, "1", &(wav_fmt->ext.esf.esf_field4 [k])) ; - psf_log_printf (psf, "0x%X ", wav_fmt->ext.esf.esf_field4 [k] & 0xFF) ; - } ; - psf_log_printf (psf, "\n") ; - psf->bytewidth = BITWIDTH2BYTES (wav_fmt->ext.bitwidth) ; - - /* Compare GUIDs for known ones. */ - if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_PCM)) - { psf->sf.format = SF_FORMAT_WAVEX | u_bitwidth_to_subformat (psf->bytewidth * 8) ; - psf_log_printf (psf, " format : pcm\n") ; - } - else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_MS_ADPCM)) - { psf->sf.format = (SF_FORMAT_WAVEX | SF_FORMAT_MS_ADPCM) ; - psf_log_printf (psf, " format : ms adpcm\n") ; - } - else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_IEEE_FLOAT)) - { psf->sf.format = SF_FORMAT_WAVEX | ((psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT) ; - psf_log_printf (psf, " format : IEEE float\n") ; - } - else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_ALAW)) - { psf->sf.format = (SF_FORMAT_WAVEX | SF_FORMAT_ALAW) ; - psf_log_printf (psf, " format : A-law\n") ; - } - else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_MULAW)) - { psf->sf.format = (SF_FORMAT_WAVEX | SF_FORMAT_ULAW) ; - psf_log_printf (psf, " format : u-law\n") ; - } - else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM)) - { psf->sf.format = SF_FORMAT_WAVEX | u_bitwidth_to_subformat (psf->bytewidth * 8) ; - psf_log_printf (psf, " format : pcm (Ambisonic B)\n") ; - wpriv->wavex_ambisonic = SF_AMBISONIC_B_FORMAT ; - } - else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT)) - { psf->sf.format = SF_FORMAT_WAVEX | ((psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT) ; - psf_log_printf (psf, " format : IEEE float (Ambisonic B)\n") ; - wpriv->wavex_ambisonic = SF_AMBISONIC_B_FORMAT ; - } - else - return SFE_UNIMPLEMENTED ; - - break ; - - case WAVE_FORMAT_G721_ADPCM : - psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->g72x.bytespersec) ; - if (fmtsize >= 20) - { bytesread += psf_binheader_readf (psf, "22", &(wav_fmt->g72x.extrabytes), &(wav_fmt->g72x.auxblocksize)) ; - if (wav_fmt->g72x.extrabytes == 0) - psf_log_printf (psf, " Extra Bytes : %d (should be 2)\n", wav_fmt->g72x.extrabytes) ; - else - psf_log_printf (psf, " Extra Bytes : %d\n", wav_fmt->g72x.extrabytes) ; - psf_log_printf (psf, " Aux Blk Size : %d\n", wav_fmt->g72x.auxblocksize) ; - } - else if (fmtsize == 18) - { bytesread += psf_binheader_readf (psf, "2", &(wav_fmt->g72x.extrabytes)) ; - psf_log_printf (psf, " Extra Bytes : %d%s\n", wav_fmt->g72x.extrabytes, wav_fmt->g72x.extrabytes != 0 ? " (should be 0)" : "") ; - } - else - psf_log_printf (psf, "*** 'fmt ' chunk should be bigger than this!\n") ; - break ; - - default : - psf_log_printf (psf, "*** No 'fmt ' chunk dumper for this format!\n") ; - return SFE_WAV_BAD_FMT ; - } ; - - if (bytesread > fmtsize) - { psf_log_printf (psf, "*** wav_w64_read_fmt_chunk (bytesread > fmtsize)\n") ; - return SFE_WAV_BAD_FMT ; - } - else - psf_binheader_readf (psf, "j", fmtsize - bytesread) ; - - psf->blockwidth = wav_fmt->min.channels * psf->bytewidth ; - - return 0 ; -} /* wav_w64_read_fmt_chunk */ - -void -wavex_write_guid (SF_PRIVATE *psf, const EXT_SUBFORMAT * subformat) -{ - psf_binheader_writef (psf, "422b", subformat->esf_field1, - subformat->esf_field2, subformat->esf_field3, - subformat->esf_field4, make_size_t (8)) ; -} /* wavex_write_guid */ - - -int -wavex_gen_channel_mask (const int *chan_map, int channels) -{ int chan, mask = 0, bit = -1, last_bit = -1 ; - - if (chan_map == NULL) - return 0 ; - - for (chan = 0 ; chan < channels ; chan ++) - { int k ; - - for (k = bit + 1 ; k < ARRAY_LEN (channel_mask_bits) ; k++) - if (chan_map [chan] == channel_mask_bits [k].id) - { bit = k ; - break ; - } ; - - /* Check for bad sequence. */ - if (bit <= last_bit) - return 0 ; - - mask += 1 << bit ; - last_bit = bit ; - } ; - - return mask ; -} /* wavex_gen_channel_mask */ - -void -wav_w64_analyze (SF_PRIVATE *psf) -{ unsigned char buffer [4096] ; - AUDIO_DETECT ad ; - int format = 0 ; - - if (psf->is_pipe) - { psf_log_printf (psf, "*** Error : Reading from a pipe. Can't analyze data section to figure out real data format.\n\n") ; - return ; - } ; - - psf_log_printf (psf, "---------------------------------------------------\n" - "Format is known to be broken. Using detection code.\n") ; - - /* Code goes here. */ - ad.endianness = SF_ENDIAN_LITTLE ; - ad.channels = psf->sf.channels ; - - psf_fseek (psf, 3 * 4 * 50, SEEK_SET) ; - - while (psf_fread (buffer, 1, sizeof (buffer), psf) == sizeof (buffer)) - { format = audio_detect (psf, &ad, buffer, sizeof (buffer)) ; - if (format != 0) - break ; - } ; - - /* Seek to start of DATA section. */ - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - - if (format == 0) - { psf_log_printf (psf, "wav_w64_analyze : detection failed.\n") ; - return ; - } ; - - switch (format) - { case SF_FORMAT_PCM_32 : - case SF_FORMAT_FLOAT : - psf_log_printf (psf, "wav_w64_analyze : found format : 0x%X\n", format) ; - psf->sf.format = (psf->sf.format & ~SF_FORMAT_SUBMASK) + format ; - psf->bytewidth = 4 ; - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - break ; - - case SF_FORMAT_PCM_24 : - psf_log_printf (psf, "wav_w64_analyze : found format : 0x%X\n", format) ; - psf->sf.format = (psf->sf.format & ~SF_FORMAT_SUBMASK) + format ; - psf->bytewidth = 3 ; - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - break ; - - default : - psf_log_printf (psf, "wav_w64_analyze : unhandled format : 0x%X\n", format) ; - break ; - } ; - - return ; -} /* wav_w64_analyze */ - -/*============================================================================== -*/ - -typedef struct -{ int ID ; - const char *name ; -} WAV_FORMAT_DESC ; - -#define STR(x) #x -#define FORMAT_TYPE(x) { x, STR (x) } - -static WAV_FORMAT_DESC wave_descs [] = -{ FORMAT_TYPE (WAVE_FORMAT_PCM), - FORMAT_TYPE (WAVE_FORMAT_MS_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_IEEE_FLOAT), - FORMAT_TYPE (WAVE_FORMAT_VSELP), - FORMAT_TYPE (WAVE_FORMAT_IBM_CVSD), - FORMAT_TYPE (WAVE_FORMAT_ALAW), - FORMAT_TYPE (WAVE_FORMAT_MULAW), - FORMAT_TYPE (WAVE_FORMAT_OKI_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_IMA_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_MEDIASPACE_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_SIERRA_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_G723_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_DIGISTD), - FORMAT_TYPE (WAVE_FORMAT_DIGIFIX), - FORMAT_TYPE (WAVE_FORMAT_DIALOGIC_OKI_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_MEDIAVISION_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_CU_CODEC), - FORMAT_TYPE (WAVE_FORMAT_YAMAHA_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_SONARC), - FORMAT_TYPE (WAVE_FORMAT_DSPGROUP_TRUESPEECH), - FORMAT_TYPE (WAVE_FORMAT_ECHOSC1), - FORMAT_TYPE (WAVE_FORMAT_AUDIOFILE_AF36), - FORMAT_TYPE (WAVE_FORMAT_APTX), - FORMAT_TYPE (WAVE_FORMAT_AUDIOFILE_AF10), - FORMAT_TYPE (WAVE_FORMAT_PROSODY_1612), - FORMAT_TYPE (WAVE_FORMAT_LRC), - FORMAT_TYPE (WAVE_FORMAT_DOLBY_AC2), - FORMAT_TYPE (WAVE_FORMAT_GSM610), - FORMAT_TYPE (WAVE_FORMAT_MSNAUDIO), - FORMAT_TYPE (WAVE_FORMAT_ANTEX_ADPCME), - FORMAT_TYPE (WAVE_FORMAT_CONTROL_RES_VQLPC), - FORMAT_TYPE (WAVE_FORMAT_DIGIREAL), - FORMAT_TYPE (WAVE_FORMAT_DIGIADPCM), - FORMAT_TYPE (WAVE_FORMAT_CONTROL_RES_CR10), - FORMAT_TYPE (WAVE_FORMAT_NMS_VBXADPCM), - FORMAT_TYPE (WAVE_FORMAT_ROLAND_RDAC), - FORMAT_TYPE (WAVE_FORMAT_ECHOSC3), - FORMAT_TYPE (WAVE_FORMAT_ROCKWELL_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_ROCKWELL_DIGITALK), - FORMAT_TYPE (WAVE_FORMAT_XEBEC), - FORMAT_TYPE (WAVE_FORMAT_G721_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_G728_CELP), - FORMAT_TYPE (WAVE_FORMAT_MSG723), - FORMAT_TYPE (WAVE_FORMAT_MPEG), - FORMAT_TYPE (WAVE_FORMAT_RT24), - FORMAT_TYPE (WAVE_FORMAT_PAC), - FORMAT_TYPE (WAVE_FORMAT_MPEGLAYER3), - FORMAT_TYPE (WAVE_FORMAT_LUCENT_G723), - FORMAT_TYPE (WAVE_FORMAT_CIRRUS), - FORMAT_TYPE (WAVE_FORMAT_ESPCM), - FORMAT_TYPE (WAVE_FORMAT_VOXWARE), - FORMAT_TYPE (WAVE_FORMAT_CANOPUS_ATRAC), - FORMAT_TYPE (WAVE_FORMAT_G726_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_G722_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_DSAT), - FORMAT_TYPE (WAVE_FORMAT_DSAT_DISPLAY), - FORMAT_TYPE (WAVE_FORMAT_VOXWARE_BYTE_ALIGNED), - FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC8), - FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC10), - FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC16), - FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC20), - FORMAT_TYPE (WAVE_FORMAT_VOXWARE_RT24), - FORMAT_TYPE (WAVE_FORMAT_VOXWARE_RT29), - FORMAT_TYPE (WAVE_FORMAT_VOXWARE_RT29HW), - FORMAT_TYPE (WAVE_FORMAT_VOXWARE_VR12), - FORMAT_TYPE (WAVE_FORMAT_VOXWARE_VR18), - FORMAT_TYPE (WAVE_FORMAT_VOXWARE_TQ40), - FORMAT_TYPE (WAVE_FORMAT_SOFTSOUND), - FORMAT_TYPE (WAVE_FORMAT_VOXARE_TQ60), - FORMAT_TYPE (WAVE_FORMAT_MSRT24), - FORMAT_TYPE (WAVE_FORMAT_G729A), - FORMAT_TYPE (WAVE_FORMAT_MVI_MV12), - FORMAT_TYPE (WAVE_FORMAT_DF_G726), - FORMAT_TYPE (WAVE_FORMAT_DF_GSM610), - FORMAT_TYPE (WAVE_FORMAT_ONLIVE), - FORMAT_TYPE (WAVE_FORMAT_SBC24), - FORMAT_TYPE (WAVE_FORMAT_DOLBY_AC3_SPDIF), - FORMAT_TYPE (WAVE_FORMAT_ZYXEL_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_PHILIPS_LPCBB), - FORMAT_TYPE (WAVE_FORMAT_PACKED), - FORMAT_TYPE (WAVE_FORMAT_RHETOREX_ADPCM), - FORMAT_TYPE (IBM_FORMAT_MULAW), - FORMAT_TYPE (IBM_FORMAT_ALAW), - FORMAT_TYPE (IBM_FORMAT_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_VIVO_G723), - FORMAT_TYPE (WAVE_FORMAT_VIVO_SIREN), - FORMAT_TYPE (WAVE_FORMAT_DIGITAL_G723), - FORMAT_TYPE (WAVE_FORMAT_CREATIVE_ADPCM), - FORMAT_TYPE (WAVE_FORMAT_CREATIVE_FASTSPEECH8), - FORMAT_TYPE (WAVE_FORMAT_CREATIVE_FASTSPEECH10), - FORMAT_TYPE (WAVE_FORMAT_QUARTERDECK), - FORMAT_TYPE (WAVE_FORMAT_FM_TOWNS_SND), - FORMAT_TYPE (WAVE_FORMAT_BZV_DIGITAL), - FORMAT_TYPE (WAVE_FORMAT_VME_VMPCM), - FORMAT_TYPE (WAVE_FORMAT_OLIGSM), - FORMAT_TYPE (WAVE_FORMAT_OLIADPCM), - FORMAT_TYPE (WAVE_FORMAT_OLICELP), - FORMAT_TYPE (WAVE_FORMAT_OLISBC), - FORMAT_TYPE (WAVE_FORMAT_OLIOPR), - FORMAT_TYPE (WAVE_FORMAT_LH_CODEC), - FORMAT_TYPE (WAVE_FORMAT_NORRIS), - FORMAT_TYPE (WAVE_FORMAT_SOUNDSPACE_MUSICOMPRESS), - FORMAT_TYPE (WAVE_FORMAT_DVM), - FORMAT_TYPE (WAVE_FORMAT_INTERWAV_VSC112), - FORMAT_TYPE (WAVE_FORMAT_IPP_ITU_G_723_1), - FORMAT_TYPE (WAVE_FORMAT_EXTENSIBLE), -} ; - -char const* -wav_w64_format_str (int k) -{ int lower, upper, mid ; - - lower = -1 ; - upper = sizeof (wave_descs) / sizeof (WAV_FORMAT_DESC) ; - - /* binary search */ - if ((wave_descs [0].ID <= k) && (k <= wave_descs [upper - 1].ID)) - { - while (lower + 1 < upper) - { mid = (upper + lower) / 2 ; - - if (k == wave_descs [mid].ID) - return wave_descs [mid].name ; - if (k < wave_descs [mid].ID) - upper = mid ; - else - lower = mid ; - } ; - } ; - - return "Unknown format" ; -} /* wav_w64_format_str */ - -int -wav_w64_srate2blocksize (int srate_chan_product) -{ if (srate_chan_product < 12000) - return 256 ; - if (srate_chan_product < 23000) - return 512 ; - if (srate_chan_product < 44000) - return 1024 ; - return 2048 ; -} /* srate2blocksize */ diff --git a/libs/libsndfile/src/wav_w64.h b/libs/libsndfile/src/wav_w64.h deleted file mode 100644 index 7e180801a6..0000000000 --- a/libs/libsndfile/src/wav_w64.h +++ /dev/null @@ -1,298 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* This file contains definitions commong to WAV and W64 files. */ - - -#ifndef WAV_W64_H_INCLUDED -#define WAV_W64_H_INCLUDED - -/*------------------------------------------------------------------------------ -** List of known WAV format tags -*/ - -enum -{ - /* keep sorted for wav_w64_format_str() */ - WAVE_FORMAT_UNKNOWN = 0x0000, /* Microsoft Corporation */ - WAVE_FORMAT_PCM = 0x0001, /* Microsoft PCM format */ - WAVE_FORMAT_MS_ADPCM = 0x0002, /* Microsoft ADPCM */ - WAVE_FORMAT_IEEE_FLOAT = 0x0003, /* Micrososft 32 bit float format */ - WAVE_FORMAT_VSELP = 0x0004, /* Compaq Computer Corporation */ - WAVE_FORMAT_IBM_CVSD = 0x0005, /* IBM Corporation */ - WAVE_FORMAT_ALAW = 0x0006, /* Microsoft Corporation */ - WAVE_FORMAT_MULAW = 0x0007, /* Microsoft Corporation */ - WAVE_FORMAT_OKI_ADPCM = 0x0010, /* OKI */ - WAVE_FORMAT_IMA_ADPCM = 0x0011, /* Intel Corporation */ - WAVE_FORMAT_MEDIASPACE_ADPCM = 0x0012, /* Videologic */ - WAVE_FORMAT_SIERRA_ADPCM = 0x0013, /* Sierra Semiconductor Corp */ - WAVE_FORMAT_G723_ADPCM = 0x0014, /* Antex Electronics Corporation */ - WAVE_FORMAT_DIGISTD = 0x0015, /* DSP Solutions, Inc. */ - WAVE_FORMAT_DIGIFIX = 0x0016, /* DSP Solutions, Inc. */ - WAVE_FORMAT_DIALOGIC_OKI_ADPCM = 0x0017, /* Dialogic Corporation */ - WAVE_FORMAT_MEDIAVISION_ADPCM = 0x0018, /* Media Vision, Inc. */ - WAVE_FORMAT_CU_CODEC = 0x0019, /* Hewlett-Packard Company */ - WAVE_FORMAT_YAMAHA_ADPCM = 0x0020, /* Yamaha Corporation of America */ - WAVE_FORMAT_SONARC = 0x0021, /* Speech Compression */ - WAVE_FORMAT_DSPGROUP_TRUESPEECH = 0x0022, /* DSP Group, Inc */ - WAVE_FORMAT_ECHOSC1 = 0x0023, /* Echo Speech Corporation */ - WAVE_FORMAT_AUDIOFILE_AF36 = 0x0024, /* Audiofile, Inc. */ - WAVE_FORMAT_APTX = 0x0025, /* Audio Processing Technology */ - WAVE_FORMAT_AUDIOFILE_AF10 = 0x0026, /* Audiofile, Inc. */ - WAVE_FORMAT_PROSODY_1612 = 0x0027, /* Aculab plc */ - WAVE_FORMAT_LRC = 0x0028, /* Merging Technologies S.A. */ - WAVE_FORMAT_DOLBY_AC2 = 0x0030, /* Dolby Laboratories */ - WAVE_FORMAT_GSM610 = 0x0031, /* Microsoft Corporation */ - WAVE_FORMAT_MSNAUDIO = 0x0032, /* Microsoft Corporation */ - WAVE_FORMAT_ANTEX_ADPCME = 0x0033, /* Antex Electronics Corporation */ - WAVE_FORMAT_CONTROL_RES_VQLPC = 0x0034, /* Control Resources Limited */ - WAVE_FORMAT_DIGIREAL = 0x0035, /* DSP Solutions, Inc. */ - WAVE_FORMAT_DIGIADPCM = 0x0036, /* DSP Solutions, Inc. */ - WAVE_FORMAT_CONTROL_RES_CR10 = 0x0037, /* Control Resources Limited */ - WAVE_FORMAT_NMS_VBXADPCM = 0x0038, /* Natural MicroSystems */ - WAVE_FORMAT_ROLAND_RDAC = 0x0039, /* Roland */ - WAVE_FORMAT_ECHOSC3 = 0x003A, /* Echo Speech Corporation */ - WAVE_FORMAT_ROCKWELL_ADPCM = 0x003B, /* Rockwell International */ - WAVE_FORMAT_ROCKWELL_DIGITALK = 0x003C, /* Rockwell International */ - WAVE_FORMAT_XEBEC = 0x003D, /* Xebec Multimedia Solutions Limited */ - WAVE_FORMAT_G721_ADPCM = 0x0040, /* Antex Electronics Corporation */ - WAVE_FORMAT_G728_CELP = 0x0041, /* Antex Electronics Corporation */ - WAVE_FORMAT_MSG723 = 0x0042, /* Microsoft Corporation */ - WAVE_FORMAT_MPEG = 0x0050, /* Microsoft Corporation */ - WAVE_FORMAT_RT24 = 0x0052, /* InSoft Inc. */ - WAVE_FORMAT_PAC = 0x0053, /* InSoft Inc. */ - WAVE_FORMAT_MPEGLAYER3 = 0x0055, /* MPEG 3 Layer 1 */ - WAVE_FORMAT_LUCENT_G723 = 0x0059, /* Lucent Technologies */ - WAVE_FORMAT_CIRRUS = 0x0060, /* Cirrus Logic */ - WAVE_FORMAT_ESPCM = 0x0061, /* ESS Technology */ - WAVE_FORMAT_VOXWARE = 0x0062, /* Voxware Inc */ - WAVE_FORMAT_CANOPUS_ATRAC = 0x0063, /* Canopus, Co., Ltd. */ - WAVE_FORMAT_G726_ADPCM = 0x0064, /* APICOM */ - WAVE_FORMAT_G722_ADPCM = 0x0065, /* APICOM */ - WAVE_FORMAT_DSAT = 0x0066, /* Microsoft Corporation */ - WAVE_FORMAT_DSAT_DISPLAY = 0x0067, /* Microsoft Corporation */ - WAVE_FORMAT_VOXWARE_BYTE_ALIGNED = 0x0069, /* Voxware Inc. */ - WAVE_FORMAT_VOXWARE_AC8 = 0x0070, /* Voxware Inc. */ - WAVE_FORMAT_VOXWARE_AC10 = 0x0071, /* Voxware Inc. */ - WAVE_FORMAT_VOXWARE_AC16 = 0x0072, /* Voxware Inc. */ - WAVE_FORMAT_VOXWARE_AC20 = 0x0073, /* Voxware Inc. */ - WAVE_FORMAT_VOXWARE_RT24 = 0x0074, /* Voxware Inc. */ - WAVE_FORMAT_VOXWARE_RT29 = 0x0075, /* Voxware Inc. */ - WAVE_FORMAT_VOXWARE_RT29HW = 0x0076, /* Voxware Inc. */ - WAVE_FORMAT_VOXWARE_VR12 = 0x0077, /* Voxware Inc. */ - WAVE_FORMAT_VOXWARE_VR18 = 0x0078, /* Voxware Inc. */ - WAVE_FORMAT_VOXWARE_TQ40 = 0x0079, /* Voxware Inc. */ - WAVE_FORMAT_SOFTSOUND = 0x0080, /* Softsound, Ltd. */ - WAVE_FORMAT_VOXARE_TQ60 = 0x0081, /* Voxware Inc. */ - WAVE_FORMAT_MSRT24 = 0x0082, /* Microsoft Corporation */ - WAVE_FORMAT_G729A = 0x0083, /* AT&T Laboratories */ - WAVE_FORMAT_MVI_MV12 = 0x0084, /* Motion Pixels */ - WAVE_FORMAT_DF_G726 = 0x0085, /* DataFusion Systems (Pty) (Ltd) */ - WAVE_FORMAT_DF_GSM610 = 0x0086, /* DataFusion Systems (Pty) (Ltd) */ - /* removed because duplicate */ - /* WAVE_FORMAT_ISIAUDIO = 0x0088, */ /* Iterated Systems, Inc. */ - WAVE_FORMAT_ONLIVE = 0x0089, /* OnLive! Technologies, Inc. */ - WAVE_FORMAT_SBC24 = 0x0091, /* Siemens Business Communications Systems */ - WAVE_FORMAT_DOLBY_AC3_SPDIF = 0x0092, /* Sonic Foundry */ - WAVE_FORMAT_ZYXEL_ADPCM = 0x0097, /* ZyXEL Communications, Inc. */ - WAVE_FORMAT_PHILIPS_LPCBB = 0x0098, /* Philips Speech Processing */ - WAVE_FORMAT_PACKED = 0x0099, /* Studer Professional Audio AG */ - WAVE_FORMAT_RHETOREX_ADPCM = 0x0100, /* Rhetorex, Inc. */ - - /* removed because of the following */ - /* WAVE_FORMAT_IRAT = 0x0101,*/ /* BeCubed Software Inc. */ - - /* these three are unofficial */ - IBM_FORMAT_MULAW = 0x0101, /* IBM mu-law format */ - IBM_FORMAT_ALAW = 0x0102, /* IBM a-law format */ - IBM_FORMAT_ADPCM = 0x0103, /* IBM AVC Adaptive Differential PCM format */ - - WAVE_FORMAT_VIVO_G723 = 0x0111, /* Vivo Software */ - WAVE_FORMAT_VIVO_SIREN = 0x0112, /* Vivo Software */ - WAVE_FORMAT_DIGITAL_G723 = 0x0123, /* Digital Equipment Corporation */ - WAVE_FORMAT_CREATIVE_ADPCM = 0x0200, /* Creative Labs, Inc */ - WAVE_FORMAT_CREATIVE_FASTSPEECH8 = 0x0202, /* Creative Labs, Inc */ - WAVE_FORMAT_CREATIVE_FASTSPEECH10 = 0x0203, /* Creative Labs, Inc */ - WAVE_FORMAT_QUARTERDECK = 0x0220, /* Quarterdeck Corporation */ - WAVE_FORMAT_FM_TOWNS_SND = 0x0300, /* Fujitsu Corporation */ - WAVE_FORMAT_BZV_DIGITAL = 0x0400, /* Brooktree Corporation */ - WAVE_FORMAT_VME_VMPCM = 0x0680, /* AT&T Labs, Inc. */ - WAVE_FORMAT_OLIGSM = 0x1000, /* Ing C. Olivetti & C., S.p.A. */ - WAVE_FORMAT_OLIADPCM = 0x1001, /* Ing C. Olivetti & C., S.p.A. */ - WAVE_FORMAT_OLICELP = 0x1002, /* Ing C. Olivetti & C., S.p.A. */ - WAVE_FORMAT_OLISBC = 0x1003, /* Ing C. Olivetti & C., S.p.A. */ - WAVE_FORMAT_OLIOPR = 0x1004, /* Ing C. Olivetti & C., S.p.A. */ - WAVE_FORMAT_LH_CODEC = 0x1100, /* Lernout & Hauspie */ - WAVE_FORMAT_NORRIS = 0x1400, /* Norris Communications, Inc. */ - /* removed because duplicate */ - /* WAVE_FORMAT_ISIAUDIO = 0x1401, */ /* AT&T Labs, Inc. */ - WAVE_FORMAT_SOUNDSPACE_MUSICOMPRESS = 0x1500, /* AT&T Labs, Inc. */ - WAVE_FORMAT_DVM = 0x2000, /* FAST Multimedia AG */ - WAVE_FORMAT_INTERWAV_VSC112 = 0x7150, /* ????? */ - - WAVE_FORMAT_IPP_ITU_G_723_1 = 0x7230, /* Intel Performance Primitives g723 codec. */ - - WAVE_FORMAT_EXTENSIBLE = 0xFFFE -} ; - -typedef struct -{ unsigned short format ; - unsigned short channels ; - unsigned int samplerate ; - unsigned int bytespersec ; - unsigned short blockalign ; - unsigned short bitwidth ; -} MIN_WAV_FMT ; - -typedef struct -{ unsigned short format ; - unsigned short channels ; - unsigned int samplerate ; - unsigned int bytespersec ; - unsigned short blockalign ; - unsigned short bitwidth ; - unsigned short extrabytes ; - unsigned short dummy ; -} WAV_FMT_SIZE20 ; - -typedef struct -{ unsigned short format ; - unsigned short channels ; - unsigned int samplerate ; - unsigned int bytespersec ; - unsigned short blockalign ; - unsigned short bitwidth ; - unsigned short extrabytes ; - unsigned short samplesperblock ; - unsigned short numcoeffs ; - struct - { short coeff1 ; - short coeff2 ; - } coeffs [7] ; -} MS_ADPCM_WAV_FMT ; - -typedef struct -{ unsigned short format ; - unsigned short channels ; - unsigned int samplerate ; - unsigned int bytespersec ; - unsigned short blockalign ; - unsigned short bitwidth ; - unsigned short extrabytes ; - unsigned short samplesperblock ; -} IMA_ADPCM_WAV_FMT ; - -typedef struct -{ unsigned short format ; - unsigned short channels ; - unsigned int samplerate ; - unsigned int bytespersec ; - unsigned short blockalign ; - unsigned short bitwidth ; - unsigned short extrabytes ; - unsigned short auxblocksize ; -} G72x_ADPCM_WAV_FMT ; - - -typedef struct -{ unsigned short format ; - unsigned short channels ; - unsigned int samplerate ; - unsigned int bytespersec ; - unsigned short blockalign ; - unsigned short bitwidth ; - unsigned short extrabytes ; - unsigned short samplesperblock ; -} GSM610_WAV_FMT ; - -typedef struct -{ unsigned int esf_field1 ; - unsigned short esf_field2 ; - unsigned short esf_field3 ; - char esf_field4 [8] ; -} EXT_SUBFORMAT ; - -typedef struct -{ unsigned short format ; - unsigned short channels ; - unsigned int samplerate ; - unsigned int bytespersec ; - unsigned short blockalign ; - unsigned short bitwidth ; - unsigned short extrabytes ; - unsigned short validbits ; - unsigned int channelmask ; - EXT_SUBFORMAT esf ; -} EXTENSIBLE_WAV_FMT ; - -typedef union -{ unsigned short format ; - MIN_WAV_FMT min ; - IMA_ADPCM_WAV_FMT ima ; - MS_ADPCM_WAV_FMT msadpcm ; - G72x_ADPCM_WAV_FMT g72x ; - EXTENSIBLE_WAV_FMT ext ; - GSM610_WAV_FMT gsm610 ; - WAV_FMT_SIZE20 size20 ; - char padding [512] ; -} WAV_FMT ; - -typedef struct -{ int frames ; -} FACT_CHUNK ; - -typedef struct -{ /* For ambisonic commands */ - int wavex_ambisonic ; - unsigned wavex_channelmask ; - - /* Set to true when 'fmt ' chunk is ambiguous.*/ - int fmt_is_broken ; - WAV_FMT wav_fmt ; -} WAV_PRIVATE ; - -#define WAV_W64_GSM610_BLOCKSIZE 65 -#define WAV_W64_GSM610_SAMPLES 320 - -/*------------------------------------------------------------------------------------ -** Functions defined in wav_ms_adpcm.c -*/ - -#define MSADPCM_ADAPT_COEFF_COUNT 7 - -void msadpcm_write_adapt_coeffs (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------------ -** Functions defined in wav_w64.c -*/ - -int wav_w64_srate2blocksize (int srate_chan_product) ; -char const* wav_w64_format_str (int k) ; -int wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize) ; -void wavex_write_guid (SF_PRIVATE *psf, const EXT_SUBFORMAT * subformat) ; -void wav_w64_analyze (SF_PRIVATE *psf) ; -int wavex_gen_channel_mask (const int *chan_map, int channels) ; - -int wav_read_bext_chunk (SF_PRIVATE *psf, unsigned int chunksize) ; -int wav_write_bext_chunk (SF_PRIVATE *psf) ; - -int wav_read_cart_chunk (SF_PRIVATE *psf, unsigned int chunksize) ; -int wav_write_cart_chunk (SF_PRIVATE *psf) ; - -#endif - diff --git a/libs/libsndfile/src/windows.c b/libs/libsndfile/src/windows.c deleted file mode 100644 index 387afddafe..0000000000 --- a/libs/libsndfile/src/windows.c +++ /dev/null @@ -1,93 +0,0 @@ -/* -** Copyright (C) 2009-2011 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* -** This needs to be a separate file so that we don't have to include -** elsewhere (too many symbol clashes). -*/ - - -#include "sfconfig.h" - -#if OS_IS_WIN32 -#include - -#define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 -#include "sndfile.h" -#include "common.h" - -extern int sf_errno ; - -static void copy_filename (SF_PRIVATE * psf, LPCWSTR wpath) ; - -SNDFILE* -sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) -{ SF_PRIVATE *psf ; - char utf8name [512] ; - - if ((psf = calloc (1, sizeof (SF_PRIVATE))) == NULL) - { sf_errno = SFE_MALLOC_FAILED ; - return NULL ; - } ; - - memset (psf, 0, sizeof (SF_PRIVATE)) ; - psf_init_files (psf) ; - - if (WideCharToMultiByte (CP_UTF8, 0, wpath, -1, utf8name, sizeof (utf8name), NULL, NULL) == 0) - psf->file.path.wc [0] = 0 ; - - psf_log_printf (psf, "File : '%s' (utf-8 converted from ucs-2)\n", utf8name) ; - - copy_filename (psf, wpath) ; - psf->file.use_wchar = SF_TRUE ; - psf->file.mode = mode ; - - psf->error = psf_fopen (psf) ; - - return psf_open_file (psf, sfinfo) ; -} /* sf_wchar_open */ - - -static void -copy_filename (SF_PRIVATE *psf, LPCWSTR wpath) -{ const wchar_t *cwcptr ; - wchar_t *wcptr ; - - wcsncpy (psf->file.path.wc, wpath, ARRAY_LEN (psf->file.path.wc)) ; - psf->file.path.wc [ARRAY_LEN (psf->file.path.wc) - 1] = 0 ; - if ((cwcptr = wcsrchr (wpath, '/')) || (cwcptr = wcsrchr (wpath, '\\'))) - cwcptr ++ ; - else - cwcptr = wpath ; - - wcsncpy (psf->file.name.wc, cwcptr, ARRAY_LEN (psf->file.name.wc)) ; - psf->file.name.wc [ARRAY_LEN (psf->file.name.wc) - 1] = 0 ; - - /* Now grab the directory. */ - wcsncpy (psf->file.dir.wc, wpath, ARRAY_LEN (psf->file.dir.wc)) ; - psf->file.dir.wc [ARRAY_LEN (psf->file.dir.wc) - 1] = 0 ; - - if ((wcptr = wcsrchr (psf->file.dir.wc, '/')) || (wcptr = wcsrchr (psf->file.dir.wc, '\\'))) - wcptr [1] = 0 ; - else - psf->file.dir.wc [0] = 0 ; - - return ; -} /* copy_filename */ - -#endif diff --git a/libs/libsndfile/src/wve.c b/libs/libsndfile/src/wve.c deleted file mode 100644 index c13e7ab9b7..0000000000 --- a/libs/libsndfile/src/wve.c +++ /dev/null @@ -1,209 +0,0 @@ -/* -** Copyright (C) 2002-2011 Erik de Castro Lopo -** Copyright (C) 2007 Reuben Thomas -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -/*------------------------------------------------------------------------------ -** Macros to handle big/little endian issues, and other magic numbers. -*/ - -#define ALAW_MARKER MAKE_MARKER ('A', 'L', 'a', 'w') -#define SOUN_MARKER MAKE_MARKER ('S', 'o', 'u', 'n') -#define DFIL_MARKER MAKE_MARKER ('d', 'F', 'i', 'l') -#define ESSN_MARKER MAKE_MARKER ('e', '*', '*', '\0') -#define PSION_VERSION ((unsigned short) 3856) -#define PSION_DATAOFFSET 0x20 - -/*------------------------------------------------------------------------------ -** Private static functions. -*/ - -static int wve_read_header (SF_PRIVATE *psf) ; -static int wve_write_header (SF_PRIVATE *psf, int calc_length) ; -static int wve_close (SF_PRIVATE *psf) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -wve_open (SF_PRIVATE *psf) -{ int error = 0 ; - - if (psf->is_pipe) - return SFE_WVE_NO_PIPE ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = wve_read_header (psf))) - return error ; - } ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_WVE) - return SFE_BAD_OPEN_FORMAT ; - - psf->endian = SF_ENDIAN_BIG ; - - if ((error = wve_write_header (psf, SF_FALSE))) - return error ; - - psf->write_header = wve_write_header ; - } ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - psf->container_close = wve_close ; - - error = alaw_init (psf) ; - - return error ; -} /* wve_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -wve_read_header (SF_PRIVATE *psf) -{ int marker ; - unsigned short version, padding, repeats, trash ; - unsigned datalength ; - - /* Set position to start of file to begin reading header. */ - psf_binheader_readf (psf, "pm", 0, &marker) ; - if (marker != ALAW_MARKER) - { psf_log_printf (psf, "Could not find '%M'\n", ALAW_MARKER) ; - return SFE_WVE_NOT_WVE ; - } ; - - psf_binheader_readf (psf, "m", &marker) ; - if (marker != SOUN_MARKER) - { psf_log_printf (psf, "Could not find '%M'\n", SOUN_MARKER) ; - return SFE_WVE_NOT_WVE ; - } ; - - psf_binheader_readf (psf, "m", &marker) ; - if (marker != DFIL_MARKER) - { psf_log_printf (psf, "Could not find '%M'\n", DFIL_MARKER) ; - return SFE_WVE_NOT_WVE ; - } ; - - psf_binheader_readf (psf, "m", &marker) ; - if (marker != ESSN_MARKER) - { psf_log_printf (psf, "Could not find '%M'\n", ESSN_MARKER) ; - return SFE_WVE_NOT_WVE ; - } ; - - psf_binheader_readf (psf, "E2", &version) ; - - psf_log_printf (psf, "Psion Palmtop Alaw (.wve)\n" - " Sample Rate : 8000\n" - " Channels : 1\n" - " Encoding : A-law\n") ; - - if (version != PSION_VERSION) - psf_log_printf (psf, "Psion version %d should be %d\n", version, PSION_VERSION) ; - - psf_binheader_readf (psf, "E4", &datalength) ; - psf->dataoffset = PSION_DATAOFFSET ; - if (datalength != psf->filelength - psf->dataoffset) - { psf->datalength = psf->filelength - psf->dataoffset ; - psf_log_printf (psf, "Data length %d should be %D\n", datalength, psf->datalength) ; - } - else - psf->datalength = datalength ; - - psf_binheader_readf (psf, "E22222", &padding, &repeats, &trash, &trash, &trash) ; - - psf->sf.format = SF_FORMAT_WVE | SF_FORMAT_ALAW ; - psf->sf.samplerate = 8000 ; - psf->sf.frames = psf->datalength ; - psf->sf.channels = 1 ; - - return SFE_NO_ERROR ; -} /* wve_read_header */ - -/*------------------------------------------------------------------------------ -*/ - -static int -wve_write_header (SF_PRIVATE *psf, int calc_length) -{ sf_count_t current ; - unsigned datalen ; - - current = psf_ftell (psf) ; - - if (calc_length) - { psf->filelength = psf_get_filelen (psf) ; - - psf->datalength = psf->filelength - psf->dataoffset ; - if (psf->dataend) - psf->datalength -= psf->filelength - psf->dataend ; - - psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; - } ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - psf_fseek (psf, 0, SEEK_SET) ; - - /* Write header. */ - datalen = psf->datalength ; - psf_binheader_writef (psf, "Emmmm", ALAW_MARKER, SOUN_MARKER, DFIL_MARKER, ESSN_MARKER) ; - psf_binheader_writef (psf, "E2422222", PSION_VERSION, datalen, 0, 0, 0, 0, 0) ; - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->sf.channels != 1) - return SFE_CHANNEL_COUNT ; - - if (psf->error) - return psf->error ; - - psf->dataoffset = psf->headindex ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* wve_write_header */ - -/*------------------------------------------------------------------------------ -*/ - -static int -wve_close (SF_PRIVATE *psf) -{ - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { /* Now we know for certain the length of the file we can re-write - ** the header. - */ - wve_write_header (psf, SF_TRUE) ; - } ; - - return 0 ; -} /* wve_close */ diff --git a/libs/libsndfile/src/xi.c b/libs/libsndfile/src/xi.c deleted file mode 100644 index fc442d1c3a..0000000000 --- a/libs/libsndfile/src/xi.c +++ /dev/null @@ -1,1230 +0,0 @@ -/* -** Copyright (C) 2003-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#include - -#include "sndfile.h" -#include "sfendian.h" -#include "common.h" - -#define MAX_XI_SAMPLES 16 - -/*------------------------------------------------------------------------------ -** Private static functions and tyepdefs. -*/ - -typedef struct -{ /* Warning, this filename is NOT nul terminated. */ - char filename [22] ; - char software [20] ; - char sample_name [22] ; - - int loop_begin, loop_end ; - int sample_flags ; - - /* Data for encoder and decoder. */ - short last_16 ; -} XI_PRIVATE ; - -static int xi_close (SF_PRIVATE *psf) ; -static int xi_write_header (SF_PRIVATE *psf, int calc_length) ; -static int xi_read_header (SF_PRIVATE *psf) ; -static int dpcm_init (SF_PRIVATE *psf) ; - - -static sf_count_t dpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; - -/*------------------------------------------------------------------------------ -** Public function. -*/ - -int -xi_open (SF_PRIVATE *psf) -{ XI_PRIVATE *pxi ; - int subformat, error = 0 ; - - if (psf->is_pipe) - return SFE_XI_NO_PIPE ; - - if (psf->codec_data) - pxi = psf->codec_data ; - else if ((pxi = calloc (1, sizeof (XI_PRIVATE))) == NULL) - return SFE_MALLOC_FAILED ; - - psf->codec_data = pxi ; - - if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) - { if ((error = xi_read_header (psf))) - return error ; - } ; - - subformat = SF_CODEC (psf->sf.format) ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_XI) - return SFE_BAD_OPEN_FORMAT ; - - psf->endian = SF_ENDIAN_LITTLE ; - psf->sf.channels = 1 ; /* Always mono */ - psf->sf.samplerate = 44100 ; /* Always */ - - /* Set up default instrument and software name. */ - memcpy (pxi->filename, "Default Name ", sizeof (pxi->filename)) ; - memcpy (pxi->software, PACKAGE "-" VERSION " ", sizeof (pxi->software)) ; - - memset (pxi->sample_name, 0, sizeof (pxi->sample_name)) ; - snprintf (pxi->sample_name, sizeof (pxi->sample_name), "%s", "Sample #1") ; - - pxi->sample_flags = (subformat == SF_FORMAT_DPCM_16) ? 16 : 0 ; - - if (xi_write_header (psf, SF_FALSE)) - return psf->error ; - - psf->write_header = xi_write_header ; - } ; - - psf->container_close = xi_close ; - psf->seek = dpcm_seek ; - - psf->sf.seekable = SF_FALSE ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - switch (subformat) - { case SF_FORMAT_DPCM_8 : /* 8-bit differential PCM. */ - case SF_FORMAT_DPCM_16 : /* 16-bit differential PCM. */ - error = dpcm_init (psf) ; - break ; - - default : break ; - } ; - - return error ; -} /* xi_open */ - -/*------------------------------------------------------------------------------ -*/ - -static int -xi_close (SF_PRIVATE * UNUSED (psf)) -{ - return 0 ; -} /* xi_close */ - -/*============================================================================== -*/ - -static sf_count_t dpcm_read_dsc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t dpcm_read_dsc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t dpcm_write_s2dsc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t dpcm_write_i2dsc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static sf_count_t dpcm_read_dles2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; -static sf_count_t dpcm_read_dles2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; -static sf_count_t dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; -static sf_count_t dpcm_read_dles2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; - -static sf_count_t dpcm_write_s2dles (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; -static sf_count_t dpcm_write_i2dles (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; -static sf_count_t dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; -static sf_count_t dpcm_write_d2dles (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; - -static int -dpcm_init (SF_PRIVATE *psf) -{ if (psf->bytewidth == 0 || psf->sf.channels == 0) - return SFE_INTERNAL ; - - psf->blockwidth = psf->bytewidth * psf->sf.channels ; - - if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) - { switch (psf->bytewidth) - { case 1 : - psf->read_short = dpcm_read_dsc2s ; - psf->read_int = dpcm_read_dsc2i ; - psf->read_float = dpcm_read_dsc2f ; - psf->read_double = dpcm_read_dsc2d ; - break ; - case 2 : - psf->read_short = dpcm_read_dles2s ; - psf->read_int = dpcm_read_dles2i ; - psf->read_float = dpcm_read_dles2f ; - psf->read_double = dpcm_read_dles2d ; - break ; - default : - psf_log_printf (psf, "dpcm_init() returning SFE_UNIMPLEMENTED\n") ; - return SFE_UNIMPLEMENTED ; - } ; - } ; - - if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) - { switch (psf->bytewidth) - { case 1 : - psf->write_short = dpcm_write_s2dsc ; - psf->write_int = dpcm_write_i2dsc ; - psf->write_float = dpcm_write_f2dsc ; - psf->write_double = dpcm_write_d2dsc ; - break ; - case 2 : - psf->write_short = dpcm_write_s2dles ; - psf->write_int = dpcm_write_i2dles ; - psf->write_float = dpcm_write_f2dles ; - psf->write_double = dpcm_write_d2dles ; - break ; - default : - psf_log_printf (psf, "dpcm_init() returning SFE_UNIMPLEMENTED\n") ; - return SFE_UNIMPLEMENTED ; - } ; - } ; - - psf->filelength = psf_get_filelen (psf) ; - psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : - psf->filelength - psf->dataoffset ; - psf->sf.frames = psf->datalength / psf->blockwidth ; - - return 0 ; -} /* dpcm_init */ - -/*============================================================================== -*/ - -static sf_count_t -dpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int total, bufferlen, len ; - - if ((pxi = psf->codec_data) == NULL) - return SFE_INTERNAL ; - - if (psf->datalength < 0 || psf->dataoffset < 0) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - if (offset == 0) - { psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - pxi->last_16 = 0 ; - return 0 ; - } ; - - if (offset < 0 || offset > psf->sf.frames) - { psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - if (mode != SFM_READ) - { /* What to do about write??? */ - psf->error = SFE_BAD_SEEK ; - return PSF_SEEK_ERROR ; - } ; - - psf_fseek (psf, psf->dataoffset, SEEK_SET) ; - - if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_DPCM_16) - { total = offset ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (total > 0) - { len = (total > bufferlen) ? bufferlen : total ; - total -= dpcm_read_dles2s (psf, ubuf.sbuf, len) ; - } ; - } - else - { total = offset ; - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - while (total > 0) - { len = (total > bufferlen) ? bufferlen : total ; - total -= dpcm_read_dsc2s (psf, ubuf.sbuf, len) ; - } ; - } ; - - return offset ; -} /* dpcm_seek */ - - -static int -xi_write_header (SF_PRIVATE *psf, int UNUSED (calc_length)) -{ XI_PRIVATE *pxi ; - sf_count_t current ; - const char *string ; - - if ((pxi = psf->codec_data) == NULL) - return SFE_INTERNAL ; - - current = psf_ftell (psf) ; - - /* Reset the current header length to zero. */ - psf->header [0] = 0 ; - psf->headindex = 0 ; - psf_fseek (psf, 0, SEEK_SET) ; - - string = "Extended Instrument: " ; - psf_binheader_writef (psf, "b", string, strlen (string)) ; - psf_binheader_writef (psf, "b1", pxi->filename, sizeof (pxi->filename), 0x1A) ; - - /* Write software version and two byte XI version. */ - psf_binheader_writef (psf, "eb2", pxi->software, sizeof (pxi->software), (1 << 8) + 2) ; - - /* - ** Jump note numbers (96), volume envelope (48), pan envelope (48), - ** volume points (1), pan points (1) - */ - psf_binheader_writef (psf, "z", (size_t) (96 + 48 + 48 + 1 + 1)) ; - - /* Jump volume loop (3 bytes), pan loop (3), envelope flags (3), vibrato (3) - ** fade out (2), 22 unknown bytes, and then write sample_count (2 bytes). - */ - psf_binheader_writef (psf, "ez2z2", (size_t) (4 * 3), 0x1234, make_size_t (22), 1) ; - - pxi->loop_begin = 0 ; - pxi->loop_end = 0 ; - - psf_binheader_writef (psf, "et844", psf->sf.frames, pxi->loop_begin, pxi->loop_end) ; - - /* volume, fine tune, flags, pan, note, namelen */ - psf_binheader_writef (psf, "111111", 128, 0, pxi->sample_flags, 128, 0, strlen (pxi->sample_name)) ; - - psf_binheader_writef (psf, "b", pxi->sample_name, sizeof (pxi->sample_name)) ; - - - - - - /* Header construction complete so write it out. */ - psf_fwrite (psf->header, psf->headindex, 1, psf) ; - - if (psf->error) - return psf->error ; - - psf->dataoffset = psf->headindex ; - - if (current > 0) - psf_fseek (psf, current, SEEK_SET) ; - - return psf->error ; -} /* xi_write_header */ - -static int -xi_read_header (SF_PRIVATE *psf) -{ char buffer [64], name [32] ; - short version, fade_out, sample_count ; - int k, loop_begin, loop_end ; - int sample_sizes [MAX_XI_SAMPLES] ; - - psf_binheader_readf (psf, "pb", 0, buffer, 21) ; - - memset (sample_sizes, 0, sizeof (sample_sizes)) ; - - buffer [20] = 0 ; - if (strcmp (buffer, "Extended Instrument:") != 0) - return SFE_XI_BAD_HEADER ; - - memset (buffer, 0, sizeof (buffer)) ; - psf_binheader_readf (psf, "b", buffer, 23) ; - - if (buffer [22] != 0x1A) - return SFE_XI_BAD_HEADER ; - - buffer [22] = 0 ; - for (k = 21 ; k >= 0 && buffer [k] == ' ' ; k --) - buffer [k] = 0 ; - - psf_log_printf (psf, "Extended Instrument : %s\n", buffer) ; - psf_store_string (psf, SF_STR_TITLE, buffer) ; - - psf_binheader_readf (psf, "be2", buffer, 20, &version) ; - buffer [19] = 0 ; - for (k = 18 ; k >= 0 && buffer [k] == ' ' ; k --) - buffer [k] = 0 ; - - psf_log_printf (psf, "Software : %s\nVersion : %d.%02d\n", buffer, version / 256, version % 256) ; - psf_store_string (psf, SF_STR_SOFTWARE, buffer) ; - - /* Jump note numbers (96), volume envelope (48), pan envelope (48), - ** volume points (1), pan points (1) - */ - psf_binheader_readf (psf, "j", 96 + 48 + 48 + 1 + 1) ; - - psf_binheader_readf (psf, "b", buffer, 12) ; - psf_log_printf (psf, "Volume Loop\n sustain : %u\n begin : %u\n end : %u\n", - buffer [0], buffer [1], buffer [2]) ; - psf_log_printf (psf, "Pan Loop\n sustain : %u\n begin : %u\n end : %u\n", - buffer [3], buffer [4], buffer [5]) ; - psf_log_printf (psf, "Envelope Flags\n volume : 0x%X\n pan : 0x%X\n", - buffer [6] & 0xFF, buffer [7] & 0xFF) ; - - psf_log_printf (psf, "Vibrato\n type : %u\n sweep : %u\n depth : %u\n rate : %u\n", - buffer [8], buffer [9], buffer [10], buffer [11]) ; - - /* - ** Read fade_out then jump reserved (2 bytes) and ???? (20 bytes) and - ** sample_count. - */ - psf_binheader_readf (psf, "e2j2", &fade_out, 2 + 20, &sample_count) ; - psf_log_printf (psf, "Fade out : %d\n", fade_out) ; - - /* XI file can contain up to 16 samples. */ - if (sample_count > MAX_XI_SAMPLES) - return SFE_XI_EXCESS_SAMPLES ; - - if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL) - return SFE_MALLOC_FAILED ; - - psf->instrument->basenote = 0 ; - /* Log all data for each sample. */ - for (k = 0 ; k < sample_count ; k++) - { psf_binheader_readf (psf, "e444", &(sample_sizes [k]), &loop_begin, &loop_end) ; - - /* Read 5 know bytes, 1 unknown byte and 22 name bytes. */ - psf_binheader_readf (psf, "bb", buffer, 6, name, 22) ; - name [21] = 0 ; - - psf_log_printf (psf, "Sample #%d\n name : %s\n", k + 1, name) ; - - psf_log_printf (psf, " size : %d\n", sample_sizes [k]) ; - - - - psf_log_printf (psf, " loop\n begin : %d\n end : %d\n", loop_begin, loop_end) ; - - psf_log_printf (psf, " volume : %u\n f. tune : %d\n flags : 0x%02X ", - buffer [0] & 0xFF, buffer [1] & 0xFF, buffer [2] & 0xFF) ; - - psf_log_printf (psf, " (") ; - if (buffer [2] & 1) - psf_log_printf (psf, " Loop") ; - if (buffer [2] & 2) - psf_log_printf (psf, " PingPong") ; - psf_log_printf (psf, (buffer [2] & 16) ? " 16bit" : " 8bit") ; - psf_log_printf (psf, " )\n") ; - - psf_log_printf (psf, " pan : %u\n note : %d\n namelen : %d\n", - buffer [3] & 0xFF, buffer [4], buffer [5]) ; - - psf->instrument->basenote = buffer [4] ; - if (buffer [2] & 1) - { psf->instrument->loop_count = 1 ; - psf->instrument->loops [0].mode = (buffer [2] & 2) ? SF_LOOP_ALTERNATING : SF_LOOP_FORWARD ; - psf->instrument->loops [0].start = loop_begin ; - psf->instrument->loops [0].end = loop_end ; - } ; - - if (k != 0) - continue ; - - if (buffer [2] & 16) - { psf->sf.format = SF_FORMAT_XI | SF_FORMAT_DPCM_16 ; - psf->bytewidth = 2 ; - } - else - { psf->sf.format = SF_FORMAT_XI | SF_FORMAT_DPCM_8 ; - psf->bytewidth = 1 ; - } ; - } ; - - while (sample_count > 1 && sample_sizes [sample_count - 1] == 0) - sample_count -- ; - - /* Currently, we can only handle 1 sample per file. */ - - if (sample_count > 2) - { psf_log_printf (psf, "*** Sample count is less than 16 but more than 1.\n") ; - psf_log_printf (psf, " sample count : %d sample_sizes [%d] : %d\n", - sample_count, sample_count - 1, sample_sizes [sample_count - 1]) ; - return SFE_XI_EXCESS_SAMPLES ; - } ; - - psf->datalength = sample_sizes [0] ; - - psf->dataoffset = psf_ftell (psf) ; - if (psf->dataoffset < 0) - { psf_log_printf (psf, "*** Bad Data Offset : %D\n", psf->dataoffset) ; - return SFE_BAD_OFFSET ; - } ; - psf_log_printf (psf, "Data Offset : %D\n", psf->dataoffset) ; - - if (psf->dataoffset + psf->datalength > psf->filelength) - { psf_log_printf (psf, "*** File seems to be truncated. Should be at least %D bytes long.\n", - psf->dataoffset + sample_sizes [0]) ; - psf->datalength = psf->filelength - psf->dataoffset ; - } ; - - if (psf_fseek (psf, psf->dataoffset, SEEK_SET) != psf->dataoffset) - return SFE_BAD_SEEK ; - - psf->endian = SF_ENDIAN_LITTLE ; - psf->sf.channels = 1 ; /* Always mono */ - psf->sf.samplerate = 44100 ; /* Always */ - - psf->blockwidth = psf->sf.channels * psf->bytewidth ; - - if (! psf->sf.frames && psf->blockwidth) - psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; - - psf->instrument->gain = 1 ; - psf->instrument->velocity_lo = psf->instrument->key_lo = 0 ; - psf->instrument->velocity_hi = psf->instrument->key_hi = 127 ; - - return 0 ; -} /* xi_read_header */ - -/*============================================================================== -*/ - -static void dsc2s_array (XI_PRIVATE *pxi, signed char *src, int count, short *dest) ; -static void dsc2i_array (XI_PRIVATE *pxi, signed char *src, int count, int *dest) ; -static void dsc2f_array (XI_PRIVATE *pxi, signed char *src, int count, float *dest, float normfact) ; -static void dsc2d_array (XI_PRIVATE *pxi, signed char *src, int count, double *dest, double normfact) ; - -static void dles2s_array (XI_PRIVATE *pxi, short *src, int count, short *dest) ; -static void dles2i_array (XI_PRIVATE *pxi, short *src, int count, int *dest) ; -static void dles2f_array (XI_PRIVATE *pxi, short *src, int count, float *dest, float normfact) ; -static void dles2d_array (XI_PRIVATE *pxi, short *src, int count, double *dest, double normfact) ; - -static sf_count_t -dpcm_read_dsc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - dsc2s_array (pxi, ubuf.scbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* dpcm_read_dsc2s */ - -static sf_count_t -dpcm_read_dsc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - dsc2i_array (pxi, ubuf.scbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* dpcm_read_dsc2i */ - -static sf_count_t -dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float normfact ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - dsc2f_array (pxi, ubuf.scbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* dpcm_read_dsc2f */ - -static sf_count_t -dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double normfact ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - dsc2d_array (pxi, ubuf.scbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* dpcm_read_dsc2d */ - -/*------------------------------------------------------------------------------ -*/ - -static sf_count_t -dpcm_read_dles2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - dles2s_array (pxi, ubuf.sbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* dpcm_read_dles2s */ - -static sf_count_t -dpcm_read_dles2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - dles2i_array (pxi, ubuf.sbuf, readcount, ptr + total) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* dpcm_read_dles2i */ - -static sf_count_t -dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - float normfact ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - dles2f_array (pxi, ubuf.sbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* dpcm_read_dles2f */ - -static sf_count_t -dpcm_read_dles2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, readcount ; - sf_count_t total = 0 ; - double normfact ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - dles2d_array (pxi, ubuf.sbuf, readcount, ptr + total, normfact) ; - total += readcount ; - if (readcount < bufferlen) - break ; - len -= readcount ; - } ; - - return total ; -} /* dpcm_read_dles2d */ - -/*============================================================================== -*/ - -static void s2dsc_array (XI_PRIVATE *pxi, const short *src, signed char *dest, int count) ; -static void i2dsc_array (XI_PRIVATE *pxi, const int *src, signed char *dest, int count) ; -static void f2dsc_array (XI_PRIVATE *pxi, const float *src, signed char *dest, int count, float normfact) ; -static void d2dsc_array (XI_PRIVATE *pxi, const double *src, signed char *dest, int count, double normfact) ; - -static void s2dles_array (XI_PRIVATE *pxi, const short *src, short *dest, int count) ; -static void i2dles_array (XI_PRIVATE *pxi, const int *src, short *dest, int count) ; -static void f2dles_array (XI_PRIVATE *pxi, const float *src, short *dest, int count, float normfact) ; -static void d2dles_array (XI_PRIVATE *pxi, const double *src, short *dest, int count, double normfact) ; - - -static sf_count_t -dpcm_write_s2dsc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - s2dsc_array (pxi, ptr + total, ubuf.scbuf, bufferlen) ; - writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* dpcm_write_s2dsc */ - -static sf_count_t -dpcm_write_i2dsc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - i2dsc_array (pxi, ptr + total, ubuf.scbuf, bufferlen) ; - writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* dpcm_write_i2dsc */ - -static sf_count_t -dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - float normfact ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7F) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - f2dsc_array (pxi, ptr + total, ubuf.scbuf, bufferlen, normfact) ; - writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* dpcm_write_f2dsc */ - -static sf_count_t -dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - double normfact ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7F) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.ucbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - d2dsc_array (pxi, ptr + total, ubuf.scbuf, bufferlen, normfact) ; - writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* dpcm_write_d2dsc */ - - -static sf_count_t -dpcm_write_s2dles (SF_PRIVATE *psf, const short *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - s2dles_array (pxi, ptr + total, ubuf.sbuf, bufferlen) ; - writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* dpcm_write_s2dles */ - -static sf_count_t -dpcm_write_i2dles (SF_PRIVATE *psf, const int *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - i2dles_array (pxi, ptr + total, ubuf.sbuf, bufferlen) ; - writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* dpcm_write_i2dles */ - -static sf_count_t -dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - float normfact ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - f2dles_array (pxi, ptr + total, ubuf.sbuf, bufferlen, normfact) ; - writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* dpcm_write_f2dles */ - -static sf_count_t -dpcm_write_d2dles (SF_PRIVATE *psf, const double *ptr, sf_count_t len) -{ BUF_UNION ubuf ; - XI_PRIVATE *pxi ; - int bufferlen, writecount ; - sf_count_t total = 0 ; - double normfact ; - - if ((pxi = psf->codec_data) == NULL) - return 0 ; - - normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; - - bufferlen = ARRAY_LEN (ubuf.sbuf) ; - - while (len > 0) - { if (len < bufferlen) - bufferlen = (int) len ; - d2dles_array (pxi, ptr + total, ubuf.sbuf, bufferlen, normfact) ; - writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; - total += writecount ; - if (writecount < bufferlen) - break ; - len -= writecount ; - } ; - - return total ; -} /* dpcm_write_d2dles */ - - -/*============================================================================== -*/ - -static void -dsc2s_array (XI_PRIVATE *pxi, signed char *src, int count, short *dest) -{ signed char last_val ; - int k ; - - last_val = pxi->last_16 >> 8 ; - - for (k = 0 ; k < count ; k++) - { last_val += src [k] ; - dest [k] = last_val << 8 ; - } ; - - pxi->last_16 = last_val << 8 ; -} /* dsc2s_array */ - -static void -dsc2i_array (XI_PRIVATE *pxi, signed char *src, int count, int *dest) -{ signed char last_val ; - int k ; - - last_val = pxi->last_16 >> 8 ; - - for (k = 0 ; k < count ; k++) - { last_val += src [k] ; - dest [k] = last_val << 24 ; - } ; - - pxi->last_16 = last_val << 8 ; -} /* dsc2i_array */ - -static void -dsc2f_array (XI_PRIVATE *pxi, signed char *src, int count, float *dest, float normfact) -{ signed char last_val ; - int k ; - - last_val = pxi->last_16 >> 8 ; - - for (k = 0 ; k < count ; k++) - { last_val += src [k] ; - dest [k] = last_val * normfact ; - } ; - - pxi->last_16 = last_val << 8 ; -} /* dsc2f_array */ - -static void -dsc2d_array (XI_PRIVATE *pxi, signed char *src, int count, double *dest, double normfact) -{ signed char last_val ; - int k ; - - last_val = pxi->last_16 >> 8 ; - - for (k = 0 ; k < count ; k++) - { last_val += src [k] ; - dest [k] = last_val * normfact ; - } ; - - pxi->last_16 = last_val << 8 ; -} /* dsc2d_array */ - -/*------------------------------------------------------------------------------ -*/ - -static void -s2dsc_array (XI_PRIVATE *pxi, const short *src, signed char *dest, int count) -{ signed char last_val, current ; - int k ; - - last_val = pxi->last_16 >> 8 ; - - for (k = 0 ; k < count ; k++) - { current = src [k] >> 8 ; - dest [k] = current - last_val ; - last_val = current ; - } ; - - pxi->last_16 = last_val << 8 ; -} /* s2dsc_array */ - -static void -i2dsc_array (XI_PRIVATE *pxi, const int *src, signed char *dest, int count) -{ signed char last_val, current ; - int k ; - - last_val = pxi->last_16 >> 8 ; - - for (k = 0 ; k < count ; k++) - { current = src [k] >> 24 ; - dest [k] = current - last_val ; - last_val = current ; - } ; - - pxi->last_16 = last_val << 8 ; -} /* i2dsc_array */ - -static void -f2dsc_array (XI_PRIVATE *pxi, const float *src, signed char *dest, int count, float normfact) -{ signed char last_val, current ; - int k ; - - last_val = pxi->last_16 >> 8 ; - - for (k = 0 ; k < count ; k++) - { current = lrintf (src [k] * normfact) ; - dest [k] = current - last_val ; - last_val = current ; - } ; - - pxi->last_16 = last_val << 8 ; -} /* f2dsc_array */ - -static void -d2dsc_array (XI_PRIVATE *pxi, const double *src, signed char *dest, int count, double normfact) -{ signed char last_val, current ; - int k ; - - last_val = pxi->last_16 >> 8 ; - - for (k = 0 ; k < count ; k++) - { current = lrint (src [k] * normfact) ; - dest [k] = current - last_val ; - last_val = current ; - } ; - - pxi->last_16 = last_val << 8 ; -} /* d2dsc_array */ - -/*============================================================================== -*/ - -static void -dles2s_array (XI_PRIVATE *pxi, short *src, int count, short *dest) -{ short last_val ; - int k ; - - last_val = pxi->last_16 ; - - for (k = 0 ; k < count ; k++) - { last_val += LE2H_16 (src [k]) ; - dest [k] = last_val ; - } ; - - pxi->last_16 = last_val ; -} /* dles2s_array */ - -static void -dles2i_array (XI_PRIVATE *pxi, short *src, int count, int *dest) -{ short last_val ; - int k ; - - last_val = pxi->last_16 ; - - for (k = 0 ; k < count ; k++) - { last_val += LE2H_16 (src [k]) ; - dest [k] = last_val << 16 ; - } ; - - pxi->last_16 = last_val ; -} /* dles2i_array */ - -static void -dles2f_array (XI_PRIVATE *pxi, short *src, int count, float *dest, float normfact) -{ short last_val ; - int k ; - - last_val = pxi->last_16 ; - - for (k = 0 ; k < count ; k++) - { last_val += LE2H_16 (src [k]) ; - dest [k] = last_val * normfact ; - } ; - - pxi->last_16 = last_val ; -} /* dles2f_array */ - -static void -dles2d_array (XI_PRIVATE *pxi, short *src, int count, double *dest, double normfact) -{ short last_val ; - int k ; - - last_val = pxi->last_16 ; - - for (k = 0 ; k < count ; k++) - { last_val += LE2H_16 (src [k]) ; - dest [k] = last_val * normfact ; - } ; - - pxi->last_16 = last_val ; -} /* dles2d_array */ - -/*------------------------------------------------------------------------------ -*/ - -static void -s2dles_array (XI_PRIVATE *pxi, const short *src, short *dest, int count) -{ short diff, last_val ; - int k ; - - last_val = pxi->last_16 ; - - for (k = 0 ; k < count ; k++) - { diff = src [k] - last_val ; - dest [k] = LE2H_16 (diff) ; - last_val = src [k] ; - } ; - - pxi->last_16 = last_val ; -} /* s2dles_array */ - -static void -i2dles_array (XI_PRIVATE *pxi, const int *src, short *dest, int count) -{ short diff, last_val ; - int k ; - - last_val = pxi->last_16 ; - - for (k = 0 ; k < count ; k++) - { diff = (src [k] >> 16) - last_val ; - dest [k] = LE2H_16 (diff) ; - last_val = src [k] >> 16 ; - } ; - - pxi->last_16 = last_val ; -} /* i2dles_array */ - -static void -f2dles_array (XI_PRIVATE *pxi, const float *src, short *dest, int count, float normfact) -{ short diff, last_val, current ; - int k ; - - last_val = pxi->last_16 ; - - for (k = 0 ; k < count ; k++) - { current = lrintf (src [k] * normfact) ; - diff = current - last_val ; - dest [k] = LE2H_16 (diff) ; - last_val = current ; - } ; - - pxi->last_16 = last_val ; -} /* f2dles_array */ - -static void -d2dles_array (XI_PRIVATE *pxi, const double *src, short *dest, int count, double normfact) -{ short diff, last_val, current ; - int k ; - - last_val = pxi->last_16 ; - - for (k = 0 ; k < count ; k++) - { current = lrint (src [k] * normfact) ; - diff = current - last_val ; - dest [k] = LE2H_16 (diff) ; - last_val = current ; - } ; - - pxi->last_16 = last_val ; -} /* d2dles_array */ - diff --git a/libs/libsndfile/tests/Makefile.am b/libs/libsndfile/tests/Makefile.am deleted file mode 100644 index 089046bb81..0000000000 --- a/libs/libsndfile/tests/Makefile.am +++ /dev/null @@ -1,218 +0,0 @@ -## Process this file with automake to produce Makefile.in - -if ENABLE_TEST_COVERAGE -CPP_TEST = -else -CPP_TEST = cpp_test -endif - -AM_CPPFLAGS = -I$(top_srcdir)/src - -check_PROGRAMS = sfversion floating_point_test write_read_test \ - lossy_comp_test error_test ulaw_test alaw_test dwvw_test \ - peak_chunk_test command_test stdin_test stdout_test stdio_test \ - pcm_test headerless_test pipe_test benchmark header_test misc_test \ - raw_test string_test multi_file_test dither_test chunk_test \ - scale_clip_test win32_test fix_this aiff_rw_test virtual_io_test \ - locale_test largefile_test win32_ordinal_test ogg_test compression_size_test \ - checksum_test external_libs_test rdwr_test format_check_test $(CPP_TEST) \ - channel_test - -noinst_HEADERS = dft_cmp.h utils.h generate.h - -autogen_sources = write_read_test.tpl write_read_test.def \ - pcm_test.tpl pcm_test.def \ - header_test.tpl header_test.def \ - utils.tpl utils.def \ - scale_clip_test.tpl scale_clip_test.def \ - pipe_test.tpl pipe_test.def \ - rdwr_test.tpl rdwr_test.def \ - floating_point_test.tpl floating_point_test.def \ - benchmark.tpl benchmark.def - -EXTRA_DIST = $(autogen_sources) - -CLEANFILES = *~ *.exe - -#=============================================================================== -# If we're cross compiling from Linux to Windows and running the test suite -# under Wine, we need a symbolic link to the generated libsndfile DLL. - -if LINUX_MINGW_CROSS_TEST - -$(check_PROGRAMS) : libsndfile-1.dll - -libsndfile-1.dll : - ln -s $(top_builddir)/src/.libs/$@ $@ - -clean-local : - -rm -f libsndfile-1.dll - -endif - -#=============================================================================== - -check: test_wrapper.sh - sh test_wrapper.sh - -# Need this target to force building of test programs. -checkprograms : $(check_PROGRAMS) - -#=============================================================================== - -sfversion_SOURCES = sfversion.c -sfversion_LDADD = $(top_builddir)/src/libsndfile.la - -write_read_test_SOURCES = utils.c generate.c write_read_test.c -write_read_test_LDADD = $(top_builddir)/src/libsndfile.la - -lossy_comp_test_SOURCES = utils.c lossy_comp_test.c -lossy_comp_test_LDADD = $(top_builddir)/src/libsndfile.la - -fix_this_SOURCES = utils.c fix_this.c -fix_this_LDADD = $(top_builddir)/src/libsndfile.la - -error_test_SOURCES = error_test.c utils.c -error_test_LDADD = $(top_builddir)/src/libsndfile.la - -ulaw_test_SOURCES = utils.c ulaw_test.c -ulaw_test_LDADD = $(top_builddir)/src/libsndfile.la - -alaw_test_SOURCES = utils.c alaw_test.c -alaw_test_LDADD = $(top_builddir)/src/libsndfile.la - -aiff_rw_test_SOURCES = utils.c aiff_rw_test.c -aiff_rw_test_LDADD = $(top_builddir)/src/libsndfile.la - -command_test_SOURCES = command_test.c utils.c -command_test_LDADD = $(top_builddir)/src/libsndfile.la - -locale_test_SOURCES = locale_test.c utils.c -locale_test_LDADD = $(top_builddir)/src/libsndfile.la - -largefile_test_SOURCES = largefile_test.c utils.c -largefile_test_LDADD = $(top_builddir)/src/libsndfile.la - -pcm_test_SOURCES = pcm_test.c utils.c -pcm_test_LDADD = $(top_builddir)/src/libsndfile.la - -headerless_test_SOURCES = utils.c headerless_test.c -headerless_test_LDADD = $(top_builddir)/src/libsndfile.la - -stdin_test_SOURCES = stdin_test.c utils.c -stdin_test_LDADD = $(top_builddir)/src/libsndfile.la - -stdout_test_SOURCES = stdout_test.c -stdout_test_LDADD = $(top_builddir)/src/libsndfile.la - -stdio_test_SOURCES = stdio_test.c utils.c -stdio_test_LDADD = $(top_builddir)/src/libsndfile.la - -pipe_test_SOURCES = pipe_test.c utils.c -pipe_test_LDADD = $(top_builddir)/src/libsndfile.la - -benchmark_SOURCES = benchmark.c -benchmark_LDADD = $(top_builddir)/src/libsndfile.la - -header_test_SOURCES = header_test.c utils.c -header_test_LDADD = $(top_builddir)/src/libsndfile.la - -misc_test_SOURCES = misc_test.c utils.c -misc_test_LDADD = $(top_builddir)/src/libsndfile.la - -raw_test_SOURCES = raw_test.c utils.c -raw_test_LDADD = $(top_builddir)/src/libsndfile.la - -string_test_SOURCES = string_test.c utils.c -string_test_LDADD = $(top_builddir)/src/libsndfile.la - -dither_test_SOURCES = dither_test.c utils.c -dither_test_LDADD = $(top_builddir)/src/libsndfile.la - -chunk_test_SOURCES = chunk_test.c utils.c -chunk_test_LDADD = $(top_builddir)/src/libsndfile.la - -multi_file_test_SOURCES = multi_file_test.c utils.c -multi_file_test_LDADD = $(top_builddir)/src/libsndfile.la - -virtual_io_test_SOURCES = virtual_io_test.c utils.c -virtual_io_test_LDADD = $(top_builddir)/src/libsndfile.la - -ogg_test_SOURCES = ogg_test.c utils.c -ogg_test_LDADD = $(top_builddir)/src/libsndfile.la - -compression_size_test_SOURCES = compression_size_test.c utils.c -compression_size_test_LDADD = $(top_builddir)/src/libsndfile.la - -rdwr_test_SOURCES = rdwr_test.c utils.c -rdwr_test_LDADD = $(top_builddir)/src/libsndfile.la - -win32_test_SOURCES = win32_test.c -# Link lib here so that generating the testsuite tarball works correctly. -win32_test_LDADD = $(top_builddir)/src/libsndfile.la - -win32_ordinal_test_SOURCES = win32_ordinal_test.c utils.c -win32_ordinal_test_LDADD = $(top_builddir)/src/libsndfile.la - -external_libs_test_SOURCES = external_libs_test.c utils.c -external_libs_test_LDADD = $(top_builddir)/src/libsndfile.la - -format_check_test_SOURCES = format_check_test.c utils.c -format_check_test_LDADD = $(top_builddir)/src/libsndfile.la - -channel_test_SOURCES = channel_test.c utils.c -channel_test_LDADD = $(top_builddir)/src/libsndfile.la - -cpp_test_SOURCES = cpp_test.cc utils.c -cpp_test_LDADD = $(top_builddir)/src/libsndfile.la - -checksum_test_SOURCES = checksum_test.c utils.c -checksum_test_LDADD = $(top_builddir)/src/libsndfile.la - -# Lite remove start -dwvw_test_SOURCES = utils.c dwvw_test.c -dwvw_test_LDADD = $(top_builddir)/src/libsndfile.la - -floating_point_test_SOURCES = utils.c dft_cmp.c floating_point_test.c -floating_point_test_LDADD = $(top_builddir)/src/libsndfile.la - -peak_chunk_test_SOURCES = peak_chunk_test.c utils.c -peak_chunk_test_LDADD = $(top_builddir)/src/libsndfile.la - -scale_clip_test_SOURCES = scale_clip_test.c utils.c -scale_clip_test_LDADD = $(top_builddir)/src/libsndfile.la -# Lite remove end - -#=============================================================================== - -write_read_test.c: write_read_test.def write_read_test.tpl - cd $(srcdir) && autogen --writable write_read_test.def && cd $(abs_builddir) - -pcm_test.c: pcm_test.def pcm_test.tpl - cd $(srcdir) && autogen --writable pcm_test.def && cd $(abs_builddir) - -header_test.c: header_test.def header_test.tpl - cd $(srcdir) && autogen --writable header_test.def && cd $(abs_builddir) - -utils.c utils.h : utils.def utils.tpl - cd $(srcdir) && autogen --writable utils.def && cd $(abs_builddir) - -scale_clip_test.c: scale_clip_test.def scale_clip_test.tpl - cd $(srcdir) && autogen --writable scale_clip_test.def && cd $(abs_builddir) - -pipe_test.c: pipe_test.def pipe_test.tpl - cd $(srcdir) && autogen --writable pipe_test.def && cd $(abs_builddir) - -rdwr_test.c: rdwr_test.def rdwr_test.tpl - cd $(srcdir) && autogen --writable rdwr_test.def && cd $(abs_builddir) - -floating_point_test.c: floating_point_test.def floating_point_test.tpl - cd $(srcdir) && autogen --writable floating_point_test.def && cd $(abs_builddir) - -benchmark.c: benchmark.def benchmark.tpl - cd $(srcdir) && autogen --writable benchmark.def && cd $(abs_builddir) - -genfiles : write_read_test.c pcm_test.c header_test.c utils.c \ - scale_clip_test.c pipe_test.c floating_point_test.c rdwr_test.c \ - benchmark.c - diff --git a/libs/libsndfile/tests/aiff_rw_test.c b/libs/libsndfile/tests/aiff_rw_test.c deleted file mode 100644 index 43d34dbc8f..0000000000 --- a/libs/libsndfile/tests/aiff_rw_test.c +++ /dev/null @@ -1,164 +0,0 @@ -/* -** Copyright (C) 2003-2012 Erik de Castro Lopo -** -** 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. -*/ - - -#include -#include -#include -#include -#include -#include - - -#include - -#include "utils.h" - - -static unsigned char aifc_data [] = -{ 'F' , 'O' , 'R' , 'M' , - 0x00, 0x00, 0x01, 0xE8, /* FORM length */ - - 'A' , 'I' , 'F' , 'C' , - 0x43, 0x4F, 0x4D, 0x4D, /* COMM */ - 0x00, 0x00, 0x00, 0x26, /* COMM length */ - 0x00, 0x01, 0x00, 0x00, 0x00, 0xAE, 0x00, 0x10, 0x40, 0x0D, 0xAC, 0x44, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x4F, 0x4E, 0x45, 0x0D, 'N' , - 'o' , 't' , ' ' , 'c' , 'o' , 'm' , 'p' , 'r' , 'e' , 's' , 's' , 'e' , - 'd' , 0x00, - - 'F' , 'V' , 'E' , 'R' , 0x00, 0x00, 0x00, 0x04, 0xA2, 0x80, 0x51, 0x40, - - /* A 'MARK' chunk. */ - 'M' , 'A' , 'R' , 'K' , 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 'A' , - 0x00, 0x02, 0x00, 0x00, 0x11, 0x3A, 0x02, 'B' , 'C' , 0x00, - 0x00, 0x03, 0x00, 0x00, 0x22, 0x74, 0x03, 'D' , 'E' , 'F', - 0x00, 0x04, 0x00, 0x00, 0x33, 0xAE, 0x04, 'G' , 'H' , 'I', 'J' , 0x00, - 0x00, 0x05, 0x00, 0x00, 0x44, 0xE8, 0x05, 'K' , 'L' , 'M', 'N' , 'O' , - - 'S' , 'S' , 'N' , 'D' , - 0x00, 0x00, 0x01, 0x64, /* SSND length */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xE0, 0xFF, 0xDB, 0xFF, 0xD0, 0xFF, 0xD5, 0xFF, 0xD6, 0xFF, 0xD0, - 0xFF, 0xBF, 0xFF, 0xBE, 0xFF, 0xB9, 0xFF, 0xC8, 0xFF, 0xBF, 0xFF, 0xD5, - 0xFF, 0xC3, 0xFF, 0xBF, 0xFF, 0xB3, 0xFF, 0xBE, 0xFF, 0xB4, 0xFF, 0xAD, - 0xFF, 0xAC, 0xFF, 0xAF, 0xFF, 0xB9, 0xFF, 0xB3, 0xFF, 0xA4, 0xFF, 0xA5, - 0xFF, 0x93, 0xFF, 0x95, 0xFF, 0x97, 0xFF, 0x98, 0xFF, 0x99, 0xFF, 0x9E, - 0xFF, 0x90, 0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x7C, 0xFF, 0x80, 0xFF, 0x7C, - 0xFF, 0x72, 0xFF, 0x72, 0xFF, 0x6C, 0xFF, 0x75, 0xFF, 0x6E, 0xFF, 0x6F, - 0xFF, 0x66, 0xFF, 0x62, 0xFF, 0x5C, 0xFF, 0x64, 0xFF, 0x50, 0xFF, 0x56, - 0xFF, 0x56, 0xFF, 0x4A, 0xFF, 0x4A, 0xFF, 0x49, 0xFF, 0x44, 0xFF, 0x49, - 0xFF, 0x3B, 0xFF, 0x3F, 0xFF, 0x48, 0xFF, 0x46, 0xFF, 0x42, 0xFF, 0x49, - 0xFF, 0x43, 0xFF, 0x36, 0xFF, 0x40, 0xFF, 0x35, 0xFF, 0x3F, 0xFF, 0x36, - 0xFF, 0x37, 0xFF, 0x2E, 0xFF, 0x23, 0xFF, 0x23, 0xFF, 0x21, 0xFF, 0x1F, - 0xFF, 0x25, 0xFF, 0x2C, 0xFF, 0x1E, 0xFF, 0x22, 0xFF, 0x24, 0xFF, 0x2B, - 0xFF, 0x35, 0xFF, 0x27, 0xFF, 0x2E, 0xFF, 0x21, 0xFF, 0x18, 0xFF, 0x21, - 0xFF, 0x20, 0xFF, 0x0F, 0xFF, 0x21, 0xFF, 0x1A, 0xFF, 0x10, 0xFF, 0x09, - 0xFF, 0x1E, 0xFF, 0x19, 0xFF, 0x21, 0xFF, 0x13, 0xFF, 0x1B, 0xFF, 0x18, - 0xFF, 0x21, 0xFF, 0x0F, 0xFF, 0x1A, 0xFF, 0x16, 0xFF, 0x21, 0xFF, 0x1B, - 0xFF, 0x1B, 0xFF, 0x23, 0xFF, 0x1A, 0xFF, 0x21, 0xFF, 0x26, 0xFF, 0x23, - 0xFF, 0x26, 0xFF, 0x27, 0xFF, 0x30, 0xFF, 0x27, 0xFF, 0x2F, 0xFF, 0x28, - 0xFF, 0x2C, 0xFF, 0x27, 0xFF, 0x33, 0xFF, 0x29, 0xFF, 0x33, 0xFF, 0x3A, - 0xFF, 0x42, 0xFF, 0x3B, 0xFF, 0x4D, 0xFF, 0x4B, 0xFF, 0x4D, 0xFF, 0x4A, - 0xFF, 0x67, 0xFF, 0x77, 0xFF, 0x73, 0xFF, 0x7B, 0xFF, 0xDE, 0xFF, 0xAD, - 0x00, 0x4A, 0x00, 0x63, 0xEC, 0x8C, 0x03, 0xBB, 0x0E, 0xE4, 0x08, 0xF2, - 0x00, 0x70, 0xE3, 0xD1, 0xE5, 0xE4, 0x01, 0x6E, 0x0A, 0x67, 0x1C, 0x74, - 0xF8, 0x8E, 0x10, 0x7B, 0xEA, 0x3C, 0x09, 0x87, 0x1B, 0x24, 0xEF, 0x05, - 0x17, 0x76, 0x0D, 0x5B, 0x02, 0x43, 0xF5, 0xEF, 0x0C, 0x1D, 0xF7, 0x61, - 0x05, 0x95, 0x0B, 0xC2, 0xF1, 0x69, 0x1A, 0xA1, 0xEC, 0x75, 0xF4, 0x11, - 0x13, 0x4F, 0x13, 0x71, 0xFA, 0x33, 0xEC, 0x32, 0xC8, 0xCF, 0x05, 0xB0, - 0x0B, 0x61, 0x33, 0x19, 0xCE, 0x37, 0xEF, 0xD4, 0x21, 0x9D, 0xFA, 0xAE, -} ; - -static void rw_test (const char *filename) ; - -int -main (void) -{ const char *filename = "rw.aifc" ; - - print_test_name ("aiff_rw_test", filename) ; - - dump_data_to_file (filename, aifc_data, sizeof (aifc_data)) ; - - rw_test (filename) ; - - unlink (filename) ; - - puts ("ok") ; - return 0 ; -} /* main */ - -/*============================================================================== -*/ - -static void -rw_test (const char *filename) -{ SNDFILE *file ; - SF_INFO sfinfo_rd, sfinfo_rw ; - - memset (&sfinfo_rd, 0, sizeof (sfinfo_rd)) ; - memset (&sfinfo_rw, 0, sizeof (sfinfo_rw)) ; - - /* Open the file in read only mode and fill in the SF_INFO struct. */ - if ((file = sf_open (filename, SFM_READ, &sfinfo_rd)) == NULL) - { printf ("\n\nLine %d : sf_open SFM_READ failed : %s\n\n", __LINE__, sf_strerror (NULL)) ; - exit (1) ; - } ; - check_log_buffer_or_die (file, __LINE__) ; - sf_close (file) ; - - /* Now open read/write and close the file. */ - if ((file = sf_open (filename, SFM_RDWR, &sfinfo_rw)) == NULL) - { printf ("\n\nLine %d : sf_open SFM_RDWR failed : %s\n\n", __LINE__, sf_strerror (NULL)) ; - exit (1) ; - } ; - check_log_buffer_or_die (file, __LINE__) ; - sf_close (file) ; - - /* Open again as read only again and fill in a new SF_INFO struct. */ - memset (&sfinfo_rw, 0, sizeof (sfinfo_rw)) ; - if ((file = sf_open (filename, SFM_READ, &sfinfo_rw)) == NULL) - { printf ("\n\nLine %d : sf_open SFM_RDWR failed : %s\n\n", __LINE__, sf_strerror (NULL)) ; - exit (1) ; - } ; - check_log_buffer_or_die (file, __LINE__) ; - sf_close (file) ; - - /* Now compare the two. */ - if (sfinfo_rd.format != sfinfo_rw.format) - { printf ("\n\nLine %d : format mismatch (0x%08X != 0x%08X).\n\n", __LINE__, - sfinfo_rd.format, sfinfo_rw.format) ; - exit (1) ; - } ; - - if (sfinfo_rd.channels != sfinfo_rw.channels) - { printf ("\n\nLine %d : channel count mismatch (%d != %d).\n\n", __LINE__, - sfinfo_rd.channels, sfinfo_rw.channels) ; - exit (1) ; - } ; - - if (sfinfo_rd.frames != sfinfo_rw.frames) - { printf ("\n\nLine %d : frame count mismatch (rd %" PRId64 " != rw %" PRId64 ").\n\n", __LINE__, - sfinfo_rd.frames, sfinfo_rw.frames) ; - exit (1) ; - } ; - - return ; -} /* rw_test */ - diff --git a/libs/libsndfile/tests/alaw_test.c b/libs/libsndfile/tests/alaw_test.c deleted file mode 100644 index 6d71ffed98..0000000000 --- a/libs/libsndfile/tests/alaw_test.c +++ /dev/null @@ -1,236 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_SIZE (65536) - -static unsigned char alaw_encode (int sample) ; -static int alaw_decode (unsigned int alawbyte) ; - -static short short_buffer [BUFFER_SIZE] ; -static unsigned char alaw_buffer [BUFFER_SIZE] ; - -int -main (void) -{ SNDFILE *file ; - SF_INFO sfinfo ; - const char *filename ; - int k ; - - print_test_name ("alaw_test", "encoder") ; - - filename = "test.raw" ; - - sf_info_setup (&sfinfo, SF_FORMAT_RAW | SF_FORMAT_ALAW, 44100, 1) ; - - if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) - { printf ("sf_open_write failed with error : ") ; - fflush (stdout) ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - /* Generate a file containing all possible 16 bit sample values - ** and write it to disk as alaw encoded.frames. - */ - - for (k = 0 ; k < 0x10000 ; k++) - short_buffer [k] = k & 0xFFFF ; - - sf_write_short (file, short_buffer, BUFFER_SIZE) ; - sf_close (file) ; - - /* Now open that file and compare the alaw encoded sample values - ** with what they should be. - */ - - if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) - { printf ("sf_open_write failed with error : ") ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - if (sf_read_raw (file, alaw_buffer, BUFFER_SIZE) != BUFFER_SIZE) - { printf ("sf_read_raw : ") ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - for (k = 0 ; k < 0x10000 ; k++) - if (alaw_encode (short_buffer [k]) != alaw_buffer [k]) - { printf ("Encoder error : sample #%d (0x%02X should be 0x%02X)\n", k, alaw_buffer [k], alaw_encode (short_buffer [k])) ; - exit (1) ; - } ; - - sf_close (file) ; - - puts ("ok") ; - - print_test_name ("alaw_test", "decoder") ; - /* Now generate a file containing all possible 8 bit encoded - ** sample values and write it to disk as alaw encoded.frames. - */ - - if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) - { printf ("sf_open_write failed with error : ") ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - for (k = 0 ; k < 256 ; k++) - alaw_buffer [k] = k & 0xFF ; - - sf_write_raw (file, alaw_buffer, 256) ; - sf_close (file) ; - - /* Now open that file and compare the alaw decoded sample values - ** with what they should be. - */ - - if (! (file = sf_open (filename, SFM_READ, &sfinfo))) - { printf ("sf_open_write failed with error : ") ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - if (sf_read_short (file, short_buffer, 256) != 256) - { printf ("sf_read_short : ") ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - - for (k = 0 ; k < 256 ; k++) - if (short_buffer [k] != alaw_decode (alaw_buffer [k])) - { printf ("Decoder error : sample #%d (0x%02X should be 0x%02X)\n", k, short_buffer [k], alaw_decode (alaw_buffer [k])) ; - exit (1) ; - } ; - - sf_close (file) ; - - puts ("ok") ; - - unlink (filename) ; - - return 0 ; -} /* main */ - - -/*================================================================================= -** The following routines came from the sox-12.15 (Sound eXcahcnge) distribution. -** -** This code is not compiled into libsndfile. It is only used to test the -** libsndfile lookup tables for correctness. -** -** I have included the original authors comments. -*/ - -/* -** A-law routines by Graeme W. Gill. -** Date: 93/5/7 -** -** References: -** 1) CCITT Recommendation G.711 -** -*/ - -#define ACLIP 31744 - -static -unsigned char alaw_encode (int sample) -{ static int exp_lut [128] = - { 1, 1, 2, 2, 3, 3, 3, 3, - 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7 - } ; - - int sign, exponent, mantissa ; - unsigned char Alawbyte ; - - /* Get the sample into sign-magnitude. */ - sign = ((~sample) >> 8) & 0x80 ; /* set aside the sign */ - if (sign == 0) - sample = -sample ; /* get magnitude */ - if (sample > ACLIP) - sample = ACLIP ; /* clip the magnitude */ - - /* Convert from 16 bit linear to ulaw. */ - if (sample >= 256) - { exponent = exp_lut [(sample >> 8) & 0x7F] ; - mantissa = (sample >> (exponent + 3)) & 0x0F ; - Alawbyte = ((exponent << 4) | mantissa) ; - } - else - Alawbyte = (sample >> 4) ; - - Alawbyte ^= (sign ^ 0x55) ; - - return Alawbyte ; -} /* alaw_encode */ - -static -int alaw_decode (unsigned int Alawbyte) -{ static int exp_lut [8] = { 0, 264, 528, 1056, 2112, 4224, 8448, 16896 } ; - int sign, exponent, mantissa, sample ; - - Alawbyte ^= 0x55 ; - sign = (Alawbyte & 0x80) ; - Alawbyte &= 0x7f ; /* get magnitude */ - if (Alawbyte >= 16) - { exponent = (Alawbyte >> 4) & 0x07 ; - mantissa = Alawbyte & 0x0F ; - sample = exp_lut [exponent] + (mantissa << (exponent + 3)) ; - } - else - sample = (Alawbyte << 4) + 8 ; - if (sign == 0) - sample = -sample ; - - return sample ; -} /* alaw_decode */ - diff --git a/libs/libsndfile/tests/benchmark-0.0.28 b/libs/libsndfile/tests/benchmark-0.0.28 deleted file mode 100644 index 2d2b06f9bc..0000000000 --- a/libs/libsndfile/tests/benchmark-0.0.28 +++ /dev/null @@ -1,40 +0,0 @@ -erikd@coltrane > tests/benchmark -Benchmarking libsndfile-0.0.28 ------------------------------- -Each test takes a little over 5 seconds. - - Raw write PCM_16 : 30660117 samples per sec - Raw read PCM_16 : 62788982 samples per sec - -Native endian I/O : - Write short to PCM_16 : 83.37% of raw write - Read short from PCM_16 : 83.17% of raw read - Write int to PCM_24 : 30.78% of raw write - Read int from PCM_24 : 32.96% of raw read - Write int to PCM_32 : 42.05% of raw write - Read int from PCM_32 : 41.11% of raw read - Write float to PCM_16 : 17.75% of raw write - Read float from PCM_16 : 43.27% of raw read - Write float to PCM_24 : 15.30% of raw write - Read float from PCM_24 : 28.09% of raw read - Write float to PCM_32 : 14.55% of raw write - Read float from PCM_32 : 34.65% of raw read - Write float to FLOAT : 28.98% of raw write - Read float from FLOAT : 56.71% of raw read - -Endian swapped I/O : - Write short to PCM_16 : 43.39% of raw write - Read short from PCM_16 : 49.12% of raw read - Write int to PCM_24 : 29.65% of raw write - Read int from PCM_24 : 33.66% of raw read - Write int to PCM_32 : 19.62% of raw write - Read int from PCM_32 : 21.97% of raw read - Write float to PCM_16 : 17.63% of raw write - Read float from PCM_16 : 31.43% of raw read - Write float to PCM_24 : 14.91% of raw write - Read float from PCM_24 : 27.99% of raw read - Write float to PCM_32 : 13.69% of raw write - Read float from PCM_32 : 22.23% of raw read - Write float to FLOAT : 19.25% of raw write - Read float from FLOAT : 25.66% of raw read - diff --git a/libs/libsndfile/tests/benchmark-1.0.0 b/libs/libsndfile/tests/benchmark-1.0.0 deleted file mode 100644 index 2922836419..0000000000 --- a/libs/libsndfile/tests/benchmark-1.0.0 +++ /dev/null @@ -1,35 +0,0 @@ -Benchmarking libsndfile-1.0.0 ------------------------------ -Each test takes a little over 5 seconds. - - Raw write PCM_16 : 31084269 samples per sec - Raw read PCM_16 : 63597065 samples per sec - -Native endian I/O : - Write short to PCM_16 : 83.19% of raw write - Read short from PCM_16 : 82.93% of raw read - Write int to PCM_24 : 31.12% of raw write - Read int from PCM_24 : 37.90% of raw read - Write float to PCM_16 : 37.00% of raw write - Read float from PCM_16 : 45.53% of raw read - Write float to PCM_24 : 29.08% of raw write - Read float from PCM_24 : 28.48% of raw read - Write float to PCM_32 : 22.08% of raw write - Read float from PCM_32 : 31.21% of raw read - Write float to FLOAT : 28.70% of raw write - Read float from FLOAT : 56.32% of raw read - -Endian swapped I/O : - Write short to PCM_16 : 22.08% of raw write - Read short from PCM_16 : 23.20% of raw read - Write int to PCM_24 : 30.96% of raw write - Read int from PCM_24 : 37.76% of raw read - Write float to PCM_16 : 35.82% of raw write - Read float from PCM_16 : 22.61% of raw read - Write float to PCM_24 : 27.70% of raw write - Read float from PCM_24 : 28.37% of raw read - Write float to PCM_32 : 20.77% of raw write - Read float from PCM_32 : 23.46% of raw read - Write float to FLOAT : 15.03% of raw write - Read float from FLOAT : 15.43% of raw read - diff --git a/libs/libsndfile/tests/benchmark-1.0.0rc2 b/libs/libsndfile/tests/benchmark-1.0.0rc2 deleted file mode 100644 index 770224672f..0000000000 --- a/libs/libsndfile/tests/benchmark-1.0.0rc2 +++ /dev/null @@ -1,31 +0,0 @@ -Benchmarking libsndfile-1.0.0rc2 --------------------------------- -Each test takes a little over 5 seconds. - - Raw write PCM_16 : 31638069 samples per sec - Raw read PCM_16 : 62788982 samples per sec - -Native endian I/O : - Write short to PCM_16 : 82.37% of raw write - Read short from PCM_16 : 82.17% of raw read - Write int to PCM_24 : 30.80% of raw write - Read int from PCM_24 : 37.95% of raw read - Write float to PCM_16 : 36.22% of raw write - Read float from PCM_16 : 23.32% of raw read - Write float to PCM_24 : 28.41% of raw write - Read float from PCM_24 : 28.41% of raw read - Write float to FLOAT : 28.41% of raw write - Read float from FLOAT : 57.50% of raw read - -Endian swapped I/O : - Write short to PCM_16 : 21.73% of raw write - Read short from PCM_16 : 23.37% of raw read - Write int to PCM_24 : 31.02% of raw write - Read int from PCM_24 : 38.24% of raw read - Write float to PCM_16 : 35.51% of raw write - Read float from PCM_16 : 19.16% of raw read - Write float to PCM_24 : 27.37% of raw write - Read float from PCM_24 : 28.74% of raw read - Write float to FLOAT : 15.11% of raw write - Read float from FLOAT : 15.60% of raw read - diff --git a/libs/libsndfile/tests/benchmark-1.0.18pre16-hendrix b/libs/libsndfile/tests/benchmark-1.0.18pre16-hendrix deleted file mode 100644 index 951bc56d25..0000000000 --- a/libs/libsndfile/tests/benchmark-1.0.18pre16-hendrix +++ /dev/null @@ -1,38 +0,0 @@ -Benchmarking libsndfile-1.0.18pre15 ------------------------------------ -Each test takes a little over 5 seconds. - - Raw write PCM_16 : 103189885 samples per sec - Raw read PCM_16 : 660854036 samples per sec - -Native endian I/O : - Write short to PCM_16 : 95.08% of raw write - Read short from PCM_16 : 96.39% of raw read - Write int to PCM_24 : 54.55% of raw write - Read int from PCM_24 : 28.50% of raw read - Write int to PCM_32 : 46.97% of raw write - Read int from PCM_32 : 39.98% of raw read - Write float to PCM_16 : 60.85% of raw write - Read float from PCM_16 : 27.79% of raw read - Write float to PCM_24 : 46.23% of raw write - Read float from PCM_24 : 22.62% of raw read - Write float to PCM_32 : 35.38% of raw write - Read float from PCM_32 : 24.18% of raw read - Write float to FLOAT : 47.73% of raw write - Read float from FLOAT : 40.62% of raw read - -Endian swapped I/O : - Write short to PCM_16 : 79.98% of raw write - Read short from PCM_16 : 49.27% of raw read - Write int to PCM_24 : 53.80% of raw write - Read int from PCM_24 : 28.50% of raw read - Write int to PCM_32 : 41.68% of raw write - Read int from PCM_32 : 25.89% of raw read - Write float to PCM_16 : 61.03% of raw write - Read float from PCM_16 : 27.74% of raw read - Write float to PCM_24 : 45.10% of raw write - Read float from PCM_24 : 22.43% of raw read - Write float to PCM_32 : 35.24% of raw write - Read float from PCM_32 : 22.37% of raw read - Write float to FLOAT : 42.01% of raw write - Read float from FLOAT : 28.98% of raw read diff --git a/libs/libsndfile/tests/benchmark-1.0.18pre16-mingus b/libs/libsndfile/tests/benchmark-1.0.18pre16-mingus deleted file mode 100644 index fa0584e149..0000000000 --- a/libs/libsndfile/tests/benchmark-1.0.18pre16-mingus +++ /dev/null @@ -1,38 +0,0 @@ -Benchmarking libsndfile-1.0.18pre15 ------------------------------------ -Each test takes a little over 5 seconds. - - Raw write PCM_16 : 178237074 samples per sec - Raw read PCM_16 : 368885269 samples per sec - -Native endian I/O : - Write short to PCM_16 : 98.84% of raw write - Read short from PCM_16 : 147.10% of raw read - Write int to PCM_24 : 33.74% of raw write - Read int from PCM_24 : 30.82% of raw read - Write int to PCM_32 : 48.34% of raw write - Read int from PCM_32 : 62.43% of raw read - Write float to PCM_16 : 41.86% of raw write - Read float from PCM_16 : 36.73% of raw read - Write float to PCM_24 : 28.38% of raw write - Read float from PCM_24 : 19.50% of raw read - Write float to PCM_32 : 23.68% of raw write - Read float from PCM_32 : 28.76% of raw read - Write float to FLOAT : 47.21% of raw write - Read float from FLOAT : 60.85% of raw read - -Endian swapped I/O : - Write short to PCM_16 : 54.94% of raw write - Read short from PCM_16 : 59.03% of raw read - Write int to PCM_24 : 33.40% of raw write - Read int from PCM_24 : 31.98% of raw read - Write int to PCM_32 : 30.89% of raw write - Read int from PCM_32 : 33.68% of raw read - Write float to PCM_16 : 41.61% of raw write - Read float from PCM_16 : 26.76% of raw read - Write float to PCM_24 : 25.75% of raw write - Read float from PCM_24 : 19.84% of raw read - Write float to PCM_32 : 21.29% of raw write - Read float from PCM_32 : 21.78% of raw read - Write float to FLOAT : 30.82% of raw write - Read float from FLOAT : 35.04% of raw read diff --git a/libs/libsndfile/tests/benchmark-1.0.6pre10-coltrane b/libs/libsndfile/tests/benchmark-1.0.6pre10-coltrane deleted file mode 100644 index 12f71a8a78..0000000000 --- a/libs/libsndfile/tests/benchmark-1.0.6pre10-coltrane +++ /dev/null @@ -1,39 +0,0 @@ -Benchmarking libsndfile-1.0.6pre10 ----------------------------------- -Each test takes a little over 5 seconds. - - Raw write PCM_16 : 28845961 samples per sec - Raw read PCM_16 : 63471874 samples per sec - -Native endian I/O : - Write short to PCM_16 : 86.21% of raw write - Read short from PCM_16 : 82.60% of raw read - Write int to PCM_24 : 34.89% of raw write - Read int from PCM_24 : 37.26% of raw read - Write int to PCM_32 : 43.36% of raw write - Read int from PCM_32 : 41.30% of raw read - Write float to PCM_16 : 43.02% of raw write - Read float from PCM_16 : 43.99% of raw read - Write float to PCM_24 : 32.72% of raw write - Read float from PCM_24 : 28.21% of raw read - Write float to PCM_32 : 25.92% of raw write - Read float from PCM_32 : 30.98% of raw read - Write float to FLOAT : 46.65% of raw write - Read float from FLOAT : 56.66% of raw read - -Endian swapped I/O : - Write short to PCM_16 : 54.53% of raw write - Read short from PCM_16 : 56.32% of raw read - Write int to PCM_24 : 35.28% of raw write - Read int from PCM_24 : 37.33% of raw read - Write int to PCM_32 : 26.21% of raw write - Read int from PCM_32 : 23.51% of raw read - Write float to PCM_16 : 41.39% of raw write - Read float from PCM_16 : 23.56% of raw read - Write float to PCM_24 : 30.86% of raw write - Read float from PCM_24 : 28.27% of raw read - Write float to PCM_32 : 23.83% of raw write - Read float from PCM_32 : 20.54% of raw read - Write float to FLOAT : 27.26% of raw write - Read float from FLOAT : 29.04% of raw read - diff --git a/libs/libsndfile/tests/benchmark-1.0.6pre10-miles b/libs/libsndfile/tests/benchmark-1.0.6pre10-miles deleted file mode 100644 index fffdb84630..0000000000 --- a/libs/libsndfile/tests/benchmark-1.0.6pre10-miles +++ /dev/null @@ -1,39 +0,0 @@ -Benchmarking libsndfile-1.0.6pre10 ----------------------------------- -Each test takes a little over 5 seconds. - - Raw write PCM_16 : 40092612 samples per sec - Raw read PCM_16 : 42382563 samples per sec - -Native endian I/O : - Write short to PCM_16 : 61.90% of raw write - Read short from PCM_16 : 100.20% of raw read - Write int to PCM_24 : 28.69% of raw write - Read int from PCM_24 : 33.62% of raw read - Write int to PCM_32 : 31.14% of raw write - Read int from PCM_32 : 51.04% of raw read - Write float to PCM_16 : 25.57% of raw write - Read float from PCM_16 : 28.17% of raw read - Write float to PCM_24 : 23.59% of raw write - Read float from PCM_24 : 24.14% of raw read - Write float to PCM_32 : 18.00% of raw write - Read float from PCM_32 : 22.59% of raw read - Write float to FLOAT : 31.32% of raw write - Read float from FLOAT : 51.54% of raw read - -Endian swapped I/O : - Write short to PCM_16 : 42.81% of raw write - Read short from PCM_16 : 54.58% of raw read - Write int to PCM_24 : 29.28% of raw write - Read int from PCM_24 : 33.43% of raw read - Write int to PCM_32 : 22.21% of raw write - Read int from PCM_32 : 27.24% of raw read - Write float to PCM_16 : 25.76% of raw write - Read float from PCM_16 : 26.84% of raw read - Write float to PCM_24 : 23.71% of raw write - Read float from PCM_24 : 24.10% of raw read - Write float to PCM_32 : 18.47% of raw write - Read float from PCM_32 : 21.45% of raw read - Write float to FLOAT : 22.46% of raw write - Read float from FLOAT : 29.72% of raw read - diff --git a/libs/libsndfile/tests/benchmark-latest-coltrane b/libs/libsndfile/tests/benchmark-latest-coltrane deleted file mode 100644 index 97ce29a8a9..0000000000 --- a/libs/libsndfile/tests/benchmark-latest-coltrane +++ /dev/null @@ -1,75 +0,0 @@ -erikd@coltrane > cat tests/benchmark-0.0.28 -Benchmarking libsndfile-0.0.28 ------------------------------- -Each test takes a little over 5 seconds. - - Raw write PCM_16 : 31022959 samples per sec - Raw read PCM_16 : 63471874 samples per sec - -Native endian I/O : - Write short to PCM_16 : 83.19% of raw write - Read short from PCM_16 : 82.28% of raw read - Write int to PCM_24 : 30.81% of raw write - Read int from PCM_24 : 32.92% of raw read - Write float to PCM_16 : 17.70% of raw write - Read float from PCM_16 : 43.64% of raw read - Write float to PCM_24 : 15.09% of raw write - Read float from PCM_24 : 27.79% of raw read - Write float to PCM_32 : 14.32% of raw write - Read float from PCM_32 : 34.42% of raw read - Write float to FLOAT : 28.64% of raw write - Read float from FLOAT : 56.77% of raw read - -Endian swapped I/O : - Write short to PCM_16 : 44.04% of raw write - Read short from PCM_16 : 49.46% of raw read - Write int to PCM_24 : 28.92% of raw write - Read int from PCM_24 : 33.10% of raw read - Write float to PCM_16 : 17.30% of raw write - Read float from PCM_16 : 31.46% of raw read - Write float to PCM_24 : 14.62% of raw write - Read float from PCM_24 : 27.64% of raw read - Write float to PCM_32 : 13.65% of raw write - Read float from PCM_32 : 22.41% of raw read - Write float to FLOAT : 19.13% of raw write - Read float from FLOAT : 26.21% of raw read - -erikd@coltrane > tests/benchmark -Benchmarking libsndfile-1.0.0 ------------------------------ -Each test takes a little over 5 seconds. - - Raw write PCM_16 : 29884416 samples per sec - Raw read PCM_16 : 63347175 samples per sec - -Native endian I/O : - Write short to PCM_16 : 88.24% of raw write - Read short from PCM_16 : 82.76% of raw read - Write int to PCM_24 : 34.95% of raw write - Read int from PCM_24 : 37.17% of raw read - Write int to PCM_32 : 43.86% of raw write - Read int from PCM_32 : 41.22% of raw read - Write float to PCM_16 : 42.07% of raw write - Read float from PCM_16 : 44.25% of raw read - Write float to PCM_24 : 32.43% of raw write - Read float from PCM_24 : 28.93% of raw read - Write float to PCM_32 : 25.60% of raw write - Read float from PCM_32 : 31.10% of raw read - Write float to FLOAT : 45.55% of raw write - Read float from FLOAT : 57.41% of raw read - -Endian swapped I/O : - Write short to PCM_16 : 43.46% of raw write - Read short from PCM_16 : 43.99% of raw read - Write int to PCM_24 : 35.09% of raw write - Read int from PCM_24 : 37.34% of raw read - Write int to PCM_32 : 24.05% of raw write - Read int from PCM_32 : 19.74% of raw read - Write float to PCM_16 : 40.25% of raw write - Read float from PCM_16 : 32.15% of raw read - Write float to PCM_24 : 31.02% of raw write - Read float from PCM_24 : 28.82% of raw read - Write float to PCM_32 : 23.54% of raw write - Read float from PCM_32 : 23.65% of raw read - Write float to FLOAT : 24.87% of raw write - Read float from FLOAT : 20.28% of raw read diff --git a/libs/libsndfile/tests/benchmark.c b/libs/libsndfile/tests/benchmark.c deleted file mode 100644 index f33bfee43b..0000000000 --- a/libs/libsndfile/tests/benchmark.c +++ /dev/null @@ -1,545 +0,0 @@ -/* -** Copyright (C) 2002-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if (HAVE_DECL_S_IRGRP == 0) -#include -#endif - -#include -#include -#include -#include -#include - -#include - -#ifndef M_PI -#define M_PI 3.14159265358979323846264338 -#endif - -/* -** Neat solution to the Win32/OS2 binary file flage requirement. -** If O_BINARY isn't already defined by the inclusion of the system -** headers, set it to zero. -*/ -#ifndef O_BINARY -#define O_BINARY 0 -#endif - -#define WRITE_FLAGS (O_WRONLY | O_CREAT | O_TRUNC | O_BINARY) -#define READ_FLAGS (O_RDONLY | O_BINARY) - -#if (defined (WIN32) || defined (_WIN32) || defined (__OS2__)) - #define WRITE_PERMS 0777 -#else - #define WRITE_PERMS (S_IRUSR | S_IWUSR | S_IRGRP) -#endif - -#define BUFFER_SIZE (1<<18) -#define BLOCK_COUNT (30) -#define TEST_DURATION (5) /* 5 Seconds. */ - -typedef struct -{ double write_rate ; - double read_rate ; -} PERF_STATS ; - -static void *data = NULL ; - -static void calc_raw_performance (PERF_STATS *stats) ; - -static void calc_short_performance (int format, double read_rate, double write_rate) ; -static void calc_int_performance (int format, double read_rate, double write_rate) ; -static void calc_float_performance (int format, double read_rate, double write_rate) ; - - -static int cpu_is_big_endian (void) ; - -static const char* get_subtype_str (int subtype) ; - -int -main (int argc, char *argv []) -{ PERF_STATS stats ; - char buffer [256] = "Benchmarking " ; - int format_major ; - - if (! (data = malloc (BUFFER_SIZE * sizeof (double)))) - { perror ("Error : malloc failed") ; - exit (1) ; - } ; - - sf_command (NULL, SFC_GET_LIB_VERSION, buffer + strlen (buffer), sizeof (buffer) - strlen (buffer)) ; - - puts (buffer) ; - memset (buffer, '-', strlen (buffer)) ; - puts (buffer) ; - printf ("Each test takes a little over %d seconds.\n\n", TEST_DURATION) ; - - calc_raw_performance (&stats) ; - - if (argc < 2 || strcmp ("--native-only", argv [1]) == 0) - { puts ("\nNative endian I/O :") ; - format_major = cpu_is_big_endian () ? SF_FORMAT_AIFF : SF_FORMAT_WAV ; - - calc_short_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; - calc_int_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; - calc_int_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_FLOAT , stats.read_rate, stats.write_rate) ; - } ; - - if (argc < 2 || strcmp ("--swap-only", argv [1]) == 0) - { puts ("\nEndian swapped I/O :") ; - format_major = cpu_is_big_endian () ? SF_FORMAT_WAV : SF_FORMAT_AIFF ; - - calc_short_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; - calc_int_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; - calc_int_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_FLOAT , stats.read_rate, stats.write_rate) ; - } ; - - puts ("") ; - - free (data) ; - - return 0 ; -} /* main */ - -/*============================================================================== -*/ - -static void -calc_raw_performance (PERF_STATS *stats) -{ clock_t start_clock, clock_time ; - int fd, k, byte_count, retval, op_count ; - const char *filename ; - - filename = "benchmark.dat" ; - - byte_count = BUFFER_SIZE * sizeof (short) ; - - /* Collect write stats */ - printf (" Raw write PCM_16 : ") ; - fflush (stdout) ; - - clock_time = 0 ; - op_count = 0 ; - start_clock = clock () ; - - while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) - { if ((fd = open (filename, WRITE_FLAGS, WRITE_PERMS)) < 0) - { printf ("Error : not able to open file : %s\n", filename) ; - perror ("") ; - exit (1) ; - } ; - - for (k = 0 ; k < BLOCK_COUNT ; k++) - { if ((retval = write (fd, data, byte_count)) != byte_count) - { printf ("Error : write returned %d (should have been %d)\n", retval, byte_count) ; - exit (1) ; - } ; - } ; - - close (fd) ; - - clock_time = clock () - start_clock ; - op_count ++ ; - } ; - - stats->write_rate = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; - stats->write_rate *= (1.0 * CLOCKS_PER_SEC) / clock_time ; - printf ("%10.0f samples per sec\n", stats->write_rate) ; - - /* Collect read stats */ - printf (" Raw read PCM_16 : ") ; - fflush (stdout) ; - - clock_time = 0 ; - op_count = 0 ; - start_clock = clock () ; - - while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) - { if ((fd = open (filename, READ_FLAGS)) < 0) - { printf ("Error : not able to open file : %s\n", filename) ; - perror ("") ; - exit (1) ; - } ; - - for (k = 0 ; k < BLOCK_COUNT ; k++) - { if ((retval = read (fd, data, byte_count)) != byte_count) - { printf ("Error : write returned %d (should have been %d)\n", retval, byte_count) ; - exit (1) ; - } ; - } ; - - close (fd) ; - - clock_time = clock () - start_clock ; - op_count ++ ; - } ; - - stats->read_rate = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; - stats->read_rate *= (1.0 * CLOCKS_PER_SEC) / clock_time ; - printf ("%10.0f samples per sec\n", stats->read_rate) ; - - unlink (filename) ; -} /* calc_raw_performance */ - -/*------------------------------------------------------------------------------ -*/ - -static void -calc_short_performance (int format, double read_rate, double write_rate) -{ SNDFILE *file ; - SF_INFO sfinfo ; - clock_t start_clock, clock_time ; - double performance ; - int k, item_count, retval, op_count ; - const char* subtype ; - short *short_data ; - const char *filename ; - - filename = "benchmark.dat" ; - subtype = get_subtype_str (format & SF_FORMAT_SUBMASK) ; - - short_data = data ; - item_count = BUFFER_SIZE ; - for (k = 0 ; k < item_count ; k++) - short_data [k] = 32700.0 * sin (2 * M_PI * k / 32000.0) ; - - /* Collect write stats */ - printf (" Write %-5s to %s : ", "short", subtype) ; - fflush (stdout) ; - - sfinfo.channels = 1 ; - sfinfo.format = format ; - sfinfo.frames = 1 ; - sfinfo.samplerate = 32000 ; - - clock_time = 0 ; - op_count = 0 ; - start_clock = clock () ; - - while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) - { if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) - { printf ("Error : not able to open file : %s\n", filename) ; - perror ("") ; - exit (1) ; - } ; - - /* Turn off the addition of a PEAK chunk. */ - sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; - - for (k = 0 ; k < BLOCK_COUNT ; k++) - { if ((retval = sf_write_short (file, short_data, item_count)) != item_count) - { printf ("Error : sf_write_short returned %d (should have been %d)\n", retval, item_count) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - clock_time = clock () - start_clock ; - op_count ++ ; - } ; - - performance = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; - performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; - printf ("%6.2f%% of raw write\n", 100.0 * performance / write_rate) ; - - /* Collect read stats */ - printf (" Read %-5s from %s : ", "short", subtype) ; - fflush (stdout) ; - - clock_time = 0 ; - op_count = 0 ; - start_clock = clock () ; - - while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) - { if (! (file = sf_open (filename, SFM_READ, &sfinfo))) - { printf ("Error : not able to open file : %s\n", filename) ; - perror ("") ; - exit (1) ; - } ; - - for (k = 0 ; k < BLOCK_COUNT ; k++) - { if ((retval = sf_read_short (file, short_data, item_count)) != item_count) - { printf ("Error : write returned %d (should have been %d)\n", retval, item_count) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - clock_time = clock () - start_clock ; - op_count ++ ; - } ; - - performance = (1.0 * item_count) * BLOCK_COUNT * op_count ; - performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; - printf ("%6.2f%% of raw read\n", 100.0 * performance / read_rate) ; - - unlink (filename) ; - -} /* calc_short_performance */ -static void -calc_int_performance (int format, double read_rate, double write_rate) -{ SNDFILE *file ; - SF_INFO sfinfo ; - clock_t start_clock, clock_time ; - double performance ; - int k, item_count, retval, op_count ; - const char* subtype ; - int *int_data ; - const char *filename ; - - filename = "benchmark.dat" ; - subtype = get_subtype_str (format & SF_FORMAT_SUBMASK) ; - - int_data = data ; - item_count = BUFFER_SIZE ; - for (k = 0 ; k < item_count ; k++) - int_data [k] = 32700.0 * (1<<16) * sin (2 * M_PI * k / 32000.0) ; - - /* Collect write stats */ - printf (" Write %-5s to %s : ", "int", subtype) ; - fflush (stdout) ; - - sfinfo.channels = 1 ; - sfinfo.format = format ; - sfinfo.frames = 1 ; - sfinfo.samplerate = 32000 ; - - clock_time = 0 ; - op_count = 0 ; - start_clock = clock () ; - - while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) - { if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) - { printf ("Error : not able to open file : %s\n", filename) ; - perror ("") ; - exit (1) ; - } ; - - /* Turn off the addition of a PEAK chunk. */ - sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; - - for (k = 0 ; k < BLOCK_COUNT ; k++) - { if ((retval = sf_write_int (file, int_data, item_count)) != item_count) - { printf ("Error : sf_write_short returned %d (should have been %d)\n", retval, item_count) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - clock_time = clock () - start_clock ; - op_count ++ ; - } ; - - performance = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; - performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; - printf ("%6.2f%% of raw write\n", 100.0 * performance / write_rate) ; - - /* Collect read stats */ - printf (" Read %-5s from %s : ", "int", subtype) ; - fflush (stdout) ; - - clock_time = 0 ; - op_count = 0 ; - start_clock = clock () ; - - while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) - { if (! (file = sf_open (filename, SFM_READ, &sfinfo))) - { printf ("Error : not able to open file : %s\n", filename) ; - perror ("") ; - exit (1) ; - } ; - - for (k = 0 ; k < BLOCK_COUNT ; k++) - { if ((retval = sf_read_int (file, int_data, item_count)) != item_count) - { printf ("Error : write returned %d (should have been %d)\n", retval, item_count) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - clock_time = clock () - start_clock ; - op_count ++ ; - } ; - - performance = (1.0 * item_count) * BLOCK_COUNT * op_count ; - performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; - printf ("%6.2f%% of raw read\n", 100.0 * performance / read_rate) ; - - unlink (filename) ; - -} /* calc_int_performance */ -static void -calc_float_performance (int format, double read_rate, double write_rate) -{ SNDFILE *file ; - SF_INFO sfinfo ; - clock_t start_clock, clock_time ; - double performance ; - int k, item_count, retval, op_count ; - const char* subtype ; - float *float_data ; - const char *filename ; - - filename = "benchmark.dat" ; - subtype = get_subtype_str (format & SF_FORMAT_SUBMASK) ; - - float_data = data ; - item_count = BUFFER_SIZE ; - for (k = 0 ; k < item_count ; k++) - float_data [k] = 1.0 * sin (2 * M_PI * k / 32000.0) ; - - /* Collect write stats */ - printf (" Write %-5s to %s : ", "float", subtype) ; - fflush (stdout) ; - - sfinfo.channels = 1 ; - sfinfo.format = format ; - sfinfo.frames = 1 ; - sfinfo.samplerate = 32000 ; - - clock_time = 0 ; - op_count = 0 ; - start_clock = clock () ; - - while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) - { if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) - { printf ("Error : not able to open file : %s\n", filename) ; - perror ("") ; - exit (1) ; - } ; - - /* Turn off the addition of a PEAK chunk. */ - sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; - - for (k = 0 ; k < BLOCK_COUNT ; k++) - { if ((retval = sf_write_float (file, float_data, item_count)) != item_count) - { printf ("Error : sf_write_short returned %d (should have been %d)\n", retval, item_count) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - clock_time = clock () - start_clock ; - op_count ++ ; - } ; - - performance = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; - performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; - printf ("%6.2f%% of raw write\n", 100.0 * performance / write_rate) ; - - /* Collect read stats */ - printf (" Read %-5s from %s : ", "float", subtype) ; - fflush (stdout) ; - - clock_time = 0 ; - op_count = 0 ; - start_clock = clock () ; - - while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) - { if (! (file = sf_open (filename, SFM_READ, &sfinfo))) - { printf ("Error : not able to open file : %s\n", filename) ; - perror ("") ; - exit (1) ; - } ; - - for (k = 0 ; k < BLOCK_COUNT ; k++) - { if ((retval = sf_read_float (file, float_data, item_count)) != item_count) - { printf ("Error : write returned %d (should have been %d)\n", retval, item_count) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - clock_time = clock () - start_clock ; - op_count ++ ; - } ; - - performance = (1.0 * item_count) * BLOCK_COUNT * op_count ; - performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; - printf ("%6.2f%% of raw read\n", 100.0 * performance / read_rate) ; - - unlink (filename) ; - -} /* calc_float_performance */ - - -/*============================================================================== -*/ - -static int -cpu_is_big_endian (void) -{ unsigned char *cptr ; - int endtest ; - - endtest = 0x12345678 ; - - cptr = (unsigned char*) (&endtest) ; - - if (cptr [0] == 0x12 && cptr [1] == 0x34 && cptr [3] == 0x78) - return SF_TRUE ; - - return SF_FALSE ; -} /* cpu_is_big_endian */ - -static const char* -get_subtype_str (int subtype) -{ switch (subtype) - { case SF_FORMAT_PCM_16 : - return "PCM_16" ; - - case SF_FORMAT_PCM_24 : - return "PCM_24" ; - - case SF_FORMAT_PCM_32 : - return "PCM_32" ; - - case SF_FORMAT_FLOAT : - return "FLOAT " ; - - case SF_FORMAT_DOUBLE : - return "DOUBLE" ; - - default : break ; - } ; - - return "UNKNOWN" ; -} /* get_subtype_str */ - diff --git a/libs/libsndfile/tests/benchmark.def b/libs/libsndfile/tests/benchmark.def deleted file mode 100644 index 382bf3b1a6..0000000000 --- a/libs/libsndfile/tests/benchmark.def +++ /dev/null @@ -1,17 +0,0 @@ -autogen definitions benchmark.tpl; - -data_type = { - type_name = short ; - multiplier = "32700.0" ; - }; - -data_type = { - type_name = int ; - multiplier = "32700.0 * (1 << 16)" ; - }; - -data_type = { - type_name = float ; - multiplier = "1.0" ; - }; - diff --git a/libs/libsndfile/tests/benchmark.tpl b/libs/libsndfile/tests/benchmark.tpl deleted file mode 100644 index 14b22e2e22..0000000000 --- a/libs/libsndfile/tests/benchmark.tpl +++ /dev/null @@ -1,360 +0,0 @@ -[+ AutoGen5 template c +] -/* -** Copyright (C) 2002-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if (HAVE_DECL_S_IRGRP == 0) -#include -#endif - -#include -#include -#include -#include -#include - -#include - -#ifndef M_PI -#define M_PI 3.14159265358979323846264338 -#endif - -/* -** Neat solution to the Win32/OS2 binary file flage requirement. -** If O_BINARY isn't already defined by the inclusion of the system -** headers, set it to zero. -*/ -#ifndef O_BINARY -#define O_BINARY 0 -#endif - -#define WRITE_FLAGS (O_WRONLY | O_CREAT | O_TRUNC | O_BINARY) -#define READ_FLAGS (O_RDONLY | O_BINARY) - -#if (defined (WIN32) || defined (_WIN32) || defined (__OS2__)) - #define WRITE_PERMS 0777 -#else - #define WRITE_PERMS (S_IRUSR | S_IWUSR | S_IRGRP) -#endif - -#define BUFFER_SIZE (1 << 18) -#define BLOCK_COUNT (30) -#define TEST_DURATION (5) /* 5 Seconds. */ - -typedef struct -{ double write_rate ; - double read_rate ; -} PERF_STATS ; - -static void *data = NULL ; - -static void calc_raw_performance (PERF_STATS *stats) ; - -[+ FOR data_type -+]static void calc_[+ (get "type_name") +]_performance (int format, double read_rate, double write_rate) ; -[+ ENDFOR data_type -+] - -static int cpu_is_big_endian (void) ; - -static const char* get_subtype_str (int subtype) ; - -int -main (int argc, char *argv []) -{ PERF_STATS stats ; - char buffer [256] = "Benchmarking " ; - int format_major ; - - if (! (data = malloc (BUFFER_SIZE * sizeof (double)))) - { perror ("Error : malloc failed") ; - exit (1) ; - } ; - - sf_command (NULL, SFC_GET_LIB_VERSION, buffer + strlen (buffer), sizeof (buffer) - strlen (buffer)) ; - - puts (buffer) ; - memset (buffer, '-', strlen (buffer)) ; - puts (buffer) ; - printf ("Each test takes a little over %d seconds.\n\n", TEST_DURATION) ; - - calc_raw_performance (&stats) ; - - if (argc < 2 || strcmp ("--native-only", argv [1]) == 0) - { puts ("\nNative endian I/O :") ; - format_major = cpu_is_big_endian () ? SF_FORMAT_AIFF : SF_FORMAT_WAV ; - - calc_short_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; - calc_int_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; - calc_int_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_FLOAT , stats.read_rate, stats.write_rate) ; - } ; - - if (argc < 2 || strcmp ("--swap-only", argv [1]) == 0) - { puts ("\nEndian swapped I/O :") ; - format_major = cpu_is_big_endian () ? SF_FORMAT_WAV : SF_FORMAT_AIFF ; - - calc_short_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; - calc_int_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; - calc_int_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; - calc_float_performance (format_major | SF_FORMAT_FLOAT , stats.read_rate, stats.write_rate) ; - } ; - - puts ("") ; - - free (data) ; - - return 0 ; -} /* main */ - -/*============================================================================== -*/ - -static void -calc_raw_performance (PERF_STATS *stats) -{ clock_t start_clock, clock_time ; - int fd, k, byte_count, retval, op_count ; - const char *filename ; - - filename = "benchmark.dat" ; - - byte_count = BUFFER_SIZE * sizeof (short) ; - - /* Collect write stats */ - printf (" Raw write PCM_16 : ") ; - fflush (stdout) ; - - clock_time = 0 ; - op_count = 0 ; - start_clock = clock () ; - - while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) - { if ((fd = open (filename, WRITE_FLAGS, WRITE_PERMS)) < 0) - { printf ("Error : not able to open file : %s\n", filename) ; - perror ("") ; - exit (1) ; - } ; - - for (k = 0 ; k < BLOCK_COUNT ; k++) - { if ((retval = write (fd, data, byte_count)) != byte_count) - { printf ("Error : write returned %d (should have been %d)\n", retval, byte_count) ; - exit (1) ; - } ; - } ; - - close (fd) ; - - clock_time = clock () - start_clock ; - op_count ++ ; - } ; - - stats->write_rate = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; - stats->write_rate *= (1.0 * CLOCKS_PER_SEC) / clock_time ; - printf ("%10.0f samples per sec\n", stats->write_rate) ; - - /* Collect read stats */ - printf (" Raw read PCM_16 : ") ; - fflush (stdout) ; - - clock_time = 0 ; - op_count = 0 ; - start_clock = clock () ; - - while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) - { if ((fd = open (filename, READ_FLAGS)) < 0) - { printf ("Error : not able to open file : %s\n", filename) ; - perror ("") ; - exit (1) ; - } ; - - for (k = 0 ; k < BLOCK_COUNT ; k++) - { if ((retval = read (fd, data, byte_count)) != byte_count) - { printf ("Error : write returned %d (should have been %d)\n", retval, byte_count) ; - exit (1) ; - } ; - } ; - - close (fd) ; - - clock_time = clock () - start_clock ; - op_count ++ ; - } ; - - stats->read_rate = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; - stats->read_rate *= (1.0 * CLOCKS_PER_SEC) / clock_time ; - printf ("%10.0f samples per sec\n", stats->read_rate) ; - - unlink (filename) ; -} /* calc_raw_performance */ - -/*------------------------------------------------------------------------------ -*/ - -[+ FOR data_type -+]static void -calc_[+ (get "type_name") +]_performance (int format, double read_rate, double write_rate) -{ SNDFILE *file ; - SF_INFO sfinfo ; - clock_t start_clock, clock_time ; - double performance ; - int k, item_count, retval, op_count ; - const char* subtype ; - [+ (get "type_name") +] *[+ (get "type_name") +]_data ; - const char *filename ; - - filename = "benchmark.dat" ; - subtype = get_subtype_str (format & SF_FORMAT_SUBMASK) ; - - [+ (get "type_name") +]_data = data ; - item_count = BUFFER_SIZE ; - for (k = 0 ; k < item_count ; k++) - [+ (get "type_name") +]_data [k] = [+ (get "multiplier") +] * sin (2 * M_PI * k / 32000.0) ; - - /* Collect write stats */ - printf (" Write %-5s to %s : ", "[+ (get "type_name") +]", subtype) ; - fflush (stdout) ; - - sfinfo.channels = 1 ; - sfinfo.format = format ; - sfinfo.frames = 1 ; - sfinfo.samplerate = 32000 ; - - clock_time = 0 ; - op_count = 0 ; - start_clock = clock () ; - - while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) - { if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) - { printf ("Error : not able to open file : %s\n", filename) ; - perror ("") ; - exit (1) ; - } ; - - /* Turn off the addition of a PEAK chunk. */ - sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; - - for (k = 0 ; k < BLOCK_COUNT ; k++) - { if ((retval = sf_write_[+ (get "type_name") +] (file, [+ (get "type_name") +]_data, item_count)) != item_count) - { printf ("Error : sf_write_short returned %d (should have been %d)\n", retval, item_count) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - clock_time = clock () - start_clock ; - op_count ++ ; - } ; - - performance = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; - performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; - printf ("%6.2f%% of raw write\n", 100.0 * performance / write_rate) ; - - /* Collect read stats */ - printf (" Read %-5s from %s : ", "[+ (get "type_name") +]", subtype) ; - fflush (stdout) ; - - clock_time = 0 ; - op_count = 0 ; - start_clock = clock () ; - - while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) - { if (! (file = sf_open (filename, SFM_READ, &sfinfo))) - { printf ("Error : not able to open file : %s\n", filename) ; - perror ("") ; - exit (1) ; - } ; - - for (k = 0 ; k < BLOCK_COUNT ; k++) - { if ((retval = sf_read_[+ (get "type_name") +] (file, [+ (get "type_name") +]_data, item_count)) != item_count) - { printf ("Error : write returned %d (should have been %d)\n", retval, item_count) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - clock_time = clock () - start_clock ; - op_count ++ ; - } ; - - performance = (1.0 * item_count) * BLOCK_COUNT * op_count ; - performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; - printf ("%6.2f%% of raw read\n", 100.0 * performance / read_rate) ; - - unlink (filename) ; - -} /* calc_[+ (get "type_name") +]_performance */ -[+ ENDFOR data_type -+] - -/*============================================================================== -*/ - -static int -cpu_is_big_endian (void) -{ unsigned char *cptr ; - int endtest ; - - endtest = 0x12345678 ; - - cptr = (unsigned char*) (&endtest) ; - - if (cptr [0] == 0x12 && cptr [1] == 0x34 && cptr [3] == 0x78) - return SF_TRUE ; - - return SF_FALSE ; -} /* cpu_is_big_endian */ - -static const char* -get_subtype_str (int subtype) -{ switch (subtype) - { case SF_FORMAT_PCM_16 : - return "PCM_16" ; - - case SF_FORMAT_PCM_24 : - return "PCM_24" ; - - case SF_FORMAT_PCM_32 : - return "PCM_32" ; - - case SF_FORMAT_FLOAT : - return "FLOAT " ; - - case SF_FORMAT_DOUBLE : - return "DOUBLE" ; - - default : break ; - } ; - - return "UNKNOWN" ; -} /* get_subtype_str */ - diff --git a/libs/libsndfile/tests/channel_test.c b/libs/libsndfile/tests/channel_test.c deleted file mode 100644 index 8a69734389..0000000000 --- a/libs/libsndfile/tests/channel_test.c +++ /dev/null @@ -1,134 +0,0 @@ -/* -** Copyright (C) 2001-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include - -#include "utils.h" - -#define BUFFER_LEN (1 << 10) -#define LOG_BUFFER_SIZE 1024 - -static void channel_test (void) ; -static double max_diff (const float *a, const float *b, int len) ; - -int -main (void) // int argc, char *argv []) -{ channel_test () ; - return 0 ; -} /* main */ - -/*============================================================================================ -** Here are the test functions. -*/ - -static void -channel_test (void) -{ static float float_data [1024] ; - static float read_float [1024] ; - static int read_int [1024] ; - static short read_short [1024] ; - unsigned int ch, k ; - - gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.9) ; - - for (ch = 1 ; ch <= 8 ; ch++) - { SNDFILE *file ; - SF_INFO wsfinfo, rsfinfo ; - sf_count_t wframes = ARRAY_LEN (float_data) / ch ; - double maxdiff ; - char filename [256] ; - - snprintf (filename, sizeof (filename), "chan_%d.wav", ch) ; - print_test_name (__func__, filename) ; - - sf_info_setup (&wsfinfo, SF_FORMAT_WAV | SF_FORMAT_FLOAT, 48000, ch) ; - sf_info_clear (&rsfinfo) ; - - /* Write the test file. */ - file = test_open_file_or_die (filename, SFM_WRITE, &wsfinfo, SF_FALSE, __LINE__) ; - test_writef_float_or_die (file, 0, float_data, wframes, __LINE__) ; - sf_close (file) ; - - /* Read it as float and test. */ - file = test_open_file_or_die (filename, SFM_READ, &rsfinfo, SF_FALSE, __LINE__) ; - exit_if_true (rsfinfo.frames == 0, - "\n\nLine %d : Frames in file %" PRId64 ".\n\n", __LINE__, rsfinfo.frames) ; - exit_if_true (wframes != rsfinfo.frames, - "\n\nLine %d : Wrote %" PRId64 ", read %" PRId64 " frames.\n\n", __LINE__, wframes, rsfinfo.frames) ; - - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - test_readf_float_or_die (file, 0, read_float, rsfinfo.frames, __LINE__) ; - compare_float_or_die (float_data, read_float, ch * rsfinfo.frames, __LINE__) ; - - /* Read it as short and test. */ - test_seek_or_die (file, 0, SEEK_SET, 0, ch, __LINE__) ; - test_readf_short_or_die (file, 0, read_short, rsfinfo.frames, __LINE__) ; - - for (k = 0 ; k < ARRAY_LEN (read_float) ; k++) - read_float [k] = read_short [k] * (0.9 / 0x8000) ; - - maxdiff = max_diff (float_data, read_float, ch * rsfinfo.frames) ; - exit_if_true (maxdiff > 0.5, "\n\nLine %d : Max diff is %f\n\n", __LINE__, maxdiff) ; - - /* Read it as int and test. */ - test_seek_or_die (file, 0, SEEK_SET, 0, ch, __LINE__) ; - test_readf_int_or_die (file, 0, read_int, rsfinfo.frames, __LINE__) ; - - for (k = 0 ; k < ARRAY_LEN (read_float) ; k++) - read_float [k] = read_int [k] * (0.9 / 0x80000000) ; - - maxdiff = max_diff (float_data, read_float, ch * rsfinfo.frames) ; - exit_if_true (maxdiff > 0.5, "\n\nLine %d : Max diff is %f\n\n", __LINE__, maxdiff) ; - - sf_close (file) ; - unlink (filename) ; - printf ("ok\n") ; - } ; - - return ; -} /* channel_test */ - -static double -max_diff (const float *a, const float *b, int len) -{ double mdiff = 0.0, diff ; - int k ; - - for (k = 0 ; k < len ; k++) - { diff = fabs (a [k] - b [k]) ; - mdiff = diff > mdiff ? diff : mdiff ; - // printf ("%4d: % f % f % f % f\n", k, a [k], b [k], diff, mdiff) ; - } ; - - return mdiff ; -} /* max_diff */ diff --git a/libs/libsndfile/tests/checksum_test.c b/libs/libsndfile/tests/checksum_test.c deleted file mode 100644 index 544da93408..0000000000 --- a/libs/libsndfile/tests/checksum_test.c +++ /dev/null @@ -1,128 +0,0 @@ -/* -** Copyright (C) 2008-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include - -#include "utils.h" - -#define SAMPLE_RATE 8000 - -typedef struct -{ int enc_fmt ; - - const char * enc_name ; - const char * dec_name ; - - uint64_t enc_cksum ; - uint64_t dec_cksum ; -} CHECKSUM ; - -static CHECKSUM -checksum_orig [] = -{ - { SF_FORMAT_RAW | SF_FORMAT_ULAW, - "checksum.ulaw", "cksum_ulaw.pcm16", - 0x33aefae029e0c888LL, 0x595cd6e47edd0cffLL - }, - { SF_FORMAT_RAW | SF_FORMAT_ALAW, - "checksum.alaw", "cksum_alaw.pcm16", - 0x48c798da3572d468LL, 0x6837d74869af5bb6LL - }, - { SF_FORMAT_RAW | SF_FORMAT_GSM610, - "checksum.gsm", "cksum_gsm.pcm16", - 0x1b1f64ff2acf858fLL, 0x504179dbadd4bce6LL - }, - { SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, - "checksum.vox", "cksum_vox.pcm16", - 0xf1147fb3a298f4dfLL, 0xfc9c0cb8b12cb0abLL - }, -} ; - -static void checksum_test (const CHECKSUM * cksum) ; - -static float orig [1 << 14] ; -static short data [1 << 14] ; - -int -main (void) -{ unsigned k ; - - gen_windowed_sine_float (orig, ARRAY_LEN (orig), 0.9) ; - - for (k = 0 ; k < ARRAY_LEN (checksum_orig) ; k++) - checksum_test (&checksum_orig [k]) ; - - return 0 ; -} /* main */ - -/*============================================================================== -*/ - -static void -checksum_test (const CHECKSUM * cksum) -{ SNDFILE * file ; - SF_INFO info ; - - print_test_name (__func__, cksum->enc_name) ; - - info.format = cksum->enc_fmt ; - info.channels = 1 ; - info.samplerate = SAMPLE_RATE ; - - file = test_open_file_or_die (cksum->enc_name, SFM_WRITE, &info, 0, __LINE__) ; - test_write_float_or_die (file, 0, orig, ARRAY_LEN (orig), __LINE__) ; - sf_close (file) ; - - check_file_hash_or_die (cksum->enc_name, cksum->enc_cksum, __LINE__) ; - puts ("ok") ; - - /*------------------------------------------------------------------------*/ - - print_test_name (__func__, cksum->dec_name) ; - - info.format = cksum->enc_fmt ; - info.channels = 1 ; - info.samplerate = SAMPLE_RATE ; - - file = test_open_file_or_die (cksum->enc_name, SFM_READ, &info, 0, __LINE__) ; - test_read_short_or_die (file, 0, data, ARRAY_LEN (data), __LINE__) ; - sf_close (file) ; - - info.format = SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16 ; - info.channels = 1 ; - info.samplerate = SAMPLE_RATE ; - - file = test_open_file_or_die (cksum->dec_name, SFM_WRITE, &info, 0, __LINE__) ; - test_write_short_or_die (file, 0, data, ARRAY_LEN (data), __LINE__) ; - sf_close (file) ; - - check_file_hash_or_die (cksum->dec_name, cksum->dec_cksum, __LINE__) ; - - remove (cksum->enc_name) ; - remove (cksum->dec_name) ; - - puts ("ok") ; -} /* checksum_test */ - diff --git a/libs/libsndfile/tests/chunk_test.c b/libs/libsndfile/tests/chunk_test.c deleted file mode 100644 index 5a036b1e07..0000000000 --- a/libs/libsndfile/tests/chunk_test.c +++ /dev/null @@ -1,293 +0,0 @@ -/* -** Copyright (C) 2003-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_LEN (1 << 10) -#define LOG_BUFFER_SIZE 1024 - -static void chunk_test (const char *filename, int format) ; - -static void -chunk_test_helper (const char *filename, int format, const char * testdata) ; - -int -main (int argc, char *argv []) -{ int do_all = 0 ; - int test_count = 0 ; - - if (argc != 2) - { printf ("Usage : %s \n", argv [0]) ; - printf (" Where is one of the following:\n") ; - printf (" wav - test adding chunks to WAV files\n") ; - printf (" aiff - test adding chunks to AIFF files\n") ; - printf (" all - perform all tests\n") ; - exit (1) ; - } ; - - do_all = ! strcmp (argv [1], "all") ; - - if (do_all || ! strcmp (argv [1], "wav")) - { chunk_test ("chunks_pcm16.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - chunk_test ("chunks_pcm16.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - chunk_test ("chunks_pcm16.wavex", SF_FORMAT_WAVEX | SF_FORMAT_PCM_16) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "aiff")) - { chunk_test ("chunks_pcm16.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "caf")) - { chunk_test ("chunks_pcm16.caf", SF_FORMAT_CAF | SF_FORMAT_PCM_16) ; - chunk_test ("chunks_alac.caf", SF_FORMAT_CAF | SF_FORMAT_ALAC_16) ; - test_count++ ; - } ; - - if (test_count == 0) - { printf ("Mono : ************************************\n") ; - printf ("Mono : * No '%s' test defined.\n", argv [1]) ; - printf ("Mono : ************************************\n") ; - return 1 ; - } ; - - return 0 ; -} /* main */ - - -/*============================================================================================ -** Here are the test functions. -*/ - -static void -chunk_test_helper (const char *filename, int format, const char * testdata) -{ SNDFILE *file ; - SF_INFO sfinfo ; - SF_CHUNK_INFO chunk_info ; - SF_CHUNK_ITERATOR * iterator ; - uint32_t length_before ; - int err, allow_fd ; - - switch (format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_ALAC_16 : - allow_fd = SF_FALSE ; - break ; - default : - allow_fd = SF_TRUE ; - break ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - sfinfo.format = format ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - /* Set up the chunk to write. */ - memset (&chunk_info, 0, sizeof (chunk_info)) ; - snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ; - chunk_info.id_size = 4 ; - chunk_info.data = strdup (testdata) ; - chunk_info.datalen = strlen (chunk_info.data) ; - - length_before = chunk_info.datalen ; - - err = sf_set_chunk (file, &chunk_info) ; - exit_if_true ( - err != SF_ERR_NO_ERROR, - "\n\nLine %d : sf_set_chunk returned for testdata '%s' : %s\n\n", __LINE__, testdata, sf_error_number (err) - ) ; - - memset (chunk_info.data, 0, chunk_info.datalen) ; - free (chunk_info.data) ; - - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - memset (&chunk_info, 0, sizeof (chunk_info)) ; - snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ; - chunk_info.id_size = 4 ; - - iterator = sf_get_chunk_iterator (file, &chunk_info) ; - err = sf_get_chunk_size (iterator, &chunk_info) ; - exit_if_true ( - err != SF_ERR_NO_ERROR, - "\n\nLine %d : sf_get_chunk_size returned for testdata '%s' : %s\n\n", __LINE__, testdata, sf_error_number (err) - ) ; - - exit_if_true ( - length_before > chunk_info.datalen || chunk_info.datalen - length_before > 4, - "\n\nLine %d : testdata '%s' : Bad chunk length %u (previous length %u)\n\n", __LINE__, testdata, chunk_info.datalen, length_before - ) ; - - chunk_info.data = malloc (chunk_info.datalen) ; - err = sf_get_chunk_data (iterator, &chunk_info) ; - exit_if_true ( - err != SF_ERR_NO_ERROR, - "\n\nLine %d : sf_get_chunk_size returned for testdata '%s' : %s\n\n", __LINE__, testdata, sf_error_number (err) - ) ; - - exit_if_true ( - memcmp (testdata, chunk_info.data, length_before), - "\n\nLine %d : Data compare failed.\n %s\n %s\n\n", __LINE__, testdata, (char*) chunk_info.data - ) ; - - free (chunk_info.data) ; - - sf_close (file) ; - unlink (filename) ; -} /* chunk_test_helper */ - -static void -multichunk_test_helper (const char *filename, int format, const char * testdata [], size_t testdata_len) -{ SNDFILE *file ; - SF_INFO sfinfo ; - SF_CHUNK_INFO chunk_info ; - SF_CHUNK_ITERATOR * iterator ; - uint32_t length_before [testdata_len] ; - int err, allow_fd ; - size_t i ; - - sfinfo.samplerate = 44100 ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - sfinfo.format = format ; - - switch (format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_ALAC_16 : - allow_fd = SF_FALSE ; - break ; - default : - allow_fd = SF_TRUE ; - break ; - } ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - /* Set up the chunk to write. */ - for (i = 0 ; i < testdata_len ; i++) - { memset (&chunk_info, 0, sizeof (chunk_info)) ; - snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ; - chunk_info.id_size = 4 ; - - chunk_info.data = strdup (testdata [i]) ; - chunk_info.datalen = strlen (chunk_info.data) ; - - length_before [i] = chunk_info.datalen ; - - err = sf_set_chunk (file, &chunk_info) ; - exit_if_true ( - err != SF_ERR_NO_ERROR, - "\n\nLine %d : sf_set_chunk returned for testdata[%d] '%s' : %s\n\n", __LINE__, (int) i, testdata [i], sf_error_number (err) - ) ; - - memset (chunk_info.data, 0, chunk_info.datalen) ; - free (chunk_info.data) ; - } - - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - memset (&chunk_info, 0, sizeof (chunk_info)) ; - snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ; - chunk_info.id_size = 4 ; - - iterator = sf_get_chunk_iterator (file, &chunk_info) ; - - i = 0 ; - while (iterator) - { memset (&chunk_info, 0, sizeof (chunk_info)) ; - err = sf_get_chunk_size (iterator, &chunk_info) ; - exit_if_true ( - i > testdata_len, - "\n\nLine %d : iterated to chunk #%d, but only %d chunks have been written\n\n", __LINE__, (int) i, (int) testdata_len - ) ; - - exit_if_true ( - err != SF_ERR_NO_ERROR, - "\n\nLine %d : sf_get_chunk_size returned for testdata[%d] '%s' : %s\n\n", __LINE__, (int) i, testdata [i], sf_error_number (err) - ) ; - - exit_if_true ( - length_before [i] > chunk_info.datalen || chunk_info.datalen - length_before [i] > 4, - "\n\nLine %d : testdata[%d] '%s' : Bad chunk length %u (previous length %u)\n\n", __LINE__, (int) i, testdata [i], chunk_info.datalen, length_before [i] - ) ; - - chunk_info.data = malloc (chunk_info.datalen) ; - err = sf_get_chunk_data (iterator, &chunk_info) ; - exit_if_true ( - err != SF_ERR_NO_ERROR, - "\n\nLine %d : sf_get_chunk_size returned for testdata[%d] '%s' : %s\n\n", __LINE__, (int) i, testdata [i], sf_error_number (err) - ) ; - - exit_if_true ( - 4 != chunk_info.id_size, - "\n\nLine %d : testdata[%d] : Bad ID length %u (previous length %u)\n\n", __LINE__, (int) i, chunk_info.id_size, 4 - ) ; - exit_if_true ( - memcmp ("Test", chunk_info.id, 4), - "\n\nLine %d : ID compare failed at %d.\n %s\n %s\n\n", __LINE__, (int) i, "Test", (char*) chunk_info.id - ) ; - - exit_if_true ( - memcmp (testdata [i], chunk_info.data, length_before [i]), - "\n\nLine %d : Data compare failed at %d.\n %s\n %s\n\n", __LINE__, (int) i, testdata [i], (char*) chunk_info.data - ) ; - - free (chunk_info.data) ; - iterator = sf_next_chunk_iterator (iterator) ; - i++ ; - } - - sf_close (file) ; - unlink (filename) ; -} /* multichunk_test_helper */ - - -static void -chunk_test (const char *filename, int format) -{ const char* testdata [] = - { "There can be only one.", "", "A", "AB", "ABC", "ABCD", "ABCDE" } ; - uint32_t k ; - - print_test_name (__func__, filename) ; - - for (k = 0 ; k < ARRAY_LEN (testdata) ; k++) - chunk_test_helper (filename, format, testdata [k]) ; - - multichunk_test_helper (filename, format, testdata, ARRAY_LEN (testdata)) ; - - puts ("ok") ; -} /* chunk_test */ diff --git a/libs/libsndfile/tests/command_test.c b/libs/libsndfile/tests/command_test.c deleted file mode 100644 index 9e6bfd485b..0000000000 --- a/libs/libsndfile/tests/command_test.c +++ /dev/null @@ -1,1570 +0,0 @@ -/* -** Copyright (C) 2001-2013 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include - -#include "utils.h" - -#define BUFFER_LEN (1 << 10) -#define LOG_BUFFER_SIZE 1024 - -static void float_norm_test (const char *filename) ; -static void double_norm_test (const char *filename) ; -static void format_tests (void) ; -static void calc_peak_test (int filetype, const char *filename) ; -static void truncate_test (const char *filename, int filetype) ; -static void instrument_test (const char *filename, int filetype) ; -static void channel_map_test (const char *filename, int filetype) ; -static void current_sf_info_test (const char *filename) ; -static void raw_needs_endswap_test (const char *filename, int filetype) ; - -static void broadcast_test (const char *filename, int filetype) ; -static void broadcast_rdwr_test (const char *filename, int filetype) ; -static void broadcast_coding_history_test (const char *filename) ; -static void broadcast_coding_history_size (const char *filename) ; - -/* Cart Chunk tests */ -static void cart_test (const char *filename, int filetype) ; -static void cart_rdwr_test (const char *filename, int filetype) ; - -/* Force the start of this buffer to be double aligned. Sparc-solaris will -** choke if its not. -*/ - -static int int_data [BUFFER_LEN] ; -static float float_data [BUFFER_LEN] ; -static double double_data [BUFFER_LEN] ; - -int -main (int argc, char *argv []) -{ int do_all = 0 ; - int test_count = 0 ; - - if (argc != 2) - { printf ("Usage : %s \n", argv [0]) ; - printf (" Where is one of the following:\n") ; - printf (" ver - test sf_command (SFC_GETLIB_VERSION)\n") ; - printf (" norm - test floating point normalisation\n") ; - printf (" format - test format string commands\n") ; - printf (" peak - test peak calculation\n") ; - printf (" trunc - test file truncation\n") ; - printf (" inst - test set/get of SF_INSTRUMENT.\n") ; - printf (" chanmap - test set/get of channel map data..\n") ; - printf (" bext - test set/get of SF_BROADCAST_INFO.\n") ; - printf (" bextch - test set/get of SF_BROADCAST_INFO coding_history.\n") ; - printf (" cart - test set/get of SF_CART_INFO.\n") ; - printf (" rawend - test SFC_RAW_NEEDS_ENDSWAP.\n") ; - printf (" all - perform all tests\n") ; - exit (1) ; - } ; - - do_all = ! strcmp (argv [1], "all") ; - - if (do_all || strcmp (argv [1], "ver") == 0) - { char buffer [128] ; - - print_test_name ("version_test", "(none)") ; - buffer [0] = 0 ; - sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ; - if (strlen (buffer) < 1) - { printf ("Line %d: could not retrieve lib version.\n", __LINE__) ; - exit (1) ; - } ; - puts ("ok") ; - test_count ++ ; - } ; - - if (do_all || strcmp (argv [1], "norm") == 0) - { /* Preliminary float/double normalisation tests. More testing - ** is done in the program 'floating_point_test'. - */ - float_norm_test ("float.wav") ; - double_norm_test ("double.wav") ; - test_count ++ ; - } ; - - if (do_all || strcmp (argv [1], "peak") == 0) - { calc_peak_test (SF_ENDIAN_BIG | SF_FORMAT_RAW, "be-peak.raw") ; - calc_peak_test (SF_ENDIAN_LITTLE | SF_FORMAT_RAW, "le-peak.raw") ; - test_count ++ ; - } ; - - if (do_all || ! strcmp (argv [1], "format")) - { format_tests () ; - test_count ++ ; - } ; - - if (do_all || strcmp (argv [1], "trunc") == 0) - { truncate_test ("truncate.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_32) ; - truncate_test ("truncate.au" , SF_FORMAT_AU | SF_FORMAT_PCM_16) ; - test_count ++ ; - } ; - - if (do_all || strcmp (argv [1], "inst") == 0) - { instrument_test ("instrument.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - instrument_test ("instrument.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_24) ; - /*-instrument_test ("instrument.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16) ;-*/ - test_count ++ ; - } ; - - if (do_all || strcmp (argv [1], "current_sf_info") == 0) - { current_sf_info_test ("current.wav") ; - test_count ++ ; - } ; - - if (do_all || strcmp (argv [1], "bext") == 0) - { broadcast_test ("broadcast.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - broadcast_rdwr_test ("broadcast.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - - broadcast_test ("broadcast.wavex", SF_FORMAT_WAVEX | SF_FORMAT_PCM_16) ; - broadcast_rdwr_test ("broadcast.wavex", SF_FORMAT_WAVEX | SF_FORMAT_PCM_16) ; - - broadcast_test ("broadcast.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; - broadcast_rdwr_test ("broadcast.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; - test_count ++ ; - } ; - - if (do_all || strcmp (argv [1], "cart") == 0) - { cart_test ("cart.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - cart_rdwr_test ("cart.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - cart_test ("cart.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; - cart_rdwr_test ("cart.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; - test_count ++ ; - } ; - - if (do_all || strcmp (argv [1], "bextch") == 0) - { broadcast_coding_history_test ("coding_history.wav") ; - broadcast_coding_history_size ("coding_hist_size.wav") ; - test_count ++ ; - } ; - - if (do_all || strcmp (argv [1], "chanmap") == 0) - { channel_map_test ("chanmap.wavex", SF_FORMAT_WAVEX | SF_FORMAT_PCM_16) ; - channel_map_test ("chanmap.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; - channel_map_test ("chanmap.aifc" , SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ; - channel_map_test ("chanmap.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_16) ; - test_count ++ ; - } ; - - if (do_all || strcmp (argv [1], "rawend") == 0) - { raw_needs_endswap_test ("raw_end.wav", SF_FORMAT_WAV) ; - raw_needs_endswap_test ("raw_end.wavex", SF_FORMAT_WAVEX) ; - raw_needs_endswap_test ("raw_end.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ; - raw_needs_endswap_test ("raw_end.aiff", SF_FORMAT_AIFF) ; - raw_needs_endswap_test ("raw_end.aiff_le", SF_ENDIAN_LITTLE | SF_FORMAT_AIFF) ; - test_count ++ ; - } ; - - if (test_count == 0) - { printf ("Mono : ************************************\n") ; - printf ("Mono : * No '%s' test defined.\n", argv [1]) ; - printf ("Mono : ************************************\n") ; - return 1 ; - } ; - - return 0 ; -} /* main */ - -/*============================================================================================ -** Here are the test functions. -*/ - -static void -float_norm_test (const char *filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - unsigned int k ; - - print_test_name ("float_norm_test", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = (SF_FORMAT_RAW | SF_FORMAT_PCM_16) ; - sfinfo.channels = 1 ; - sfinfo.frames = BUFFER_LEN ; - - /* Create float_data with all values being less than 1.0. */ - for (k = 0 ; k < BUFFER_LEN / 2 ; k++) - float_data [k] = (k + 5) / (2.0 * BUFFER_LEN) ; - for (k = BUFFER_LEN / 2 ; k < BUFFER_LEN ; k++) - float_data [k] = (k + 5) ; - - if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) - { printf ("Line %d: sf_open_write failed with error : ", __LINE__) ; - fflush (stdout) ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - /* Normalisation is on by default so no need to do anything here. */ - - if ((k = sf_write_float (file, float_data, BUFFER_LEN / 2)) != BUFFER_LEN / 2) - { printf ("Line %d: sf_write_float failed with short write (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; - exit (1) ; - } ; - - /* Turn normalisation off. */ - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - if ((k = sf_write_float (file, float_data + BUFFER_LEN / 2, BUFFER_LEN / 2)) != BUFFER_LEN / 2) - { printf ("Line %d: sf_write_float failed with short write (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* sfinfo struct should still contain correct data. */ - if (! (file = sf_open (filename, SFM_READ, &sfinfo))) - { printf ("Line %d: sf_open_read failed with error : ", __LINE__) ; - fflush (stdout) ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - if (sfinfo.format != (SF_FORMAT_RAW | SF_FORMAT_PCM_16)) - { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, (SF_FORMAT_RAW | SF_FORMAT_PCM_16), sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_LEN) - { printf ("\n\nLine %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_LEN, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - /* Read float_data and check that it is normalised (ie default). */ - if ((k = sf_read_float (file, float_data, BUFFER_LEN)) != BUFFER_LEN) - { printf ("\n\nLine %d: sf_read_float failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; - exit (1) ; - } ; - - for (k = 0 ; k < BUFFER_LEN ; k++) - if (float_data [k] >= 1.0) - { printf ("\n\nLine %d: float_data [%d] == %f which is greater than 1.0\n", __LINE__, k, float_data [k]) ; - exit (1) ; - } ; - - /* Seek to start of file, turn normalisation off, read float_data and check again. */ - sf_seek (file, 0, SEEK_SET) ; - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - if ((k = sf_read_float (file, float_data, BUFFER_LEN)) != BUFFER_LEN) - { printf ("\n\nLine %d: sf_read_float failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; - exit (1) ; - } ; - - for (k = 0 ; k < BUFFER_LEN ; k++) - if (float_data [k] < 1.0) - { printf ("\n\nLine %d: float_data [%d] == %f which is less than 1.0\n", __LINE__, k, float_data [k]) ; - exit (1) ; - } ; - - /* Seek to start of file, turn normalisation on, read float_data and do final check. */ - sf_seek (file, 0, SEEK_SET) ; - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_TRUE) ; - - if ((k = sf_read_float (file, float_data, BUFFER_LEN)) != BUFFER_LEN) - { printf ("\n\nLine %d: sf_read_float failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; - exit (1) ; - } ; - - for (k = 0 ; k < BUFFER_LEN ; k++) - if (float_data [k] > 1.0) - { printf ("\n\nLine %d: float_data [%d] == %f which is greater than 1.0\n", __LINE__, k, float_data [k]) ; - exit (1) ; - } ; - - - sf_close (file) ; - - unlink (filename) ; - - printf ("ok\n") ; -} /* float_norm_test */ - -static void -double_norm_test (const char *filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - unsigned int k ; - - print_test_name ("double_norm_test", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = (SF_FORMAT_RAW | SF_FORMAT_PCM_16) ; - sfinfo.channels = 1 ; - sfinfo.frames = BUFFER_LEN ; - - /* Create double_data with all values being less than 1.0. */ - for (k = 0 ; k < BUFFER_LEN / 2 ; k++) - double_data [k] = (k + 5) / (2.0 * BUFFER_LEN) ; - for (k = BUFFER_LEN / 2 ; k < BUFFER_LEN ; k++) - double_data [k] = (k + 5) ; - - if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) - { printf ("Line %d: sf_open_write failed with error : ", __LINE__) ; - fflush (stdout) ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - /* Normailsation is on by default so no need to do anything here. */ - /*-sf_command (file, "set-norm-double", "true", 0) ;-*/ - - if ((k = sf_write_double (file, double_data, BUFFER_LEN / 2)) != BUFFER_LEN / 2) - { printf ("Line %d: sf_write_double failed with short write (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; - exit (1) ; - } ; - - /* Turn normalisation off. */ - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - if ((k = sf_write_double (file, double_data + BUFFER_LEN / 2, BUFFER_LEN / 2)) != BUFFER_LEN / 2) - { printf ("Line %d: sf_write_double failed with short write (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; - exit (1) ; - } ; - - sf_close (file) ; - - if (! (file = sf_open (filename, SFM_READ, &sfinfo))) - { printf ("Line %d: sf_open_read failed with error : ", __LINE__) ; - fflush (stdout) ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - if (sfinfo.format != (SF_FORMAT_RAW | SF_FORMAT_PCM_16)) - { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, (SF_FORMAT_RAW | SF_FORMAT_PCM_16), sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_LEN) - { printf ("\n\nLine %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_LEN, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - /* Read double_data and check that it is normalised (ie default). */ - if ((k = sf_read_double (file, double_data, BUFFER_LEN)) != BUFFER_LEN) - { printf ("\n\nLine %d: sf_read_double failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; - exit (1) ; - } ; - - for (k = 0 ; k < BUFFER_LEN ; k++) - if (double_data [k] >= 1.0) - { printf ("\n\nLine %d: double_data [%d] == %f which is greater than 1.0\n", __LINE__, k, double_data [k]) ; - exit (1) ; - } ; - - /* Seek to start of file, turn normalisation off, read double_data and check again. */ - sf_seek (file, 0, SEEK_SET) ; - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - if ((k = sf_read_double (file, double_data, BUFFER_LEN)) != BUFFER_LEN) - { printf ("\n\nLine %d: sf_read_double failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; - exit (1) ; - } ; - - for (k = 0 ; k < BUFFER_LEN ; k++) - if (double_data [k] < 1.0) - { printf ("\n\nLine %d: double_data [%d] == %f which is less than 1.0\n", __LINE__, k, double_data [k]) ; - exit (1) ; - } ; - - /* Seek to start of file, turn normalisation on, read double_data and do final check. */ - sf_seek (file, 0, SEEK_SET) ; - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_TRUE) ; - - if ((k = sf_read_double (file, double_data, BUFFER_LEN)) != BUFFER_LEN) - { printf ("\n\nLine %d: sf_read_double failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; - exit (1) ; - } ; - - for (k = 0 ; k < BUFFER_LEN ; k++) - if (double_data [k] > 1.0) - { printf ("\n\nLine %d: double_data [%d] == %f which is greater than 1.0\n", __LINE__, k, double_data [k]) ; - exit (1) ; - } ; - - - sf_close (file) ; - - unlink (filename) ; - - printf ("ok\n") ; -} /* double_norm_test */ - -static void -format_tests (void) -{ SF_FORMAT_INFO format_info ; - SF_INFO sfinfo ; - const char *last_name ; - int k, count ; - - print_test_name ("format_tests", "(null)") ; - - /* Clear out SF_INFO struct and set channels > 0. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.channels = 1 ; - - /* First test simple formats. */ - - sf_command (NULL, SFC_GET_SIMPLE_FORMAT_COUNT, &count, sizeof (int)) ; - - if (count < 0 || count > 30) - { printf ("Line %d: Weird count.\n", __LINE__) ; - exit (1) ; - } ; - - format_info.format = 0 ; - sf_command (NULL, SFC_GET_SIMPLE_FORMAT, &format_info, sizeof (format_info)) ; - - last_name = format_info.name ; - for (k = 1 ; k < count ; k ++) - { format_info.format = k ; - sf_command (NULL, SFC_GET_SIMPLE_FORMAT, &format_info, sizeof (format_info)) ; - if (strcmp (last_name, format_info.name) >= 0) - { printf ("\n\nLine %d: format names out of sequence `%s' < `%s'.\n", __LINE__, last_name, format_info.name) ; - exit (1) ; - } ; - sfinfo.format = format_info.format ; - - if (! sf_format_check (&sfinfo)) - { printf ("\n\nLine %d: sf_format_check failed.\n", __LINE__) ; - printf (" Name : %s\n", format_info.name) ; - printf (" Format : 0x%X\n", sfinfo.format) ; - printf (" Channels : 0x%X\n", sfinfo.channels) ; - printf (" Sample Rate : 0x%X\n", sfinfo.samplerate) ; - exit (1) ; - } ; - last_name = format_info.name ; - } ; - format_info.format = 666 ; - sf_command (NULL, SFC_GET_SIMPLE_FORMAT, &format_info, sizeof (format_info)) ; - - /* Now test major formats. */ - sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof (int)) ; - - if (count < 0 || count > 30) - { printf ("Line %d: Weird count.\n", __LINE__) ; - exit (1) ; - } ; - - format_info.format = 0 ; - sf_command (NULL, SFC_GET_FORMAT_MAJOR, &format_info, sizeof (format_info)) ; - - last_name = format_info.name ; - for (k = 1 ; k < count ; k ++) - { format_info.format = k ; - sf_command (NULL, SFC_GET_FORMAT_MAJOR, &format_info, sizeof (format_info)) ; - if (strcmp (last_name, format_info.name) >= 0) - { printf ("\n\nLine %d: format names out of sequence (%d) `%s' < `%s'.\n", __LINE__, k, last_name, format_info.name) ; - exit (1) ; - } ; - - last_name = format_info.name ; - } ; - format_info.format = 666 ; - sf_command (NULL, SFC_GET_FORMAT_MAJOR, &format_info, sizeof (format_info)) ; - - /* Now test subtype formats. */ - sf_command (NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int)) ; - - if (count < 0 || count > 30) - { printf ("Line %d: Weird count.\n", __LINE__) ; - exit (1) ; - } ; - - format_info.format = 0 ; - sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)) ; - - last_name = format_info.name ; - for (k = 1 ; k < count ; k ++) - { format_info.format = k ; - sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)) ; - } ; - format_info.format = 666 ; - sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)) ; - - - printf ("ok\n") ; -} /* format_tests */ - -static void -calc_peak_test (int filetype, const char *filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, format ; - double peak ; - - print_test_name ("calc_peak_test", filename) ; - - format = (filetype | SF_FORMAT_PCM_16) ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = format ; - sfinfo.channels = 1 ; - sfinfo.frames = BUFFER_LEN ; - - /* Create double_data with max value of 0.5. */ - for (k = 0 ; k < BUFFER_LEN ; k++) - double_data [k] = (k + 1) / (2.0 * BUFFER_LEN) ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; - - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != format) - { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_LEN) - { printf ("\n\nLine %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_LEN, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - sf_command (file, SFC_CALC_SIGNAL_MAX, &peak, sizeof (peak)) ; - if (fabs (peak - (1 << 14)) > 1.0) - { printf ("Line %d : Peak value should be %d (is %f).\n", __LINE__, (1 << 14), peak) ; - exit (1) ; - } ; - - sf_command (file, SFC_CALC_NORM_SIGNAL_MAX, &peak, sizeof (peak)) ; - if (fabs (peak - 0.5) > 4e-5) - { printf ("Line %d : Peak value should be %f (is %f).\n", __LINE__, 0.5, peak) ; - exit (1) ; - } ; - - sf_close (file) ; - - format = (filetype | SF_FORMAT_FLOAT) ; - sfinfo.samplerate = 44100 ; - sfinfo.format = format ; - sfinfo.channels = 1 ; - sfinfo.frames = BUFFER_LEN ; - - /* Create double_data with max value of 0.5. */ - for (k = 0 ; k < BUFFER_LEN ; k++) - double_data [k] = (k + 1) / (2.0 * BUFFER_LEN) ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; - - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != format) - { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_LEN) - { printf ("\n\nLine %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_LEN, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - sf_command (file, SFC_CALC_SIGNAL_MAX, &peak, sizeof (peak)) ; - if (fabs (peak - 0.5) > 1e-5) - { printf ("Line %d : Peak value should be %f (is %f).\n", __LINE__, 0.5, peak) ; - exit (1) ; - } ; - - sf_command (file, SFC_CALC_NORM_SIGNAL_MAX, &peak, sizeof (peak)) ; - if (fabs (peak - 0.5) > 1e-5) - { printf ("Line %d : Peak value should be %f (is %f).\n", __LINE__, 0.5, peak) ; - exit (1) ; - } ; - - sf_close (file) ; - - unlink (filename) ; - - printf ("ok\n") ; -} /* calc_peak_test */ - -static void -truncate_test (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - sf_count_t len ; - - print_test_name ("truncate_test", filename) ; - - sfinfo.samplerate = 11025 ; - sfinfo.format = filetype ; - sfinfo.channels = 2 ; - - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; - - test_write_int_or_die (file, 0, int_data, BUFFER_LEN, __LINE__) ; - - len = 100 ; - if (sf_command (file, SFC_FILE_TRUNCATE, &len, sizeof (len))) - { printf ("Line %d: sf_command (SFC_FILE_TRUNCATE) returned error.\n", __LINE__) ; - exit (1) ; - } ; - - test_seek_or_die (file, 0, SEEK_CUR, len, 2, __LINE__) ; - test_seek_or_die (file, 0, SEEK_END, len, 2, __LINE__) ; - - sf_close (file) ; - - unlink (filename) ; - puts ("ok") ; -} /* truncate_test */ - -/*------------------------------------------------------------------------------ -*/ - -static void -instrumet_rw_test (const char *filename) -{ SNDFILE *sndfile ; - SF_INFO sfinfo ; - SF_INSTRUMENT inst ; - memset (&sfinfo, 0, sizeof (SF_INFO)) ; - - sndfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ; - - if (sf_command (sndfile, SFC_GET_INSTRUMENT, &inst, sizeof (inst)) == SF_TRUE) - { inst.basenote = 22 ; - - if (sf_command (sndfile, SFC_SET_INSTRUMENT, &inst, sizeof (inst)) == SF_TRUE) - printf ("Sucess: [%s] updated\n", filename) ; - else - printf ("Error: SFC_SET_INSTRUMENT on [%s] [%s]\n", filename, sf_strerror (sndfile)) ; - } - else - printf ("Error: SFC_GET_INSTRUMENT on [%s] [%s]\n", filename, sf_strerror (sndfile)) ; - - - if (sf_command (sndfile, SFC_UPDATE_HEADER_NOW, NULL, 0) != 0) - printf ("Error: SFC_UPDATE_HEADER_NOW on [%s] [%s]\n", filename, sf_strerror (sndfile)) ; - - sf_write_sync (sndfile) ; - sf_close (sndfile) ; - - return ; -} /* instrumet_rw_test */ - -static void -instrument_test (const char *filename, int filetype) -{ static SF_INSTRUMENT write_inst = - { 2, /* gain */ - 3, /* detune */ - 4, /* basenote */ - 5, 6, /* key low and high */ - 7, 8, /* velocity low and high */ - 2, /* loop_count */ - { { 801, 2, 3, 0 }, - { 801, 3, 4, 0 }, - } - } ; - SF_INSTRUMENT read_inst ; - SNDFILE *file ; - SF_INFO sfinfo ; - - print_test_name ("instrument_test", filename) ; - - sfinfo.samplerate = 11025 ; - sfinfo.format = filetype ; - sfinfo.channels = 1 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - if (sf_command (file, SFC_SET_INSTRUMENT, &write_inst, sizeof (write_inst)) == SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_SET_INSTRUMENT) failed.\n\n", __LINE__) ; - exit (1) ; - } ; - test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; - sf_close (file) ; - - memset (&read_inst, 0, sizeof (read_inst)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - if (sf_command (file, SFC_GET_INSTRUMENT, &read_inst, sizeof (read_inst)) == SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_GET_INSTRUMENT) failed.\n\n", __LINE__) ; - exit (1) ; - return ; - } ; - check_log_buffer_or_die (file, __LINE__) ; - sf_close (file) ; - - if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV) - { /* - ** For all the fields that WAV doesn't support, modify the - ** write_inst struct to hold the default value that the WAV - ** module should hold. - */ - write_inst.detune = 0 ; - write_inst.key_lo = write_inst.velocity_lo = 0 ; - write_inst.key_hi = write_inst.velocity_hi = 127 ; - write_inst.gain = 1 ; - } ; - - if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_XI) - { /* - ** For all the fields that XI doesn't support, modify the - ** write_inst struct to hold the default value that the XI - ** module should hold. - */ - write_inst.basenote = 0 ; - write_inst.detune = 0 ; - write_inst.key_lo = write_inst.velocity_lo = 0 ; - write_inst.key_hi = write_inst.velocity_hi = 127 ; - write_inst.gain = 1 ; - } ; - - if (memcmp (&write_inst, &read_inst, sizeof (write_inst)) != 0) - { printf ("\n\nLine %d : instrument comparison failed.\n\n", __LINE__) ; - printf ("W Base Note : %u\n" - " Detune : %u\n" - " Low Note : %u\tHigh Note : %u\n" - " Low Vel. : %u\tHigh Vel. : %u\n" - " Gain : %d\tCount : %d\n" - " mode : %d\n" - " start : %d\tend : %d\tcount :%d\n" - " mode : %d\n" - " start : %d\tend : %d\tcount :%d\n\n", - write_inst.basenote, - write_inst.detune, - write_inst.key_lo, write_inst.key_hi, - write_inst.velocity_lo, write_inst.velocity_hi, - write_inst.gain, write_inst.loop_count, - write_inst.loops [0].mode, write_inst.loops [0].start, - write_inst.loops [0].end, write_inst.loops [0].count, - write_inst.loops [1].mode, write_inst.loops [1].start, - write_inst.loops [1].end, write_inst.loops [1].count) ; - printf ("R Base Note : %u\n" - " Detune : %u\n" - " Low Note : %u\tHigh Note : %u\n" - " Low Vel. : %u\tHigh Vel. : %u\n" - " Gain : %d\tCount : %d\n" - " mode : %d\n" - " start : %d\tend : %d\tcount :%d\n" - " mode : %d\n" - " start : %d\tend : %d\tcount :%d\n\n", - read_inst.basenote, - read_inst.detune, - read_inst.key_lo, read_inst.key_hi, - read_inst.velocity_lo, read_inst.velocity_hi, - read_inst.gain, read_inst.loop_count, - read_inst.loops [0].mode, read_inst.loops [0].start, - read_inst.loops [0].end, read_inst.loops [0].count, - read_inst.loops [1].mode, read_inst.loops [1].start, - read_inst.loops [1].end, read_inst.loops [1].count) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_XI) - exit (1) ; - } ; - - if (0) instrumet_rw_test (filename) ; - - unlink (filename) ; - puts ("ok") ; -} /* instrument_test */ - -static void -current_sf_info_test (const char *filename) -{ SNDFILE *outfile, *infile ; - SF_INFO outinfo, ininfo ; - - print_test_name ("current_sf_info_test", filename) ; - - outinfo.samplerate = 44100 ; - outinfo.format = (SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - outinfo.channels = 1 ; - outinfo.frames = 0 ; - - outfile = test_open_file_or_die (filename, SFM_WRITE, &outinfo, SF_TRUE, __LINE__) ; - sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, 0) ; - - exit_if_true (outinfo.frames != 0, - "\n\nLine %d : Initial sfinfo.frames is not zero.\n\n", __LINE__ - ) ; - - test_write_double_or_die (outfile, 0, double_data, BUFFER_LEN, __LINE__) ; - sf_command (outfile, SFC_GET_CURRENT_SF_INFO, &outinfo, sizeof (outinfo)) ; - - exit_if_true (outinfo.frames != BUFFER_LEN, - "\n\nLine %d : Initial sfinfo.frames (%" PRId64 ") should be %d.\n\n", __LINE__, - outinfo.frames, BUFFER_LEN - ) ; - - /* Read file making sure no channel map exists. */ - memset (&ininfo, 0, sizeof (ininfo)) ; - infile = test_open_file_or_die (filename, SFM_READ, &ininfo, SF_TRUE, __LINE__) ; - - test_write_double_or_die (outfile, 0, double_data, BUFFER_LEN, __LINE__) ; - - sf_command (infile, SFC_GET_CURRENT_SF_INFO, &ininfo, sizeof (ininfo)) ; - - exit_if_true (ininfo.frames != BUFFER_LEN, - "\n\nLine %d : Initial sfinfo.frames (%" PRId64 ") should be %d.\n\n", __LINE__, - ininfo.frames, BUFFER_LEN - ) ; - - sf_close (outfile) ; - sf_close (infile) ; - - unlink (filename) ; - puts ("ok") ; -} /* current_sf_info_test */ - -static void -broadcast_test (const char *filename, int filetype) -{ static SF_BROADCAST_INFO bc_write, bc_read ; - SNDFILE *file ; - SF_INFO sfinfo ; - int errors = 0 ; - - print_test_name ("broadcast_test", filename) ; - - sfinfo.samplerate = 11025 ; - sfinfo.format = filetype ; - sfinfo.channels = 1 ; - - memset (&bc_write, 0, sizeof (bc_write)) ; - - snprintf (bc_write.description, sizeof (bc_write.description), "Test description") ; - snprintf (bc_write.originator, sizeof (bc_write.originator), "Test originator") ; - snprintf (bc_write.originator_reference, sizeof (bc_write.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ; - snprintf (bc_write.origination_date, sizeof (bc_write.origination_date), "%d/%02d/%02d", 2006, 3, 30) ; - snprintf (bc_write.origination_time, sizeof (bc_write.origination_time), "%02d:%02d:%02d", 20, 27, 0) ; - snprintf (bc_write.umid, sizeof (bc_write.umid), "Some umid") ; - bc_write.coding_history_size = 0 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; - exit (1) ; - } ; - test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; - sf_close (file) ; - - memset (&bc_read, 0, sizeof (bc_read)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_GET_BROADCAST_INFO) failed.\n\n", __LINE__) ; - exit (1) ; - return ; - } ; - check_log_buffer_or_die (file, __LINE__) ; - sf_close (file) ; - - if (bc_read.version != 1) - { printf ("\n\nLine %d : Read bad version number %d.\n\n", __LINE__, bc_read.version) ; - exit (1) ; - return ; - } ; - - bc_read.version = bc_write.version = 0 ; - - if (memcmp (bc_write.description, bc_read.description, sizeof (bc_write.description)) != 0) - { printf ("\n\nLine %d : description mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.description, bc_read.description) ; - errors ++ ; - } ; - - if (memcmp (bc_write.originator, bc_read.originator, sizeof (bc_write.originator)) != 0) - { printf ("\n\nLine %d : originator mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.originator, bc_read.originator) ; - errors ++ ; - } ; - - if (memcmp (bc_write.originator_reference, bc_read.originator_reference, sizeof (bc_write.originator_reference)) != 0) - { printf ("\n\nLine %d : originator_reference mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.originator_reference, bc_read.originator_reference) ; - errors ++ ; - } ; - - if (memcmp (bc_write.origination_date, bc_read.origination_date, sizeof (bc_write.origination_date)) != 0) - { printf ("\n\nLine %d : origination_date mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.origination_date, bc_read.origination_date) ; - errors ++ ; - } ; - - if (memcmp (bc_write.origination_time, bc_read.origination_time, sizeof (bc_write.origination_time)) != 0) - { printf ("\n\nLine %d : origination_time mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.origination_time, bc_read.origination_time) ; - errors ++ ; - } ; - - if (memcmp (bc_write.umid, bc_read.umid, sizeof (bc_write.umid)) != 0) - { printf ("\n\nLine %d : umid mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.umid, bc_read.umid) ; - errors ++ ; - } ; - - if (errors) - exit (1) ; - - unlink (filename) ; - puts ("ok") ; -} /* broadcast_test */ - -static void -broadcast_rdwr_test (const char *filename, int filetype) -{ SF_BROADCAST_INFO binfo ; - SNDFILE *file ; - SF_INFO sfinfo ; - sf_count_t frames ; - - print_test_name (__func__, filename) ; - - create_short_sndfile (filename, filetype, 2) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - memset (&binfo, 0, sizeof (binfo)) ; - - snprintf (binfo.description, sizeof (binfo.description), "Test description") ; - snprintf (binfo.originator, sizeof (binfo.originator), "Test originator") ; - snprintf (binfo.originator_reference, sizeof (binfo.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ; - snprintf (binfo.origination_date, sizeof (binfo.origination_date), "%d/%02d/%02d", 2006, 3, 30) ; - snprintf (binfo.origination_time, sizeof (binfo.origination_time), "%02d:%02d:%02d", 20, 27, 0) ; - snprintf (binfo.umid, sizeof (binfo.umid), "Some umid") ; - binfo.coding_history_size = 0 ; - - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; - frames = sfinfo.frames ; - if (sf_command (file, SFC_SET_BROADCAST_INFO, &binfo, sizeof (binfo)) != SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) should have failed but didn't.\n\n", __LINE__) ; - exit (1) ; - } ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_close (file) ; - exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ; - - unlink (filename) ; - puts ("ok") ; -} /* broadcast_rdwr_test */ - -static void -check_coding_history_newlines (const char *filename) -{ static SF_BROADCAST_INFO bc_write, bc_read ; - SNDFILE *file ; - SF_INFO sfinfo ; - unsigned k ; - - sfinfo.samplerate = 22050 ; - sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; - sfinfo.channels = 1 ; - - memset (&bc_write, 0, sizeof (bc_write)) ; - - snprintf (bc_write.description, sizeof (bc_write.description), "Test description") ; - snprintf (bc_write.originator, sizeof (bc_write.originator), "Test originator") ; - snprintf (bc_write.originator_reference, sizeof (bc_write.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ; - snprintf (bc_write.origination_date, sizeof (bc_write.origination_date), "%d/%02d/%02d", 2006, 3, 30) ; - snprintf (bc_write.origination_time, sizeof (bc_write.origination_time), "%02d:%02d:%02d", 20, 27, 0) ; - snprintf (bc_write.umid, sizeof (bc_write.umid), "Some umid") ; - bc_write.coding_history_size = snprintf (bc_write.coding_history, sizeof (bc_write.coding_history), "This has\nUnix\nand\rMac OS9\rline endings.\nLast line") ; ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; - exit (1) ; - } ; - - test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; - sf_close (file) ; - - memset (&bc_read, 0, sizeof (bc_read)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; - exit (1) ; - } ; - check_log_buffer_or_die (file, __LINE__) ; - sf_close (file) ; - - if (bc_read.coding_history_size == 0) - { printf ("\n\nLine %d : missing coding history.\n\n", __LINE__) ; - exit (1) ; - } ; - - if (strstr (bc_read.coding_history, "Last line") == NULL) - { printf ("\n\nLine %d : coding history truncated.\n\n", __LINE__) ; - exit (1) ; - } ; - - for (k = 1 ; k < bc_read.coding_history_size ; k++) - { if (bc_read.coding_history [k] == '\n' && bc_read.coding_history [k - 1] != '\r') - { printf ("\n\nLine %d : '\\n' without '\\r' before.\n\n", __LINE__) ; - exit (1) ; - } ; - - if (bc_read.coding_history [k] == '\r' && bc_read.coding_history [k + 1] != '\n') - { printf ("\n\nLine %d : '\\r' without '\\n' after.\n\n", __LINE__) ; - exit (1) ; - } ; - - if (bc_read.coding_history [k] == 0 && k < bc_read.coding_history_size - 1) - { printf ("\n\nLine %d : '\\0' within coding history at index %d of %d.\n\n", __LINE__, k, bc_read.coding_history_size) ; - exit (1) ; - } ; - } ; - - return ; -} /* check_coding_history_newlines */ - -static void -broadcast_coding_history_test (const char *filename) -{ static SF_BROADCAST_INFO bc_write, bc_read ; - SNDFILE *file ; - SF_INFO sfinfo ; - const char *default_history = "A=PCM,F=22050,W=16,M=mono" ; - const char *supplied_history = - "A=PCM,F=44100,W=24,M=mono,T=other\r\n" - "A=PCM,F=22050,W=16,M=mono,T=yet_another\r\n" ; - - print_test_name ("broadcast_coding_history_test", filename) ; - - sfinfo.samplerate = 22050 ; - sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; - sfinfo.channels = 1 ; - - memset (&bc_write, 0, sizeof (bc_write)) ; - - snprintf (bc_write.description, sizeof (bc_write.description), "Test description") ; - snprintf (bc_write.originator, sizeof (bc_write.originator), "Test originator") ; - snprintf (bc_write.originator_reference, sizeof (bc_write.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ; - snprintf (bc_write.origination_date, sizeof (bc_write.origination_date), "%d/%02d/%02d", 2006, 3, 30) ; - snprintf (bc_write.origination_time, sizeof (bc_write.origination_time), "%02d:%02d:%02d", 20, 27, 0) ; - snprintf (bc_write.umid, sizeof (bc_write.umid), "Some umid") ; - /* Coding history will be filled in by the library. */ - bc_write.coding_history_size = 0 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; - exit (1) ; - } ; - - test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; - sf_close (file) ; - - memset (&bc_read, 0, sizeof (bc_read)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; - exit (1) ; - } ; - check_log_buffer_or_die (file, __LINE__) ; - sf_close (file) ; - - if (bc_read.coding_history_size == 0) - { printf ("\n\nLine %d : missing coding history.\n\n", __LINE__) ; - exit (1) ; - } ; - - if (bc_read.coding_history_size < strlen (default_history) || memcmp (bc_read.coding_history, default_history, strlen (default_history)) != 0) - { printf ("\n\n" - "Line %d : unexpected coding history '%.*s',\n" - " should be '%s'\n\n", __LINE__, bc_read.coding_history_size, bc_read.coding_history, default_history) ; - exit (1) ; - } ; - - bc_write.coding_history_size = strlen (supplied_history) ; - bc_write.coding_history_size = snprintf (bc_write.coding_history, sizeof (bc_write.coding_history), "%s", supplied_history) ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; - exit (1) ; - } ; - - test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; - sf_close (file) ; - - memset (&bc_read, 0, sizeof (bc_read)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - sf_close (file) ; - - if (strstr (bc_read.coding_history, supplied_history) != bc_read.coding_history) - { printf ("\n\nLine %d : unexpected coding history :\n" - "----------------------------------------------------\n%s" - "----------------------------------------------------\n" - "should be this :\n" - "----------------------------------------------------\n%s" - "----------------------------------------------------\n" - "with one more line at the end.\n\n", - __LINE__, bc_read.coding_history, supplied_history) ; - exit (1) ; - } ; - - check_coding_history_newlines (filename) ; - - unlink (filename) ; - puts ("ok") ; -} /* broadcast_coding_history_test */ - -/*============================================================================== -*/ - -static void -broadcast_coding_history_size (const char *filename) -{ /* SF_BROADCAST_INFO struct with coding_history field of 1024 bytes. */ - static SF_BROADCAST_INFO_VAR (1024) bc_write ; - static SF_BROADCAST_INFO_VAR (1024) bc_read ; - SNDFILE *file ; - SF_INFO sfinfo ; - int k ; - - print_test_name (__func__, filename) ; - - sfinfo.samplerate = 22050 ; - sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; - sfinfo.channels = 1 ; - - memset (&bc_write, 0, sizeof (bc_write)) ; - - snprintf (bc_write.description, sizeof (bc_write.description), "Test description") ; - snprintf (bc_write.originator, sizeof (bc_write.originator), "Test originator") ; - snprintf (bc_write.originator_reference, sizeof (bc_write.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ; - snprintf (bc_write.origination_date, sizeof (bc_write.origination_date), "%d/%02d/%02d", 2006, 3, 30) ; - snprintf (bc_write.origination_time, sizeof (bc_write.origination_time), "%02d:%02d:%02d", 20, 27, 0) ; - snprintf (bc_write.umid, sizeof (bc_write.umid), "Some umid") ; - bc_write.coding_history_size = 0 ; - - for (k = 0 ; bc_write.coding_history_size < 512 ; k++) - { snprintf (bc_write.coding_history + bc_write.coding_history_size, - sizeof (bc_write.coding_history) - bc_write.coding_history_size, "line %4d\n", k) ; - bc_write.coding_history_size = strlen (bc_write.coding_history) ; - } ; - - exit_if_true (bc_write.coding_history_size < 512, - "\n\nLine %d : bc_write.coding_history_size (%d) should be > 512.\n\n", __LINE__, bc_write.coding_history_size) ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; - exit (1) ; - } ; - - test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; - sf_close (file) ; - - memset (&bc_read, 0, sizeof (bc_read)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; - exit (1) ; - } ; - check_log_buffer_or_die (file, __LINE__) ; - sf_close (file) ; - - exit_if_true (bc_read.coding_history_size < 512, - "\n\nLine %d : unexpected coding history size %d (should be > 512).\n\n", __LINE__, bc_read.coding_history_size) ; - - exit_if_true (strstr (bc_read.coding_history, "libsndfile") == NULL, - "\n\nLine %d : coding history incomplete (should contain 'libsndfile').\n\n", __LINE__) ; - - unlink (filename) ; - puts ("ok") ; -} /* broadcast_coding_history_size */ - -/*============================================================================== -*/ -static void -cart_test (const char *filename, int filetype) -{ static SF_CART_INFO ca_write, ca_read ; - SNDFILE *file ; - SF_INFO sfinfo ; - int errors = 0 ; - - print_test_name ("cart_test", filename) ; - - sfinfo.samplerate = 11025 ; - sfinfo.format = filetype ; - sfinfo.channels = 1 ; - memset (&ca_write, 0, sizeof (ca_write)) ; - - // example test data - snprintf (ca_write.artist, sizeof (ca_write.artist), "Test artist") ; - snprintf (ca_write.version, sizeof (ca_write.version), "Test version") ; - snprintf (ca_write.cut_id, sizeof (ca_write.cut_id), "Test cut ID") ; - snprintf (ca_write.client_id, sizeof (ca_write.client_id), "Test client ID") ; - snprintf (ca_write.category, sizeof (ca_write.category), "Test category") ; - snprintf (ca_write.classification, sizeof (ca_write.classification), "Test classification") ; - snprintf (ca_write.out_cue, sizeof (ca_write.out_cue), "Test out cue") ; - snprintf (ca_write.start_date, sizeof (ca_write.start_date), "%d/%02d/%02d", 2006, 3, 30) ; - snprintf (ca_write.start_time, sizeof (ca_write.start_time), "%02d:%02d:%02d", 20, 27, 0) ; - snprintf (ca_write.end_date, sizeof (ca_write.end_date), "%d/%02d/%02d", 2006, 3, 30) ; - snprintf (ca_write.end_time, sizeof (ca_write.end_time), "%02d:%02d:%02d", 20, 27, 0) ; - snprintf (ca_write.producer_app_id, sizeof (ca_write.producer_app_id), "Test producer app id") ; - snprintf (ca_write.producer_app_version, sizeof (ca_write.producer_app_version), "Test producer app version") ; - snprintf (ca_write.user_def, sizeof (ca_write.user_def), "test user def test test") ; - ca_write.level_reference = 42 ; - snprintf (ca_write.url, sizeof (ca_write.url), "http://www.test.com/test_url") ; - snprintf (ca_write.tag_text, sizeof (ca_write.tag_text), "tag text test! \r\n") ; // must be terminated \r\n to be valid - ca_write.tag_text_size = strlen (ca_write.tag_text) ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - if (sf_command (file, SFC_SET_CART_INFO, &ca_write, sizeof (ca_write)) == SF_FALSE) - exit (1) ; - - test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; - sf_close (file) ; - - memset (&ca_read, 0, sizeof (ca_read)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - if (sf_command (file, SFC_GET_CART_INFO, &ca_read, sizeof (ca_read)) == SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_GET_CART_INFO) failed.\n\n", __LINE__) ; - exit (1) ; - return ; - } ; - check_log_buffer_or_die (file, __LINE__) ; - sf_close (file) ; - - - if (memcmp (ca_write.artist, ca_read.artist, sizeof (ca_write.artist)) != 0) - { printf ("\n\nLine %d : artist mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.artist, ca_read.artist) ; - errors ++ ; - } ; - - if (memcmp (ca_write.version, ca_read.version, sizeof (ca_write.version)) != 0) - { printf ("\n\nLine %d : version mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.version, ca_read.version) ; - errors ++ ; - } ; - - if (memcmp (ca_write.title, ca_read.title, sizeof (ca_write.title)) != 0) - { printf ("\n\nLine %d : title mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.title, ca_read.title) ; - errors ++ ; - } ; - - if (memcmp (ca_write.cut_id, ca_read.cut_id, sizeof (ca_write.cut_id)) != 0) - { printf ("\n\nLine %d : cut_id mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.cut_id, ca_read.cut_id) ; - errors ++ ; - } ; - - if (memcmp (ca_write.client_id, ca_read.client_id, sizeof (ca_write.client_id)) != 0) - { printf ("\n\nLine %d : client_id mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.client_id, ca_read.client_id) ; - errors ++ ; - } ; - - if (memcmp (ca_write.category, ca_read.category, sizeof (ca_write.category)) != 0) - { printf ("\n\nLine %d : category mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.category, ca_read.category) ; - errors ++ ; - } ; - - if (memcmp (ca_write.out_cue, ca_read.out_cue, sizeof (ca_write.out_cue)) != 0) - { printf ("\n\nLine %d : out_cue mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.out_cue, ca_read.out_cue) ; - errors ++ ; - } ; - - if (memcmp (ca_write.start_date, ca_read.start_date, sizeof (ca_write.start_date)) != 0) - { printf ("\n\nLine %d : start_date mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.start_date, ca_read.start_date) ; - errors ++ ; - } ; - - - if (memcmp (ca_write.start_time, ca_read.start_time, sizeof (ca_write.start_time)) != 0) - { printf ("\n\nLine %d : start_time mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.start_time, ca_read.start_time) ; - errors ++ ; - } ; - - - if (memcmp (ca_write.end_date, ca_read.end_date, sizeof (ca_write.end_date)) != 0) - { printf ("\n\nLine %d : end_date mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.end_date, ca_read.end_date) ; - errors ++ ; - } ; - - - if (memcmp (ca_write.end_time, ca_read.end_time, sizeof (ca_write.end_time)) != 0) - { printf ("\n\nLine %d : end_time mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.end_time, ca_read.end_time) ; - errors ++ ; - } ; - - - if (memcmp (ca_write.producer_app_id, ca_read.producer_app_id, sizeof (ca_write.producer_app_id)) != 0) - { printf ("\n\nLine %d : producer_app_id mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.producer_app_id, ca_read.producer_app_id) ; - errors ++ ; - } ; - - - if (memcmp (ca_write.producer_app_version, ca_read.producer_app_version, sizeof (ca_write.producer_app_version)) != 0) - { printf ("\n\nLine %d : producer_app_version mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.producer_app_version, ca_read.producer_app_version) ; - errors ++ ; - } ; - - - if (memcmp (ca_write.user_def, ca_read.user_def, sizeof (ca_write.user_def)) != 0) - { printf ("\n\nLine %d : user_def mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.user_def, ca_read.user_def) ; - errors ++ ; - } ; - - - if (ca_write.level_reference != ca_read.level_reference) - { printf ("\n\nLine %d : level_reference mismatch :\n\twrite : '%d'\n\tread : '%d'\n\n", __LINE__, ca_write.level_reference, ca_read.level_reference) ; - errors ++ ; - } ; - - // TODO: make this more helpful - if (memcmp (ca_write.post_timers, ca_read.post_timers, sizeof (ca_write.post_timers)) != 0) - { printf ("\n\nLine %d : post_timers mismatch :\n'\n\n", __LINE__) ; - errors ++ ; - } ; - - if (memcmp (ca_write.url, ca_read.url, sizeof (ca_write.url)) != 0) - { printf ("\n\nLine %d : url mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.url, ca_read.url) ; - errors ++ ; - } ; - - - if (memcmp (ca_write.tag_text, ca_read.tag_text, (size_t) (ca_read.tag_text_size)) != 0) - { printf ("\n\nLine %d : tag_text mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.tag_text, ca_read.tag_text) ; - errors ++ ; - } ; - - - if (errors) - exit (1) ; - - unlink (filename) ; - puts ("ok") ; -} /* cart_test */ - -static void -cart_rdwr_test (const char *filename, int filetype) -{ SF_CART_INFO cinfo ; - SNDFILE *file ; - SF_INFO sfinfo ; - sf_count_t frames ; - - print_test_name (__func__, filename) ; - - create_short_sndfile (filename, filetype, 2) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - memset (&cinfo, 0, sizeof (cinfo)) ; - - snprintf (cinfo.artist, sizeof (cinfo.artist), "Test artist") ; - snprintf (cinfo.version, sizeof (cinfo.version), "Test version") ; - snprintf (cinfo.cut_id, sizeof (cinfo.cut_id), "Test cut ID") ; - snprintf (cinfo.client_id, sizeof (cinfo.client_id), "Test client ID") ; - snprintf (cinfo.category, sizeof (cinfo.category), "Test category") ; - snprintf (cinfo.classification, sizeof (cinfo.classification), "Test classification") ; - snprintf (cinfo.out_cue, sizeof (cinfo.out_cue), "Test out cue") ; - snprintf (cinfo.start_date, sizeof (cinfo.start_date), "%d/%02d/%02d", 2006, 3, 30) ; - snprintf (cinfo.start_time, sizeof (cinfo.start_time), "%02d:%02d:%02d", 20, 27, 0) ; - snprintf (cinfo.end_date, sizeof (cinfo.end_date), "%d/%02d/%02d", 2006, 3, 30) ; - snprintf (cinfo.end_time, sizeof (cinfo.end_time), "%02d:%02d:%02d", 20, 27, 0) ; - snprintf (cinfo.producer_app_id, sizeof (cinfo.producer_app_id), "Test producer app id") ; - snprintf (cinfo.producer_app_version, sizeof (cinfo.producer_app_version), "Test producer app version") ; - snprintf (cinfo.user_def, sizeof (cinfo.user_def), "test user def test test") ; - cinfo.level_reference = 42 ; - snprintf (cinfo.url, sizeof (cinfo.url), "http://www.test.com/test_url") ; - snprintf (cinfo.tag_text, sizeof (cinfo.tag_text), "tag text test!\r\n") ; - cinfo.tag_text_size = strlen (cinfo.tag_text) ; - - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; - frames = sfinfo.frames ; - if (sf_command (file, SFC_SET_CART_INFO, &cinfo, sizeof (cinfo)) != SF_FALSE) - { printf ("\n\nLine %d : sf_command (SFC_SET_CART_INFO) should have failed but didn't.\n\n", __LINE__) ; - exit (1) ; - } ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_close (file) ; - exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ; - - unlink (filename) ; - puts ("ok") ; -} /* cart_rdwr_test */ - -/*============================================================================== -*/ - -static void -channel_map_test (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int channel_map_read [4], channel_map_write [4] = - { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_LFE, - SF_CHANNEL_MAP_REAR_CENTER - } ; - - print_test_name ("channel_map_test", filename) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 11025 ; - sfinfo.format = filetype ; - sfinfo.channels = ARRAY_LEN (channel_map_read) ; - - switch (filetype & SF_FORMAT_TYPEMASK) - { /* WAVEX and RF64 have a default channel map, even if you don't specify one. */ - case SF_FORMAT_WAVEX : - case SF_FORMAT_RF64 : - /* Write file without channel map. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; - sf_close (file) ; - - /* Read file making default channel map exists. */ - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - exit_if_true ( - sf_command (file, SFC_GET_CHANNEL_MAP_INFO, channel_map_read, sizeof (channel_map_read)) == SF_FALSE, - "\n\nLine %d : sf_command (SFC_GET_CHANNEL_MAP_INFO) should not have failed.\n\n", __LINE__ - ) ; - check_log_buffer_or_die (file, __LINE__) ; - sf_close (file) ; - break ; - - default : - break ; - } ; - - /* Write file with a channel map. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - exit_if_true ( - sf_command (file, SFC_SET_CHANNEL_MAP_INFO, channel_map_write, sizeof (channel_map_write)) == SF_FALSE, - "\n\nLine %d : sf_command (SFC_SET_CHANNEL_MAP_INFO) failed.\n\n", __LINE__ - ) ; - test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; - sf_close (file) ; - - /* Read file making sure no channel map exists. */ - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - exit_if_true ( - sf_command (file, SFC_GET_CHANNEL_MAP_INFO, channel_map_read, sizeof (channel_map_read)) != SF_TRUE, - "\n\nLine %d : sf_command (SFC_GET_CHANNEL_MAP_INFO) failed.\n\n", __LINE__ - ) ; - check_log_buffer_or_die (file, __LINE__) ; - sf_close (file) ; - - exit_if_true ( - memcmp (channel_map_read, channel_map_write, sizeof (channel_map_read)) != 0, - "\n\nLine %d : Channel map read does not match channel map written.\n\n", __LINE__ - ) ; - - unlink (filename) ; - puts ("ok") ; -} /* channel_map_test */ - -static void -raw_needs_endswap_test (const char *filename, int filetype) -{ static int subtypes [] = - { SF_FORMAT_FLOAT, SF_FORMAT_DOUBLE, - SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32 - } ; - SNDFILE *file ; - SF_INFO sfinfo ; - unsigned k ; - int needs_endswap ; - - print_test_name (__func__, filename) ; - - for (k = 0 ; k < ARRAY_LEN (subtypes) ; k++) - { - if (filetype == (SF_ENDIAN_LITTLE | SF_FORMAT_AIFF)) - switch (subtypes [k]) - { /* Little endian AIFF does not AFAIK support fl32 and fl64. */ - case SF_FORMAT_FLOAT : - case SF_FORMAT_DOUBLE : - continue ; - default : - break ; - } ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 11025 ; - sfinfo.format = filetype | subtypes [k] ; - sfinfo.channels = 1 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; - sf_close (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - needs_endswap = sf_command (file, SFC_RAW_DATA_NEEDS_ENDSWAP, NULL, 0) ; - - switch (filetype) - { case SF_FORMAT_WAV : - case SF_FORMAT_WAVEX : - case SF_FORMAT_AIFF | SF_ENDIAN_LITTLE : - exit_if_true (needs_endswap != CPU_IS_BIG_ENDIAN, - "\n\nLine %d : SFC_RAW_DATA_NEEDS_ENDSWAP failed for (%d | %d).\n\n", __LINE__, filetype, k) ; - break ; - - case SF_FORMAT_AIFF : - case SF_FORMAT_WAV | SF_ENDIAN_BIG : - exit_if_true (needs_endswap != CPU_IS_LITTLE_ENDIAN, - "\n\nLine %d : SFC_RAW_DATA_NEEDS_ENDSWAP failed for (%d | %d).\n\n", __LINE__, filetype, k) ; - break ; - - default : - printf ("\n\nLine %d : bad format value %d.\n\n", __LINE__, filetype) ; - exit (1) ; - break ; - } ; - - sf_close (file) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* raw_needs_endswap_test */ diff --git a/libs/libsndfile/tests/compression_size_test.c b/libs/libsndfile/tests/compression_size_test.c deleted file mode 100644 index ddacf94905..0000000000 --- a/libs/libsndfile/tests/compression_size_test.c +++ /dev/null @@ -1,205 +0,0 @@ -/* -** Copyright (C) 2007-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include - -#include - -#include "utils.h" -#include "dft_cmp.h" - -#define SAMPLE_RATE 16000 -#define DATA_LENGTH (SAMPLE_RATE) - -static float data_out [DATA_LENGTH] ; - -static inline float -max_float (float a, float b) -{ return a > b ? a : b ; -} /* max_float */ - -static void -vorbis_test (void) -{ static float float_data [DFT_DATA_LENGTH] ; - const char * filename = "vorbis_test.oga" ; - SNDFILE * file ; - SF_INFO sfinfo ; - float max_abs = 0.0 ; - unsigned k ; - - print_test_name ("vorbis_test", filename) ; - - /* Generate float data. */ - gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 1.0) ; - - /* Set up output file type. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; - sfinfo.channels = 1 ; - sfinfo.samplerate = SAMPLE_RATE ; - - /* Write the output file. */ - - /* The Vorbis encoder has a bug on PowerPC and X86-64 with sample rates - ** <= 22050. Increasing the sample rate to 32000 avoids triggering it. - ** See https://trac.xiph.org/ticket/1229 - */ - if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) - { const char * errstr ; - - errstr = sf_strerror (NULL) ; - if (strstr (errstr, "Sample rate chosen is known to trigger a Vorbis") == NULL) - { printf ("Line %d: sf_open (SFM_WRITE) failed : %s\n", __LINE__, errstr) ; - dump_log_buffer (NULL) ; - exit (1) ; - } ; - - printf ("\n Sample rate -> 32kHz ") ; - sfinfo.samplerate = 32000 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - } ; - - test_write_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ; - sf_close (file) ; - - memset (float_data, 0, sizeof (float_data)) ; - - /* Read the file back in again. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - test_read_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ; - sf_close (file) ; - - for (k = 0 ; k < ARRAY_LEN (float_data) ; k ++) - max_abs = max_float (max_abs, fabs (float_data [k])) ; - - if (max_abs > 1.021) - { printf ("\n\n Error : max_abs %f should be < 1.021.\n\n", max_abs) ; - exit (1) ; - } ; - - puts ("ok") ; - unlink (filename) ; -} /* vorbis_test */ - -static void -compression_size_test (int format, const char * filename) -{ /* - ** Encode two files, one at quality 0.3 and one at quality 0.5 and then - ** make sure that the quality 0.3 files is the smaller of the two. - */ - char q3_fname [64] ; - char q6_fname [64] ; - char test_name [64] ; - - SNDFILE *q3_file, *q6_file ; - SF_INFO sfinfo ; - int q3_size, q6_size ; - double quality ; - int k ; - - snprintf (q3_fname, sizeof (q3_fname), "q3_%s", filename) ; - snprintf (q6_fname, sizeof (q6_fname), "q6_%s", filename) ; - - snprintf (test_name, sizeof (test_name), "q[36]_%s", filename) ; - print_test_name (__func__, test_name) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - /* Set up output file type. */ - sfinfo.format = format ; - sfinfo.channels = 1 ; - sfinfo.samplerate = SAMPLE_RATE ; - - /* Write the output file. */ - q3_file = test_open_file_or_die (q3_fname, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - q6_file = test_open_file_or_die (q6_fname, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - - quality = 0.3 ; - sf_command (q3_file, SFC_SET_VBR_ENCODING_QUALITY, &quality, sizeof (quality)) ; - quality = 0.6 ; - sf_command (q6_file, SFC_SET_VBR_ENCODING_QUALITY, &quality, sizeof (quality)) ; - - for (k = 0 ; k < 5 ; k++) - { gen_lowpass_signal_float (data_out, ARRAY_LEN (data_out)) ; - test_write_float_or_die (q3_file, 0, data_out, ARRAY_LEN (data_out), __LINE__) ; - test_write_float_or_die (q6_file, 0, data_out, ARRAY_LEN (data_out), __LINE__) ; - } ; - - sf_close (q3_file) ; - sf_close (q6_file) ; - - q3_size = file_length (q3_fname) ; - q6_size = file_length (q6_fname) ; - - if (q3_size >= q6_size) - { printf ("\n\nLine %d : q3 size (%d) >= q5 size (%d)\n\n", __LINE__, q3_size, q6_size) ; - exit (1) ; - } ; - - puts ("ok") ; - unlink (q3_fname) ; - unlink (q6_fname) ; -} /* compression_size_test */ - - - -int -main (int argc, char *argv []) -{ int all_tests = 0, tests = 0 ; - - if (argc != 2) - { printf ( - "Usage : %s \n" - " Where is one of:\n" - " vorbis - test Ogg/Vorbis\n" - " flac - test FLAC\n" - " all - perform all tests\n", - argv [0]) ; - exit (0) ; - } ; - - if (! HAVE_EXTERNAL_LIBS) - { puts (" No Ogg/Vorbis tests because Ogg/Vorbis support was not compiled in.") ; - return 0 ; - } ; - - if (strcmp (argv [1], "all") == 0) - all_tests = 1 ; - - if (all_tests || strcmp (argv [1], "vorbis") == 0) - { vorbis_test () ; - compression_size_test (SF_FORMAT_OGG | SF_FORMAT_VORBIS, "vorbis.oga") ; - tests ++ ; - } ; - - if (all_tests || strcmp (argv [1], "flac") == 0) - { compression_size_test (SF_FORMAT_FLAC | SF_FORMAT_PCM_16, "pcm16.flac") ; - tests ++ ; - } ; - - return 0 ; -} /* main */ diff --git a/libs/libsndfile/tests/cpp_test.cc b/libs/libsndfile/tests/cpp_test.cc deleted file mode 100644 index 364ec86ee2..0000000000 --- a/libs/libsndfile/tests/cpp_test.cc +++ /dev/null @@ -1,313 +0,0 @@ -/* -** Copyright (C) 2006-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include -#include -#include - -#include - -#include "utils.h" - -static short sbuffer [100] ; -static int ibuffer [100] ; -static float fbuffer [100] ; -static double dbuffer [100] ; - -static void -ceeplusplus_wchar_test (void) -{ -#if 0 - LPCWSTR filename = L"wchar_test.wav" ; - - print_test_name (__func__, "ceeplusplus_wchar_test.wav") ; - - /* Use this scope to make sure the created file is closed. */ - { - SndfileHandle file (filename, SFM_WRITE, SF_FORMAT_WAV | SF_FORMAT_PCM_16, 2, 44100) ; - - if (file.refCount () != 1) - { printf ("\n\n%s %d : Error : Reference count (%d) should be 1.\n\n", __func__, __LINE__, file.refCount ()) ; - exit (1) ; - } ; - - /* This should check that the file did in fact get created with a - ** wchar_t * filename. - */ - exit_if_true ( - GetFileAttributesW (filename) == INVALID_FILE_ATTRIBUTES, - "\n\nLine %d : GetFileAttributes failed.\n\n", __LINE__ - ) ; - } - - /* Use this because the file was created with CreateFileW. */ - DeleteFileW (filename) ; - - puts ("ok") ; -#endif -} /* ceeplusplus_wchar_test */ - - - -static void -create_file (const char * filename, int format) -{ SndfileHandle file ; - - if (file.refCount () != 0) - { printf ("\n\n%s %d : Error : Reference count (%d) should be zero.\n\n", __func__, __LINE__, file.refCount ()) ; - exit (1) ; - } ; - - file = SndfileHandle (filename, SFM_WRITE, format, 2, 48000) ; - - if (file.refCount () != 1) - { printf ("\n\n%s %d : Error : Reference count (%d) should be 1.\n\n", __func__, __LINE__, file.refCount ()) ; - exit (1) ; - } ; - - file.setString (SF_STR_TITLE, filename) ; - - /* Item write. */ - file.write (sbuffer, ARRAY_LEN (sbuffer)) ; - file.write (ibuffer, ARRAY_LEN (ibuffer)) ; - file.write (fbuffer, ARRAY_LEN (fbuffer)) ; - file.write (dbuffer, ARRAY_LEN (dbuffer)) ; - - /* Frame write. */ - file.writef (sbuffer, ARRAY_LEN (sbuffer) / file.channels ()) ; - file.writef (ibuffer, ARRAY_LEN (ibuffer) / file.channels ()) ; - file.writef (fbuffer, ARRAY_LEN (fbuffer) / file.channels ()) ; - file.writef (dbuffer, ARRAY_LEN (dbuffer) / file.channels ()) ; - - /* RAII takes care of the SndfileHandle. */ -} /* create_file */ - -static void -check_title (const SndfileHandle & file, const char * filename) -{ const char *title = NULL ; - - title = file.getString (SF_STR_TITLE) ; - - if (title == NULL) - { printf ("\n\n%s %d : Error : No title.\n\n", __func__, __LINE__) ; - exit (1) ; - } ; - - if (strcmp (filename, title) != 0) - { printf ("\n\n%s %d : Error : title '%s' should be '%s'\n\n", __func__, __LINE__, title, filename) ; - exit (1) ; - } ; - - return ; -} /* check_title */ - -static void -read_file (const char * filename, int format) -{ SndfileHandle file ; - sf_count_t count ; - - if (file) - { printf ("\n\n%s %d : Error : should not be here.\n\n", __func__, __LINE__) ; - exit (1) ; - } ; - - file = SndfileHandle (filename) ; - - if (1) - { SndfileHandle file2 = file ; - - if (file.refCount () != 2 || file2.refCount () != 2) - { printf ("\n\n%s %d : Error : Reference count (%d) should be two.\n\n", __func__, __LINE__, file.refCount ()) ; - exit (1) ; - } ; - } ; - - if (file.refCount () != 1) - { printf ("\n\n%s %d : Error : Reference count (%d) should be one.\n\n", __func__, __LINE__, file.refCount ()) ; - exit (1) ; - } ; - - if (! file) - { printf ("\n\n%s %d : Error : should not be here.\n\n", __func__, __LINE__) ; - exit (1) ; - } ; - - if (file.format () != format) - { printf ("\n\n%s %d : Error : format 0x%08x should be 0x%08x.\n\n", __func__, __LINE__, file.format (), format) ; - exit (1) ; - } ; - - if (file.channels () != 2) - { printf ("\n\n%s %d : Error : channels %d should be 2.\n\n", __func__, __LINE__, file.channels ()) ; - exit (1) ; - } ; - - if (file.frames () != ARRAY_LEN (sbuffer) * 4) - { printf ("\n\n%s %d : Error : frames %ld should be %lu.\n\n", __func__, __LINE__, - (long) file.frames (), (long) ARRAY_LEN (sbuffer) * 4 / 2) ; - exit (1) ; - } ; - - switch (format & SF_FORMAT_TYPEMASK) - { case SF_FORMAT_AU : - break ; - - default : - check_title (file, filename) ; - break ; - } ; - - /* Item read. */ - file.read (sbuffer, ARRAY_LEN (sbuffer)) ; - file.read (ibuffer, ARRAY_LEN (ibuffer)) ; - file.read (fbuffer, ARRAY_LEN (fbuffer)) ; - file.read (dbuffer, ARRAY_LEN (dbuffer)) ; - - /* Frame read. */ - file.readf (sbuffer, ARRAY_LEN (sbuffer) / file.channels ()) ; - file.readf (ibuffer, ARRAY_LEN (ibuffer) / file.channels ()) ; - file.readf (fbuffer, ARRAY_LEN (fbuffer) / file.channels ()) ; - file.readf (dbuffer, ARRAY_LEN (dbuffer) / file.channels ()) ; - - count = file.seek (file.frames () - 10, SEEK_SET) ; - if (count != file.frames () - 10) - { printf ("\n\n%s %d : Error : offset (%ld) should be %ld\n\n", __func__, __LINE__, - (long) count, (long) (file.frames () - 10)) ; - exit (1) ; - } ; - - count = file.read (sbuffer, ARRAY_LEN (sbuffer)) ; - if (count != 10 * file.channels ()) - { printf ("\n\n%s %d : Error : count (%ld) should be %ld\n\n", __func__, __LINE__, - (long) count, (long) (10 * file.channels ())) ; - exit (1) ; - } ; - - /* RAII takes care of the SndfileHandle. */ -} /* read_file */ - -static void -ceeplusplus_test (const char *filename, int format) -{ - print_test_name ("ceeplusplus_test", filename) ; - - create_file (filename, format) ; - read_file (filename, format) ; - - remove (filename) ; - puts ("ok") ; -} /* ceeplusplus_test */ - -static void -ceeplusplus_extra_test (void) -{ SndfileHandle file ; - const char * filename = "bad_file_name.wav" ; - int error ; - - print_test_name ("ceeplusplus_extra_test", filename) ; - - file = SndfileHandle (filename) ; - - error = file.error () ; - if (error == 0) - { printf ("\n\n%s %d : error should not be zero.\n\n", __func__, __LINE__) ; - exit (1) ; - } ; - - if (file.strError () == NULL) - { printf ("\n\n%s %d : strError should not return NULL.\n\n", __func__, __LINE__) ; - exit (1) ; - } ; - - if (file.seek (0, SEEK_SET) != 0) - { printf ("\n\n%s %d : bad seek ().\n\n", __func__, __LINE__) ; - exit (1) ; - } ; - - puts ("ok") ; -} /* ceeplusplus_extra_test */ - - -static void -ceeplusplus_rawhandle_test (const char *filename) -{ - SNDFILE* handle ; - { - SndfileHandle file (filename) ; - handle = file.rawHandle () ; - sf_read_float (handle, fbuffer, ARRAY_LEN (fbuffer)) ; - } -} /* ceeplusplus_rawhandle_test */ - -static void -ceeplusplus_takeOwnership_test (const char *filename) -{ - SNDFILE* handle ; - { - SndfileHandle file (filename) ; - handle = file.takeOwnership () ; - } - - if (sf_read_float (handle, fbuffer, ARRAY_LEN (fbuffer)) <= 0) - { printf ("\n\n%s %d : error when taking ownership of handle.\n\n", __func__, __LINE__) ; - exit (1) ; - } - - if (sf_close (handle) != 0) - { printf ("\n\n%s %d : cannot close file.\n\n", __func__, __LINE__) ; - exit (1) ; - } - - SndfileHandle file (filename) ; - SndfileHandle file2 (file) ; - - if (file2.takeOwnership ()) - { printf ("\n\n%s %d : taking ownership of shared handle is not allowed.\n\n", __func__, __LINE__) ; - exit (1) ; - } -} /* ceeplusplus_takeOwnership_test */ - -static void -ceeplusplus_handle_test (const char *filename, int format) -{ - print_test_name ("ceeplusplus_handle_test", filename) ; - - create_file (filename, format) ; - - if (0) ceeplusplus_rawhandle_test (filename) ; - ceeplusplus_takeOwnership_test (filename) ; - - remove (filename) ; - puts ("ok") ; -} /* ceeplusplus_test */ - -int -main (void) -{ - ceeplusplus_test ("cpp_test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - ceeplusplus_test ("cpp_test.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_S8) ; - ceeplusplus_test ("cpp_test.au", SF_FORMAT_AU | SF_FORMAT_FLOAT) ; - - ceeplusplus_extra_test () ; - ceeplusplus_handle_test ("cpp_test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - - ceeplusplus_wchar_test () ; - - return 0 ; -} /* main */ - diff --git a/libs/libsndfile/tests/dft_cmp.c b/libs/libsndfile/tests/dft_cmp.c deleted file mode 100644 index 439a53949a..0000000000 --- a/libs/libsndfile/tests/dft_cmp.c +++ /dev/null @@ -1,149 +0,0 @@ -/* -** Copyright (C) 2002-2013 Erik de Castro Lopo -** -** 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. -*/ - -#include -#include -#include - -#include "dft_cmp.h" -#include "utils.h" - -#ifndef M_PI -#define M_PI 3.14159265358979323846264338 -#endif - -#define DFT_SPEC_LENGTH (DFT_DATA_LENGTH / 2) - -static void dft_magnitude (const double *data, double *spectrum) ; -static double calc_max_spectral_difference (const double *spec1, const double *spec2) ; - -/*-------------------------------------------------------------------------------- -** Public functions. -*/ - -double -dft_cmp_float (int linenum, const float *in_data, const float *test_data, int len, double target_snr, int allow_exit) -{ static double orig [DFT_DATA_LENGTH] ; - static double test [DFT_DATA_LENGTH] ; - unsigned k ; - - if (len != DFT_DATA_LENGTH) - { printf ("Error (line %d) : dft_cmp_float : Bad input array length.\n", linenum) ; - return 1 ; - } ; - - for (k = 0 ; k < ARRAY_LEN (orig) ; k++) - { test [k] = test_data [k] ; - orig [k] = in_data [k] ; - } ; - - return dft_cmp_double (linenum, orig, test, len, target_snr, allow_exit) ; -} /* dft_cmp_float */ - -double -dft_cmp_double (int linenum, const double *orig, const double *test, int len, double target_snr, int allow_exit) -{ static double orig_spec [DFT_SPEC_LENGTH] ; - static double test_spec [DFT_SPEC_LENGTH] ; - double snr ; - - if (! orig || ! test) - { printf ("Error (line %d) : dft_cmp_double : Bad input arrays.\n", linenum) ; - return 1 ; - } ; - - if (len != DFT_DATA_LENGTH) - { printf ("Error (line %d) : dft_cmp_double : Bad input array length.\n", linenum) ; - return 1 ; - } ; - - dft_magnitude (orig, orig_spec) ; - dft_magnitude (test, test_spec) ; - - snr = calc_max_spectral_difference (orig_spec, test_spec) ; - - if (snr > target_snr) - { printf ("\n\nLine %d: Actual SNR (% 4.1f) > target SNR (% 4.1f).\n\n", linenum, snr, target_snr) ; - oct_save_double (orig, test, len) ; - if (allow_exit) - exit (1) ; - } ; - - if (snr < -500.0) - snr = -500.0 ; - - return snr ; -} /* dft_cmp_double */ - -/*-------------------------------------------------------------------------------- -** Quick dirty calculation of magnitude spectrum for real valued data using -** Discrete Fourier Transform. Since the data is real, the DFT is only -** calculated for positive frequencies. -*/ - -static void -dft_magnitude (const double *data, double *spectrum) -{ static double cos_angle [DFT_DATA_LENGTH] = { 0.0 } ; - static double sin_angle [DFT_DATA_LENGTH] ; - - double real_part, imag_part ; - int k, n ; - - /* If sine and cosine tables haven't been initialised, do so. */ - if (cos_angle [0] == 0.0) - for (n = 0 ; n < DFT_DATA_LENGTH ; n++) - { cos_angle [n] = cos (2.0 * M_PI * n / DFT_DATA_LENGTH) ; - sin_angle [n] = -1.0 * sin (2.0 * M_PI * n / DFT_DATA_LENGTH) ; - } ; - - /* DFT proper. Since the data is real, only generate a half spectrum. */ - for (k = 1 ; k < DFT_SPEC_LENGTH ; k++) - { real_part = 0.0 ; - imag_part = 0.0 ; - - for (n = 0 ; n < DFT_DATA_LENGTH ; n++) - { real_part += data [n] * cos_angle [(k * n) % DFT_DATA_LENGTH] ; - imag_part += data [n] * sin_angle [(k * n) % DFT_DATA_LENGTH] ; - } ; - - spectrum [k] = sqrt (real_part * real_part + imag_part * imag_part) ; - } ; - - spectrum [DFT_DATA_LENGTH - 1] = 0.0 ; - - spectrum [0] = spectrum [1] = spectrum [2] = spectrum [3] = spectrum [4] = 0.0 ; - - return ; -} /* dft_magnitude */ - -static double -calc_max_spectral_difference (const double *orig, const double *test) -{ double orig_max = 0.0, max_diff = 0.0 ; - int k ; - - for (k = 0 ; k < DFT_SPEC_LENGTH ; k++) - { if (orig_max < orig [k]) - orig_max = orig [k] ; - if (max_diff < fabs (orig [k] - test [k])) - max_diff = fabs (orig [k] - test [k]) ; - } ; - - if (max_diff < 1e-25) - return -500.0 ; - - return 20.0 * log10 (max_diff / orig_max) ; -} /* calc_max_spectral_difference */ diff --git a/libs/libsndfile/tests/dft_cmp.h b/libs/libsndfile/tests/dft_cmp.h deleted file mode 100644 index 3cbdd118e7..0000000000 --- a/libs/libsndfile/tests/dft_cmp.h +++ /dev/null @@ -1,25 +0,0 @@ -/* -** Copyright (C) 2002-2011 Erik de Castro Lopo -** -** 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. -*/ - - -#define DFT_DATA_LENGTH (2048) - -double dft_cmp_float (int linenum, const float *orig, const float *test, int len, double tolerance, int allow_exit) ; - -double dft_cmp_double (int linenum, const double *orig, const double *test, int len, double tolerance, int allow_exit) ; - diff --git a/libs/libsndfile/tests/dither_test.c b/libs/libsndfile/tests/dither_test.c deleted file mode 100644 index e9eef7c136..0000000000 --- a/libs/libsndfile/tests/dither_test.c +++ /dev/null @@ -1,180 +0,0 @@ -/* -** Copyright (C) 2003-2013 Erik de Castro Lopo -** -** 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. -*/ - - - -#include -#include -#include -#include -#include - -#include - -#include "utils.h" - -#define BUFFER_LEN (1 << 16) -#define LOG_BUFFER_SIZE 1024 - -static void dither_test (const char *filename, int filetype) ; - -/* Force the start of this buffer to be double aligned. Sparc-solaris will -** choke if its not. -*/ -static short data_out [BUFFER_LEN] ; - -int -main (int argc, char *argv []) -{ int do_all = 0 ; - int test_count = 0 ; - - if (argc != 2) - { printf ("Usage : %s \n", argv [0]) ; - printf (" Where is one of the following:\n") ; - printf (" wav - test WAV file peak chunk\n") ; - printf (" aiff - test AIFF file PEAK chunk\n") ; - printf (" all - perform all tests\n") ; - exit (1) ; - } ; - - do_all = ! strcmp (argv [1], "all") ; - - if (do_all || ! strcmp (argv [1], "wav")) - { dither_test ("dither.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "aiff")) - { dither_test ("dither.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_S8) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "au")) - { dither_test ("dither.au", SF_FORMAT_AU | SF_FORMAT_PCM_S8) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "svx")) - { dither_test ("dither.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_S8) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "nist")) - { dither_test ("dither.nist", SF_FORMAT_NIST | SF_FORMAT_PCM_S8) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "paf")) - { dither_test ("dither.paf", SF_FORMAT_PAF | SF_FORMAT_PCM_S8) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "ircam")) - { dither_test ("dither.ircam", SF_FORMAT_IRCAM | SF_FORMAT_PCM_S8) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "voc")) - { dither_test ("dither.voc", SF_FORMAT_VOC | SF_FORMAT_PCM_S8) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "w64")) - { dither_test ("dither.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_S8) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat4")) - { dither_test ("dither.mat4", SF_FORMAT_MAT4 | SF_FORMAT_PCM_S8) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat5")) - { dither_test ("dither.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_S8) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "pvf")) - { dither_test ("dither.pvf", SF_FORMAT_PVF | SF_FORMAT_PCM_S8) ; - test_count++ ; - } ; - - if (test_count == 0) - { printf ("Mono : ************************************\n") ; - printf ("Mono : * No '%s' test defined.\n", argv [1]) ; - printf ("Mono : ************************************\n") ; - return 1 ; - } ; - - return 0 ; -} /* main */ - - -/*============================================================================================ -** Here are the test functions. -*/ - -static void -dither_test (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - SF_DITHER_INFO dither ; - - print_test_name ("dither_test", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = filetype ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - /* Check for old version of the dither API. */ - if (sf_command (file, SFC_SET_DITHER_ON_WRITE, NULL, SF_TRUE) == 0) - { printf ("\n\nLine %d: Should have an error here but don't.\n\n", __LINE__) ; - exit (1) ; - } ; - - memset (&dither, 0, sizeof (dither)) ; - dither.type = SFD_WHITE ; - dither.level = 0 ; - - if (sf_command (file, SFC_SET_DITHER_ON_WRITE, &dither, sizeof (dither)) != 0) - { printf ("\n\nLine %d: sf_command (SFC_SET_DITHER_ON_WRITE) returned error : %s\n\n", - __LINE__, sf_strerror (file)) ; - exit (1) ; - } ; - - /* Write data to file. */ - test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.frames != BUFFER_LEN) - { printf ("\n\nLine %d: Bad frame count %d (should be %d)\n\n", __LINE__, (int) sfinfo.frames, BUFFER_LEN) ; - } ; - - sf_close (file) ; - /*-unlink (filename) ;-*/ - - puts ("ok") ; -} /* dither_test */ - diff --git a/libs/libsndfile/tests/dwvw_test.c b/libs/libsndfile/tests/dwvw_test.c deleted file mode 100644 index 2bd11d18c9..0000000000 --- a/libs/libsndfile/tests/dwvw_test.c +++ /dev/null @@ -1,109 +0,0 @@ -/* -** Copyright (C) 2002-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_SIZE (10000) - -#ifndef M_PI -#define M_PI 3.14159265358979323846264338 -#endif - -static void dwvw_test (const char *filename, int format, int bit_width) ; - -int -main (void) -{ - dwvw_test ("dwvw12.raw", SF_FORMAT_RAW | SF_FORMAT_DWVW_12, 12) ; - dwvw_test ("dwvw16.raw", SF_FORMAT_RAW | SF_FORMAT_DWVW_16, 16) ; - dwvw_test ("dwvw24.raw", SF_FORMAT_RAW | SF_FORMAT_DWVW_24, 24) ; - - return 0 ; -} /* main */ - -static void -dwvw_test (const char *filename, int format, int bit_width) -{ static int write_buf [BUFFER_SIZE] ; - static int read_buf [BUFFER_SIZE] ; - - SNDFILE *file ; - SF_INFO sfinfo ; - double value ; - int k, bit_mask ; - - srand (123456) ; - - /* Only want to grab the top bit_width bits. */ - bit_mask = (-1 << (32 - bit_width)) ; - - print_test_name ("dwvw_test", filename) ; - - sf_info_setup (&sfinfo, format, 44100, 1) ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - /* Generate random.frames. */ - for (k = 0 ; k < BUFFER_SIZE / 2 ; k++) - { value = 0x7FFFFFFF * sin (123.0 / sfinfo.samplerate * 2 * k * M_PI) ; - write_buf [k] = bit_mask & lrint (value) ; - } ; - - for ( ; k < BUFFER_SIZE ; k++) - write_buf [k] = bit_mask & ((rand () << 11) ^ (rand () >> 11)) ; - - sf_write_int (file, write_buf, BUFFER_SIZE) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if ((k = sf_read_int (file, read_buf, BUFFER_SIZE)) != BUFFER_SIZE) - { printf ("Error (line %d) : Only read %d/%d.frames.\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } - - for (k = 0 ; k < BUFFER_SIZE ; k++) - { if (read_buf [k] != write_buf [k]) - { printf ("Error (line %d) : %d != %d at position %d/%d\n", __LINE__, - write_buf [k] >> (32 - bit_width), read_buf [k] >> (32 - bit_width), - k, BUFFER_SIZE) ; - oct_save_int (write_buf, read_buf, BUFFER_SIZE) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - unlink (filename) ; - printf ("ok\n") ; - - return ; -} /* dwvw_test */ - diff --git a/libs/libsndfile/tests/error_test.c b/libs/libsndfile/tests/error_test.c deleted file mode 100644 index 4207c0a3cf..0000000000 --- a/libs/libsndfile/tests/error_test.c +++ /dev/null @@ -1,246 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if OS_IS_WIN32 -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_SIZE (1 << 15) -#define SHORT_BUFFER (256) - -static void -error_number_test (void) -{ const char *noerror, *errstr ; - int k ; - - print_test_name ("error_number_test", "") ; - - noerror = sf_error_number (0) ; - - for (k = 1 ; k < 300 ; k++) - { errstr = sf_error_number (k) ; - - /* Test for termination condition. */ - if (errstr == noerror) - break ; - - /* Test for error. */ - if (strstr (errstr, "This is a bug in libsndfile.")) - { printf ("\n\nError : error number %d : %s\n\n\n", k, errstr) ; - exit (1) ; - } ; - } ; - - - puts ("ok") ; - return ; -} /* error_number_test */ - -static void -error_value_test (void) -{ static unsigned char aiff_data [0x1b0] = - { 'F' , 'O' , 'R' , 'M' , - 0x00, 0x00, 0x01, 0xA8, /* FORM length */ - - 'A' , 'I' , 'F' , 'C' , - } ; - - const char *filename = "error.aiff" ; - SNDFILE *file ; - SF_INFO sfinfo ; - int error_num ; - - print_test_name ("error_value_test", filename) ; - - dump_data_to_file (filename, aiff_data, sizeof (aiff_data)) ; - - file = sf_open (filename, SFM_READ, &sfinfo) ; - if (file != NULL) - { printf ("\n\nLine %d : Should not have been able to open this file.\n\n", __LINE__) ; - exit (1) ; - } ; - - if ((error_num = sf_error (NULL)) <= 1 || error_num > 300) - { printf ("\n\nLine %d : Should not have had an error number of %d.\n\n", __LINE__, error_num) ; - exit (1) ; - } ; - - remove (filename) ; - puts ("ok") ; - return ; -} /* error_value_test */ - -static void -no_file_test (const char * filename) -{ SNDFILE *sndfile ; - SF_INFO sfinfo ; - - print_test_name (__func__, filename) ; - - unlink (filename) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sndfile = sf_open (filename, SFM_READ, &sfinfo) ; - - exit_if_true (sndfile != NULL, "\n\nLine %d : should not have received a valid SNDFILE* pointer.\n", __LINE__) ; - - unlink (filename) ; - puts ("ok") ; -} /* no_file_test */ - -static void -zero_length_test (const char *filename) -{ SNDFILE *sndfile ; - SF_INFO sfinfo ; - FILE *file ; - - print_test_name (__func__, filename) ; - - /* Create a zero length file. */ - file = fopen (filename, "w") ; - exit_if_true (file == NULL, "\n\nLine %d : fopen ('%s') failed.\n", __LINE__, filename) ; - fclose (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sndfile = sf_open (filename, SFM_READ, &sfinfo) ; - - exit_if_true (sndfile != NULL, "\n\nLine %d : should not have received a valid SNDFILE* pointer.\n", __LINE__) ; - - exit_if_true (0 && sf_error (NULL) != SF_ERR_UNRECOGNISED_FORMAT, - "\n\nLine %3d : Error : %s\n should be : %s\n", __LINE__, - sf_strerror (NULL), sf_error_number (SF_ERR_UNRECOGNISED_FORMAT)) ; - - unlink (filename) ; - puts ("ok") ; -} /* zero_length_test */ - -static void -bad_wav_test (const char * filename) -{ SNDFILE *sndfile ; - SF_INFO sfinfo ; - - FILE *file ; - const char data [] = "RIFF WAVEfmt " ; - - print_test_name (__func__, filename) ; - - if ((file = fopen (filename, "w")) == NULL) - { printf ("\n\nLine %d : fopen returned NULL.\n", __LINE__) ; - exit (1) ; - } ; - - exit_if_true (fwrite (data, sizeof (data), 1, file) != 1, "\n\nLine %d : fwrite failed.\n", __LINE__) ; - fclose (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sndfile = sf_open (filename, SFM_READ, &sfinfo) ; - - if (sndfile) - { printf ("\n\nLine %d : should not have received a valid SNDFILE* pointer.\n", __LINE__) ; - exit (1) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* bad_wav_test */ - -static void -error_close_test (void) -{ static short buffer [SHORT_BUFFER] ; - const char *filename = "error_close.wav" ; - SNDFILE *sndfile ; - SF_INFO sfinfo ; - FILE *file ; - - print_test_name (__func__, filename) ; - - /* Open a FILE* from which we will extract a file descriptor. */ - if ((file = fopen (filename, "w")) == NULL) - { printf ("\n\nLine %d : fopen returned NULL.\n", __LINE__) ; - exit (1) ; - } ; - - /* Set parameters for writing the file. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.channels = 1 ; - sfinfo.samplerate = 44100 ; - sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; - - sndfile = sf_open_fd (fileno (file), SFM_WRITE, &sfinfo, SF_TRUE) ; - if (sndfile == NULL) - { printf ("\n\nLine %d : sf_open_fd failed : %s\n", __LINE__, sf_strerror (NULL)) ; - exit (1) ; - } ; - - test_write_short_or_die (sndfile, 0, buffer, ARRAY_LEN (buffer), __LINE__) ; - - /* Now close the fd associated with file before calling sf_close. */ - fclose (file) ; - - if (sf_close (sndfile) == 0) - { -#if OS_IS_WIN32 - OSVERSIONINFOEX osvi ; - - memset (&osvi, 0, sizeof (OSVERSIONINFOEX)) ; - osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX) ; - - if (GetVersionEx ((OSVERSIONINFO *) &osvi)) - { printf ("\n\nLine %d : sf_close should not have returned zero.\n", __LINE__) ; - printf ("\nHowever, this is a known bug in version %d.%d of windows so we'll ignore it.\n\n", - (int) osvi.dwMajorVersion, (int) osvi.dwMinorVersion) ; - } ; -#else - printf ("\n\nLine %d : sf_close should not have returned zero.\n", __LINE__) ; - exit (1) ; -#endif - } ; - - unlink (filename) ; - puts ("ok") ; -} /* error_close_test */ - -int -main (void) -{ - error_number_test () ; - error_value_test () ; - - error_close_test () ; - - no_file_test ("no_file.wav") ; - zero_length_test ("zero_length.wav") ; - bad_wav_test ("bad_wav.wav") ; - - return 0 ; -} /* main */ - diff --git a/libs/libsndfile/tests/external_libs_test.c b/libs/libsndfile/tests/external_libs_test.c deleted file mode 100644 index 86b029078e..0000000000 --- a/libs/libsndfile/tests/external_libs_test.c +++ /dev/null @@ -1,149 +0,0 @@ -/* -** Copyright (C) 2008-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include - -#include "utils.h" - -static void major_format_test (void) ; -static void subtype_format_test (void) ; -static void simple_format_test (void) ; - -int -main (void) -{ - major_format_test () ; - subtype_format_test () ; - simple_format_test () ; - - return 0 ; -} /* main */ - -static void -major_format_test (void) -{ SF_FORMAT_INFO info ; - int have_ogg = 0, have_flac = 0 ; - int m, major_count ; - - print_test_name (__func__, NULL) ; - - sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &major_count, sizeof (int)) ; - - for (m = 0 ; m < major_count ; m++) - { info.format = m ; - sf_command (NULL, SFC_GET_FORMAT_MAJOR, &info, sizeof (info)) ; - - have_flac = info.format == SF_FORMAT_FLAC ? 1 : have_flac ; - have_ogg = info.format == SF_FORMAT_OGG ? 1 : have_ogg ; - } ; - - if (HAVE_EXTERNAL_LIBS) - { exit_if_true (have_flac == 0, "\n\nLine %d : FLAC should be available.\n\n", __LINE__) ; - exit_if_true (have_ogg == 0, "\n\nLine %d : Ogg/Vorbis should be available.\n\n", __LINE__) ; - } - else - { exit_if_true (have_flac, "\n\nLine %d : FLAC should not be available.\n\n", __LINE__) ; - exit_if_true (have_ogg, "\n\nLine %d : Ogg/Vorbis should not be available.\n\n", __LINE__) ; - } ; - - puts ("ok") ; -} /* major_format_test */ - -static void -subtype_format_test (void) -{ SF_FORMAT_INFO info ; - int have_vorbis = 0 ; - int s, subtype_count ; - - print_test_name (__func__, NULL) ; - - sf_command (NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &subtype_count, sizeof (int)) ; - - for (s = 0 ; s < subtype_count ; s++) - { info.format = s ; - sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &info, sizeof (info)) ; - - have_vorbis = info.format == SF_FORMAT_VORBIS ? 1 : have_vorbis ; - } ; - - if (HAVE_EXTERNAL_LIBS) - exit_if_true (have_vorbis == 0, "\n\nLine %d : Ogg/Vorbis should be available.\n\n", __LINE__) ; - else - exit_if_true (have_vorbis, "\n\nLine %d : Ogg/Vorbis should not be available.\n\n", __LINE__) ; - - puts ("ok") ; -} /* subtype_format_test */ - -static void -simple_format_test (void) -{ SF_FORMAT_INFO info ; - int have_flac = 0, have_ogg = 0, have_vorbis = 0 ; - int s, simple_count ; - - print_test_name (__func__, NULL) ; - - sf_command (NULL, SFC_GET_SIMPLE_FORMAT_COUNT, &simple_count, sizeof (int)) ; - - for (s = 0 ; s < simple_count ; s++) - { info.format = s ; - sf_command (NULL, SFC_GET_SIMPLE_FORMAT, &info, sizeof (info)) ; - - switch (info.format & SF_FORMAT_TYPEMASK) - { case SF_FORMAT_FLAC : - have_flac = 1 ; - break ; - - case SF_FORMAT_OGG : - have_ogg = 1 ; - break ; - - default : - break ; - } ; - - switch (info.format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_VORBIS : - have_vorbis = 1 ; - break ; - - default : - break ; - } ; - - } ; - - if (HAVE_EXTERNAL_LIBS) - { exit_if_true (have_flac == 0, "\n\nLine %d : FLAC should be available.\n\n", __LINE__) ; - exit_if_true (have_ogg == 0, "\n\nLine %d : Ogg/Vorbis should be available.\n\n", __LINE__) ; - exit_if_true (have_vorbis == 0, "\n\nLine %d : Ogg/Vorbis should be available.\n\n", __LINE__) ; - } - else - { exit_if_true (have_flac, "\n\nLine %d : FLAC should not be available.\n\n", __LINE__) ; - exit_if_true (have_ogg, "\n\nLine %d : Ogg/Vorbis should not be available.\n\n", __LINE__) ; - exit_if_true (have_vorbis, "\n\nLine %d : Ogg/Vorbis should not be available.\n\n", __LINE__) ; - } ; - - puts ("ok") ; -} /* simple_format_test */ diff --git a/libs/libsndfile/tests/fix_this.c b/libs/libsndfile/tests/fix_this.c deleted file mode 100644 index 4cbb8d43ac..0000000000 --- a/libs/libsndfile/tests/fix_this.c +++ /dev/null @@ -1,328 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include -#include -#include -#include -#include -#include - -#include - -#include "utils.h" - -#define BUFFER_SIZE (1 << 14) -#define SAMPLE_RATE (11025) - -#ifndef M_PI -#define M_PI 3.14159265358979323846264338 -#endif - -static void lcomp_test_int (const char *str, const char *filename, int filetype, double margin) ; - -static int error_function (double data, double orig, double margin) ; -static int decay_response (int k) ; - -static void gen_signal_double (double *data, double scale, int datalen) ; - -/* Force the start of these buffers to be double aligned. Sparc-solaris will -** choke if they are not. -*/ - -typedef union -{ double d [BUFFER_SIZE + 1] ; - int i [BUFFER_SIZE + 1] ; -} BUFFER ; - -static BUFFER data_buffer ; -static BUFFER orig_buffer ; - -int -main (void) -{ const char *filename = "test.au" ; - - lcomp_test_int ("au_g721", filename, SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G721_32, 0.06) ; - - return 0 ; -} /* main */ - -/*============================================================================================ -** Here are the test functions. -*/ - -static void -lcomp_test_int (const char *str, const char *filename, int filetype, double margin) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, m, *orig, *data ; - sf_count_t datalen, seekpos ; - int64_t sum_abs ; - double scale ; - - printf ("\nThis is program is not part of the libsndfile test suite.\n\n") ; - - printf (" lcomp_test_int : %s ... ", str) ; - fflush (stdout) ; - - datalen = BUFFER_SIZE ; - - scale = 1.0 * 0x10000 ; - - data = data_buffer.i ; - orig = orig_buffer.i ; - - gen_signal_double (orig_buffer.d, 32000.0 * scale, datalen) ; - for (k = 0 ; k < datalen ; k++) - orig [k] = orig_buffer.d [k] ; - - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = 123456789 ; /* Ridiculous value. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) - { printf ("sf_open_write failed with error : ") ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - if ((k = sf_writef_int (file, orig, datalen)) != datalen) - { printf ("sf_writef_int failed with short write (%" PRId64 " => %d).\n", datalen, k) ; - exit (1) ; - } ; - sf_close (file) ; - - memset (data, 0, datalen * sizeof (int)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - if (! (file = sf_open (filename, SFM_READ, &sfinfo))) - { printf ("sf_open_read failed with error : ") ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < datalen) - { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.frames > (datalen + datalen / 2)) - { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("Incorrect number of channels in file.\n") ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - if ((k = sf_readf_int (file, data, datalen)) != datalen) - { printf ("Line %d: short read (%d should be %" PRId64 ").\n", __LINE__, k, datalen) ; - exit (1) ; - } ; - - sum_abs = 0 ; - for (k = 0 ; k < datalen ; k++) - { if (error_function (data [k] / scale, orig [k] / scale, margin)) - { printf ("Line %d: Incorrect sample (#%d : %f should be %f).\n", __LINE__, k, data [k] / scale, orig [k] / scale) ; - oct_save_int (orig, data, datalen) ; - exit (1) ; - } ; - sum_abs += abs (data [k]) ; - } ; - - if (sum_abs < 1.0) - { printf ("Line %d: Signal is all zeros.\n", __LINE__) ; - exit (1) ; - } ; - - if ((k = sf_readf_int (file, data, datalen)) != sfinfo.frames - datalen) - { printf ("Line %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__, sfinfo.frames - datalen, k) ; - exit (1) ; - } ; - - /* This check is only for block based encoders which must append silence - ** to the end of a file so as to fill out a block. - */ - if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM) - for (k = 0 ; k < sfinfo.frames - datalen ; k++) - if (abs (data [k] / scale) > decay_response (k)) - { printf ("Line %d : Incorrect sample B (#%d : abs (%d) should be < %d).\n", __LINE__, k, data [k], decay_response (k)) ; - exit (1) ; - } ; - - if (! sfinfo.seekable) - { printf ("ok\n") ; - return ; - } ; - - /* Now test sf_seek function. */ - - if ((k = sf_seek (file, 0, SEEK_SET)) != 0) - { printf ("Line %d: Seek to start of file failed (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - for (m = 0 ; m < 3 ; m++) - { int n ; - - if ((k = sf_readf_int (file, data, 11)) != 11) - { printf ("Line %d: Incorrect read length (11 => %d).\n", __LINE__, k) ; - exit (1) ; - } ; - - for (k = 0 ; k < 11 ; k++) - if (error_function (data [k] / scale, orig [k + m * 11] / scale, margin)) - { printf ("Line %d: Incorrect sample (m = %d) (#%d : %d => %d).\n", __LINE__, m, k + m * 11, orig [k + m * 11], data [k]) ; - for (n = 0 ; n < 1 ; n++) - printf ("%d ", data [n]) ; - printf ("\n") ; - exit (1) ; - } ; - } ; - - seekpos = BUFFER_SIZE / 10 ; - - /* Check seek from start of file. */ - if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) - { printf ("Seek to start of file + %" PRId64 " failed (%d).\n", seekpos, k) ; - exit (1) ; - } ; - - if ((k = sf_readf_int (file, data, 1)) != 1) - { printf ("Line %d: sf_readf_int (file, data, 1) returned %d.\n", __LINE__, k) ; - exit (1) ; - } ; - - if (error_function ((double) data [0], (double) orig [seekpos], margin)) - { printf ("Line %d: sf_seek (SEEK_SET) followed by sf_readf_int failed (%d, %d).\n", __LINE__, orig [1], data [0]) ; - exit (1) ; - } ; - - if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) - { printf ("Line %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %" PRId64 ")\n", __LINE__, k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; - k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; - sf_readf_int (file, data, 1) ; - if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos) - { printf ("Line %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %" PRId64 ").\n", __LINE__, data [0], orig [seekpos], k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; - /* Check seek backward from current position. */ - k = sf_seek (file, -20, SEEK_CUR) ; - sf_readf_int (file, data, 1) ; - if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos) - { printf ("sf_seek (backwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %" PRId64 ").\n", data [0], orig [seekpos], k, seekpos) ; - exit (1) ; - } ; - - /* Check that read past end of file returns number of items. */ - sf_seek (file, (int) sfinfo.frames, SEEK_SET) ; - - if ((k = sf_readf_int (file, data, datalen)) != 0) - { printf ("Line %d: Return value from sf_readf_int past end of file incorrect (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - /* Check seek backward from end. */ - if ((k = sf_seek (file, 5 - (int) sfinfo.frames, SEEK_END)) != 5) - { printf ("sf_seek (SEEK_END) returned %d instead of %d.\n", k, 5) ; - exit (1) ; - } ; - - sf_readf_int (file, data, 1) ; - if (error_function (data [0] / scale, orig [5] / scale, margin)) - { printf ("Line %d: sf_seek (SEEK_END) followed by sf_readf_short failed (%d should be %d).\n", __LINE__, data [0], orig [5]) ; - exit (1) ; - } ; - - sf_close (file) ; - - printf ("ok\n") ; -} /* lcomp_test_int */ - -/*======================================================================================== -** Auxiliary functions -*/ - -#define SIGNAL_MAXVAL 30000.0 -#define DECAY_COUNT 800 - -static int -decay_response (int k) -{ if (k < 1) - return (int) (1.2 * SIGNAL_MAXVAL) ; - if (k > DECAY_COUNT) - return 0 ; - return (int) (1.2 * SIGNAL_MAXVAL * (DECAY_COUNT - k) / (1.0 * DECAY_COUNT)) ; -} /* decay_response */ - -static void -gen_signal_double (double *data, double scale, int datalen) -{ int k, ramplen ; - double amp = 0.0 ; - - ramplen = datalen / 18 ; - - for (k = 0 ; k < datalen ; k++) - { if (k <= ramplen) - amp = scale * k / ((double) ramplen) ; - else if (k > datalen - ramplen) - amp = scale * (datalen - k) / ((double) ramplen) ; - - data [k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k + 1)) / ((double) SAMPLE_RATE)) - + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k + 1)) / ((double) SAMPLE_RATE))) ; - } ; - - return ; -} /* gen_signal_double */ - -static int -error_function (double data, double orig, double margin) -{ double error ; - - if (fabs (orig) <= 500.0) - error = fabs (fabs (data) - fabs (orig)) / 2000.0 ; - else if (fabs (orig) <= 1000.0) - error = fabs (data - orig) / 3000.0 ; - else - error = fabs (data - orig) / fabs (orig) ; - - if (error > margin) - { printf ("\n\n*******************\nError : %f\n", error) ; - return 1 ; - } ; - return 0 ; -} /* error_function */ - diff --git a/libs/libsndfile/tests/floating_point_test.c b/libs/libsndfile/tests/floating_point_test.c deleted file mode 100644 index aaf53866ea..0000000000 --- a/libs/libsndfile/tests/floating_point_test.c +++ /dev/null @@ -1,694 +0,0 @@ -/* -** Copyright (C) 1999-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "dft_cmp.h" -#include "utils.h" - -#define SAMPLE_RATE 16000 - -static void float_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) ; -static void double_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) ; - -static void float_short_little_test (const char * filename) ; -static void float_short_big_test (const char * filename) ; -static void float_int_little_test (const char * filename) ; -static void float_int_big_test (const char * filename) ; -static void double_short_little_test (const char * filename) ; -static void double_short_big_test (const char * filename) ; -static void double_int_little_test (const char * filename) ; -static void double_int_big_test (const char * filename) ; - - -static double double_data [DFT_DATA_LENGTH] ; -static double double_test [DFT_DATA_LENGTH] ; - -static float float_data [DFT_DATA_LENGTH] ; -static float float_test [DFT_DATA_LENGTH] ; - -static double double_data [DFT_DATA_LENGTH] ; -static short short_data [DFT_DATA_LENGTH] ; -static int int_data [DFT_DATA_LENGTH] ; - -int -main (int argc, char *argv []) -{ int allow_exit = 1 ; - - if (argc == 2 && ! strstr (argv [1], "no-exit")) - allow_exit = 0 ; - -#if ((HAVE_LRINTF == 0) && (HAVE_LRINT_REPLACEMENT == 0)) - puts ("*** Cannot run this test on this platform because it lacks lrintf().") ; - exit (0) ; -#endif - - /* Float tests. */ - float_scaled_test ("float.raw", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, -163.0) ; - - /* Test both signed and unsigned 8 bit files. */ - float_scaled_test ("pcm_s8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_S8, -39.0) ; - float_scaled_test ("pcm_u8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_U8, -39.0) ; - - float_scaled_test ("pcm_16.raw", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, -87.0) ; - float_scaled_test ("pcm_24.raw", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, -138.0) ; - float_scaled_test ("pcm_32.raw", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, -163.0) ; - - float_scaled_test ("ulaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ULAW, -50.0) ; - float_scaled_test ("alaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ALAW, -49.0) ; - - float_scaled_test ("ima_adpcm.wav", allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, -47.0) ; - float_scaled_test ("ms_adpcm.wav" , allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, -40.0) ; - float_scaled_test ("gsm610.raw" , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_GSM610, -33.0) ; - - float_scaled_test ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -34.0) ; - float_scaled_test ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -34.0) ; - float_scaled_test ("g723_40.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_40, -40.0) ; - - /* PAF files do not use the same encoding method for 24 bit PCM data as other file - ** formats so we need to explicitly test it here. - */ - float_scaled_test ("le_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -149.0) ; - float_scaled_test ("be_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -149.0) ; - - float_scaled_test ("dwvw_12.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_12, -64.0) ; - float_scaled_test ("dwvw_16.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_16, -92.0) ; - float_scaled_test ("dwvw_24.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_24, -151.0) ; - - float_scaled_test ("adpcm.vox", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, -40.0) ; - - float_scaled_test ("dpcm_16.xi", allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_16, -90.0) ; - float_scaled_test ("dpcm_8.xi" , allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_8 , -41.0) ; - - float_scaled_test ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -90.0) ; - float_scaled_test ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -140.0) ; - float_scaled_test ("pcm_24.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_24, -170.0) ; - -#if HAVE_EXTERNAL_LIBS - float_scaled_test ("flac_8.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, -39.0) ; - float_scaled_test ("flac_16.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_16, -87.0) ; - float_scaled_test ("flac_24.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_24, -138.0) ; - - float_scaled_test ("vorbis.oga", allow_exit, SF_FALSE, SF_FORMAT_OGG | SF_FORMAT_VORBIS, -31.0) ; -#endif - - float_scaled_test ("replace_float.raw", allow_exit, SF_TRUE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, -163.0) ; - - /*============================================================================== - ** Double tests. - */ - - double_scaled_test ("double.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -300.0) ; - - /* Test both signed (AIFF) and unsigned (WAV) 8 bit files. */ - double_scaled_test ("pcm_s8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_S8, -39.0) ; - double_scaled_test ("pcm_u8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_U8, -39.0) ; - - double_scaled_test ("pcm_16.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_16, -87.0) ; - double_scaled_test ("pcm_24.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_24, -135.0) ; - double_scaled_test ("pcm_32.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_32, -184.0) ; - - double_scaled_test ("ulaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ULAW, -50.0) ; - double_scaled_test ("alaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ALAW, -49.0) ; - - double_scaled_test ("ima_adpcm.wav", allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, -47.0) ; - double_scaled_test ("ms_adpcm.wav" , allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, -40.0) ; - double_scaled_test ("gsm610.raw" , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_GSM610, -33.0) ; - - double_scaled_test ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -34.0) ; - double_scaled_test ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -34.0) ; - double_scaled_test ("g723_40.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_40, -40.0) ; - - /* 24 bit PCM PAF files tested here. */ - double_scaled_test ("be_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -151.0) ; - double_scaled_test ("le_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -151.0) ; - - double_scaled_test ("dwvw_12.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_12, -64.0) ; - double_scaled_test ("dwvw_16.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_16, -92.0) ; - double_scaled_test ("dwvw_24.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_24, -151.0) ; - - double_scaled_test ("adpcm.vox" , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, -40.0) ; - - double_scaled_test ("dpcm_16.xi", allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_16, -90.0) ; - double_scaled_test ("dpcm_8.xi" , allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_8 , -42.0) ; - - double_scaled_test ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -90.0) ; - double_scaled_test ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -140.0) ; - double_scaled_test ("pcm_24.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_24, -180.0) ; - -#if HAVE_EXTERNAL_LIBS - double_scaled_test ("flac_8.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, -39.0) ; - double_scaled_test ("flac_16.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_16, -87.0) ; - double_scaled_test ("flac_24.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_24, -138.0) ; - - double_scaled_test ("vorbis.oga", allow_exit, SF_FALSE, SF_FORMAT_OGG | SF_FORMAT_VORBIS, -29.0) ; -#endif - - double_scaled_test ("replace_double.raw", allow_exit, SF_TRUE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -300.0) ; - - putchar ('\n') ; - /* Float int tests. */ - float_short_little_test ("float_short_little.au") ; - float_short_big_test ("float_short_big.au") ; - float_int_little_test ("float_int_little.au") ; - float_int_big_test ("float_int_big.au") ; - double_short_little_test ("double_short_little.au") ; - double_short_big_test ("double_short_big.au") ; - double_int_little_test ("double_int_little.au") ; - double_int_big_test ("double_int_big.au") ; - - - return 0 ; -} /* main */ - -/*============================================================================================ - * Here are the test functions. - */ - -static void -float_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) -{ SNDFILE *file ; - SF_INFO sfinfo ; - double snr ; - - print_test_name ("float_scaled_test", filename) ; - - gen_windowed_sine_float (float_data, DFT_DATA_LENGTH, 1.0) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DFT_DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - - test_write_float_or_die (file, 0, float_data, DFT_DATA_LENGTH, __LINE__) ; - - sf_close (file) ; - - memset (float_test, 0, sizeof (float_test)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - - exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ; - exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_float_or_die (file, 0, float_test, DFT_DATA_LENGTH, __LINE__) ; - - sf_close (file) ; - - snr = dft_cmp_float (__LINE__, float_data, float_test, DFT_DATA_LENGTH, target_snr, allow_exit) ; - - exit_if_true (snr > target_snr, "% 6.1fdB SNR\n\n Error : should be better than % 6.1fdB\n\n", snr, target_snr) ; - - printf ("% 6.1fdB SNR ... ok\n", snr) ; - - unlink (filename) ; - - return ; -} /* float_scaled_test */ - -static void -double_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) -{ SNDFILE *file ; - SF_INFO sfinfo ; - double snr ; - - print_test_name ("double_scaled_test", filename) ; - - gen_windowed_sine_double (double_data, DFT_DATA_LENGTH, 0.95) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DFT_DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - - test_write_double_or_die (file, 0, double_data, DFT_DATA_LENGTH, __LINE__) ; - - sf_close (file) ; - - memset (double_test, 0, sizeof (double_test)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - - exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ; - exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_double_or_die (file, 0, double_test, DFT_DATA_LENGTH, __LINE__) ; - - sf_close (file) ; - - snr = dft_cmp_double (__LINE__, double_data, double_test, DFT_DATA_LENGTH, target_snr, allow_exit) ; - - exit_if_true (snr > target_snr, "% 6.1fdB SNR\n\n Error : should be better than % 6.1fdB\n\n", snr, target_snr) ; - - printf ("% 6.1fdB SNR ... ok\n", snr) ; - - unlink (filename) ; - - return ; -} /* double_scaled_test */ - -/*============================================================================== -*/ - - -static void -float_short_little_test (const char * filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - unsigned k, max ; - - print_test_name ("float_short_little_test", filename) ; - - gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.98) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = ARRAY_LEN (short_data) ; - sfinfo.channels = 1 ; - sfinfo.format = SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.frames != ARRAY_LEN (float_data)) - { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - test_read_short_or_die (file, 0, short_data, ARRAY_LEN (short_data), __LINE__) ; - sf_close (file) ; - - max = 0 ; - for (k = 0 ; k < ARRAY_LEN (short_data) ; k++) - if ((unsigned) abs (short_data [k]) > max) - max = abs (short_data [k]) ; - - if (1.0 * abs (max - 0x7FFF) / 0x7FFF > 0.01) - { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFF) ; - exit (1) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* float_short_little_test */ - -static void -float_short_big_test (const char * filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - unsigned k, max ; - - print_test_name ("float_short_big_test", filename) ; - - gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.98) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = ARRAY_LEN (short_data) ; - sfinfo.channels = 1 ; - sfinfo.format = SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_FLOAT ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.frames != ARRAY_LEN (float_data)) - { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - test_read_short_or_die (file, 0, short_data, ARRAY_LEN (short_data), __LINE__) ; - sf_close (file) ; - - max = 0 ; - for (k = 0 ; k < ARRAY_LEN (short_data) ; k++) - if ((unsigned) abs (short_data [k]) > max) - max = abs (short_data [k]) ; - - if (1.0 * abs (max - 0x7FFF) / 0x7FFF > 0.01) - { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFF) ; - exit (1) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* float_short_big_test */ - -static void -float_int_little_test (const char * filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - unsigned k, max ; - - print_test_name ("float_int_little_test", filename) ; - - gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.98) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = ARRAY_LEN (int_data) ; - sfinfo.channels = 1 ; - sfinfo.format = SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.frames != ARRAY_LEN (float_data)) - { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - test_read_int_or_die (file, 0, int_data, ARRAY_LEN (int_data), __LINE__) ; - sf_close (file) ; - - max = 0 ; - for (k = 0 ; k < ARRAY_LEN (int_data) ; k++) - if ((unsigned) abs (int_data [k]) > max) - max = abs (int_data [k]) ; - - if (1.0 * abs (max - 0x7FFFFFFF) / 0x7FFFFFFF > 0.01) - { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFFFFFF) ; - exit (1) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* float_int_little_test */ - -static void -float_int_big_test (const char * filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - unsigned k, max ; - - print_test_name ("float_int_big_test", filename) ; - - gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.98) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = ARRAY_LEN (int_data) ; - sfinfo.channels = 1 ; - sfinfo.format = SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_FLOAT ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.frames != ARRAY_LEN (float_data)) - { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - test_read_int_or_die (file, 0, int_data, ARRAY_LEN (int_data), __LINE__) ; - sf_close (file) ; - - max = 0 ; - for (k = 0 ; k < ARRAY_LEN (int_data) ; k++) - if ((unsigned) abs (int_data [k]) > max) - max = abs (int_data [k]) ; - - if (1.0 * abs (max - 0x7FFFFFFF) / 0x7FFFFFFF > 0.01) - { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFFFFFF) ; - exit (1) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* float_int_big_test */ - -static void -double_short_little_test (const char * filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - unsigned k, max ; - - print_test_name ("double_short_little_test", filename) ; - - gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.98) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = ARRAY_LEN (short_data) ; - sfinfo.channels = 1 ; - sfinfo.format = SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_double_or_die (file, 0, double_data, ARRAY_LEN (double_data), __LINE__) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.frames != ARRAY_LEN (double_data)) - { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - test_read_short_or_die (file, 0, short_data, ARRAY_LEN (short_data), __LINE__) ; - sf_close (file) ; - - max = 0 ; - for (k = 0 ; k < ARRAY_LEN (short_data) ; k++) - if ((unsigned) abs (short_data [k]) > max) - max = abs (short_data [k]) ; - - if (1.0 * abs (max - 0x7FFF) / 0x7FFF > 0.01) - { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFF) ; - exit (1) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* double_short_little_test */ - -static void -double_short_big_test (const char * filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - unsigned k, max ; - - print_test_name ("double_short_big_test", filename) ; - - gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.98) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = ARRAY_LEN (short_data) ; - sfinfo.channels = 1 ; - sfinfo.format = SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_DOUBLE ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_double_or_die (file, 0, double_data, ARRAY_LEN (double_data), __LINE__) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.frames != ARRAY_LEN (double_data)) - { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - test_read_short_or_die (file, 0, short_data, ARRAY_LEN (short_data), __LINE__) ; - sf_close (file) ; - - max = 0 ; - for (k = 0 ; k < ARRAY_LEN (short_data) ; k++) - if ((unsigned) abs (short_data [k]) > max) - max = abs (short_data [k]) ; - - if (1.0 * abs (max - 0x7FFF) / 0x7FFF > 0.01) - { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFF) ; - exit (1) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* double_short_big_test */ - -static void -double_int_little_test (const char * filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - unsigned k, max ; - - print_test_name ("double_int_little_test", filename) ; - - gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.98) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = ARRAY_LEN (int_data) ; - sfinfo.channels = 1 ; - sfinfo.format = SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_double_or_die (file, 0, double_data, ARRAY_LEN (double_data), __LINE__) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.frames != ARRAY_LEN (double_data)) - { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - test_read_int_or_die (file, 0, int_data, ARRAY_LEN (int_data), __LINE__) ; - sf_close (file) ; - - max = 0 ; - for (k = 0 ; k < ARRAY_LEN (int_data) ; k++) - if ((unsigned) abs (int_data [k]) > max) - max = abs (int_data [k]) ; - - if (1.0 * abs (max - 0x7FFFFFFF) / 0x7FFFFFFF > 0.01) - { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFFFFFF) ; - exit (1) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* double_int_little_test */ - -static void -double_int_big_test (const char * filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - unsigned k, max ; - - print_test_name ("double_int_big_test", filename) ; - - gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.98) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = ARRAY_LEN (int_data) ; - sfinfo.channels = 1 ; - sfinfo.format = SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_DOUBLE ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_double_or_die (file, 0, double_data, ARRAY_LEN (double_data), __LINE__) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.frames != ARRAY_LEN (double_data)) - { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - test_read_int_or_die (file, 0, int_data, ARRAY_LEN (int_data), __LINE__) ; - sf_close (file) ; - - max = 0 ; - for (k = 0 ; k < ARRAY_LEN (int_data) ; k++) - if ((unsigned) abs (int_data [k]) > max) - max = abs (int_data [k]) ; - - if (1.0 * abs (max - 0x7FFFFFFF) / 0x7FFFFFFF > 0.01) - { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFFFFFF) ; - exit (1) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* double_int_big_test */ - - diff --git a/libs/libsndfile/tests/floating_point_test.def b/libs/libsndfile/tests/floating_point_test.def deleted file mode 100644 index 3441d34bc7..0000000000 --- a/libs/libsndfile/tests/floating_point_test.def +++ /dev/null @@ -1,32 +0,0 @@ -autogen definitions floating_point_test.tpl; - -endian_type = { - end_name = little ; - end_type = SF_ENDIAN_LITTLE ; - } ; - -endian_type = { - end_name = big ; - end_type = SF_ENDIAN_BIG ; - } ; - -float_type = { - float_name = float ; - minor_type = SF_FORMAT_FLOAT ; - } ; - -float_type = { - float_name = double ; - minor_type = SF_FORMAT_DOUBLE ; - } ; - -int_type = { - int_name = short ; - int_max = 0x7FFF ; - } ; - -int_type = { - int_name = int ; - int_max = 0x7FFFFFFF ; - } ; - diff --git a/libs/libsndfile/tests/floating_point_test.tpl b/libs/libsndfile/tests/floating_point_test.tpl deleted file mode 100644 index 4b2d21caab..0000000000 --- a/libs/libsndfile/tests/floating_point_test.tpl +++ /dev/null @@ -1,355 +0,0 @@ -[+ AutoGen5 template c +] -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "dft_cmp.h" -#include "utils.h" - -#define SAMPLE_RATE 16000 - -static void float_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) ; -static void double_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) ; - -[+ FOR float_type +][+ FOR int_type +][+ FOR endian_type -+]static void [+ (get "float_name") +]_[+ (get "int_name") +]_[+ (get "end_name") +]_test (const char * filename) ; -[+ ENDFOR endian_type +][+ ENDFOR int_type +][+ ENDFOR float_type -+] - -static double double_data [DFT_DATA_LENGTH] ; -static double double_test [DFT_DATA_LENGTH] ; - -static float float_data [DFT_DATA_LENGTH] ; -static float float_test [DFT_DATA_LENGTH] ; - -static double double_data [DFT_DATA_LENGTH] ; -static short short_data [DFT_DATA_LENGTH] ; -static int int_data [DFT_DATA_LENGTH] ; - -int -main (int argc, char *argv []) -{ int allow_exit = 1 ; - - if (argc == 2 && ! strstr (argv [1], "no-exit")) - allow_exit = 0 ; - -#if (HAVE_LRINTF == 0) - puts ("*** Cannot run this test on this platform because it lacks lrintf().") ; - exit (0) ; -#endif - - /* Float tests. */ - float_scaled_test ("float.raw", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, -163.0) ; - - /* Test both signed and unsigned 8 bit files. */ - float_scaled_test ("pcm_s8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_S8, -39.0) ; - float_scaled_test ("pcm_u8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_U8, -39.0) ; - - float_scaled_test ("pcm_16.raw", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, -87.0) ; - float_scaled_test ("pcm_24.raw", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, -138.0) ; - float_scaled_test ("pcm_32.raw", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, -163.0) ; - - float_scaled_test ("ulaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ULAW, -50.0) ; - float_scaled_test ("alaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ALAW, -49.0) ; - - float_scaled_test ("ima_adpcm.wav", allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, -47.0) ; - float_scaled_test ("ms_adpcm.wav" , allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, -40.0) ; - float_scaled_test ("gsm610.raw" , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_GSM610, -33.0) ; - - float_scaled_test ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -34.0) ; - float_scaled_test ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -34.0) ; - float_scaled_test ("g723_40.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_40, -40.0) ; - - /* PAF files do not use the same encoding method for 24 bit PCM data as other file - ** formats so we need to explicitly test it here. - */ - float_scaled_test ("le_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -149.0) ; - float_scaled_test ("be_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -149.0) ; - - float_scaled_test ("dwvw_12.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_12, -64.0) ; - float_scaled_test ("dwvw_16.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_16, -92.0) ; - float_scaled_test ("dwvw_24.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_24, -151.0) ; - - float_scaled_test ("adpcm.vox", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, -40.0) ; - - float_scaled_test ("dpcm_16.xi", allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_16, -90.0) ; - float_scaled_test ("dpcm_8.xi" , allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_8 , -41.0) ; - - float_scaled_test ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -90.0) ; - float_scaled_test ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -140.0) ; - float_scaled_test ("pcm_24.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_24, -170.0) ; - - float_scaled_test ("alac_16.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_16, -90.0) ; - float_scaled_test ("alac_32.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_32, -181.0) ; - float_scaled_test ("alac_24.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_24, -160.0) ; - float_scaled_test ("alac_20.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_20, -134.0) ; - -#if HAVE_EXTERNAL_LIBS - float_scaled_test ("flac_8.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, -39.0) ; - float_scaled_test ("flac_16.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_16, -87.0) ; - float_scaled_test ("flac_24.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_24, -138.0) ; - - float_scaled_test ("vorbis.oga", allow_exit, SF_FALSE, SF_FORMAT_OGG | SF_FORMAT_VORBIS, -31.0) ; -#endif - - float_scaled_test ("replace_float.raw", allow_exit, SF_TRUE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, -163.0) ; - - /*============================================================================== - ** Double tests. - */ - - double_scaled_test ("double.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -205.0) ; - - /* Test both signed (AIFF) and unsigned (WAV) 8 bit files. */ - double_scaled_test ("pcm_s8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_S8, -39.0) ; - double_scaled_test ("pcm_u8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_U8, -39.0) ; - - double_scaled_test ("pcm_16.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_16, -87.0) ; - double_scaled_test ("pcm_24.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_24, -135.0) ; - double_scaled_test ("pcm_32.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_32, -184.0) ; - - double_scaled_test ("ulaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ULAW, -50.0) ; - double_scaled_test ("alaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ALAW, -49.0) ; - - double_scaled_test ("ima_adpcm.wav", allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, -47.0) ; - double_scaled_test ("ms_adpcm.wav" , allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, -40.0) ; - double_scaled_test ("gsm610.raw" , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_GSM610, -33.0) ; - - double_scaled_test ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -34.0) ; - double_scaled_test ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -34.0) ; - double_scaled_test ("g723_40.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_40, -40.0) ; - - /* 24 bit PCM PAF files tested here. */ - double_scaled_test ("be_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -151.0) ; - double_scaled_test ("le_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -151.0) ; - - double_scaled_test ("dwvw_12.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_12, -64.0) ; - double_scaled_test ("dwvw_16.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_16, -92.0) ; - double_scaled_test ("dwvw_24.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_24, -151.0) ; - - double_scaled_test ("adpcm.vox" , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, -40.0) ; - - double_scaled_test ("dpcm_16.xi", allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_16, -90.0) ; - double_scaled_test ("dpcm_8.xi" , allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_8 , -42.0) ; - - double_scaled_test ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -90.0) ; - double_scaled_test ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -140.0) ; - double_scaled_test ("pcm_24.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_24, -180.0) ; - - double_scaled_test ("alac_16.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_16, -90.0) ; - double_scaled_test ("alac_20.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_20, -134.0) ; - double_scaled_test ("alac_24.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_24, -158.0) ; - double_scaled_test ("alac_32.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_32, -186.0) ; - -#if HAVE_EXTERNAL_LIBS - double_scaled_test ("flac_8.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, -39.0) ; - double_scaled_test ("flac_16.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_16, -87.0) ; - double_scaled_test ("flac_24.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_24, -138.0) ; - - double_scaled_test ("vorbis.oga", allow_exit, SF_FALSE, SF_FORMAT_OGG | SF_FORMAT_VORBIS, -29.0) ; -#endif - - double_scaled_test ("replace_double.raw", allow_exit, SF_TRUE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -205.0) ; - - putchar ('\n') ; - /* Float int tests. */ -[+ FOR float_type +][+ FOR int_type +][+ FOR endian_type -+] [+ (get "float_name") +]_[+ (get "int_name") +]_[+ (get "end_name") +]_test ("[+ (get "float_name") +]_[+ (get "int_name") +]_[+ (get "end_name") +].au") ; -[+ ENDFOR endian_type +][+ ENDFOR int_type +][+ ENDFOR float_type -+] - - return 0 ; -} /* main */ - -/*============================================================================================ - * Here are the test functions. - */ - -static void -float_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) -{ SNDFILE *file ; - SF_INFO sfinfo ; - double snr ; - int byterate ; - - print_test_name ("float_scaled_test", filename) ; - - gen_windowed_sine_float (float_data, DFT_DATA_LENGTH, 1.0) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DFT_DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - - test_write_float_or_die (file, 0, float_data, DFT_DATA_LENGTH, __LINE__) ; - - sf_close (file) ; - - memset (float_test, 0, sizeof (float_test)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - - exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; - exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_float_or_die (file, 0, float_test, DFT_DATA_LENGTH, __LINE__) ; - - byterate = sf_current_byterate (file) ; - exit_if_true (byterate <= 0, "\n\nLine %d: byterate is zero.\n", __LINE__) ; - - sf_close (file) ; - - snr = dft_cmp_float (__LINE__, float_data, float_test, DFT_DATA_LENGTH, target_snr, allow_exit) ; - - exit_if_true (snr > target_snr, "% 6.1fdB SNR\n\n Error : should be better than % 6.1fdB\n\n", snr, target_snr) ; - - printf ("% 6.1fdB SNR ... ok\n", snr) ; - - unlink (filename) ; - - return ; -} /* float_scaled_test */ - -static void -double_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) -{ SNDFILE *file ; - SF_INFO sfinfo ; - double snr ; - int byterate ; - - print_test_name ("double_scaled_test", filename) ; - - gen_windowed_sine_double (double_data, DFT_DATA_LENGTH, 0.95) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DFT_DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - - test_write_double_or_die (file, 0, double_data, DFT_DATA_LENGTH, __LINE__) ; - - sf_close (file) ; - - memset (double_test, 0, sizeof (double_test)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - - exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; - exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_double_or_die (file, 0, double_test, DFT_DATA_LENGTH, __LINE__) ; - - byterate = sf_current_byterate (file) ; - exit_if_true (byterate <= 0, "\n\nLine %d: byterate is zero.\n", __LINE__) ; - - sf_close (file) ; - - snr = dft_cmp_double (__LINE__, double_data, double_test, DFT_DATA_LENGTH, target_snr, allow_exit) ; - - exit_if_true (snr > target_snr, "% 6.1fdB SNR\n\n Error : should be better than % 6.1fdB\n\n", snr, target_snr) ; - - printf ("% 6.1fdB SNR ... ok\n", snr) ; - - unlink (filename) ; - - return ; -} /* double_scaled_test */ - -/*============================================================================== -*/ - -[+ FOR float_type +][+ FOR int_type +][+ FOR endian_type -+] -static void -[+ (get "float_name") +]_[+ (get "int_name") +]_[+ (get "end_name") +]_test (const char * filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - unsigned k, max ; - - print_test_name ("[+ (get "float_name") +]_[+ (get "int_name") +]_[+ (get "end_name") +]_test", filename) ; - - gen_windowed_sine_[+ (get "float_name") +] ([+ (get "float_name") +]_data, ARRAY_LEN ([+ (get "float_name") +]_data), 0.98) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = ARRAY_LEN ([+ (get "int_name") +]_data) ; - sfinfo.channels = 1 ; - sfinfo.format = [+ (get "end_type") +] | SF_FORMAT_AU | [+ (get "minor_type") +] ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_[+ (get "float_name") +]_or_die (file, 0, [+ (get "float_name") +]_data, ARRAY_LEN ([+ (get "float_name") +]_data), __LINE__) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.frames != ARRAY_LEN ([+ (get "float_name") +]_data)) - { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - test_read_[+ (get "int_name") +]_or_die (file, 0, [+ (get "int_name") +]_data, ARRAY_LEN ([+ (get "int_name") +]_data), __LINE__) ; - sf_close (file) ; - - max = 0 ; - for (k = 0 ; k < ARRAY_LEN ([+ (get "int_name") +]_data) ; k++) - if ((unsigned) abs ([+ (get "int_name") +]_data [k]) > max) - max = abs ([+ (get "int_name") +]_data [k]) ; - - if (1.0 * abs (max - [+ (get "int_max") +]) / [+ (get "int_max") +] > 0.01) - { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, [+ (get "int_max") +]) ; - exit (1) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* [+ (get "float_name") +]_[+ (get "int_name") +]_[+ (get "end_name") +]_test */ -[+ ENDFOR endian_type +][+ ENDFOR int_type +][+ ENDFOR float_type +] - diff --git a/libs/libsndfile/tests/format_check_test.c b/libs/libsndfile/tests/format_check_test.c deleted file mode 100644 index a371c71ff7..0000000000 --- a/libs/libsndfile/tests/format_check_test.c +++ /dev/null @@ -1,149 +0,0 @@ -/* -** Copyright (C) 2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include "sndfile.h" -#include "utils.h" - -static void format_error_test (void) ; -static void format_combo_test (void) ; - -int -main (void) -{ - format_error_test () ; - format_combo_test () ; - - return 0 ; -} /* main */ - -/*============================================================================== -*/ - -static void -format_error_test (void) -{ const char *filename = "format-error.wav" ; - SNDFILE *file ; - SF_INFO info ; - - print_test_name (__func__, NULL) ; - - memset (&info, 0, sizeof (info)) ; - info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; - info.channels = 1 ; - info.samplerate = 44100 ; - - info.format = SF_FORMAT_WAV ; - file = sf_open (filename, SFM_WRITE, &info) ; - exit_if_true (file != NULL, "\n\nLine %d : Format should not be valid.\n\n", __LINE__) ; - exit_if_true ( - strstr (sf_strerror (NULL), "minor format") == NULL, - "\n\nLine %d : Error string should reference bad 'minor format'.\n\n", __LINE__ - ) ; - - info.format = SF_FORMAT_PCM_16 ; - file = sf_open (filename, SFM_WRITE, &info) ; - exit_if_true (file != NULL, "\n\nLine %d : Format should not be valid.\n\n", __LINE__) ; - exit_if_true ( - strstr (sf_strerror (NULL), "major format") == NULL, - "\n\nLine %d : Error string should reference bad 'major format'.\n\n", __LINE__ - ) ; - - unlink (filename) ; - puts ("ok") ; -} /* format_error_test */ - -static void -format_combo_test (void) -{ int container_max, codec_max, cont, codec ; - - print_test_name (__func__, NULL) ; - - sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &container_max, sizeof (container_max)) ; - sf_command (NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &codec_max, sizeof (codec_max)) ; - - for (cont = 0 ; cont < container_max + 10 ; cont ++) - { SF_FORMAT_INFO major_fmt_info ; - - memset (&major_fmt_info, 0, sizeof (major_fmt_info)) ; - major_fmt_info.format = cont ; - (void) sf_command (NULL, SFC_GET_FORMAT_MAJOR, &major_fmt_info, sizeof (major_fmt_info)) ; - - for (codec = 0 ; codec < codec_max + 10 ; codec ++) - { SF_FORMAT_INFO subtype_fmt_info ; - SNDFILE * sndfile ; - SF_INFO info ; - char filename [128] ; - int subtype_is_valid, check_is_valid ; - - memset (&subtype_fmt_info, 0, sizeof (subtype_fmt_info)) ; - subtype_fmt_info.format = codec ; - subtype_is_valid = sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &subtype_fmt_info, sizeof (subtype_fmt_info)) == 0 ; - - sf_info_setup (&info, major_fmt_info.format | subtype_fmt_info.format, 22050, 1) ; - - check_is_valid = sf_format_check (&info) ; - - exit_if_true ( - NOT (subtype_is_valid) && check_is_valid, - "\n\nLine %d : Subtype is not valid but checks ok.\n", - __LINE__ - ) ; - - snprintf (filename, sizeof (filename), "format-check.%s", major_fmt_info.extension) ; - - sndfile = sf_open (filename, SFM_WRITE, &info) ; - - sf_close (sndfile) ; - unlink (filename) ; - - if (major_fmt_info.extension != NULL && strcmp (major_fmt_info.extension, "sd2") == 0) - { snprintf (filename, sizeof (filename), "._format-check.%s", major_fmt_info.extension) ; - unlink (filename) ; - } ; - - exit_if_true ( - sndfile && NOT (check_is_valid), - "\n\nError : Format was not valid but file opened correctly.\n" - " Container : %s\n" - " Codec : %s\n\n", - major_fmt_info.name, subtype_fmt_info.name - ) ; - - exit_if_true ( - NOT (sndfile) && check_is_valid, - "\n\nError : Format was valid but file failed to open.\n" - " Container : %s\n" - " Codec : %s\n\n", - major_fmt_info.name, subtype_fmt_info.name - ) ; - } ; - } ; - - puts ("ok") ; -} /* format_combo_test */ - diff --git a/libs/libsndfile/tests/generate.c b/libs/libsndfile/tests/generate.c deleted file mode 100644 index 653018b0f4..0000000000 --- a/libs/libsndfile/tests/generate.c +++ /dev/null @@ -1,73 +0,0 @@ -/* -** Copyright (C) 2007-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include -#include -#include -#include - -#include - -#include "utils.h" -#include "generate.h" - -#define SF_MAX(x, y) ((x) > (y) ? (x) : (y)) - -static float crappy_snare (float *output, int len, int offset, float gain, float maxabs) ; - -void -generate_file (const char * filename, int format, int len) -{ float * output ; - float maxabs = 0.0 ; - - output = calloc (len, sizeof (float)) ; - - maxabs = crappy_snare (output, len, 0, 0.95, maxabs) ; - maxabs = crappy_snare (output, len, len / 4, 0.85, maxabs) ; - maxabs = crappy_snare (output, len, 2 * len / 4, 0.85, maxabs) ; - crappy_snare (output, len, 3 * len / 4, 0.85, maxabs) ; - - write_mono_file (filename, format, 44100, output, len) ; - - free (output) ; -} /* generate_file */ - -static inline float -rand_float (void) -{ return rand () / (0.5 * RAND_MAX) - 1.0 ; -} /* rand_float */ - -static float -crappy_snare (float *output, int len, int offset, float gain, float maxabs) -{ int k ; - float env = 0.0 ; - - for (k = offset ; k < len && env < gain ; k++) - { env += 0.03 ; - output [k] += env * rand_float () ; - maxabs = SF_MAX (maxabs, fabs (output [k])) ; - } ; - - for ( ; k < len && env > 1e-8 ; k++) - { env *= 0.995 ; - output [k] += env * rand_float () ; - maxabs = SF_MAX (maxabs, fabs (output [k])) ; - } ; - - return maxabs ; -} /* crappy_snare */ diff --git a/libs/libsndfile/tests/generate.h b/libs/libsndfile/tests/generate.h deleted file mode 100644 index 709ea61191..0000000000 --- a/libs/libsndfile/tests/generate.h +++ /dev/null @@ -1,19 +0,0 @@ -/* -** Copyright (C) 2007-2011 Erik de Castro Lopo -** -** 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. -*/ - -void generate_file (const char * filename, int format, int len) ; diff --git a/libs/libsndfile/tests/header_test.c b/libs/libsndfile/tests/header_test.c deleted file mode 100644 index 9802fd9e58..0000000000 --- a/libs/libsndfile/tests/header_test.c +++ /dev/null @@ -1,741 +0,0 @@ -/* -** Copyright (C) 2001-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if (HAVE_DECL_S_IRGRP == 0) -#include -#endif - -#if (defined (WIN32) || defined (_WIN32)) -#include -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_LEN (1<<10) -#define LOG_BUFFER_SIZE 1024 - -static void update_header_test (const char *filename, int typemajor) ; - -static void update_seek_short_test (const char *filename, int filetype) ; -static void update_seek_int_test (const char *filename, int filetype) ; -static void update_seek_float_test (const char *filename, int filetype) ; -static void update_seek_double_test (const char *filename, int filetype) ; - - -static void extra_header_test (const char *filename, int filetype) ; - -static void header_shrink_test (const char *filename, int filetype) ; - -/* Force the start of this buffer to be double aligned. Sparc-solaris will -** choke if its not. -*/ -static int data_out [BUFFER_LEN] ; -static int data_in [BUFFER_LEN] ; - -int -main (int argc, char *argv []) -{ int do_all = 0 ; - int test_count = 0 ; - - if (argc != 2) - { printf ("Usage : %s \n", argv [0]) ; - printf (" Where is one of the following:\n") ; - printf (" wav - test WAV file peak chunk\n") ; - printf (" aiff - test AIFF file PEAK chunk\n") ; - printf (" all - perform all tests\n") ; - exit (1) ; - } ; - - do_all=!strcmp (argv [1], "all") ; - - if (do_all || ! strcmp (argv [1], "wav")) - { update_header_test ("header.wav", SF_FORMAT_WAV) ; - update_seek_short_test ("header_short.wav", SF_FORMAT_WAV) ; - update_seek_int_test ("header_int.wav", SF_FORMAT_WAV) ; - update_seek_float_test ("header_float.wav", SF_FORMAT_WAV) ; - update_seek_double_test ("header_double.wav", SF_FORMAT_WAV) ; - header_shrink_test ("header_shrink.wav", SF_FORMAT_WAV) ; - extra_header_test ("extra.wav", SF_FORMAT_WAV) ; - - update_header_test ("header.wavex", SF_FORMAT_WAVEX) ; - update_seek_short_test ("header_short.wavex", SF_FORMAT_WAVEX) ; - update_seek_int_test ("header_int.wavex", SF_FORMAT_WAVEX) ; - update_seek_float_test ("header_float.wavex", SF_FORMAT_WAVEX) ; - update_seek_double_test ("header_double.wavex", SF_FORMAT_WAVEX) ; - header_shrink_test ("header_shrink.wavex", SF_FORMAT_WAVEX) ; - extra_header_test ("extra.wavex", SF_FORMAT_WAVEX) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "aiff")) - { update_header_test ("header.aiff", SF_FORMAT_AIFF) ; - update_seek_short_test ("header_short.aiff", SF_FORMAT_AIFF) ; - update_seek_int_test ("header_int.aiff", SF_FORMAT_AIFF) ; - update_seek_float_test ("header_float.aiff", SF_FORMAT_AIFF) ; - update_seek_double_test ("header_double.aiff", SF_FORMAT_AIFF) ; - header_shrink_test ("header_shrink.wav", SF_FORMAT_AIFF) ; - extra_header_test ("extra.aiff", SF_FORMAT_AIFF) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "au")) - { update_header_test ("header.au", SF_FORMAT_AU) ; - update_seek_short_test ("header_short.au", SF_FORMAT_AU) ; - update_seek_int_test ("header_int.au", SF_FORMAT_AU) ; - update_seek_float_test ("header_float.au", SF_FORMAT_AU) ; - update_seek_double_test ("header_double.au", SF_FORMAT_AU) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "caf")) - { update_header_test ("header.caf", SF_FORMAT_CAF) ; - update_seek_short_test ("header_short.caf", SF_FORMAT_CAF) ; - update_seek_int_test ("header_int.caf", SF_FORMAT_CAF) ; - update_seek_float_test ("header_float.caf", SF_FORMAT_CAF) ; - update_seek_double_test ("header_double.caf", SF_FORMAT_CAF) ; - /* extra_header_test ("extra.caf", SF_FORMAT_CAF) ; */ - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "nist")) - { update_header_test ("header.nist", SF_FORMAT_NIST) ; - update_seek_short_test ("header_short.nist", SF_FORMAT_NIST) ; - update_seek_int_test ("header_int.nist", SF_FORMAT_NIST) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "paf")) - { update_header_test ("header.paf", SF_FORMAT_PAF) ; - update_seek_short_test ("header_short.paf", SF_FORMAT_PAF) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "ircam")) - { update_header_test ("header.ircam", SF_FORMAT_IRCAM) ; - update_seek_short_test ("header_short.ircam", SF_FORMAT_IRCAM) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "w64")) - { update_header_test ("header.w64", SF_FORMAT_W64) ; - update_seek_short_test ("header_short.w64", SF_FORMAT_W64) ; - update_seek_int_test ("header_int.w64", SF_FORMAT_W64) ; - update_seek_float_test ("header_float.w64", SF_FORMAT_W64) ; - update_seek_double_test ("header_double.w64", SF_FORMAT_W64) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "rf64")) - { update_header_test ("header.rf64", SF_FORMAT_RF64) ; - update_seek_short_test ("header_short.rf64", SF_FORMAT_RF64) ; - update_seek_int_test ("header_int.rf64", SF_FORMAT_RF64) ; - update_seek_float_test ("header_float.rf64", SF_FORMAT_RF64) ; - update_seek_double_test ("header_double.rf64", SF_FORMAT_RF64) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat4")) - { update_header_test ("header.mat4", SF_FORMAT_MAT4) ; - update_seek_short_test ("header_short.mat4", SF_FORMAT_MAT4) ; - update_seek_int_test ("header_int.mat4", SF_FORMAT_MAT4) ; - update_seek_float_test ("header_float.mat4", SF_FORMAT_MAT4) ; - update_seek_double_test ("header_double.mat4", SF_FORMAT_MAT4) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat5")) - { update_header_test ("header.mat5", SF_FORMAT_MAT5) ; - update_seek_short_test ("header_short.mat5", SF_FORMAT_MAT5) ; - update_seek_int_test ("header_int.mat5", SF_FORMAT_MAT5) ; - update_seek_float_test ("header_float.mat5", SF_FORMAT_MAT5) ; - update_seek_double_test ("header_double.mat5", SF_FORMAT_MAT5) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "pvf")) - { update_header_test ("header.pvf", SF_FORMAT_PVF) ; - update_seek_short_test ("header_short.pvf", SF_FORMAT_PVF) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "avr")) - { update_header_test ("header.avr", SF_FORMAT_AVR) ; - update_seek_short_test ("header_short.avr", SF_FORMAT_AVR) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "htk")) - { update_header_test ("header.htk", SF_FORMAT_HTK) ; - update_seek_short_test ("header_short.htk", SF_FORMAT_HTK) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "svx")) - { update_header_test ("header.svx", SF_FORMAT_SVX) ; - update_seek_short_test ("header_short.svx", SF_FORMAT_SVX) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "voc")) - { update_header_test ("header.voc", SF_FORMAT_VOC) ; - /*-update_seek_short_test ("header_short.voc", SF_FORMAT_VOC) ;-*/ - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "sds")) - { update_header_test ("header.sds", SF_FORMAT_SDS) ; - /*-update_seek_short_test ("header_short.sds", SF_FORMAT_SDS) ;-*/ - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mpc2k")) - { update_header_test ("header.mpc", SF_FORMAT_MPC2K) ; - update_seek_short_test ("header_short.mpc", SF_FORMAT_MPC2K) ; - test_count++ ; - } ; - - if (test_count == 0) - { printf ("Mono : ************************************\n") ; - printf ("Mono : * No '%s' test defined.\n", argv [1]) ; - printf ("Mono : ************************************\n") ; - return 1 ; - } ; - - return 0 ; -} /* main */ - - -/*============================================================================================ -** Here are the test functions. -*/ - -static void -update_header_sub (const char *filename, int typemajor, int write_mode) -{ SNDFILE *outfile, *infile ; - SF_INFO sfinfo ; - int k ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = (typemajor | SF_FORMAT_PCM_16) ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - - outfile = test_open_file_or_die (filename, write_mode, &sfinfo, SF_TRUE, __LINE__) ; - - for (k = 0 ; k < BUFFER_LEN ; k++) - data_out [k] = k + 1 ; - test_write_int_or_die (outfile, 0, data_out, BUFFER_LEN, __LINE__) ; - - if (typemajor != SF_FORMAT_HTK) - { /* The HTK header is not correct when the file is first written. */ - infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_close (infile) ; - } ; - - sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, 0) ; - - /* - ** Open file and check log buffer for an error. If header update failed - ** the the log buffer will contain errors. - */ - infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - check_log_buffer_or_die (infile, __LINE__) ; - - if (sfinfo.frames < BUFFER_LEN || sfinfo.frames > BUFFER_LEN + 50) - { printf ("\n\nLine %d : Incorrect sample count (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), BUFFER_LEN) ; - dump_log_buffer (infile) ; - exit (1) ; - } ; - - test_read_int_or_die (infile, 0, data_in, BUFFER_LEN, __LINE__) ; - for (k = 0 ; k < BUFFER_LEN ; k++) - if (data_out [k] != k + 1) - printf ("Error : line %d\n", __LINE__) ; - - sf_close (infile) ; - - /* Set auto update on. */ - sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; - - /* Write more data_out. */ - for (k = 0 ; k < BUFFER_LEN ; k++) - data_out [k] = k + 2 ; - test_write_int_or_die (outfile, 0, data_out, BUFFER_LEN, __LINE__) ; - - /* Open file again and make sure no errors in log buffer. */ - infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - check_log_buffer_or_die (infile, __LINE__) ; - - if (sfinfo.frames < 2 * BUFFER_LEN || sfinfo.frames > 2 * BUFFER_LEN + 50) - { printf ("\n\nLine %d : Incorrect sample count (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * BUFFER_LEN) ; - dump_log_buffer (infile) ; - exit (1) ; - } ; - - sf_close (infile) ; - - sf_close (outfile) ; - - unlink (filename) ; -} /* update_header_sub */ - -static void -update_header_test (const char *filename, int typemajor) -{ - print_test_name ("update_header_test", filename) ; - - update_header_sub (filename, typemajor, SFM_WRITE) ; - update_header_sub (filename, typemajor, SFM_RDWR) ; - - unlink (filename) ; - puts ("ok") ; -} /* update_header_test */ - -/*============================================================================== -*/ - -static void -update_seek_short_test (const char *filename, int filetype) -{ SNDFILE *outfile, *infile ; - SF_INFO sfinfo ; - sf_count_t frames ; - short buffer [8] ; - int k ; - - print_test_name ("update_seek_short_test", filename) ; - - memset (buffer, 0, sizeof (buffer)) ; - - /* Create sound outfile with no data. */ - sfinfo.format = filetype | SF_FORMAT_PCM_16 ; - sfinfo.samplerate = 48000 ; - sfinfo.channels = 2 ; - - if (sf_format_check (&sfinfo) == SF_FALSE) - sfinfo.channels = 1 ; - - outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_close (outfile) ; - - /* Open again for read/write. */ - outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; - - /* - ** In auto header update mode, seeking to the end of the file with - ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END - ** will seek to 0 anyway - */ - if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0) - { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ; - exit (1) ; - } ; - - /* Now write some frames. */ - frames = ARRAY_LEN (buffer) / sfinfo.channels ; - - for (k = 0 ; k < 6 ; k++) - { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ; - test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ; - - /* Open file again and make sure no errors in log buffer. */ - infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - check_log_buffer_or_die (infile, __LINE__) ; - sf_close (infile) ; - - if (sfinfo.frames != k * frames) - { printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ; - dump_log_buffer (infile) ; - exit (1) ; - } ; - - if ((k & 1) == 0) - test_write_short_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ; - else - test_writef_short_or_die (outfile, k, buffer, frames, __LINE__) ; - } ; - - sf_close (outfile) ; - unlink (filename) ; - - puts ("ok") ; - return ; -} /* update_seek_short_test */ - -static void -update_seek_int_test (const char *filename, int filetype) -{ SNDFILE *outfile, *infile ; - SF_INFO sfinfo ; - sf_count_t frames ; - int buffer [8] ; - int k ; - - print_test_name ("update_seek_int_test", filename) ; - - memset (buffer, 0, sizeof (buffer)) ; - - /* Create sound outfile with no data. */ - sfinfo.format = filetype | SF_FORMAT_PCM_32 ; - sfinfo.samplerate = 48000 ; - sfinfo.channels = 2 ; - - if (sf_format_check (&sfinfo) == SF_FALSE) - sfinfo.channels = 1 ; - - outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_close (outfile) ; - - /* Open again for read/write. */ - outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; - - /* - ** In auto header update mode, seeking to the end of the file with - ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END - ** will seek to 0 anyway - */ - if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0) - { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ; - exit (1) ; - } ; - - /* Now write some frames. */ - frames = ARRAY_LEN (buffer) / sfinfo.channels ; - - for (k = 0 ; k < 6 ; k++) - { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ; - test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ; - - /* Open file again and make sure no errors in log buffer. */ - infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - check_log_buffer_or_die (infile, __LINE__) ; - sf_close (infile) ; - - if (sfinfo.frames != k * frames) - { printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ; - dump_log_buffer (infile) ; - exit (1) ; - } ; - - if ((k & 1) == 0) - test_write_int_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ; - else - test_writef_int_or_die (outfile, k, buffer, frames, __LINE__) ; - } ; - - sf_close (outfile) ; - unlink (filename) ; - - puts ("ok") ; - return ; -} /* update_seek_int_test */ - -static void -update_seek_float_test (const char *filename, int filetype) -{ SNDFILE *outfile, *infile ; - SF_INFO sfinfo ; - sf_count_t frames ; - float buffer [8] ; - int k ; - - print_test_name ("update_seek_float_test", filename) ; - - memset (buffer, 0, sizeof (buffer)) ; - - /* Create sound outfile with no data. */ - sfinfo.format = filetype | SF_FORMAT_FLOAT ; - sfinfo.samplerate = 48000 ; - sfinfo.channels = 2 ; - - if (sf_format_check (&sfinfo) == SF_FALSE) - sfinfo.channels = 1 ; - - outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_close (outfile) ; - - /* Open again for read/write. */ - outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; - - /* - ** In auto header update mode, seeking to the end of the file with - ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END - ** will seek to 0 anyway - */ - if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0) - { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ; - exit (1) ; - } ; - - /* Now write some frames. */ - frames = ARRAY_LEN (buffer) / sfinfo.channels ; - - for (k = 0 ; k < 6 ; k++) - { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ; - test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ; - - /* Open file again and make sure no errors in log buffer. */ - infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - check_log_buffer_or_die (infile, __LINE__) ; - sf_close (infile) ; - - if (sfinfo.frames != k * frames) - { printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ; - dump_log_buffer (infile) ; - exit (1) ; - } ; - - if ((k & 1) == 0) - test_write_float_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ; - else - test_writef_float_or_die (outfile, k, buffer, frames, __LINE__) ; - } ; - - sf_close (outfile) ; - unlink (filename) ; - - puts ("ok") ; - return ; -} /* update_seek_float_test */ - -static void -update_seek_double_test (const char *filename, int filetype) -{ SNDFILE *outfile, *infile ; - SF_INFO sfinfo ; - sf_count_t frames ; - double buffer [8] ; - int k ; - - print_test_name ("update_seek_double_test", filename) ; - - memset (buffer, 0, sizeof (buffer)) ; - - /* Create sound outfile with no data. */ - sfinfo.format = filetype | SF_FORMAT_DOUBLE ; - sfinfo.samplerate = 48000 ; - sfinfo.channels = 2 ; - - if (sf_format_check (&sfinfo) == SF_FALSE) - sfinfo.channels = 1 ; - - outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_close (outfile) ; - - /* Open again for read/write. */ - outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; - - /* - ** In auto header update mode, seeking to the end of the file with - ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END - ** will seek to 0 anyway - */ - if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0) - { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ; - exit (1) ; - } ; - - /* Now write some frames. */ - frames = ARRAY_LEN (buffer) / sfinfo.channels ; - - for (k = 0 ; k < 6 ; k++) - { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ; - test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ; - - /* Open file again and make sure no errors in log buffer. */ - infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - check_log_buffer_or_die (infile, __LINE__) ; - sf_close (infile) ; - - if (sfinfo.frames != k * frames) - { printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ; - dump_log_buffer (infile) ; - exit (1) ; - } ; - - if ((k & 1) == 0) - test_write_double_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ; - else - test_writef_double_or_die (outfile, k, buffer, frames, __LINE__) ; - } ; - - sf_close (outfile) ; - unlink (filename) ; - - puts ("ok") ; - return ; -} /* update_seek_double_test */ - - - -static void -header_shrink_test (const char *filename, int filetype) -{ SNDFILE *outfile, *infile ; - SF_INFO sfinfo ; - sf_count_t frames ; - float buffer [8], bufferin [8] ; - - print_test_name ("header_shrink_test", filename) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.format = filetype | SF_FORMAT_FLOAT ; - sfinfo.channels = 1 ; - - memset (buffer, 0xA0, sizeof (buffer)) ; - - /* Now write some frames. */ - frames = ARRAY_LEN (buffer) / sfinfo.channels ; - - /* Test the file with extra header data. */ - outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - - sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ; - sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, SF_FALSE) ; - sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; - - test_writef_float_or_die (outfile, 0, buffer, frames, __LINE__) ; - sf_close (outfile) ; - - /* Open again for read. */ - infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - test_readf_float_or_die (infile, 0, bufferin, frames, __LINE__) ; - sf_close (infile) ; - - compare_float_or_die (buffer, bufferin, frames, __LINE__) ; - - unlink (filename) ; - puts ("ok") ; - return ; -} /* header_shrink_test */ - - -static void -extra_header_test (const char *filename, int filetype) -{ SNDFILE *outfile, *infile ; - SF_INFO sfinfo ; - sf_count_t frames ; - short buffer [8] ; - int k = 0 ; - - print_test_name ("extra_header_test", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = (filetype | SF_FORMAT_PCM_16) ; - sfinfo.channels = 1 ; - - memset (buffer, 0xA0, sizeof (buffer)) ; - - /* Now write some frames. */ - frames = ARRAY_LEN (buffer) / sfinfo.channels ; - - /* Test the file with extra header data. */ - outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, 462) ; - sf_set_string (outfile, SF_STR_TITLE, filename) ; - test_writef_short_or_die (outfile, k, buffer, frames, 464) ; - sf_set_string (outfile, SF_STR_COPYRIGHT, "(c) 1980 Erik") ; - sf_close (outfile) ; - -#if 1 - /* - ** Erik de Castro Lopo May 23 2004. - ** - ** This file has extra string data in the header and therefore cannot - ** currently be opened in SFM_RDWR mode. This is fixable, but its in - ** a part of the code I don't want to fiddle with until the Ogg/Vorbis - ** integration is done. - */ - - if ((infile = sf_open (filename, SFM_RDWR, &sfinfo)) != NULL) - { printf ("\n\nError : should not be able to open this file in SFM_RDWR.\n\n") ; - exit (1) ; - } ; - - unlink (filename) ; - puts ("ok") ; - return ; -#else - - hexdump_file (filename, 0, 100000) ; - - /* Open again for read/write. */ - outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, 491) ; - - /* - ** In auto header update mode, seeking to the end of the file with - ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END - ** will seek to 0 anyway - */ - if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0) - { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ; - exit (1) ; - } ; - - /* Now write some frames. */ - frames = ARRAY_LEN (buffer) / sfinfo.channels ; - - for (k = 1 ; k < 6 ; k++) - { - printf ("\n*** pass %d\n", k) ; - memset (buffer, 0xA0 + k, sizeof (buffer)) ; - - - test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, 512) ; - test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, 513) ; - - /* Open file again and make sure no errors in log buffer. */ - if (0) - { infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, 517) ; - check_log_buffer_or_die (infile, 518) ; - sf_close (infile) ; - } ; - - if (sfinfo.frames != k * frames) - { printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", 523, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ; - dump_log_buffer (infile) ; - exit (1) ; - } ; - - if ((k & 1) == 0) - test_write_short_or_die (outfile, k, buffer, sfinfo.channels * frames, 529) ; - else - test_writef_short_or_die (outfile, k, buffer, frames, 531) ; - hexdump_file (filename, 0, 100000) ; - } ; - - sf_close (outfile) ; - unlink (filename) ; - - puts ("ok") ; - return ; -#endif -} /* extra_header_test */ - diff --git a/libs/libsndfile/tests/header_test.def b/libs/libsndfile/tests/header_test.def deleted file mode 100644 index 959703ef0c..0000000000 --- a/libs/libsndfile/tests/header_test.def +++ /dev/null @@ -1,22 +0,0 @@ -autogen definitions header_test.tpl; - -data_type = { - name = "short" ; - format = "SF_FORMAT_PCM_16" ; - } ; - -data_type = { - name = "int" ; - format = "SF_FORMAT_PCM_32" ; - } ; - -data_type = { - name = "float" ; - format = "SF_FORMAT_FLOAT" ; - } ; - -data_type = { - name = "double" ; - format = "SF_FORMAT_DOUBLE" ; - } ; - diff --git a/libs/libsndfile/tests/header_test.tpl b/libs/libsndfile/tests/header_test.tpl deleted file mode 100644 index 6545bb498b..0000000000 --- a/libs/libsndfile/tests/header_test.tpl +++ /dev/null @@ -1,543 +0,0 @@ -[+ AutoGen5 template c +] -/* -** Copyright (C) 2001-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if (HAVE_DECL_S_IRGRP == 0) -#include -#endif - -#if (defined (WIN32) || defined (_WIN32)) -#include -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_LEN (1 << 10) -#define LOG_BUFFER_SIZE 1024 - -static void update_header_test (const char *filename, int typemajor) ; - -[+ FOR data_type -+]static void update_seek_[+ (get "name") +]_test (const char *filename, int filetype) ; -[+ ENDFOR data_type -+] - -static void extra_header_test (const char *filename, int filetype) ; - -static void header_shrink_test (const char *filename, int filetype) ; - -/* Force the start of this buffer to be double aligned. Sparc-solaris will -** choke if its not. -*/ -static int data_out [BUFFER_LEN] ; -static int data_in [BUFFER_LEN] ; - -int -main (int argc, char *argv []) -{ int do_all = 0 ; - int test_count = 0 ; - - if (argc != 2) - { printf ("Usage : %s \n", argv [0]) ; - printf (" Where is one of the following:\n") ; - printf (" wav - test WAV file peak chunk\n") ; - printf (" aiff - test AIFF file PEAK chunk\n") ; - printf (" all - perform all tests\n") ; - exit (1) ; - } ; - - do_all= !strcmp (argv [1], "all") ; - - if (do_all || ! strcmp (argv [1], "wav")) - { update_header_test ("header.wav", SF_FORMAT_WAV) ; - update_seek_short_test ("header_short.wav", SF_FORMAT_WAV) ; - update_seek_int_test ("header_int.wav", SF_FORMAT_WAV) ; - update_seek_float_test ("header_float.wav", SF_FORMAT_WAV) ; - update_seek_double_test ("header_double.wav", SF_FORMAT_WAV) ; - header_shrink_test ("header_shrink.wav", SF_FORMAT_WAV) ; - extra_header_test ("extra.wav", SF_FORMAT_WAV) ; - - update_header_test ("header.wavex", SF_FORMAT_WAVEX) ; - update_seek_short_test ("header_short.wavex", SF_FORMAT_WAVEX) ; - update_seek_int_test ("header_int.wavex", SF_FORMAT_WAVEX) ; - update_seek_float_test ("header_float.wavex", SF_FORMAT_WAVEX) ; - update_seek_double_test ("header_double.wavex", SF_FORMAT_WAVEX) ; - header_shrink_test ("header_shrink.wavex", SF_FORMAT_WAVEX) ; - extra_header_test ("extra.wavex", SF_FORMAT_WAVEX) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "aiff")) - { update_header_test ("header.aiff", SF_FORMAT_AIFF) ; - update_seek_short_test ("header_short.aiff", SF_FORMAT_AIFF) ; - update_seek_int_test ("header_int.aiff", SF_FORMAT_AIFF) ; - update_seek_float_test ("header_float.aiff", SF_FORMAT_AIFF) ; - update_seek_double_test ("header_double.aiff", SF_FORMAT_AIFF) ; - header_shrink_test ("header_shrink.wav", SF_FORMAT_AIFF) ; - extra_header_test ("extra.aiff", SF_FORMAT_AIFF) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "au")) - { update_header_test ("header.au", SF_FORMAT_AU) ; - update_seek_short_test ("header_short.au", SF_FORMAT_AU) ; - update_seek_int_test ("header_int.au", SF_FORMAT_AU) ; - update_seek_float_test ("header_float.au", SF_FORMAT_AU) ; - update_seek_double_test ("header_double.au", SF_FORMAT_AU) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "caf")) - { update_header_test ("header.caf", SF_FORMAT_CAF) ; - update_seek_short_test ("header_short.caf", SF_FORMAT_CAF) ; - update_seek_int_test ("header_int.caf", SF_FORMAT_CAF) ; - update_seek_float_test ("header_float.caf", SF_FORMAT_CAF) ; - update_seek_double_test ("header_double.caf", SF_FORMAT_CAF) ; - /* extra_header_test ("extra.caf", SF_FORMAT_CAF) ; */ - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "nist")) - { update_header_test ("header.nist", SF_FORMAT_NIST) ; - update_seek_short_test ("header_short.nist", SF_FORMAT_NIST) ; - update_seek_int_test ("header_int.nist", SF_FORMAT_NIST) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "paf")) - { update_header_test ("header.paf", SF_FORMAT_PAF) ; - update_seek_short_test ("header_short.paf", SF_FORMAT_PAF) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "ircam")) - { update_header_test ("header.ircam", SF_FORMAT_IRCAM) ; - update_seek_short_test ("header_short.ircam", SF_FORMAT_IRCAM) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "w64")) - { update_header_test ("header.w64", SF_FORMAT_W64) ; - update_seek_short_test ("header_short.w64", SF_FORMAT_W64) ; - update_seek_int_test ("header_int.w64", SF_FORMAT_W64) ; - update_seek_float_test ("header_float.w64", SF_FORMAT_W64) ; - update_seek_double_test ("header_double.w64", SF_FORMAT_W64) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "rf64")) - { update_header_test ("header.rf64", SF_FORMAT_RF64) ; - update_seek_short_test ("header_short.rf64", SF_FORMAT_RF64) ; - update_seek_int_test ("header_int.rf64", SF_FORMAT_RF64) ; - update_seek_float_test ("header_float.rf64", SF_FORMAT_RF64) ; - update_seek_double_test ("header_double.rf64", SF_FORMAT_RF64) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat4")) - { update_header_test ("header.mat4", SF_FORMAT_MAT4) ; - update_seek_short_test ("header_short.mat4", SF_FORMAT_MAT4) ; - update_seek_int_test ("header_int.mat4", SF_FORMAT_MAT4) ; - update_seek_float_test ("header_float.mat4", SF_FORMAT_MAT4) ; - update_seek_double_test ("header_double.mat4", SF_FORMAT_MAT4) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat5")) - { update_header_test ("header.mat5", SF_FORMAT_MAT5) ; - update_seek_short_test ("header_short.mat5", SF_FORMAT_MAT5) ; - update_seek_int_test ("header_int.mat5", SF_FORMAT_MAT5) ; - update_seek_float_test ("header_float.mat5", SF_FORMAT_MAT5) ; - update_seek_double_test ("header_double.mat5", SF_FORMAT_MAT5) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "pvf")) - { update_header_test ("header.pvf", SF_FORMAT_PVF) ; - update_seek_short_test ("header_short.pvf", SF_FORMAT_PVF) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "avr")) - { update_header_test ("header.avr", SF_FORMAT_AVR) ; - update_seek_short_test ("header_short.avr", SF_FORMAT_AVR) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "htk")) - { update_header_test ("header.htk", SF_FORMAT_HTK) ; - update_seek_short_test ("header_short.htk", SF_FORMAT_HTK) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "svx")) - { update_header_test ("header.svx", SF_FORMAT_SVX) ; - update_seek_short_test ("header_short.svx", SF_FORMAT_SVX) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "voc")) - { update_header_test ("header.voc", SF_FORMAT_VOC) ; - /*-update_seek_short_test ("header_short.voc", SF_FORMAT_VOC) ;-*/ - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "sds")) - { update_header_test ("header.sds", SF_FORMAT_SDS) ; - /*-update_seek_short_test ("header_short.sds", SF_FORMAT_SDS) ;-*/ - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mpc2k")) - { update_header_test ("header.mpc", SF_FORMAT_MPC2K) ; - update_seek_short_test ("header_short.mpc", SF_FORMAT_MPC2K) ; - test_count++ ; - } ; - - if (test_count == 0) - { printf ("Mono : ************************************\n") ; - printf ("Mono : * No '%s' test defined.\n", argv [1]) ; - printf ("Mono : ************************************\n") ; - return 1 ; - } ; - - return 0 ; -} /* main */ - - -/*============================================================================================ -** Here are the test functions. -*/ - -static void -update_header_sub (const char *filename, int typemajor, int write_mode) -{ SNDFILE *outfile, *infile ; - SF_INFO sfinfo ; - int k ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = (typemajor | SF_FORMAT_PCM_16) ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - - outfile = test_open_file_or_die (filename, write_mode, &sfinfo, SF_TRUE, __LINE__) ; - - for (k = 0 ; k < BUFFER_LEN ; k++) - data_out [k] = k + 1 ; - test_write_int_or_die (outfile, 0, data_out, BUFFER_LEN, __LINE__) ; - - if (typemajor != SF_FORMAT_HTK) - { /* The HTK header is not correct when the file is first written. */ - infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_close (infile) ; - } ; - - sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, 0) ; - - /* - ** Open file and check log buffer for an error. If header update failed - ** the the log buffer will contain errors. - */ - infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - check_log_buffer_or_die (infile, __LINE__) ; - - if (sfinfo.frames < BUFFER_LEN || sfinfo.frames > BUFFER_LEN + 50) - { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, BUFFER_LEN) ; - dump_log_buffer (infile) ; - exit (1) ; - } ; - - test_read_int_or_die (infile, 0, data_in, BUFFER_LEN, __LINE__) ; - for (k = 0 ; k < BUFFER_LEN ; k++) - if (data_out [k] != k + 1) - printf ("Error : line %d\n", __LINE__) ; - - sf_close (infile) ; - - /* Set auto update on. */ - sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; - - /* Write more data_out. */ - for (k = 0 ; k < BUFFER_LEN ; k++) - data_out [k] = k + 2 ; - test_write_int_or_die (outfile, 0, data_out, BUFFER_LEN, __LINE__) ; - - /* Open file again and make sure no errors in log buffer. */ - infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - check_log_buffer_or_die (infile, __LINE__) ; - - if (sfinfo.frames < 2 * BUFFER_LEN || sfinfo.frames > 2 * BUFFER_LEN + 50) - { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 2 * BUFFER_LEN) ; - dump_log_buffer (infile) ; - exit (1) ; - } ; - - sf_close (infile) ; - - sf_close (outfile) ; - - unlink (filename) ; -} /* update_header_sub */ - -static void -update_header_test (const char *filename, int typemajor) -{ - print_test_name ("update_header_test", filename) ; - - update_header_sub (filename, typemajor, SFM_WRITE) ; - update_header_sub (filename, typemajor, SFM_RDWR) ; - - unlink (filename) ; - puts ("ok") ; -} /* update_header_test */ - -/*============================================================================== -*/ - -[+ FOR data_type -+]static void -update_seek_[+ (get "name") +]_test (const char *filename, int filetype) -{ SNDFILE *outfile, *infile ; - SF_INFO sfinfo ; - sf_count_t frames ; - [+ (get "name") +] buffer [8] ; - int k ; - - print_test_name ("update_seek_[+ (get "name") +]_test", filename) ; - - memset (buffer, 0, sizeof (buffer)) ; - - /* Create sound outfile with no data. */ - sfinfo.format = filetype | [+ (get "format") +] ; - sfinfo.samplerate = 48000 ; - sfinfo.channels = 2 ; - - if (sf_format_check (&sfinfo) == SF_FALSE) - sfinfo.channels = 1 ; - - outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_close (outfile) ; - - /* Open again for read/write. */ - outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; - - /* - ** In auto header update mode, seeking to the end of the file with - ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END - ** will seek to 0 anyway - */ - if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0) - { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ; - exit (1) ; - } ; - - /* Now write some frames. */ - frames = ARRAY_LEN (buffer) / sfinfo.channels ; - - for (k = 0 ; k < 6 ; k++) - { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ; - test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ; - - /* Open file again and make sure no errors in log buffer. */ - infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - check_log_buffer_or_die (infile, __LINE__) ; - sf_close (infile) ; - - if (sfinfo.frames != k * frames) - { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", __LINE__, sfinfo.frames, k + frames) ; - dump_log_buffer (infile) ; - exit (1) ; - } ; - - if ((k & 1) == 0) - test_write_[+ (get "name") +]_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ; - else - test_writef_[+ (get "name") +]_or_die (outfile, k, buffer, frames, __LINE__) ; - } ; - - sf_close (outfile) ; - unlink (filename) ; - - puts ("ok") ; - return ; -} /* update_seek_[+ (get "name") +]_test */ - -[+ ENDFOR data_type -+] - -static void -header_shrink_test (const char *filename, int filetype) -{ SNDFILE *outfile, *infile ; - SF_INFO sfinfo ; - sf_count_t frames ; - float buffer [8], bufferin [8] ; - - print_test_name ("header_shrink_test", filename) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.format = filetype | SF_FORMAT_FLOAT ; - sfinfo.channels = 1 ; - - memset (buffer, 0xA0, sizeof (buffer)) ; - - /* Now write some frames. */ - frames = ARRAY_LEN (buffer) / sfinfo.channels ; - - /* Test the file with extra header data. */ - outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - - sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ; - sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, SF_FALSE) ; - sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; - - test_writef_float_or_die (outfile, 0, buffer, frames, __LINE__) ; - sf_close (outfile) ; - - /* Open again for read. */ - infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - test_readf_float_or_die (infile, 0, bufferin, frames, __LINE__) ; - sf_close (infile) ; - - compare_float_or_die (buffer, bufferin, frames, __LINE__) ; - - unlink (filename) ; - puts ("ok") ; - return ; -} /* header_shrink_test */ - - -static void -extra_header_test (const char *filename, int filetype) -{ SNDFILE *outfile, *infile ; - SF_INFO sfinfo ; - sf_count_t frames ; - short buffer [8] ; - int k = 0 ; - - print_test_name ("extra_header_test", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = (filetype | SF_FORMAT_PCM_16) ; - sfinfo.channels = 1 ; - - memset (buffer, 0xA0, sizeof (buffer)) ; - - /* Now write some frames. */ - frames = ARRAY_LEN (buffer) / sfinfo.channels ; - - /* Test the file with extra header data. */ - outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, [+ (tpl-file-line "%2$d") +]) ; - sf_set_string (outfile, SF_STR_TITLE, filename) ; - test_writef_short_or_die (outfile, k, buffer, frames, [+ (tpl-file-line "%2$d") +]) ; - sf_set_string (outfile, SF_STR_COPYRIGHT, "(c) 1980 Erik") ; - sf_close (outfile) ; - -#if 1 - /* - ** Erik de Castro Lopo May 23 2004. - ** - ** This file has extra string data in the header and therefore cannot - ** currently be opened in SFM_RDWR mode. This is fixable, but its in - ** a part of the code I don't want to fiddle with until the Ogg/Vorbis - ** integration is done. - */ - - if ((infile = sf_open (filename, SFM_RDWR, &sfinfo)) != NULL) - { printf ("\n\nError : should not be able to open this file in SFM_RDWR.\n\n") ; - exit (1) ; - } ; - - unlink (filename) ; - puts ("ok") ; - return ; -#else - - hexdump_file (filename, 0, 100000) ; - - /* Open again for read/write. */ - outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, [+ (tpl-file-line "%2$d") +]) ; - - /* - ** In auto header update mode, seeking to the end of the file with - ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END - ** will seek to 0 anyway - */ - if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0) - { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ; - exit (1) ; - } ; - - /* Now write some frames. */ - frames = ARRAY_LEN (buffer) / sfinfo.channels ; - - for (k = 1 ; k < 6 ; k++) - { - printf ("\n*** pass %d\n", k) ; - memset (buffer, 0xA0 + k, sizeof (buffer)) ; - - - test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, [+ (tpl-file-line "%2$d") +]) ; - test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, [+ (tpl-file-line "%2$d") +]) ; - - /* Open file again and make sure no errors in log buffer. */ - if (0) - { infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, [+ (tpl-file-line "%2$d") +]) ; - check_log_buffer_or_die (infile, [+ (tpl-file-line "%2$d") +]) ; - sf_close (infile) ; - } ; - - if (sfinfo.frames != k * frames) - { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", [+ (tpl-file-line "%2$d") +], sfinfo.frames, k + frames) ; - dump_log_buffer (infile) ; - exit (1) ; - } ; - - if ((k & 1) == 0) - test_write_short_or_die (outfile, k, buffer, sfinfo.channels * frames, [+ (tpl-file-line "%2$d") +]) ; - else - test_writef_short_or_die (outfile, k, buffer, frames, [+ (tpl-file-line "%2$d") +]) ; - hexdump_file (filename, 0, 100000) ; - } ; - - sf_close (outfile) ; - unlink (filename) ; - - puts ("ok") ; - return ; -#endif -} /* extra_header_test */ - diff --git a/libs/libsndfile/tests/headerless_test.c b/libs/libsndfile/tests/headerless_test.c deleted file mode 100644 index 6d3e2f2589..0000000000 --- a/libs/libsndfile/tests/headerless_test.c +++ /dev/null @@ -1,185 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_SIZE (2000) - -static void old_test (void) ; -static void headerless_test (const char * filename, int format, int expected) ; - -int -main (void) -{ - old_test () ; - - headerless_test ("raw.vox", SF_FORMAT_VOX_ADPCM, SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM) ; - headerless_test ("raw.gsm", SF_FORMAT_GSM610, SF_FORMAT_RAW | SF_FORMAT_GSM610) ; - - headerless_test ("raw.snd", SF_FORMAT_ULAW, SF_FORMAT_RAW | SF_FORMAT_ULAW) ; - headerless_test ("raw.au" , SF_FORMAT_ULAW, SF_FORMAT_RAW | SF_FORMAT_ULAW) ; - - return 0 ; -} /* main */ - -static void -headerless_test (const char * filename, int format, int expected) -{ static short buffer [BUFFER_SIZE] ; - SNDFILE *file ; - SF_INFO sfinfo ; - int k ; - - format &= SF_FORMAT_SUBMASK ; - - print_test_name (__func__, filename) ; - - for (k = 0 ; k < BUFFER_SIZE ; k++) - buffer [k] = k ; - - sfinfo.samplerate = 8000 ; - sfinfo.frames = 0 ; - sfinfo.channels = 1 ; - sfinfo.format = SF_FORMAT_RAW | format ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - if ((k = sf_write_short (file, buffer, BUFFER_SIZE)) != BUFFER_SIZE) - { printf ("Line %d: sf_write_short failed with short write (%d => %d).\n", __LINE__, BUFFER_SIZE, k) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - sf_close (file) ; - - memset (buffer, 0, sizeof (buffer)) ; - - /* We should be able to detect these so clear sfinfo. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != expected) - { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, expected, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < BUFFER_SIZE) - { printf ("Line %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_close (file) ; - - printf ("ok\n") ; - unlink (filename) ; -} /* headerless_test */ - -static void -old_test (void) -{ static short buffer [BUFFER_SIZE] ; - SNDFILE *file ; - SF_INFO sfinfo ; - int k, filetype ; - const char *filename = "headerless.wav" ; - - print_test_name (__func__, "") ; - - for (k = 0 ; k < BUFFER_SIZE ; k++) - buffer [k] = k ; - - filetype = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; - - sfinfo.samplerate = 32000 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - if ((k = sf_write_short (file, buffer, BUFFER_SIZE)) != BUFFER_SIZE) - { printf ("Line %d: sf_write_short failed with short write (%d => %d).\n", __LINE__, BUFFER_SIZE, k) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - sf_close (file) ; - - memset (buffer, 0, sizeof (buffer)) ; - - /* Read as RAW but get the bit width and endian-ness correct. */ - sfinfo.format = filetype = SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16 ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < BUFFER_SIZE) - { printf ("Line %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - if ((k = sf_read_short (file, buffer, BUFFER_SIZE)) != BUFFER_SIZE) - { printf ("Line %d: short read (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - for (k = 0 ; k < BUFFER_SIZE - 22 ; k++) - if (buffer [k + 22] != k) - { printf ("Line %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, k, buffer [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - printf ("ok\n") ; - unlink (filename) ; -} /* old_test */ - diff --git a/libs/libsndfile/tests/largefile_test.c b/libs/libsndfile/tests/largefile_test.c deleted file mode 100644 index 328a589a02..0000000000 --- a/libs/libsndfile/tests/largefile_test.c +++ /dev/null @@ -1,83 +0,0 @@ -/* -** Copyright (C) 2006-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_LEN (1024 * 1024) -#define BUFFER_COUNT (768) - -static void largefile_test (int filetype, const char * filename) ; - -int -main (void) -{ - largefile_test (SF_FORMAT_WAV, "largefile.wav") ; - largefile_test (SF_FORMAT_AIFF, "largefile.aiff") ; - - return 0 ; -} /* main */ - -static void -largefile_test (int filetype, const char * filename) -{ static float data [BUFFER_LEN] ; - SNDFILE *file ; - SF_INFO sfinfo ; - int k ; - - print_test_name ("largefile_test", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.channels = 2 ; - sfinfo.frames = 0 ; - sfinfo.format = (filetype | SF_FORMAT_PCM_32) ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - for (k = 0 ; k < BUFFER_COUNT ; k++) - test_write_float_or_die (file, k, data, BUFFER_LEN, __LINE__) ; - - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if ((sfinfo.frames * sfinfo.channels) / BUFFER_LEN != BUFFER_COUNT) - { printf ("\n\nLine %d : bad frame count.\n", __LINE__) ; - exit (1) ; - } ; - - sf_close (file) ; - - unlink (filename) ; - puts ("ok") ; - - - return ; -} /* largefile_test */ - diff --git a/libs/libsndfile/tests/locale_test.c b/libs/libsndfile/tests/locale_test.c deleted file mode 100644 index b67d549c58..0000000000 --- a/libs/libsndfile/tests/locale_test.c +++ /dev/null @@ -1,167 +0,0 @@ -/* -** Copyright (C) 2005-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if HAVE_LOCALE_H -#include -#endif - -#if OS_IS_WIN32 -#include -#define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 -#endif - -#include "sndfile.h" -#include "utils.h" - -static void utf8_test (void) ; -static void wchar_test (void) ; - -int -main (void) -{ - utf8_test () ; - wchar_test () ; - - return 0 ; -} /* main */ - -/*============================================================================== -*/ - -static void -wchar_test (void) -{ -#if OS_IS_WIN32 - SNDFILE * file ; - SF_INFO info ; - LPCWSTR filename = L"test.wav" ; - - print_test_name (__func__, "test.wav") ; - - info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; - info.channels = 1 ; - info.samplerate = 44100 ; - - file = sf_wchar_open (filename, SFM_WRITE, &info) ; - exit_if_true (file == NULL, "\n\nLine %d : sf_wchar_open failed : %s\n\n", __LINE__, sf_strerror (NULL)) ; - sf_close (file) ; - - /* This should check that the file did in fact get created with a - ** wchar_t * filename. - */ - exit_if_true ( - GetFileAttributesW (filename) == INVALID_FILE_ATTRIBUTES, - "\n\nLine %d : GetFileAttributes failed.\n\n", __LINE__ - ) ; - - /* Use this because the file was created with CreateFileW. */ - DeleteFileW (filename) ; - - puts ("ok") ; -#endif -} /* wchar_test */ - -/*============================================================================== -*/ - -typedef struct -{ const char *locale ; - int utf8 ; - const char *filename ; - int width ; -} LOCALE_DATA ; - -static void locale_test (const LOCALE_DATA * locdata) ; - -static void -utf8_test (void) -{ LOCALE_DATA ldata [] = - { { "de_DE", 1, "F\303\274\303\237e.au", 7 }, - { "en_AU", 1, "kangaroo.au", 11 }, - { "POSIX", 0, "posix.au", 8 }, - { "pt_PT", 1, "concei\303\247\303\243o.au", 12 }, - -#if OS_IS_WIN32 == 0 - { "ja_JP", 1, "\343\201\212\343\201\257\343\202\210\343\201\206\343\201\224\343\201\226\343\201\204\343\201\276\343\201\231.au", 21 }, -#endif - - { "vi_VN", 1, "qu\341\273\221c ng\341\273\257.au", 11 }, - { NULL, 0, NULL, 0 } - } ; - int k ; - - for (k = 0 ; ldata [k].locale != NULL ; k++) - locale_test (ldata + k) ; -} /* utf8_test */ - - -static void -locale_test (const LOCALE_DATA * ldata) -{ -#if (HAVE_LOCALE_H == 0 || HAVE_SETLOCALE == 0) - locname = filename = NULL ; - width = 0 ; - return ; -#else - const short wdata [] = { 1, 2, 3, 4, 5, 6, 7, 8 } ; - short rdata [ARRAY_LEN (wdata)] ; - const char *old_locale ; - char utf8_locname [32] ; - SNDFILE *file ; - SF_INFO sfinfo ; - - snprintf (utf8_locname, sizeof (utf8_locname), "%s%s", ldata->locale, ldata->utf8 ? ".UTF-8" : "") ; - - /* Change the locale saving the old one. */ - if ((old_locale = setlocale (LC_CTYPE, utf8_locname)) == NULL) - return ; - - printf (" locale_test %-8s : %s %*c ", ldata->locale, ldata->filename, 24 - ldata->width, ' ') ; - fflush (stdout) ; - - sfinfo.format = SF_FORMAT_AU | SF_FORMAT_PCM_16 ; - sfinfo.channels = 1 ; - sfinfo.samplerate = 44100 ; - - file = test_open_file_or_die (ldata->filename, SFM_WRITE, &sfinfo, 0, __LINE__) ; - test_write_short_or_die (file, 0, wdata, ARRAY_LEN (wdata), __LINE__) ; - sf_close (file) ; - - file = test_open_file_or_die (ldata->filename, SFM_READ, &sfinfo, 0, __LINE__) ; - test_read_short_or_die (file, 0, rdata, ARRAY_LEN (rdata), __LINE__) ; - sf_close (file) ; - - unlink (ldata->filename) ; - - /* Restore old locale. */ - setlocale (LC_CTYPE, old_locale) ; - - puts ("ok") ; -#endif -} /* locale_test */ - diff --git a/libs/libsndfile/tests/lossy_comp_test.c b/libs/libsndfile/tests/lossy_comp_test.c deleted file mode 100644 index 5f9f593f8f..0000000000 --- a/libs/libsndfile/tests/lossy_comp_test.c +++ /dev/null @@ -1,2372 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_SIZE (1 << 14) -#define SAMPLE_RATE 11025 - -#ifndef M_PI -#define M_PI 3.14159265358979323846264338 -#endif - -#define LCT_MAX(x, y) ((x) > (y) ? (x) : (y)) - -static void lcomp_test_short (const char *filename, int filetype, int chan, double margin) ; -static void lcomp_test_int (const char *filename, int filetype, int chan, double margin) ; -static void lcomp_test_float (const char *filename, int filetype, int chan, double margin) ; -static void lcomp_test_double (const char *filename, int filetype, int chan, double margin) ; - -static void sdlcomp_test_short (const char *filename, int filetype, int chan, double margin) ; -static void sdlcomp_test_int (const char *filename, int filetype, int chan, double margin) ; -static void sdlcomp_test_float (const char *filename, int filetype, int chan, double margin) ; -static void sdlcomp_test_double (const char *filename, int filetype, int chan, double margin) ; - -static void read_raw_test (const char *filename, int filetype, int chan) ; - -static int error_function (double data, double orig, double margin) ; -static int decay_response (int k) ; - -static void gen_signal_double (double *data, double scale, int channels, int datalen) ; - -static void smoothed_diff_short (short *data, unsigned int datalen) ; -static void smoothed_diff_int (int *data, unsigned int datalen) ; -static void smoothed_diff_float (float *data, unsigned int datalen) ; -static void smoothed_diff_double (double *data, unsigned int datalen) ; - -static void check_comment (SNDFILE * file, int format, int lineno) ; - -static int is_lossy (int filetype) ; - -/* -** Force the start of these buffers to be double aligned. Sparc-solaris will -** choke if they are not. -*/ -typedef union -{ double d [BUFFER_SIZE + 1] ; - float f [BUFFER_SIZE + 1] ; - int i [BUFFER_SIZE + 1] ; - short s [BUFFER_SIZE + 1] ; - char c [BUFFER_SIZE + 1] ; -} BUFFER ; - -static BUFFER data_buffer ; -static BUFFER orig_buffer ; -static BUFFER smooth_buffer ; - -static const char *long_comment = - "This is really quite a long comment. It is designed to be long enough " - "to screw up the encoders and decoders if the file container format does " - "not handle things correctly. If everything is working correctly, the " - "decoder will only decode the actual audio data, and not this string at " - "the end of the file." ; - -int -main (int argc, char *argv []) -{ int do_all = 0 ; - int test_count = 0 ; - - if (argc != 2) - { printf ("Usage : %s \n", argv [0]) ; - printf (" Where is one of the following:\n") ; - printf (" wav_ima - test IMA ADPCM WAV file functions\n") ; - printf (" wav_msadpcm - test MS ADPCM WAV file functions\n") ; - printf (" wav_gsm610 - test GSM 6.10 WAV file functions\n") ; - printf (" wav_ulaw - test u-law WAV file functions\n") ; - printf (" wav_alaw - test A-law WAV file functions\n") ; - printf (" wve - test Psion WVE file functions\n") ; - printf (" all - perform all tests\n") ; - exit (1) ; - } ; - - do_all = ! strcmp (argv [1], "all") ; - - if (do_all || strcmp (argv [1], "wav_pcm") == 0) - { /* This is just a sanity test for PCM encoding. */ - lcomp_test_short ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16, 2, 1e-50) ; - lcomp_test_int ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_32, 2, 1e-50) ; - lcomp_test_short ("pcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_16, 2, 1e-50) ; - lcomp_test_int ("pcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_32, 2, 1e-50) ; - /* Lite remove start */ - lcomp_test_float ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_FLOAT, 2, 1e-50) ; - lcomp_test_double ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_DOUBLE, 2, 1e-50) ; - /* Lite remove end */ - - read_raw_test ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8, 2) ; - test_count++ ; - } ; - - /* For all the rest, if the file format supports more than 1 channel, use stereo. */ - /* Lite remove start */ - if (do_all || strcmp (argv [1], "wav_ima") == 0) - { lcomp_test_short ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - lcomp_test_int ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.65) ; - lcomp_test_float ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - lcomp_test_double ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - - lcomp_test_short ("ima.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - lcomp_test_int ("ima.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - lcomp_test_float ("ima.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - lcomp_test_double ("ima.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - - sdlcomp_test_short ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - sdlcomp_test_int ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - sdlcomp_test_float ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - sdlcomp_test_double ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "wav_msadpcm") == 0) - { lcomp_test_short ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - lcomp_test_int ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - lcomp_test_float ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - lcomp_test_double ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - - lcomp_test_short ("msadpcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - lcomp_test_int ("msadpcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - lcomp_test_float ("msadpcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - lcomp_test_double ("msadpcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - - sdlcomp_test_short ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - sdlcomp_test_int ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - sdlcomp_test_float ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - sdlcomp_test_double ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "wav_g721") == 0) - { printf ("**** Fix this later : error bound should be 0.06 ****\n") ; - lcomp_test_short ("g721.wav", SF_FORMAT_WAV | SF_FORMAT_G721_32, 1, 0.7) ; - lcomp_test_int ("g721.wav", SF_FORMAT_WAV | SF_FORMAT_G721_32, 1, 0.7) ; - - lcomp_test_short ("g721.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_G721_32, 1, 0.7) ; - lcomp_test_int ("g721.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_G721_32, 1, 0.7) ; - - test_count++ ; - } ; - /* Lite remove end */ - - if (do_all || strcmp (argv [1], "wav_ulaw") == 0) - { lcomp_test_short ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_int ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ; - - lcomp_test_short ("ulaw.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_int ("ulaw.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ; - - /* Lite remove start */ - lcomp_test_float ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_double ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ; - /* Lite remove end */ - - read_raw_test ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "wav_alaw") == 0) - { lcomp_test_short ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_int ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2, 0.04) ; - /* Lite remove start */ - lcomp_test_float ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_double ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2, 0.04) ; - /* Lite remove end */ - - read_raw_test ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "wav_gsm610") == 0) - { /* Don't do lcomp_test_XXX as the errors are too big. */ - sdlcomp_test_short ("gsm610.wav", SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ; - sdlcomp_test_int ("gsm610.wav", SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ; - - sdlcomp_test_short ("gsm610.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ; - sdlcomp_test_int ("gsm610.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ; - - /* Lite remove start */ - sdlcomp_test_float ("gsm610.wav", SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ; - sdlcomp_test_double ("gsm610.wav", SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ; - /* Lite remove end */ - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "aiff_ulaw") == 0) - { lcomp_test_short ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_int ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2, 0.04) ; - /* Lite remove start */ - lcomp_test_float ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_double ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2, 0.04) ; - /* Lite remove end */ - - read_raw_test ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "aiff_alaw") == 0) - { lcomp_test_short ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_int ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2, 0.04) ; - /* Lite remove start */ - lcomp_test_float ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_double ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2, 0.04) ; - /* Lite remove end */ - - read_raw_test ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "aiff_gsm610") == 0) - { /* Don't do lcomp_test_XXX as the errors are too big. */ - sdlcomp_test_short ("gsm610.aiff", SF_FORMAT_AIFF | SF_FORMAT_GSM610, 1, 0.24) ; - sdlcomp_test_int ("gsm610.aiff", SF_FORMAT_AIFF | SF_FORMAT_GSM610, 1, 0.24) ; - /* Lite remove start */ - sdlcomp_test_float ("gsm610.aiff", SF_FORMAT_AIFF | SF_FORMAT_GSM610, 1, 0.24) ; - sdlcomp_test_double ("gsm610.aiff", SF_FORMAT_AIFF | SF_FORMAT_GSM610, 1, 0.24) ; - /* Lite remove end */ - test_count++ ; - } ; - - if (strcmp (argv [1], "aiff_ima") == 0) - { lcomp_test_short ("ima.aiff", SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - lcomp_test_int ("ima.aiff", SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - /* Lite remove start */ - lcomp_test_float ("ima.aiff", SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - lcomp_test_double ("ima.aiff", SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - /* Lite remove end */ - } ; - - if (do_all || strcmp (argv [1], "au_ulaw") == 0) - { lcomp_test_short ("ulaw.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_int ("ulaw.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_ULAW, 2, 0.04) ; - /* Lite remove start */ - lcomp_test_float ("ulaw.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_double ("ulaw.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_ULAW, 2, 0.04) ; - /* Lite remove end */ - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "au_alaw") == 0) - { lcomp_test_short ("alaw.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_int ("alaw.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_ALAW, 2, 0.04) ; - /* Lite remove start */ - lcomp_test_float ("alaw.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_double ("alaw.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_ALAW, 2, 0.04) ; - /* Lite remove end */ - test_count++ ; - } ; - - /* Lite remove start */ - if (do_all || strcmp (argv [1], "au_g721") == 0) - { printf ("**** Fix this later : error bound should be 0.06 ****\n") ; - lcomp_test_short ("g721.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.7) ; - lcomp_test_int ("g721.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.7) ; - lcomp_test_float ("g721.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.7) ; - lcomp_test_double ("g721.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.7) ; - -/*- sdlcomp_test_short ("g721.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.07) ; - sdlcomp_test_int ("g721.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.07) ; - sdlcomp_test_float ("g721.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.07) ; - sdlcomp_test_double ("g721.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.12) ; --*/ - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "au_g723") == 0) - { printf ("**** Fix this later : error bound should be 0.16 ****\n") ; - lcomp_test_short ("g723_24.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.7) ; - lcomp_test_int ("g723_24.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.7) ; - lcomp_test_float ("g723_24.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.7) ; - lcomp_test_double ("g723_24.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.7) ; - - lcomp_test_short ("g723_40.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_40, 1, 0.85) ; - lcomp_test_int ("g723_40.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_40, 1, 0.84) ; - lcomp_test_float ("g723_40.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_40, 1, 0.86) ; - lcomp_test_double ("g723_40.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_40, 1, 0.86) ; - -/*- sdlcomp_test_short ("g723.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.15) ; - sdlcomp_test_int ("g723.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.15) ; - sdlcomp_test_float ("g723.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.15) ; - sdlcomp_test_double ("g723.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.15) ; --*/ - test_count++ ; - } ; - /* Lite remove end */ - - if (do_all || strcmp (argv [1], "caf_ulaw") == 0) - { lcomp_test_short ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_int ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2, 0.04) ; - /* Lite remove start */ - lcomp_test_float ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_double ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2, 0.04) ; - /* Lite remove end */ - - read_raw_test ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "caf_alaw") == 0) - { lcomp_test_short ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_int ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2, 0.04) ; - /* Lite remove start */ - lcomp_test_float ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_double ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2, 0.04) ; - /* Lite remove end */ - - read_raw_test ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2) ; - test_count++ ; - } ; - - - if (do_all || strcmp (argv [1], "raw_ulaw") == 0) - { lcomp_test_short ("ulaw.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_int ("ulaw.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_ULAW, 2, 0.04) ; - /* Lite remove start */ - lcomp_test_float ("ulaw.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_double ("ulaw.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_ULAW, 2, 0.04) ; - /* Lite remove end */ - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "raw_alaw") == 0) - { lcomp_test_short ("alaw.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_int ("alaw.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_ALAW, 2, 0.04) ; - /* Lite remove start */ - lcomp_test_float ("alaw.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_double ("alaw.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_ALAW, 2, 0.04) ; - /* Lite remove end */ - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "raw_gsm610") == 0) - { /* Don't do lcomp_test_XXX as the errors are too big. */ - sdlcomp_test_short ("raw.gsm", SF_FORMAT_RAW | SF_FORMAT_GSM610, 1, 0.24) ; - sdlcomp_test_int ("raw.gsm", SF_FORMAT_RAW | SF_FORMAT_GSM610, 1, 0.24) ; - sdlcomp_test_float ("raw.gsm", SF_FORMAT_RAW | SF_FORMAT_GSM610, 1, 0.24) ; - sdlcomp_test_double ("raw.gsm", SF_FORMAT_RAW | SF_FORMAT_GSM610, 1, 0.24) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "ogg_vorbis") == 0) - { if (HAVE_EXTERNAL_LIBS) - { /* Don't do lcomp_test_XXX as the errors are too big. */ - sdlcomp_test_short ("vorbis.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS, 1, 0.30) ; - sdlcomp_test_int ("vorbis.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS, 1, 0.30) ; - sdlcomp_test_float ("vorbis.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS, 1, 0.30) ; - sdlcomp_test_double ("vorbis.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS, 1, 0.30) ; - } - else - puts (" No Ogg/Vorbis tests because Ogg/Vorbis support was not compiled in.") ; - - test_count++ ; - } ; - - /* Lite remove start */ - if (do_all || strcmp (argv [1], "ircam_ulaw") == 0) - { lcomp_test_short ("ulaw.ircam", SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_int ("ulaw.ircam", SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_float ("ulaw.ircam", SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_double ("ulaw.ircam", SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_ULAW, 2, 0.04) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "ircam_alaw") == 0) - { lcomp_test_short ("alaw.ircam", SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_int ("alaw.ircam", SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_float ("alaw.ircam", SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_double ("alaw.ircam", SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_ALAW, 2, 0.04) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "nist_ulaw") == 0) - { lcomp_test_short ("ulaw.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_int ("ulaw.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_float ("ulaw.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_double ("ulaw.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_ULAW, 2, 0.04) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "nist_alaw") == 0) - { lcomp_test_short ("alaw.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_int ("alaw.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_float ("alaw.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_double ("alaw.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_ALAW, 2, 0.04) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "voc_ulaw") == 0) - { lcomp_test_short ("ulaw.voc", SF_FORMAT_VOC | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_int ("ulaw.voc", SF_FORMAT_VOC | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_float ("ulaw.voc", SF_FORMAT_VOC | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_double ("ulaw.voc", SF_FORMAT_VOC | SF_FORMAT_ULAW, 2, 0.04) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "voc_alaw") == 0) - { lcomp_test_short ("alaw.voc", SF_FORMAT_VOC | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_int ("alaw.voc", SF_FORMAT_VOC | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_float ("alaw.voc", SF_FORMAT_VOC | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_double ("alaw.voc", SF_FORMAT_VOC | SF_FORMAT_ALAW, 2, 0.04) ; - test_count++ ; - } ; - /* Lite remove end */ - - if (do_all || strcmp (argv [1], "w64_ulaw") == 0) - { lcomp_test_short ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_int ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2, 0.04) ; - /* Lite remove start */ - lcomp_test_float ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2, 0.04) ; - lcomp_test_double ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2, 0.04) ; - /* Lite remove end */ - - read_raw_test ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "w64_alaw") == 0) - { lcomp_test_short ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_int ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2, 0.04) ; - /* Lite remove start */ - lcomp_test_float ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2, 0.04) ; - lcomp_test_double ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2, 0.04) ; - /* Lite remove end */ - - read_raw_test ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2) ; - test_count++ ; - } ; - - /* Lite remove start */ - if (do_all || strcmp (argv [1], "w64_ima") == 0) - { lcomp_test_short ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - lcomp_test_int ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - lcomp_test_float ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - lcomp_test_double ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - - sdlcomp_test_short ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - sdlcomp_test_int ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - sdlcomp_test_float ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - sdlcomp_test_double ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "w64_msadpcm") == 0) - { lcomp_test_short ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - lcomp_test_int ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - lcomp_test_float ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - lcomp_test_double ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - - sdlcomp_test_short ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - sdlcomp_test_int ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - sdlcomp_test_float ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - sdlcomp_test_double ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "wve") == 0) - { lcomp_test_short ("psion.wve", SF_FORMAT_WVE | SF_FORMAT_ALAW, 1, 0.04) ; - lcomp_test_int ("psion.wve", SF_FORMAT_WVE | SF_FORMAT_ALAW, 1, 0.04) ; - /* Lite remove start */ - lcomp_test_float ("psion.wve", SF_FORMAT_WVE | SF_FORMAT_ALAW, 1, 0.04) ; - lcomp_test_double ("psion.wve", SF_FORMAT_WVE | SF_FORMAT_ALAW, 1, 0.04) ; - /* Lite remove end */ - test_count++ ; - } ; - - /* Lite remove end */ - - if (do_all || strcmp (argv [1], "w64_gsm610") == 0) - { /* Don't do lcomp_test_XXX as the errors are too big. */ - sdlcomp_test_short ("gsm610.w64", SF_FORMAT_W64 | SF_FORMAT_GSM610, 1, 0.2) ; - sdlcomp_test_int ("gsm610.w64", SF_FORMAT_W64 | SF_FORMAT_GSM610, 1, 0.2) ; - /* Lite remove start */ - sdlcomp_test_float ("gsm610.w64", SF_FORMAT_W64 | SF_FORMAT_GSM610, 1, 0.2) ; - sdlcomp_test_double ("gsm610.w64", SF_FORMAT_W64 | SF_FORMAT_GSM610, 1, 0.2) ; - /* Lite remove end */ - test_count++ ; - } ; - - /* Lite remove start */ - if (do_all || strcmp (argv [1], "vox_adpcm") == 0) - { lcomp_test_short ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.17) ; - lcomp_test_int ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.17) ; - lcomp_test_float ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.17) ; - lcomp_test_double ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.17) ; - - sdlcomp_test_short ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.072) ; - sdlcomp_test_int ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.072) ; - sdlcomp_test_float ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.072) ; - sdlcomp_test_double ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.072) ; - test_count++ ; - } ; - - if (do_all || strcmp (argv [1], "xi_dpcm") == 0) - { lcomp_test_short ("8bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_8, 1, 0.25) ; - lcomp_test_int ("8bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_8, 1, 0.25) ; - - lcomp_test_short ("16bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16, 1, 0.002) ; - lcomp_test_int ("16bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16, 1, 0.002) ; - lcomp_test_float ("16bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16, 1, 0.002) ; - lcomp_test_double ("16bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16, 1, 0.002) ; - test_count++ ; - } ; - /* Lite remove end */ - - if (test_count == 0) - { printf ("************************************\n") ; - printf ("* No '%s' test defined.\n", argv [1]) ; - printf ("************************************\n") ; - return 1 ; - } ; - - return 0 ; -} /* main */ - -/*============================================================================================ -** Here are the test functions. -*/ - -static void -lcomp_test_short (const char *filename, int filetype, int channels, double margin) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, m, seekpos, half_max_abs ; - sf_count_t datalen ; - short *orig, *data ; - - print_test_name ("lcomp_test_short", filename) ; - - datalen = BUFFER_SIZE / channels ; - - data = data_buffer.s ; - orig = orig_buffer.s ; - - gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ; - for (k = 0 ; k < channels * datalen ; k++) - orig [k] = (short) (orig_buffer.d [k]) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = 123456789 ; /* Ridiculous value. */ - sfinfo.channels = channels ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - test_writef_short_or_die (file, 0, orig, datalen, __LINE__) ; - sf_set_string (file, SF_STR_COMMENT, long_comment) ; - sf_close (file) ; - - memset (data, 0, datalen * sizeof (short)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < datalen / channels) - { printf ("Too few frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ; - exit (1) ; - } ; - - if (sfinfo.frames > (datalen + datalen / 20)) - { printf ("Too many frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ; - exit (1) ; - } ; - - if (sfinfo.channels != channels) - { printf ("Incorrect number of channels in file.\n") ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - check_comment (file, filetype, __LINE__) ; - - test_readf_short_or_die (file, 0, data, datalen, __LINE__) ; - - half_max_abs = 0 ; - for (k = 0 ; k < datalen ; k++) - { if (error_function (data [k], orig [k], margin)) - { printf ("\n\nLine %d: Incorrect sample A (#%d : %d should be %d).\n", __LINE__, k, data [k], orig [k]) ; - oct_save_short (orig, data, datalen) ; - exit (1) ; - } ; - half_max_abs = LCT_MAX (half_max_abs, abs (data [k] / 2)) ; - } ; - - if (half_max_abs < 1.0) - { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ; - exit (1) ; - } ; - - if ((k = sf_readf_short (file, data, datalen)) != sfinfo.frames - datalen) - { printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__, - channels * sfinfo.frames - datalen, k) ; - exit (1) ; - } ; - - /* This check is only for block based encoders which must append silence - ** to the end of a file so as to fill out a block. - */ - for (k = 0 ; k < sfinfo.frames - datalen ; k++) - if (abs (data [channels * k]) > decay_response (channels * k)) - { printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%d) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ; - exit (1) ; - } ; - - if (! sfinfo.seekable) - { sf_close (file) ; - unlink (filename) ; - printf ("ok\n") ; - return ; - } ; - - /* Now test sf_seek function. */ - - if ((k = sf_seek (file, 0, SEEK_SET)) != 0) - { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - for (m = 0 ; m < 3 ; m++) - { test_readf_short_or_die (file, m, data, 11, __LINE__) ; - - for (k = 0 ; k < channels * 11 ; k++) - if (error_function (1.0 * data [k], 1.0 * orig [k + channels * m * 11], margin)) - { printf ("\n\nLine %d: Incorrect sample (m = %d) (#%d : %d => %d).\n", __LINE__, m, k + channels * m * 11, orig [k + channels * m * 11], data [k]) ; - for (m = 0 ; m < channels ; m++) - printf ("%d ", data [m]) ; - printf ("\n") ; - exit (1) ; - } ; - } ; - - seekpos = BUFFER_SIZE / 10 ; - - /* Check seek from start of file. */ - if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) - { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ; - exit (1) ; - } ; - - test_readf_short_or_die (file, 0, data, 1, __LINE__) ; - - if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin)) - { printf ("\n\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_short failed (%d, %d).\n", __LINE__, orig [1], data [0]) ; - exit (1) ; - } ; - - if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) - { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; - k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; - test_readf_short_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) - { printf ("\n\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_short failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ; - oct_save_short (orig, data, datalen) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; - /* Check seek backward from current position. */ - k = sf_seek (file, -20, SEEK_CUR) ; - test_readf_short_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_short failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ; - exit (1) ; - } ; - - /* Check that read past end of file returns number of items. */ - sf_seek (file, sfinfo.frames, SEEK_SET) ; - - if ((k = sf_readf_short (file, data, datalen)) != 0) - { printf ("\n\nLine %d: Return value from sf_readf_short past end of file incorrect (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - /* Check seek backward from end. */ - if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) - { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; - exit (1) ; - } ; - - test_readf_short_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (1.0 * data [0], 1.0 * orig [5 * channels], margin)) - { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_short failed (%d should be %d).\n", __LINE__, data [0], orig [5 * channels]) ; - exit (1) ; - } ; - - sf_close (file) ; - - unlink (filename) ; - printf ("ok\n") ; -} /* lcomp_test_short */ - -/*-------------------------------------------------------------------------------------------- -*/ - -static void -lcomp_test_int (const char *filename, int filetype, int channels, double margin) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, m, half_max_abs ; - sf_count_t datalen, seekpos ; - double scale, max_val ; - int *orig, *data ; - - print_test_name ("lcomp_test_int", filename) ; - - datalen = BUFFER_SIZE / channels ; - - if (is_lossy (filetype)) - { scale = 1.0 * 0x10000 ; - max_val = 32000.0 * scale ; - } - else - { scale = 1.0 ; - max_val = 0x7fffffff * scale ; - } ; - - data = data_buffer.i ; - orig = orig_buffer.i ; - - gen_signal_double (orig_buffer.d, max_val, channels, datalen) ; - - for (k = 0 ; k < channels * datalen ; k++) - orig [k] = lrint (orig_buffer.d [k]) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = 123456789 ; /* Ridiculous value. */ - sfinfo.channels = channels ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - test_writef_int_or_die (file, 0, orig, datalen, __LINE__) ; - sf_set_string (file, SF_STR_COMMENT, long_comment) ; - sf_close (file) ; - - memset (data, 0, datalen * sizeof (int)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < datalen / channels) - { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.frames > (datalen + datalen / 20)) - { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != channels) - { printf ("Incorrect number of channels in file.\n") ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - check_comment (file, filetype, __LINE__) ; - - test_readf_int_or_die (file, 0, data, datalen, __LINE__) ; - - half_max_abs = 0 ; - for (k = 0 ; k < datalen ; k++) - { if (error_function (data [k] / scale, orig [k] / scale, margin)) - { printf ("\nLine %d: Incorrect sample (#%d : %f should be %f).\n", __LINE__, k, data [k] / scale, orig [k] / scale) ; - oct_save_int (orig, data, datalen) ; - exit (1) ; - } ; - half_max_abs = LCT_MAX (half_max_abs, abs (data [k] / 2)) ; - } ; - - if (half_max_abs < 1.0) - { printf ("\n\nLine %d: Signal is all zeros (%d, 0x%X).\n", __LINE__, half_max_abs, half_max_abs) ; - exit (1) ; - } ; - - if ((k = sf_readf_int (file, data, datalen)) != sfinfo.frames - datalen) - { printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__, - channels * sfinfo.frames - datalen, k) ; - exit (1) ; - } ; - - /* This check is only for block based encoders which must append silence - ** to the end of a file so as to fill out a block. - */ - if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM) - for (k = 0 ; k < sfinfo.frames - datalen ; k++) - if (abs (data [channels * k] / scale) > decay_response (channels * k)) - { printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%d) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ; - exit (1) ; - } ; - - if (! sfinfo.seekable) - { sf_close (file) ; - unlink (filename) ; - printf ("ok\n") ; - return ; - } ; - - /* Now test sf_seek function. */ - - if ((k = sf_seek (file, 0, SEEK_SET)) != 0) - { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - for (m = 0 ; m < 3 ; m++) - { test_readf_int_or_die (file, m, data, 11, __LINE__) ; - - for (k = 0 ; k < channels * 11 ; k++) - if (error_function (data [k] / scale, orig [k + channels * m * 11] / scale, margin)) - { printf ("\nLine %d: Incorrect sample (m = %d) (#%d : %d => %d).\n", __LINE__, m, k + channels * m * 11, orig [k + channels * m * 11], data [k]) ; - for (m = 0 ; m < channels ; m++) - printf ("%d ", data [m]) ; - printf ("\n") ; - exit (1) ; - } ; - } ; - - seekpos = BUFFER_SIZE / 10 ; - - /* Check seek from start of file. */ - if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) - { printf ("Seek to start of file + %" PRId64 " failed (%d).\n", seekpos, k) ; - exit (1) ; - } ; - - test_readf_int_or_die (file, 0, data, 1, __LINE__) ; - - if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin)) - { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_int failed (%d, %d).\n", __LINE__, orig [1], data [0]) ; - exit (1) ; - } ; - - if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) - { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %" PRId64 ")\n", __LINE__, k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; - k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; - test_readf_int_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %" PRId64 ").\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; - /* Check seek backward from current position. */ - k = sf_seek (file, -20, SEEK_CUR) ; - test_readf_int_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %" PRId64 ").\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ; - exit (1) ; - } ; - - /* Check that read past end of file returns number of items. */ - sf_seek (file, sfinfo.frames, SEEK_SET) ; - - if ((k = sf_readf_int (file, data, datalen)) != 0) - { printf ("\n\nLine %d: Return value from sf_readf_int past end of file incorrect (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - /* Check seek backward from end. */ - if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) - { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; - exit (1) ; - } ; - - test_readf_int_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (data [0] / scale, orig [5 * channels] / scale, margin)) - { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_short failed (%d should be %d).\n", __LINE__, data [0], orig [5]) ; - exit (1) ; - } ; - - sf_close (file) ; - - unlink (filename) ; - printf ("ok\n") ; -} /* lcomp_test_int */ - -/*-------------------------------------------------------------------------------------------- -*/ - -static void -lcomp_test_float (const char *filename, int filetype, int channels, double margin) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, m, seekpos ; - sf_count_t datalen ; - float *orig, *data ; - double half_max_abs ; - - print_test_name ("lcomp_test_float", filename) ; - - datalen = BUFFER_SIZE / channels ; - - data = data_buffer.f ; - orig = orig_buffer.f ; - - gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ; - for (k = 0 ; k < channels * datalen ; k++) - orig [k] = orig_buffer.d [k] ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = 123456789 ; /* Ridiculous value. */ - sfinfo.channels = channels ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - test_writef_float_or_die (file, 0, orig, datalen, __LINE__) ; - sf_set_string (file, SF_STR_COMMENT, long_comment) ; - sf_close (file) ; - - memset (data, 0, datalen * sizeof (float)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < datalen / channels) - { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.frames > (datalen + datalen / 20)) - { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != channels) - { printf ("Incorrect number of channels in file.\n") ; - exit (1) ; - } ; - - check_comment (file, filetype, __LINE__) ; - - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - check_log_buffer_or_die (file, __LINE__) ; - - check_comment (file, filetype, __LINE__) ; - - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - test_readf_float_or_die (file, 0, data, datalen, __LINE__) ; - - half_max_abs = 0.0 ; - for (k = 0 ; k < datalen ; k++) - { if (error_function (data [k], orig [k], margin)) - { printf ("\nLine %d: Incorrect sample A (#%d : %f should be %f).\n", __LINE__, k, data [k], orig [k]) ; - oct_save_float (orig, data, datalen) ; - exit (1) ; - } ; - half_max_abs = LCT_MAX (half_max_abs, fabs (0.5 * data [k])) ; - } ; - - if (half_max_abs < 1.0) - { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ; - exit (1) ; - } ; - - if ((k = sf_readf_float (file, data, datalen)) != sfinfo.frames - datalen) - { printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__, - channels * sfinfo.frames - datalen, k) ; - exit (1) ; - } ; - - /* This check is only for block based encoders which must append silence - ** to the end of a file so as to fill out a block. - */ - if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM) - for (k = 0 ; k < sfinfo.frames - datalen ; k++) - if (abs (data [channels * k]) > decay_response (channels * k)) - { printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%f) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ; - exit (1) ; - } ; - - if (! sfinfo.seekable) - { sf_close (file) ; - unlink (filename) ; - printf ("ok\n") ; - return ; - } ; - - /* Now test sf_seek function. */ - - if ((k = sf_seek (file, 0, SEEK_SET)) != 0) - { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - for (m = 0 ; m < 3 ; m++) - { test_readf_float_or_die (file, 0, data, 11, __LINE__) ; - - for (k = 0 ; k < channels * 11 ; k++) - if (error_function (data [k], orig [k + channels * m * 11], margin)) - { printf ("\nLine %d: Incorrect sample (m = %d) (#%d : %f => %f).\n", __LINE__, m, k + channels * m * 11, orig [k + channels * m * 11], data [k]) ; - for (m = 0 ; m < channels ; m++) - printf ("%f ", data [m]) ; - printf ("\n") ; - exit (1) ; - } ; - } ; - - seekpos = BUFFER_SIZE / 10 ; - - /* Check seek from start of file. */ - if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) - { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ; - exit (1) ; - } ; - - test_readf_float_or_die (file, 0, data, 1, __LINE__) ; - - if (error_function (data [0], orig [seekpos * channels], margin)) - { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_float failed (%f, %f).\n", __LINE__, orig [1], data [0]) ; - exit (1) ; - } ; - - if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) - { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; - k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; - test_readf_float_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_float failed (%f, %f) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; - /* Check seek backward from current position. */ - k = sf_seek (file, -20, SEEK_CUR) ; - test_readf_float_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_float failed (%f, %f) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ; - exit (1) ; - } ; - - /* Check that read past end of file returns number of items. */ - sf_seek (file, sfinfo.frames, SEEK_SET) ; - - if ((k = sf_readf_float (file, data, datalen)) != 0) - { printf ("\n\nLine %d: Return value from sf_readf_float past end of file incorrect (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - /* Check seek backward from end. */ - if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) - { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; - exit (1) ; - } ; - - test_readf_float_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (data [0], orig [5 * channels], margin)) - { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_short failed (%f should be %f).\n", __LINE__, data [0], orig [5 * channels]) ; - exit (1) ; - } ; - - sf_close (file) ; - - unlink (filename) ; - printf ("ok\n") ; -} /* lcomp_test_float */ - -/*-------------------------------------------------------------------------------------------- -*/ - -static void -lcomp_test_double (const char *filename, int filetype, int channels, double margin) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, m, seekpos ; - sf_count_t datalen ; - double *orig, *data ; - double half_max_abs ; - - print_test_name ("lcomp_test_double", filename) ; - - datalen = BUFFER_SIZE / channels ; - - data = data_buffer.d ; - orig = orig_buffer.d ; - - gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ; - for (k = 0 ; k < channels * datalen ; k++) - orig [k] = orig_buffer.d [k] ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = 123456789 ; /* Ridiculous value. */ - sfinfo.channels = channels ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - test_writef_double_or_die (file, 0, orig, datalen, __LINE__) ; - sf_set_string (file, SF_STR_COMMENT, long_comment) ; - sf_close (file) ; - - memset (data, 0, datalen * sizeof (double)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < datalen / channels) - { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.frames > (datalen + datalen / 20)) - { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != channels) - { printf ("Incorrect number of channels in file.\n") ; - exit (1) ; - } ; - - check_comment (file, filetype, __LINE__) ; - - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - check_log_buffer_or_die (file, __LINE__) ; - - check_comment (file, filetype, __LINE__) ; - - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - test_readf_double_or_die (file, 0, data, datalen, __LINE__) ; - - half_max_abs = 0.0 ; - for (k = 0 ; k < datalen ; k++) - { if (error_function (data [k], orig [k], margin)) - { printf ("\nLine %d: Incorrect sample A (#%d : %f should be %f).\n", __LINE__, k, data [k], orig [k]) ; - oct_save_double (orig, data, datalen) ; - exit (1) ; - } ; - half_max_abs = LCT_MAX (half_max_abs, abs (0.5 * data [k])) ; - } ; - - if (half_max_abs < 1.0) - { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ; - exit (1) ; - } ; - - if ((k = sf_readf_double (file, data, datalen)) != sfinfo.frames - datalen) - { printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__, - channels * sfinfo.frames - datalen, k) ; - exit (1) ; - } ; - - /* This check is only for block based encoders which must append silence - ** to the end of a file so as to fill out a block. - */ - if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM) - for (k = 0 ; k < sfinfo.frames - datalen ; k++) - if (abs (data [channels * k]) > decay_response (channels * k)) - { printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%f) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ; - exit (1) ; - } ; - - if (! sfinfo.seekable) - { sf_close (file) ; - unlink (filename) ; - printf ("ok\n") ; - return ; - } ; - - /* Now test sf_seek function. */ - - if ((k = sf_seek (file, 0, SEEK_SET)) != 0) - { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - for (m = 0 ; m < 3 ; m++) - { test_readf_double_or_die (file, m, data, 11, __LINE__) ; - - for (k = 0 ; k < channels * 11 ; k++) - if (error_function (data [k], orig [k + channels * m * 11], margin)) - { printf ("\nLine %d: Incorrect sample (m = %d) (#%d : %f => %f).\n", __LINE__, m, k + channels * m * 11, orig [k + channels * m * 11], data [k]) ; - for (m = 0 ; m < channels ; m++) - printf ("%f ", data [m]) ; - printf ("\n") ; - exit (1) ; - } ; - } ; - - seekpos = BUFFER_SIZE / 10 ; - - /* Check seek from start of file. */ - if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) - { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ; - exit (1) ; - } ; - - test_readf_double_or_die (file, 0, data, 1, __LINE__) ; - - if (error_function (data [0], orig [seekpos * channels], margin)) - { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_double failed (%f, %f).\n", __LINE__, orig [1], data [0]) ; - exit (1) ; - } ; - - if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) - { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; - k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; - test_readf_double_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_double failed (%f, %f) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; - /* Check seek backward from current position. */ - k = sf_seek (file, -20, SEEK_CUR) ; - test_readf_double_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_double failed (%f, %f) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ; - exit (1) ; - } ; - - /* Check that read past end of file returns number of items. */ - sf_seek (file, sfinfo.frames, SEEK_SET) ; - - if ((k = sf_readf_double (file, data, datalen)) != 0) - { printf ("\n\nLine %d: Return value from sf_readf_double past end of file incorrect (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - /* Check seek backward from end. */ - if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) - { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; - exit (1) ; - } ; - - test_readf_double_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (data [0], orig [5 * channels], margin)) - { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_short failed (%f should be %f).\n", __LINE__, data [0], orig [5 * channels]) ; - exit (1) ; - } ; - - sf_close (file) ; - - unlink (filename) ; - printf ("ok\n") ; -} /* lcomp_test_double */ - -/*======================================================================================== -** Smoothed differential loss compression tests. -*/ - -static void -sdlcomp_test_short (const char *filename, int filetype, int channels, double margin) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, m, seekpos, half_max_abs ; - sf_count_t datalen ; - short *orig, *data, *smooth ; - -channels = 1 ; - print_test_name ("sdlcomp_test_short", filename) ; - - datalen = BUFFER_SIZE ; - - orig = orig_buffer.s ; - data = data_buffer.s ; - smooth = smooth_buffer.s ; - - gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ; - for (k = 0 ; k < datalen ; k++) - orig [k] = lrint (orig_buffer.d [k]) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = 123456789 ; /* Ridiculous value. */ - sfinfo.channels = channels ; - sfinfo.format = filetype ; - - /* The Vorbis encoder has a bug on PowerPC and X86-64 with sample rates - ** <= 22050. Increasing the sample rate to 32000 avoids triggering it. - ** See https://trac.xiph.org/ticket/1229 - */ - if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) - { const char * errstr ; - - errstr = sf_strerror (NULL) ; - if (strstr (errstr, "Sample rate chosen is known to trigger a Vorbis") == NULL) - { printf ("Line %d: sf_open_fd (SFM_WRITE) failed : %s\n", __LINE__, errstr) ; - dump_log_buffer (NULL) ; - exit (1) ; - } ; - - printf ("\n Sample rate -> 32kHz ") ; - sfinfo.samplerate = 32000 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - } ; - - test_write_short_or_die (file, 0, orig, datalen, __LINE__) ; - sf_set_string (file, SF_STR_COMMENT, long_comment) ; - sf_close (file) ; - - memset (data, 0, datalen * sizeof (short)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < datalen / channels) - { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.frames > (datalen + 400)) - { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ; - exit (1) ; - } ; - - if (sfinfo.channels != channels) - { printf ("Incorrect number of channels in file.\n") ; - exit (1) ; - } ; - - check_comment (file, filetype, __LINE__) ; - - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_readf_short_or_die (file, 0, data, datalen, __LINE__) ; - - memcpy (smooth, orig, datalen * sizeof (short)) ; - smoothed_diff_short (data, datalen) ; - smoothed_diff_short (smooth, datalen) ; - - half_max_abs = 0.0 ; - for (k = 0 ; k < datalen ; k++) - { if (error_function (1.0 * data [k], 1.0 * smooth [k], margin)) - { printf ("\nLine %d: Incorrect sample (#%d : %d should be %d).\n", __LINE__, k, data [k], smooth [k]) ; - oct_save_short (orig, smooth, datalen) ; - exit (1) ; - } ; - half_max_abs = LCT_MAX (half_max_abs, abs (0.5 * data [k])) ; - } ; - - if (half_max_abs < 1) - { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ; - exit (1) ; - } ; - - if ((k = sf_read_short (file, data, datalen)) != sfinfo.frames - datalen) - { printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ; - exit (1) ; - } ; - - if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM && - (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610) - for (k = 0 ; k < sfinfo.frames - datalen ; k++) - if (abs (data [k]) > decay_response (k)) - { printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, data [k], decay_response (k)) ; - exit (1) ; - } ; - - /* Now test sf_seek function. */ - if (sfinfo.seekable) - { if ((k = sf_seek (file, 0, SEEK_SET)) != 0) - { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - for (m = 0 ; m < 3 ; m++) - { test_readf_short_or_die (file, m, data, datalen / 7, __LINE__) ; - - smoothed_diff_short (data, datalen / 7) ; - memcpy (smooth, orig + m * datalen / 7, datalen / 7 * sizeof (short)) ; - smoothed_diff_short (smooth, datalen / 7) ; - - for (k = 0 ; k < datalen / 7 ; k++) - if (error_function (1.0 * data [k], 1.0 * smooth [k], margin)) - { printf ("\nLine %d: Incorrect sample C (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), smooth [k], data [k]) ; - for (m = 0 ; m < 10 ; m++) - printf ("%d ", data [k]) ; - printf ("\n") ; - exit (1) ; - } ; - } ; /* for (m = 0 ; m < 3 ; m++) */ - - seekpos = BUFFER_SIZE / 10 ; - - /* Check seek from start of file. */ - if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) - { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ; - exit (1) ; - } ; - test_readf_short_or_die (file, 0, data, 1, __LINE__) ; - - if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin)) - { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_read_short failed (%d, %d).\n", __LINE__, orig [1], data [0]) ; - exit (1) ; - } ; - - if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) - { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; - k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; - test_readf_short_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_read_short failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; - /* Check seek backward from current position. */ - k = sf_seek (file, -20, SEEK_CUR) ; - test_readf_short_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_read_short failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ; - exit (1) ; - } ; - - /* Check that read past end of file returns number of items. */ - sf_seek (file, sfinfo.frames, SEEK_SET) ; - - if ((k = sf_read_short (file, data, datalen)) != 0) - { printf ("\n\nLine %d: Return value from sf_read_short past end of file incorrect (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - /* Check seek backward from end. */ - - if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) - { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; - exit (1) ; - } ; - - test_read_short_or_die (file, 0, data, channels, __LINE__) ; - if (error_function (1.0 * data [0], 1.0 * orig [5 * channels], margin)) - { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_read_short failed (%d should be %d).\n", __LINE__, data [0], orig [5 * channels]) ; - exit (1) ; - } ; - } /* if (sfinfo.seekable) */ - - sf_close (file) ; - - unlink (filename) ; - printf ("ok\n") ; -} /* sdlcomp_test_short */ - -static void -sdlcomp_test_int (const char *filename, int filetype, int channels, double margin) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, m, seekpos, half_max_abs ; - sf_count_t datalen ; - int *orig, *data, *smooth ; - double scale ; - -channels = 1 ; - - print_test_name ("sdlcomp_test_int", filename) ; - - datalen = BUFFER_SIZE ; - scale = 1.0 * 0x10000 ; - - orig = orig_buffer.i ; - data = data_buffer.i ; - smooth = smooth_buffer.i ; - - gen_signal_double (orig_buffer.d, 32000.0 * scale, channels, datalen) ; - for (k = 0 ; k < datalen ; k++) - orig [k] = lrint (orig_buffer.d [k]) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = 123456789 ; /* Ridiculous value. */ - sfinfo.channels = channels ; - sfinfo.format = filetype ; - - /* The Vorbis encoder has a bug on PowerPC and X86-64 with sample rates - ** <= 22050. Increasing the sample rate to 32000 avoids triggering it. - ** See https://trac.xiph.org/ticket/1229 - */ - if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) - { const char * errstr ; - - errstr = sf_strerror (NULL) ; - if (strstr (errstr, "Sample rate chosen is known to trigger a Vorbis") == NULL) - { printf ("Line %d: sf_open_fd (SFM_WRITE) failed : %s\n", __LINE__, errstr) ; - dump_log_buffer (NULL) ; - exit (1) ; - } ; - - printf ("\n Sample rate -> 32kHz ") ; - sfinfo.samplerate = 32000 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - } ; - - test_writef_int_or_die (file, 0, orig, datalen, __LINE__) ; - sf_set_string (file, SF_STR_COMMENT, long_comment) ; - sf_close (file) ; - - memset (data, 0, datalen * sizeof (int)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < datalen / channels) - { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.frames > (datalen + 400)) - { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ; - exit (1) ; - } ; - - if (sfinfo.channels != channels) - { printf ("Incorrect number of channels in file.\n") ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_readf_int_or_die (file, 0, data, datalen, __LINE__) ; - - memcpy (smooth, orig, datalen * sizeof (int)) ; - smoothed_diff_int (data, datalen) ; - smoothed_diff_int (smooth, datalen) ; - - half_max_abs = abs (data [0] >> 16) ; - for (k = 1 ; k < datalen ; k++) - { if (error_function (data [k] / scale, smooth [k] / scale, margin)) - { printf ("\nLine %d: Incorrect sample (#%d : %d should be %d).\n", __LINE__, k, data [k], smooth [k]) ; - oct_save_int (orig, smooth, datalen) ; - exit (1) ; - } ; - half_max_abs = LCT_MAX (half_max_abs, abs (data [k] / 2)) ; - } ; - - if (half_max_abs < 1) - { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ; - exit (1) ; - } ; - - if ((k = sf_readf_int (file, data, datalen)) != sfinfo.frames - datalen) - { printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ; - exit (1) ; - } ; - - if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_IMA_ADPCM && - (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM && - (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610 && - (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_G721_32 && - (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_G723_24) - for (k = 0 ; k < sfinfo.frames - datalen ; k++) - if (abs (data [k]) > decay_response (k)) - { printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, data [k], decay_response (k)) ; - exit (1) ; - } ; - - /* Now test sf_seek function. */ - if (sfinfo.seekable) - { if ((k = sf_seek (file, 0, SEEK_SET)) != 0) - { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - for (m = 0 ; m < 3 ; m++) - { test_readf_int_or_die (file, m, data, datalen / 7, __LINE__) ; - - smoothed_diff_int (data, datalen / 7) ; - memcpy (smooth, orig + m * datalen / 7, datalen / 7 * sizeof (int)) ; - smoothed_diff_int (smooth, datalen / 7) ; - - for (k = 0 ; k < datalen / 7 ; k++) - if (error_function (data [k] / scale, smooth [k] / scale, margin)) - { printf ("\nLine %d: Incorrect sample (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), smooth [k], data [k]) ; - for (m = 0 ; m < 10 ; m++) - printf ("%d ", data [k]) ; - printf ("\n") ; - exit (1) ; - } ; - } ; /* for (m = 0 ; m < 3 ; m++) */ - - seekpos = BUFFER_SIZE / 10 ; - - /* Check seek from start of file. */ - if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) - { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ; - exit (1) ; - } ; - test_readf_int_or_die (file, 0, data, 1, __LINE__) ; - - if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin)) - { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_int failed (%d, %d).\n", __LINE__, orig [1], data [0]) ; - exit (1) ; - } ; - - if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) - { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; - k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; - test_readf_int_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; - /* Check seek backward from current position. */ - k = sf_seek (file, -20, SEEK_CUR) ; - test_readf_int_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ; - exit (1) ; - } ; - - /* Check that read past end of file returns number of items. */ - sf_seek (file, sfinfo.frames, SEEK_SET) ; - - if ((k = sf_readf_int (file, data, datalen)) != 0) - { printf ("\n\nLine %d: Return value from sf_readf_int past end of file incorrect (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - /* Check seek backward from end. */ - - if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) - { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; - exit (1) ; - } ; - - test_readf_int_or_die (file, 0, data, 1, __LINE__) ; - if (error_function (data [0] / scale, orig [5] / scale, margin)) - { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_int failed (%d should be %d).\n", __LINE__, data [0], orig [5]) ; - exit (1) ; - } ; - } /* if (sfinfo.seekable) */ - - sf_close (file) ; - - unlink (filename) ; - printf ("ok\n") ; -} /* sdlcomp_test_int */ - -static void -sdlcomp_test_float (const char *filename, int filetype, int channels, double margin) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, m, seekpos ; - sf_count_t datalen ; - float *orig, *data, *smooth ; - double half_max_abs ; - -channels = 1 ; - - print_test_name ("sdlcomp_test_float", filename) ; - - if ((filetype & SF_FORMAT_SUBMASK) == SF_FORMAT_VORBIS) - { puts ("Not working for this format.") ; - return ; - } ; - -printf ("** fix this ** ") ; - - datalen = BUFFER_SIZE ; - - orig = orig_buffer.f ; - data = data_buffer.f ; - smooth = smooth_buffer.f ; - - gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ; - for (k = 0 ; k < datalen ; k++) - orig [k] = lrint (orig_buffer.d [k]) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = 123456789 ; /* Ridiculous value. */ - sfinfo.channels = channels ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - test_write_float_or_die (file, 0, orig, datalen, __LINE__) ; - sf_set_string (file, SF_STR_COMMENT, long_comment) ; - sf_close (file) ; - - memset (data, 0, datalen * sizeof (float)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < datalen / channels) - { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.frames > (datalen + 400)) - { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ; - exit (1) ; - } ; - - if (sfinfo.channels != channels) - { printf ("Incorrect number of channels in file.\n") ; - exit (1) ; - } ; - - check_comment (file, filetype, __LINE__) ; - - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_float_or_die (file, 0, data, datalen, __LINE__) ; - - memcpy (smooth, orig, datalen * sizeof (float)) ; - smoothed_diff_float (data, datalen) ; - smoothed_diff_float (smooth, datalen) ; - - half_max_abs = fabs (data [0]) ; - for (k = 1 ; k < datalen ; k++) - { if (error_function (data [k], smooth [k], margin)) - { printf ("\nLine %d: Incorrect sample (#%d : %d should be %d).\n", __LINE__, k, (int) data [k], (int) smooth [k]) ; - oct_save_float (orig, smooth, datalen) ; - exit (1) ; - } ; - half_max_abs = LCT_MAX (half_max_abs, abs (0.5 * data [k])) ; - } ; - - if (half_max_abs <= 0.0) - { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ; - printf ("half_max_abs : % 10.6f\n", half_max_abs) ; - exit (1) ; - } ; - - if ((k = sf_read_float (file, data, datalen)) != sfinfo.frames - datalen) - { printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ; - exit (1) ; - } ; - - if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM && - (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610) - for (k = 0 ; k < sfinfo.frames - datalen ; k++) - if (abs (data [k]) > decay_response (k)) - { printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, (int) data [k], (int) decay_response (k)) ; - exit (1) ; - } ; - - /* Now test sf_seek function. */ - if (sfinfo.seekable) - { if ((k = sf_seek (file, 0, SEEK_SET)) != 0) - { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - for (m = 0 ; m < 3 ; m++) - { test_read_float_or_die (file, 0, data, datalen / 7, __LINE__) ; - - smoothed_diff_float (data, datalen / 7) ; - memcpy (smooth, orig + m * datalen / 7, datalen / 7 * sizeof (float)) ; - smoothed_diff_float (smooth, datalen / 7) ; - - for (k = 0 ; k < datalen / 7 ; k++) - if (error_function (data [k], smooth [k], margin)) - { printf ("\nLine %d: Incorrect sample C (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), (int) smooth [k], (int) data [k]) ; - for (m = 0 ; m < 10 ; m++) - printf ("%d ", (int) data [k]) ; - printf ("\n") ; - exit (1) ; - } ; - } ; /* for (m = 0 ; m < 3 ; m++) */ - - seekpos = BUFFER_SIZE / 10 ; - - /* Check seek from start of file. */ - if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) - { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ; - exit (1) ; - } ; - test_read_float_or_die (file, 0, data, channels, __LINE__) ; - - if (error_function (data [0], orig [seekpos * channels], margin)) - { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_read_float failed (%d, %d).\n", __LINE__, (int) orig [1], (int) data [0]) ; - exit (1) ; - } ; - - if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) - { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; - k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; - test_read_float_or_die (file, 0, data, channels, __LINE__) ; - if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_read_float failed (%d, %d) (%d, %d).\n", __LINE__, (int) data [0], (int) orig [seekpos * channels], k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; - /* Check seek backward from current position. */ - k = sf_seek (file, -20, SEEK_CUR) ; - test_read_float_or_die (file, 0, data, channels, __LINE__) ; - if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_read_float failed (%d, %d) (%d, %d).\n", __LINE__, (int) data [0], (int) orig [seekpos * channels], k, seekpos) ; - exit (1) ; - } ; - - /* Check that read past end of file returns number of items. */ - sf_seek (file, sfinfo.frames, SEEK_SET) ; - - if ((k = sf_read_float (file, data, datalen)) != 0) - { printf ("\n\nLine %d: Return value from sf_read_float past end of file incorrect (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - /* Check seek backward from end. */ - - if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) - { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; - exit (1) ; - } ; - - test_read_float_or_die (file, 0, data, channels, __LINE__) ; - if (error_function (data [0], orig [5 * channels], margin)) - { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_read_float failed (%f should be %f).\n", __LINE__, data [0], orig [5 * channels]) ; - exit (1) ; - } ; - } /* if (sfinfo.seekable) */ - - sf_close (file) ; - - unlink (filename) ; - printf ("ok\n") ; -} /* sdlcomp_test_float */ - -static void -sdlcomp_test_double (const char *filename, int filetype, int channels, double margin) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, m, seekpos ; - sf_count_t datalen ; - double *orig, *data, *smooth, half_max_abs ; - -channels = 1 ; - print_test_name ("sdlcomp_test_double", filename) ; - - if ((filetype & SF_FORMAT_SUBMASK) == SF_FORMAT_VORBIS) - { puts ("Not working for this format.") ; - return ; - } ; - - datalen = BUFFER_SIZE ; - - orig = orig_buffer.d ; - data = data_buffer.d ; - smooth = smooth_buffer.d ; - - gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = 123456789 ; /* Ridiculous value. */ - sfinfo.channels = channels ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - test_write_double_or_die (file, 0, orig, datalen, __LINE__) ; - sf_set_string (file, SF_STR_COMMENT, long_comment) ; - sf_close (file) ; - - memset (data, 0, datalen * sizeof (double)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < datalen / channels) - { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.frames > (datalen + 400)) - { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ; - exit (1) ; - } ; - - if (sfinfo.channels != channels) - { printf ("Incorrect number of channels in file.\n") ; - exit (1) ; - } ; - - check_comment (file, filetype, __LINE__) ; - - check_comment (file, filetype, __LINE__) ; - - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_double_or_die (file, 0, data, datalen, __LINE__) ; - - memcpy (smooth, orig, datalen * sizeof (double)) ; - smoothed_diff_double (data, datalen) ; - smoothed_diff_double (smooth, datalen) ; - - half_max_abs = 0.0 ; - for (k = 0 ; k < datalen ; k++) - { if (error_function (data [k], smooth [k], margin)) - { printf ("\n\nLine %d: Incorrect sample (#%d : %d should be %d).\n", __LINE__, k, (int) data [k], (int) smooth [k]) ; - oct_save_double (orig, smooth, datalen) ; - exit (1) ; - } ; - half_max_abs = LCT_MAX (half_max_abs, 0.5 * fabs (data [k])) ; - } ; - - if (half_max_abs < 1.0) - { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ; - exit (1) ; - } ; - - if ((k = sf_read_double (file, data, datalen)) != sfinfo.frames - datalen) - { printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ; - exit (1) ; - } ; - - if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM && - (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610) - for (k = 0 ; k < sfinfo.frames - datalen ; k++) - if (abs (data [k]) > decay_response (k)) - { printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, (int) data [k], (int) decay_response (k)) ; - exit (1) ; - } ; - - /* Now test sf_seek function. */ - if (sfinfo.seekable) - { if ((k = sf_seek (file, 0, SEEK_SET)) != 0) - { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - for (m = 0 ; m < 3 ; m++) - { test_read_double_or_die (file, m, data, datalen / 7, __LINE__) ; - - smoothed_diff_double (data, datalen / 7) ; - memcpy (smooth, orig + m * datalen / 7, datalen / 7 * sizeof (double)) ; - smoothed_diff_double (smooth, datalen / 7) ; - - for (k = 0 ; k < datalen / 7 ; k++) - if (error_function (data [k], smooth [k], margin)) - { printf ("\nLine %d: Incorrect sample C (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), (int) smooth [k], (int) data [k]) ; - for (m = 0 ; m < 10 ; m++) - printf ("%d ", (int) data [k]) ; - printf ("\n") ; - exit (1) ; - } ; - } ; /* for (m = 0 ; m < 3 ; m++) */ - - seekpos = BUFFER_SIZE / 10 ; - - /* Check seek from start of file. */ - if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) - { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ; - exit (1) ; - } ; - test_read_double_or_die (file, 0, data, channels, __LINE__) ; - - if (error_function (data [0], orig [seekpos * channels], margin)) - { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_read_double failed (%d, %d).\n", __LINE__, (int) orig [1], (int) data [0]) ; - exit (1) ; - } ; - - if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) - { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; - k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; - test_read_double_or_die (file, 0, data, channels, __LINE__) ; - if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_read_double failed (%d, %d) (%d, %d).\n", __LINE__, (int) data [0], (int) orig [seekpos * channels], k, seekpos + 1) ; - exit (1) ; - } ; - - seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; - /* Check seek backward from current position. */ - k = sf_seek (file, -20, SEEK_CUR) ; - test_read_double_or_die (file, 0, data, channels, __LINE__) ; - if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos) - { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_read_double failed (%d, %d) (%d, %d).\n", __LINE__, (int) data [0], (int) orig [seekpos * channels], k, seekpos) ; - exit (1) ; - } ; - - /* Check that read past end of file returns number of items. */ - sf_seek (file, sfinfo.frames, SEEK_SET) ; - - if ((k = sf_read_double (file, data, datalen)) != 0) - { printf ("\n\nLine %d: Return value from sf_read_double past end of file incorrect (%d).\n", __LINE__, k) ; - exit (1) ; - } ; - - /* Check seek backward from end. */ - - if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) - { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; - exit (1) ; - } ; - - test_read_double_or_die (file, 0, data, channels, __LINE__) ; - if (error_function (data [0], orig [5 * channels], margin)) - { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_read_double failed (%f should be %f).\n", __LINE__, data [0], orig [5 * channels]) ; - exit (1) ; - } ; - } /* if (sfinfo.seekable) */ - - sf_close (file) ; - - unlink (filename) ; - printf ("ok\n") ; -} /* sdlcomp_test_double */ - -static void -read_raw_test (const char *filename, int filetype, int channels) -{ SNDFILE *file ; - SF_INFO sfinfo ; - sf_count_t count, datalen ; - short *orig, *data ; - int k ; - - print_test_name ("read_raw_test", filename) ; - - datalen = ARRAY_LEN (orig_buffer.s) / 2 ; - - orig = orig_buffer.s ; - data = data_buffer.s ; - - gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ; - for (k = 0 ; k < datalen ; k++) - orig [k] = lrint (orig_buffer.d [k]) ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = 123456789 ; /* Ridiculous value. */ - sfinfo.channels = channels ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - test_write_short_or_die (file, 0, orig, datalen, __LINE__) ; - sf_set_string (file, SF_STR_COMMENT, long_comment) ; - sf_close (file) ; - - memset (data, 0, datalen * sizeof (double)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < datalen / channels) - { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.frames > (datalen + 400)) - { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ; - exit (1) ; - } ; - - if (sfinfo.channels != channels) - { printf ("Incorrect number of channels in file.\n") ; - exit (1) ; - } ; - - check_comment (file, filetype, __LINE__) ; - - count = sf_read_raw (file, orig_buffer.c, datalen + 5 * channels) ; - if (count != sfinfo.channels * sfinfo.frames) - { printf ("\nLine %d : sf_read_raw returned %" PRId64 " should be %" PRId64 "\n", __LINE__, count, sfinfo.channels * sfinfo.frames) ; - exit (1) ; - } ; - - sf_close (file) ; - - unlink (filename) ; - printf ("ok\n") ; -} /* read_raw_test */ - -/*======================================================================================== -** Auxiliary functions -*/ - -#define SIGNAL_MAXVAL 30000.0 -#define DECAY_COUNT 1000 - -static int -decay_response (int k) -{ if (k < 1) - return (int) (1.2 * SIGNAL_MAXVAL) ; - if (k > DECAY_COUNT) - return 0 ; - return (int) (1.2 * SIGNAL_MAXVAL * (DECAY_COUNT - k) / (1.0 * DECAY_COUNT)) ; -} /* decay_response */ - -static void -gen_signal_double (double *data, double scale, int channels, int datalen) -{ int k, ramplen ; - double amp = 0.0 ; - - ramplen = DECAY_COUNT ; - - if (channels == 1) - { for (k = 0 ; k < datalen ; k++) - { if (k <= ramplen) - amp = scale * k / ((double) ramplen) ; - else if (k > datalen - ramplen) - amp = scale * (datalen - k) / ((double) ramplen) ; - -/*-printf ("%3d : %g\n", k, amp) ;-*/ - - data [k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE)) - + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ; - } ; - } - else - { for (k = 0 ; k < datalen ; k ++) - { if (k <= ramplen) - amp = scale * k / ((double) ramplen) ; - else if (k > datalen - ramplen) - amp = scale * (datalen - k) / ((double) ramplen) ; - - data [2 * k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE)) - + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ; - data [2 * k + 1] = amp * (0.4 * sin (55.5 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE)) - + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ; - } ; - } ; - - return ; -} /* gen_signal_double */ - -static int -error_function (double data, double orig, double margin) -{ double error ; - - if (fabs (orig) <= 500.0) - error = fabs (fabs (data) - fabs (orig)) / 2000.0 ; - else if (fabs (orig) <= 1000.0) - error = fabs (data - orig) / 3000.0 ; - else - error = fabs (data - orig) / fabs (orig) ; - - if (error > margin) - { printf ("\n\nerror_function (data = %f, orig = %f, margin = %f) -> %f\n", data, orig, margin, error) ; - return 1 ; - } ; - return 0 ; -} /* error_function */ - -static void -smoothed_diff_short (short *data, unsigned int datalen) -{ unsigned int k ; - double memory = 0.0 ; - - /* Calculate the smoothed sample-to-sample difference. */ - for (k = 0 ; k < datalen - 1 ; k++) - { memory = 0.7 * memory + (1 - 0.7) * (double) (data [k+1] - data [k]) ; - data [k] = (short) memory ; - } ; - data [datalen-1] = data [datalen-2] ; - -} /* smoothed_diff_short */ - -static void -smoothed_diff_int (int *data, unsigned int datalen) -{ unsigned int k ; - double memory = 0.0 ; - - /* Calculate the smoothed sample-to-sample difference. */ - for (k = 0 ; k < datalen - 1 ; k++) - { memory = 0.7 * memory + (1 - 0.7) * (double) (data [k+1] - data [k]) ; - data [k] = (int) memory ; - } ; - data [datalen-1] = data [datalen-2] ; - -} /* smoothed_diff_int */ - -static void -smoothed_diff_float (float *data, unsigned int datalen) -{ unsigned int k ; - float memory = 0.0 ; - - /* Calculate the smoothed sample-to-sample difference. */ - for (k = 0 ; k < datalen - 1 ; k++) - { memory = 0.7 * memory + (1 - 0.7) * (data [k+1] - data [k]) ; - data [k] = memory ; - } ; - data [datalen-1] = data [datalen-2] ; - -} /* smoothed_diff_float */ - -static void -smoothed_diff_double (double *data, unsigned int datalen) -{ unsigned int k ; - double memory = 0.0 ; - - /* Calculate the smoothed sample-to-sample difference. */ - for (k = 0 ; k < datalen - 1 ; k++) - { memory = 0.7 * memory + (1 - 0.7) * (data [k+1] - data [k]) ; - data [k] = memory ; - } ; - data [datalen-1] = data [datalen-2] ; - -} /* smoothed_diff_double */ - -static void -check_comment (SNDFILE * file, int format, int lineno) -{ const char *comment ; - - switch (format & SF_FORMAT_TYPEMASK) - { case SF_FORMAT_AIFF : - case SF_FORMAT_WAV : - case SF_FORMAT_WAVEX : - break ; - default : - return ; - } ; - - comment = sf_get_string (file, SF_STR_COMMENT) ; - if (comment == NULL) - { printf ("\n\nLine %d : File does not contain a comment string.\n\n", lineno) ; - exit (1) ; - } ; - - if (strcmp (comment, long_comment) != 0) - { printf ("\n\nLine %d : File comment does not match comment written.\n\n", lineno) ; - exit (1) ; - } ; - - return ; -} /* check_comment */ - -static int -is_lossy (int filetype) -{ - switch (SF_FORMAT_SUBMASK & filetype) - { case SF_FORMAT_PCM_U8 : - case SF_FORMAT_PCM_S8 : - case SF_FORMAT_PCM_16 : - case SF_FORMAT_PCM_24 : - case SF_FORMAT_PCM_32 : - case SF_FORMAT_FLOAT : - case SF_FORMAT_DOUBLE : - return 0 ; - - default : - break ; - } ; - - return 1 ; -} /* is_lossy */ - diff --git a/libs/libsndfile/tests/misc_test.c b/libs/libsndfile/tests/misc_test.c deleted file mode 100644 index b95e421dce..0000000000 --- a/libs/libsndfile/tests/misc_test.c +++ /dev/null @@ -1,415 +0,0 @@ -/* -** Copyright (C) 2001-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if (HAVE_DECL_S_IRGRP == 0) -#include -#endif - -#if (defined (WIN32) || defined (_WIN32)) -#include -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_LEN (1 << 10) -#define LOG_BUFFER_SIZE 1024 - -static void zero_data_test (const char *filename, int format) ; -static void filesystem_full_test (int format) ; -static void permission_test (const char *filename, int typemajor) ; -static void wavex_amb_test (const char *filename) ; - -int -main (int argc, char *argv []) -{ int do_all = 0 ; - int test_count = 0 ; - - if (argc != 2) - { printf ("Usage : %s \n", argv [0]) ; - printf (" Where is one of the following:\n") ; - printf (" wav - test WAV file peak chunk\n") ; - printf (" aiff - test AIFF file PEAK chunk\n") ; - printf (" all - perform all tests\n") ; - exit (1) ; - } ; - - do_all = ! strcmp (argv [1], "all") ; - - if (do_all || ! strcmp (argv [1], "wav")) - { zero_data_test ("zerolen.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - permission_test ("readonly.wav", SF_FORMAT_WAV) ; - wavex_amb_test ("ambisonic.wav") ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "aiff")) - { zero_data_test ("zerolen.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ; - permission_test ("readonly.aiff", SF_FORMAT_AIFF) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "au")) - { zero_data_test ("zerolen.au", SF_FORMAT_AU | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_AU | SF_FORMAT_PCM_16) ; - permission_test ("readonly.au", SF_FORMAT_AU) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "caf")) - { zero_data_test ("zerolen.caf", SF_FORMAT_CAF | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_CAF | SF_FORMAT_PCM_16) ; - permission_test ("readonly.caf", SF_FORMAT_CAF) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "svx")) - { zero_data_test ("zerolen.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_SVX | SF_FORMAT_PCM_16) ; - permission_test ("readonly.svx", SF_FORMAT_SVX) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "nist")) - { zero_data_test ("zerolen.nist", SF_FORMAT_NIST | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_NIST | SF_FORMAT_PCM_16) ; - permission_test ("readonly.nist", SF_FORMAT_NIST) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "paf")) - { zero_data_test ("zerolen.paf", SF_FORMAT_PAF | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_PAF | SF_FORMAT_PCM_16) ; - permission_test ("readonly.paf", SF_FORMAT_PAF) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "ircam")) - { zero_data_test ("zerolen.ircam", SF_FORMAT_IRCAM | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_IRCAM | SF_FORMAT_PCM_16) ; - permission_test ("readonly.ircam", SF_FORMAT_IRCAM) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "voc")) - { zero_data_test ("zerolen.voc", SF_FORMAT_VOC | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_VOC | SF_FORMAT_PCM_16) ; - permission_test ("readonly.voc", SF_FORMAT_VOC) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "w64")) - { zero_data_test ("zerolen.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_W64 | SF_FORMAT_PCM_16) ; - permission_test ("readonly.w64", SF_FORMAT_W64) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "rf64")) - { zero_data_test ("zerolen.rf64", SF_FORMAT_W64 | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_W64 | SF_FORMAT_PCM_16) ; - permission_test ("readonly.rf64", SF_FORMAT_W64) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat4")) - { zero_data_test ("zerolen.mat4", SF_FORMAT_MAT4 | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_MAT4 | SF_FORMAT_PCM_16) ; - permission_test ("readonly.mat4", SF_FORMAT_MAT4) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat5")) - { zero_data_test ("zerolen.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_MAT5 | SF_FORMAT_PCM_16) ; - permission_test ("readonly.mat5", SF_FORMAT_MAT5) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "pvf")) - { zero_data_test ("zerolen.pvf", SF_FORMAT_PVF | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_PVF | SF_FORMAT_PCM_16) ; - permission_test ("readonly.pvf", SF_FORMAT_PVF) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "htk")) - { zero_data_test ("zerolen.htk", SF_FORMAT_HTK | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_HTK | SF_FORMAT_PCM_16) ; - permission_test ("readonly.htk", SF_FORMAT_HTK) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "avr")) - { zero_data_test ("zerolen.avr", SF_FORMAT_AVR | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_AVR | SF_FORMAT_PCM_16) ; - permission_test ("readonly.avr", SF_FORMAT_AVR) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "sds")) - { zero_data_test ("zerolen.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_SDS | SF_FORMAT_PCM_16) ; - permission_test ("readonly.sds", SF_FORMAT_SDS) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mpc2k")) - { zero_data_test ("zerolen.mpc", SF_FORMAT_MPC2K | SF_FORMAT_PCM_16) ; - filesystem_full_test (SF_FORMAT_MPC2K | SF_FORMAT_PCM_16) ; - permission_test ("readonly.mpc", SF_FORMAT_MPC2K) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "ogg")) - { zero_data_test ("zerolen.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS) ; - /*-filesystem_full_test (SF_FORMAT_OGG | SF_FORMAT_VORBIS) ;-*/ - permission_test ("readonly.oga", SF_FORMAT_OGG) ; - test_count++ ; - } ; - - if (test_count == 0) - { printf ("Mono : ************************************\n") ; - printf ("Mono : * No '%s' test defined.\n", argv [1]) ; - printf ("Mono : ************************************\n") ; - return 1 ; - } ; - - return 0 ; -} /* main */ - - -/*============================================================================================ -** Here are the test functions. -*/ - -static void -zero_data_test (const char *filename, int format) -{ SNDFILE *file ; - SF_INFO sfinfo ; - - switch (format & SF_FORMAT_TYPEMASK) - { case SF_FORMAT_OGG : - if (HAVE_EXTERNAL_LIBS == 0) - return ; - break ; - default : - break ; - } ; - - print_test_name ("zero_data_test", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = format ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - sf_close (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sf_close (file) ; - - unlink (filename) ; - puts ("ok") ; -} /* zero_data_test */ - -static void -filesystem_full_test (int format) -{ SNDFILE *file ; - SF_INFO sfinfo ; - struct stat buf ; - - const char *filename = "/dev/full", *errorstr ; - -#if (defined (WIN32) || defined (_WIN32)) - /* Can't run this test on Win32 so return. */ - return ; -#endif - - /* Make sure errno is zero before doing anything else. */ - errno = 0 ; - - print_test_name ("filesystem_full_test", filename) ; - - if (stat (filename, &buf) != 0) - { puts ("/dev/full missing") ; - return ; - } ; - - if (S_ISCHR (buf.st_mode) == 0 && S_ISBLK (buf.st_mode) == 0) - { puts ("/dev/full is not a device file") ; - return ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = format ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - - if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) != NULL) - { printf ("\n\nLine %d : Error, file should not have openned.\n", __LINE__ - 1) ; - exit (1) ; - } ; - - errorstr = sf_strerror (file) ; - - if (strstr (errorstr, " space ") == NULL || strstr (errorstr, "device") == NULL) - { printf ("\n\nLine %d : Error bad error string : %s.\n", __LINE__ - 1, errorstr) ; - exit (1) ; - } ; - - puts ("ok") ; -} /* filesystem_full_test */ - -static void -permission_test (const char *filename, int typemajor) -{ -#if (OS_IS_WIN32) - /* Avoid compiler warnings. */ - filename = filename ; - typemajor = typemajor ; - - /* Can't run this test on Win32 so return. */ - return ; -#else - - FILE *textfile ; - SNDFILE *file ; - SF_INFO sfinfo ; - const char *errorstr ; - - /* Make sure errno is zero before doing anything else. */ - errno = 0 ; - - if (getuid () == 0) - { /* If running as root bypass this test. - ** Root is allowed to open a readonly file for write. - */ - return ; - } ; - - print_test_name ("permission_test", filename) ; - - if (access (filename, F_OK) == 0) - { chmod (filename, S_IWUSR) ; - unlink (filename) ; - } ; - - if ((textfile = fopen (filename, "w")) == NULL) - { printf ("\n\nLine %d : not able to open text file for write.\n", __LINE__) ; - exit (1) ; - } ; - - fprintf (textfile, "This is a read only file.\n") ; - fclose (textfile) ; - - if (chmod (filename, S_IRUSR | S_IRGRP)) - { printf ("\n\nLine %d : chmod failed", __LINE__) ; - fflush (stdout) ; - perror ("") ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = (typemajor | SF_FORMAT_PCM_16) ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - - if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) != NULL) - { printf ("\n\nLine %d : Error, file should not have opened.\n", __LINE__ - 1) ; - exit (1) ; - } ; - - errorstr = sf_strerror (file) ; - - if (strstr (errorstr, "ermission denied") == NULL) - { printf ("\n\nLine %d : Error bad error string : %s.\n", __LINE__ - 1, errorstr) ; - exit (1) ; - } ; - - if (chmod (filename, S_IWUSR | S_IWGRP)) - { printf ("\n\nLine %d : chmod failed", __LINE__) ; - fflush (stdout) ; - perror ("") ; - exit (1) ; - } ; - - unlink (filename) ; - - puts ("ok") ; - -#endif -} /* permission_test */ - -static void -wavex_amb_test (const char *filename) -{ static short buffer [800] ; - SNDFILE *file ; - SF_INFO sfinfo ; - sf_count_t frames ; - - print_test_name (__func__, filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = SF_FORMAT_WAVEX | SF_FORMAT_PCM_16 ; - sfinfo.channels = 4 ; - - frames = ARRAY_LEN (buffer) / sfinfo.channels ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_WAVEX_SET_AMBISONIC, NULL, SF_AMBISONIC_B_FORMAT) ; - test_writef_short_or_die (file, 0, buffer, frames, __LINE__) ; - sf_close (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - exit_if_true ( - sf_command (file, SFC_WAVEX_GET_AMBISONIC, NULL, 0) != SF_AMBISONIC_B_FORMAT, - "\n\nLine %d : Error, this file should be in Ambisonic B format.\n", __LINE__ - ) ; - - sf_close (file) ; - - unlink (filename) ; - puts ("ok") ; -} /* wavex_amb_test */ diff --git a/libs/libsndfile/tests/multi_file_test.c b/libs/libsndfile/tests/multi_file_test.c deleted file mode 100644 index 502d15a6ba..0000000000 --- a/libs/libsndfile/tests/multi_file_test.c +++ /dev/null @@ -1,238 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if (HAVE_DECL_S_IRGRP == 0) -#include -#endif - -#include -#include -#include - -#include - -#include "utils.h" - -#define DATA_LENGTH (512) - -static void write_file_at_end (int fd, int filetype, int channels, int file_num) ; - -static void multi_file_test (const char *filename, int *formats, int format_count) ; - -static short data [DATA_LENGTH] ; - -static int wav_formats [] = -{ SF_FORMAT_WAV | SF_FORMAT_PCM_16, - SF_FORMAT_WAV | SF_FORMAT_PCM_24, - SF_FORMAT_WAV | SF_FORMAT_ULAW, - SF_FORMAT_WAV | SF_FORMAT_ALAW, - /* Lite remove start */ - SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, - SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, - /* Lite remove end */ - /*-SF_FORMAT_WAV | SF_FORMAT_GSM610 Doesn't work yet. -*/ -} ; - -static int aiff_formats [] = -{ SF_FORMAT_AIFF | SF_FORMAT_PCM_16, - SF_FORMAT_AIFF | SF_FORMAT_PCM_24, - SF_FORMAT_AIFF | SF_FORMAT_ULAW, - SF_FORMAT_AIFF | SF_FORMAT_ALAW -} ; - -static int au_formats [] = -{ SF_FORMAT_AU | SF_FORMAT_PCM_16, - SF_FORMAT_AU | SF_FORMAT_PCM_24, - SF_FORMAT_AU | SF_FORMAT_ULAW, - SF_FORMAT_AU | SF_FORMAT_ALAW -} ; - -static int verbose = SF_FALSE ; - -int -main (int argc, char **argv) -{ int do_all = 0 ; - int test_count = 0 ; - - if (argc == 3 && strcmp (argv [2], "-v") == 0) - { verbose = SF_TRUE ; - argc -- ; - } ; - - if (argc != 2) - { printf ("Usage : %s \n", argv [0]) ; - printf (" Where is one of the following:\n") ; - printf (" wav - test WAV file functions (little endian)\n") ; - printf (" aiff - test AIFF file functions (big endian)\n") ; - printf (" au - test AU file functions\n") ; -#if 0 - printf (" svx - test 8SVX/16SV file functions\n") ; - printf (" nist - test NIST Sphere file functions\n") ; - printf (" ircam - test IRCAM file functions\n") ; - printf (" voc - Create Voice file functions\n") ; - printf (" w64 - Sonic Foundry's W64 file functions\n") ; -#endif - printf (" all - perform all tests\n") ; - exit (1) ; - } ; - - do_all = !strcmp (argv [1], "all") ; - - if (do_all || ! strcmp (argv [1], "wav")) - { multi_file_test ("multi_wav.dat", wav_formats, ARRAY_LEN (wav_formats)) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "aiff")) - { multi_file_test ("multi_aiff.dat", aiff_formats, ARRAY_LEN (aiff_formats)) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "au")) - { multi_file_test ("multi_au.dat", au_formats, ARRAY_LEN (au_formats)) ; - test_count++ ; - } ; - - return 0 ; -} /* main */ - -/*====================================================================================== -*/ - -static void -multi_file_test (const char *filename, int *formats, int format_count) -{ SNDFILE *sndfile ; - SF_INFO sfinfo ; - SF_EMBED_FILE_INFO embed_info ; - sf_count_t filelen ; - int fd, k, file_count = 0 ; - - print_test_name ("multi_file_test", filename) ; - - unlink (filename) ; - - if ((fd = open (filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) < 0) - { printf ("\n\nLine %d: open failed : %s\n", __LINE__, strerror (errno)) ; - exit (1) ; - } ; - - k = write (fd, "1234", 4) ; - - for (k = 0 ; k < format_count ; k++) - write_file_at_end (fd, formats [k], 2, k) ; - - filelen = file_length_fd (fd) ; - - embed_info.offset = 4 ; - embed_info.length = 0 ; - - - for (file_count = 1 ; embed_info.offset + embed_info.length < filelen ; file_count ++) - { - if (verbose) - { puts ("\n------------------------------------") ; - printf ("This offset : %" PRId64 "\n", embed_info.offset + embed_info.length) ; - } ; - - if (lseek (fd, embed_info.offset + embed_info.length, SEEK_SET) < 0) - { printf ("\n\nLine %d: lseek failed : %s\n", __LINE__, strerror (errno)) ; - exit (1) ; - } ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - if ((sndfile = sf_open_fd (fd, SFM_READ, &sfinfo, SF_FALSE)) == NULL) - { printf ("\n\nLine %d: sf_open_fd failed\n", __LINE__) ; - printf ("Embedded file number : %d offset : %" PRId64 "\n", file_count, embed_info.offset) ; - puts (sf_strerror (sndfile)) ; - dump_log_buffer (sndfile) ; - exit (1) ; - } ; - - sf_command (sndfile, SFC_GET_EMBED_FILE_INFO, &embed_info, sizeof (embed_info)) ; - - sf_close (sndfile) ; - - if (verbose) - printf ("\nNext offset : %" PRId64 "\nNext length : %" PRId64 "\n", embed_info.offset, embed_info.length) ; - } ; - - file_count -- ; - - if (file_count != format_count) - { printf ("\n\nLine %d: file count (%d) not equal to %d.\n\n", __LINE__, file_count, format_count) ; - printf ("Embedded file number : %d\n", file_count) ; - exit (1) ; - } ; - - close (fd) ; - unlink (filename) ; - printf ("ok\n") ; - - return ; -} /* multi_file_test */ - -/*====================================================================================== -*/ - -static void -write_file_at_end (int fd, int filetype, int channels, int file_num) -{ SNDFILE *sndfile ; - SF_INFO sfinfo ; - - int frames, k ; - - lseek (fd, 0, SEEK_END) ; - - for (k = 0 ; k < DATA_LENGTH ; k++) - data [k] = k ; - - frames = DATA_LENGTH / channels ; - - sfinfo.format = filetype ; - sfinfo.channels = channels ; - sfinfo.samplerate = 44100 ; - - if ((sndfile = sf_open_fd (fd, SFM_WRITE, &sfinfo, SF_FALSE)) == NULL) - { printf ("\n\nLine %d: sf_open_fd failed\n", __LINE__) ; - printf ("Embedded file number : %d\n", file_num) ; - puts (sf_strerror (sndfile)) ; - dump_log_buffer (sndfile) ; - exit (1) ; - } ; - - if (sf_writef_short (sndfile, data, frames) != frames) - { printf ("\n\nLine %d: short write\n", __LINE__) ; - printf ("Embedded file number : %d\n", file_num) ; - exit (1) ; - } ; - - sf_close (sndfile) ; -} /* write_file_at_end */ - diff --git a/libs/libsndfile/tests/ogg_test.c b/libs/libsndfile/tests/ogg_test.c deleted file mode 100644 index 4b1be031fc..0000000000 --- a/libs/libsndfile/tests/ogg_test.c +++ /dev/null @@ -1,344 +0,0 @@ -/* -** Copyright (C) 2007-2013 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include - -#include - -#include "utils.h" - -#define SAMPLE_RATE 44100 -#define DATA_LENGTH (SAMPLE_RATE / 8) - -typedef union -{ double d [DATA_LENGTH] ; - float f [DATA_LENGTH] ; - int i [DATA_LENGTH] ; - short s [DATA_LENGTH] ; -} BUFFER ; - -static BUFFER data_out ; -static BUFFER data_in ; - -static void -ogg_short_test (void) -{ const char * filename = "vorbis_short.oga" ; - - SNDFILE * file ; - SF_INFO sfinfo ; - short seek_data [10] ; - unsigned k ; - - print_test_name ("ogg_short_test", filename) ; - - /* Generate float data. */ - gen_windowed_sine_float (data_out.f, ARRAY_LEN (data_out.f), 1.0 * 0x7F00) ; - - /* Convert to shorteger. */ - for (k = 0 ; k < ARRAY_LEN (data_out.s) ; k++) - data_out.s [k] = lrintf (data_out.f [k]) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - /* Set up output file type. */ - sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; - sfinfo.channels = 1 ; - sfinfo.samplerate = SAMPLE_RATE ; - - /* Write the output file. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - test_write_short_or_die (file, 0, data_out.s, ARRAY_LEN (data_out.s), __LINE__) ; - sf_close (file) ; - - /* Read the file in again. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - test_read_short_or_die (file, 0, data_in.s, ARRAY_LEN (data_in.s), __LINE__) ; - sf_close (file) ; - - puts ("ok") ; - - /* Test seeking. */ - print_test_name ("ogg_seek_test", filename) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - test_read_short_or_die (file, 0, seek_data, ARRAY_LEN (seek_data), __LINE__) ; - compare_short_or_die (seek_data, data_in.s + 10, ARRAY_LEN (seek_data), __LINE__) ; - - /* Test seek to end of file. */ - test_seek_or_die (file, 0, SEEK_END, sfinfo.frames, sfinfo.channels, __LINE__) ; - - sf_close (file) ; - - puts ("ok") ; - - unlink (filename) ; -} /* ogg_short_test */ - -static void -ogg_int_test (void) -{ const char * filename = "vorbis_int.oga" ; - - SNDFILE * file ; - SF_INFO sfinfo ; - int seek_data [10] ; - unsigned k ; - - print_test_name ("ogg_int_test", filename) ; - - /* Generate float data. */ - gen_windowed_sine_float (data_out.f, ARRAY_LEN (data_out.f), 1.0 * 0x7FFF0000) ; - - /* Convert to integer. */ - for (k = 0 ; k < ARRAY_LEN (data_out.i) ; k++) - data_out.i [k] = lrintf (data_out.f [k]) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - /* Set up output file type. */ - sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; - sfinfo.channels = 1 ; - sfinfo.samplerate = SAMPLE_RATE ; - - /* Write the output file. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - test_write_int_or_die (file, 0, data_out.i, ARRAY_LEN (data_out.i), __LINE__) ; - sf_close (file) ; - - /* Read the file in again. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - test_read_int_or_die (file, 0, data_in.i, ARRAY_LEN (data_in.i), __LINE__) ; - sf_close (file) ; - - puts ("ok") ; - - /* Test seeking. */ - print_test_name ("ogg_seek_test", filename) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - test_read_int_or_die (file, 0, seek_data, ARRAY_LEN (seek_data), __LINE__) ; - compare_int_or_die (seek_data, data_in.i + 10, ARRAY_LEN (seek_data), __LINE__) ; - - sf_close (file) ; - - puts ("ok") ; - - unlink (filename) ; -} /* ogg_int_test */ - -static void -ogg_float_test (void) -{ const char * filename = "vorbis_float.oga" ; - - SNDFILE * file ; - SF_INFO sfinfo ; - float seek_data [10] ; - - print_test_name ("ogg_float_test", filename) ; - - gen_windowed_sine_float (data_out.f, ARRAY_LEN (data_out.f), 0.95) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - /* Set up output file type. */ - sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; - sfinfo.channels = 1 ; - sfinfo.samplerate = SAMPLE_RATE ; - - /* Write the output file. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - test_write_float_or_die (file, 0, data_out.f, ARRAY_LEN (data_out.f), __LINE__) ; - sf_close (file) ; - - /* Read the file in again. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - test_read_float_or_die (file, 0, data_in.f, ARRAY_LEN (data_in.f), __LINE__) ; - sf_close (file) ; - - puts ("ok") ; - - /* Test seeking. */ - print_test_name ("ogg_seek_test", filename) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - test_read_float_or_die (file, 0, seek_data, ARRAY_LEN (seek_data), __LINE__) ; - compare_float_or_die (seek_data, data_in.f + 10, ARRAY_LEN (seek_data), __LINE__) ; - - sf_close (file) ; - - puts ("ok") ; - - unlink (filename) ; -} /* ogg_float_test */ - -static void -ogg_double_test (void) -{ const char * filename = "vorbis_double.oga" ; - - SNDFILE * file ; - SF_INFO sfinfo ; - double seek_data [10] ; - - print_test_name ("ogg_double_test", filename) ; - - gen_windowed_sine_double (data_out.d, ARRAY_LEN (data_out.d), 0.95) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - /* Set up output file type. */ - sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; - sfinfo.channels = 1 ; - sfinfo.samplerate = SAMPLE_RATE ; - - /* Write the output file. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - test_write_double_or_die (file, 0, data_out.d, ARRAY_LEN (data_out.d), __LINE__) ; - sf_close (file) ; - - /* Read the file in again. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - test_read_double_or_die (file, 0, data_in.d, ARRAY_LEN (data_in.d), __LINE__) ; - sf_close (file) ; - - puts ("ok") ; - - /* Test seeking. */ - print_test_name ("ogg_seek_test", filename) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - test_read_double_or_die (file, 0, seek_data, ARRAY_LEN (seek_data), __LINE__) ; - compare_double_or_die (seek_data, data_in.d + 10, ARRAY_LEN (seek_data), __LINE__) ; - - sf_close (file) ; - - puts ("ok") ; - - unlink (filename) ; -} /* ogg_double_test */ - - -static void -ogg_stereo_seek_test (const char * filename, int format) -{ static float data [SAMPLE_RATE] ; - static float stereo_out [SAMPLE_RATE * 2] ; - - SNDFILE * file ; - SF_INFO sfinfo ; - sf_count_t pos ; - unsigned k ; - - print_test_name (__func__, filename) ; - - gen_windowed_sine_float (data, ARRAY_LEN (data), 0.95) ; - for (k = 0 ; k < ARRAY_LEN (data) ; k++) - { stereo_out [2 * k] = data [k] ; - stereo_out [2 * k + 1] = data [ARRAY_LEN (data) - k - 1] ; - } ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - /* Set up output file type. */ - sfinfo.format = format ; - sfinfo.channels = 2 ; - sfinfo.samplerate = SAMPLE_RATE ; - - /* Write the output file. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - test_write_float_or_die (file, 0, stereo_out, ARRAY_LEN (stereo_out), __LINE__) ; - sf_close (file) ; - - /* Open file in again for reading. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - /* Read in the whole file. */ - test_read_float_or_die (file, 0, stereo_out, ARRAY_LEN (stereo_out), __LINE__) ; - - /* Now hammer seeking code. */ - test_seek_or_die (file, 234, SEEK_SET, 234, sfinfo.channels, __LINE__) ; - test_readf_float_or_die (file, 0, data, 10, __LINE__) ; - compare_float_or_die (data, stereo_out + (234 * sfinfo.channels), 10, __LINE__) ; - - test_seek_or_die (file, 442, SEEK_SET, 442, sfinfo.channels, __LINE__) ; - test_readf_float_or_die (file, 0, data, 10, __LINE__) ; - compare_float_or_die (data, stereo_out + (442 * sfinfo.channels), 10, __LINE__) ; - - test_seek_or_die (file, 12, SEEK_CUR, 442 + 10 + 12, sfinfo.channels, __LINE__) ; - test_readf_float_or_die (file, 0, data, 10, __LINE__) ; - compare_float_or_die (data, stereo_out + ((442 + 10 + 12) * sfinfo.channels), 10, __LINE__) ; - - test_seek_or_die (file, 12, SEEK_CUR, 442 + 20 + 24, sfinfo.channels, __LINE__) ; - test_readf_float_or_die (file, 0, data, 10, __LINE__) ; - compare_float_or_die (data, stereo_out + ((442 + 20 + 24) * sfinfo.channels), 10, __LINE__) ; - - pos = 500 - sfinfo.frames ; - test_seek_or_die (file, pos, SEEK_END, 500, sfinfo.channels, __LINE__) ; - test_readf_float_or_die (file, 0, data, 10, __LINE__) ; - compare_float_or_die (data, stereo_out + (500 * sfinfo.channels), 10, __LINE__) ; - - pos = 10 - sfinfo.frames ; - test_seek_or_die (file, pos, SEEK_END, 10, sfinfo.channels, __LINE__) ; - test_readf_float_or_die (file, 0, data, 10, __LINE__) ; - compare_float_or_die (data, stereo_out + (10 * sfinfo.channels), 10, __LINE__) ; - - sf_close (file) ; - - puts ("ok") ; - unlink (filename) ; -} /* ogg_stereo_seek_test */ - - -int -main (void) -{ - if (HAVE_EXTERNAL_LIBS) - { ogg_short_test () ; - ogg_int_test () ; - ogg_float_test () ; - ogg_double_test () ; - - /*-ogg_stereo_seek_test ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;-*/ - ogg_stereo_seek_test ("vorbis_seek.ogg", SF_FORMAT_OGG | SF_FORMAT_VORBIS) ; - } - else - puts (" No Ogg/Vorbis tests because Ogg/Vorbis support was not compiled in.") ; - - return 0 ; -} /* main */ diff --git a/libs/libsndfile/tests/open_fail_test.c b/libs/libsndfile/tests/open_fail_test.c deleted file mode 100644 index 620f3bad25..0000000000 --- a/libs/libsndfile/tests/open_fail_test.c +++ /dev/null @@ -1,81 +0,0 @@ -/* -** Copyright (C) 2003,2004 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -int -main (void) -{ SNDFILE *sndfile ; - SF_INFO sfinfo ; - - FILE *bad_file ; - const char *bad_wav = "bad_wav.wav" ; - const char bad_data [] = "RIFF WAVEfmt " ; - - print_test_name ("open_fail_test", bad_wav) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - sndfile = sf_open ("let's hope this file doesn't exist", SFM_READ, &sfinfo) ; - - if (sndfile) - { printf ("Line %d: should not have received a valid SNDFILE* pointer.\n", __LINE__) ; - exit (1) ; - } ; - - if ((bad_file = fopen (bad_wav, "w")) == NULL) - { printf ("Line %d: fopen returned NULL.\n", __LINE__) ; - exit (1) ; - } ; - - fwrite (bad_data, sizeof (bad_data), 1, bad_file) ; - fclose (bad_file) ; - - sndfile = sf_open (bad_wav, SFM_READ, &sfinfo) ; - - if (sndfile) - { printf ("Line %d: should not have received a valid SNDFILE* pointer.\n", __LINE__) ; - exit (1) ; - } ; - - unlink (bad_wav) ; - puts ("ok") ; - - return 0 ; -} /* main */ - - -/* -** Do not edit or modify anything in this comment block. -** The arch-tag line is a file identity tag for the GNU Arch -** revision control system. -** -** arch-tag: 24440323-00b1-4e4b-87c5-0e3b7e9605e9 -*/ diff --git a/libs/libsndfile/tests/pcm_test.c b/libs/libsndfile/tests/pcm_test.c deleted file mode 100644 index 86511f65e4..0000000000 --- a/libs/libsndfile/tests/pcm_test.c +++ /dev/null @@ -1,1723 +0,0 @@ -/* -** Copyright (C) 1999-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_SIZE (1<<12) - -static void lrintf_test (void) ; - -static void pcm_test_bits_8 (const char *filename, int filetype, uint64_t hash) ; -static void pcm_test_bits_16 (const char *filename, int filetype, uint64_t hash) ; -static void pcm_test_bits_24 (const char *filename, int filetype, uint64_t hash) ; -static void pcm_test_bits_32 (const char *filename, int filetype, uint64_t hash) ; - -static void pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float) ; -static void pcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float) ; - -typedef union -{ double d [BUFFER_SIZE + 1] ; - float f [BUFFER_SIZE + 1] ; - int i [BUFFER_SIZE + 1] ; - short s [BUFFER_SIZE + 1] ; -} BUFFER ; - -/* Data written to the file. */ -static BUFFER data_out ; - -/* Data read back from the file. */ -static BUFFER data_in ; - -int -main (void) -{ - lrintf_test () ; - - pcm_test_bits_8 ("pcm-s8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_S8, 0x1cda335091249dbfLL) ; - pcm_test_bits_8 ("pcm-u8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_U8, 0x7f748c433d695f3fLL) ; - - pcm_test_bits_16 ("le-pcm16.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0x3a2b956c881ebf08LL) ; - pcm_test_bits_16 ("be-pcm16.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0xd9e2f840c55750f8LL) ; - - pcm_test_bits_24 ("le-pcm24.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0x933b6a759ab496f8LL) ; - pcm_test_bits_24 ("be-pcm24.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xbb1f3eaf9c30b6f8LL) ; - - pcm_test_bits_32 ("le-pcm32.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0xa77aece1c1c17f08LL) ; - pcm_test_bits_32 ("be-pcm32.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0x3099ddf142d0b0f8LL) ; - - /* Lite remove start */ - pcm_test_float ("le-float.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x3c2ad04f7554267aLL, SF_FALSE) ; - pcm_test_float ("be-float.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x074de3e248fa9186LL, SF_FALSE) ; - - pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xc682726f958f669cLL, SF_FALSE) ; - pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xd9a3583f8ee51164LL, SF_FALSE) ; - - pcm_test_float ("le-float.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x3c2ad04f7554267aLL, SF_TRUE) ; - pcm_test_float ("be-float.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x074de3e248fa9186LL, SF_TRUE) ; - - pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xc682726f958f669cLL, SF_TRUE) ; - pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xd9a3583f8ee51164LL, SF_TRUE) ; - /* Lite remove end */ - - return 0 ; -} /* main */ - -/*============================================================================================ -** Here are the test functions. -*/ - -static void -lrintf_test (void) -{ int k, items ; - float *float_data ; - int *int_data ; - - print_test_name ("lrintf_test", "") ; - - items = 1024 ; - - float_data = data_out.f ; - int_data = data_in.i ; - - for (k = 0 ; k < items ; k++) - float_data [k] = (k * ((k % 2) ? 333333.0 : -333333.0)) ; - - for (k = 0 ; k < items ; k++) - int_data [k] = lrintf (float_data [k]) ; - - for (k = 0 ; k < items ; k++) - if (fabs (int_data [k] - float_data [k]) > 1.0) - { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %d).\n", __LINE__, k, float_data [k], int_data [k]) ; - exit (1) ; - } ; - - printf ("ok\n") ; -} /* lrintf_test */ - -static void -pcm_test_bits_8 (const char *filename, int filetype, uint64_t hash) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, items, zero_count ; - short *short_out, *short_in ; - int *int_out, *int_in ; - /* Lite remove start */ - float *float_out, *float_in ; - double *double_out, *double_in ; - /* Lite remove end */ - - print_test_name ("pcm_test_bits_8", filename) ; - - items = 127 ; - - short_out = data_out.s ; - short_in = data_in.s ; - - zero_count = 0 ; - for (k = 0 ; k < items ; k++) - { short_out [k] = ((k * ((k % 2) ? 1 : -1)) << 8) ; - zero_count = short_out [k] ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - test_write_short_or_die (file, 0, short_out, items, __LINE__) ; - - sf_close (file) ; - - memset (short_in, 0, items * sizeof (short)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_short_or_die (file, 0, short_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (short_out [k] != short_in [k]) - { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* Finally, check the file hash. */ - check_file_hash_or_die (filename, hash, __LINE__) ; - - /*-------------------------------------------------------------------------- - ** Test sf_read/write_int () - */ - zero_count = 0 ; - - int_out = data_out.i ; - int_in = data_in.i ; - for (k = 0 ; k < items ; k++) - { int_out [k] = ((k * ((k % 2) ? 1 : -1)) << 24) ; - zero_count = int_out [k] ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - test_write_int_or_die (file, 0, int_out, items, __LINE__) ; - - sf_close (file) ; - - memset (int_in, 0, items * sizeof (int)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_int_or_die (file, 0, int_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (int_out [k] != int_in [k]) - { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* Lite remove start */ - /*-------------------------------------------------------------------------- - ** Test sf_read/write_float () - */ - zero_count = 0 ; - - float_out = data_out.f ; - float_in = data_in.f ; - for (k = 0 ; k < items ; k++) - { float_out [k] = (k * ((k % 2) ? 1 : -1)) ; - zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - test_write_float_or_die (file, 0, float_out, items, __LINE__) ; - - sf_close (file) ; - - memset (float_in, 0, items * sizeof (float)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - test_read_float_or_die (file, 0, float_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (fabs (float_out [k] - float_in [k]) > 1e-10) - { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /*-------------------------------------------------------------------------- - ** Test sf_read/write_double () - */ - zero_count = 0 ; - - double_out = data_out.d ; - double_in = data_in.d ; - for (k = 0 ; k < items ; k++) - { double_out [k] = (k * ((k % 2) ? 1 : -1)) ; - zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - test_write_double_or_die (file, 0, double_out, items, __LINE__) ; - - sf_close (file) ; - - memset (double_in, 0, items * sizeof (double)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - test_read_double_or_die (file, 0, double_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (fabs (double_out [k] - double_in [k]) > 1e-10) - { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - /* Lite remove end */ - unlink (filename) ; - - puts ("ok") ; -} /* pcm_test_bits_8 */ - -static void -pcm_test_bits_16 (const char *filename, int filetype, uint64_t hash) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, items, zero_count ; - short *short_out, *short_in ; - int *int_out, *int_in ; - /* Lite remove start */ - float *float_out, *float_in ; - double *double_out, *double_in ; - /* Lite remove end */ - - print_test_name ("pcm_test_bits_16", filename) ; - - items = 1024 ; - - short_out = data_out.s ; - short_in = data_in.s ; - - zero_count = 0 ; - for (k = 0 ; k < items ; k++) - { short_out [k] = (k * ((k % 2) ? 3 : -3)) ; - zero_count = short_out [k] ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - test_write_short_or_die (file, 0, short_out, items, __LINE__) ; - - sf_close (file) ; - - memset (short_in, 0, items * sizeof (short)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_short_or_die (file, 0, short_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (short_out [k] != short_in [k]) - { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* Finally, check the file hash. */ - check_file_hash_or_die (filename, hash, __LINE__) ; - - /*-------------------------------------------------------------------------- - ** Test sf_read/write_int () - */ - zero_count = 0 ; - - int_out = data_out.i ; - int_in = data_in.i ; - for (k = 0 ; k < items ; k++) - { int_out [k] = ((k * ((k % 2) ? 3 : -3)) << 16) ; - zero_count = int_out [k] ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - test_write_int_or_die (file, 0, int_out, items, __LINE__) ; - - sf_close (file) ; - - memset (int_in, 0, items * sizeof (int)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_int_or_die (file, 0, int_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (int_out [k] != int_in [k]) - { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* Lite remove start */ - /*-------------------------------------------------------------------------- - ** Test sf_read/write_float () - */ - zero_count = 0 ; - - float_out = data_out.f ; - float_in = data_in.f ; - for (k = 0 ; k < items ; k++) - { float_out [k] = (k * ((k % 2) ? 3 : -3)) ; - zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - test_write_float_or_die (file, 0, float_out, items, __LINE__) ; - - sf_close (file) ; - - memset (float_in, 0, items * sizeof (float)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - test_read_float_or_die (file, 0, float_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (fabs (float_out [k] - float_in [k]) > 1e-10) - { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /*-------------------------------------------------------------------------- - ** Test sf_read/write_double () - */ - zero_count = 0 ; - - double_out = data_out.d ; - double_in = data_in.d ; - for (k = 0 ; k < items ; k++) - { double_out [k] = (k * ((k % 2) ? 3 : -3)) ; - zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - test_write_double_or_die (file, 0, double_out, items, __LINE__) ; - - sf_close (file) ; - - memset (double_in, 0, items * sizeof (double)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - test_read_double_or_die (file, 0, double_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (fabs (double_out [k] - double_in [k]) > 1e-10) - { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - /* Lite remove end */ - unlink (filename) ; - - puts ("ok") ; -} /* pcm_test_bits_16 */ - -static void -pcm_test_bits_24 (const char *filename, int filetype, uint64_t hash) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, items, zero_count ; - short *short_out, *short_in ; - int *int_out, *int_in ; - /* Lite remove start */ - float *float_out, *float_in ; - double *double_out, *double_in ; - /* Lite remove end */ - - print_test_name ("pcm_test_bits_24", filename) ; - - items = 1024 ; - - short_out = data_out.s ; - short_in = data_in.s ; - - zero_count = 0 ; - for (k = 0 ; k < items ; k++) - { short_out [k] = (k * ((k % 2) ? 3 : -3)) ; - zero_count = short_out [k] ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - test_write_short_or_die (file, 0, short_out, items, __LINE__) ; - - sf_close (file) ; - - memset (short_in, 0, items * sizeof (short)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_short_or_die (file, 0, short_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (short_out [k] != short_in [k]) - { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* Finally, check the file hash. */ - check_file_hash_or_die (filename, hash, __LINE__) ; - - /*-------------------------------------------------------------------------- - ** Test sf_read/write_int () - */ - zero_count = 0 ; - - int_out = data_out.i ; - int_in = data_in.i ; - for (k = 0 ; k < items ; k++) - { int_out [k] = ((k * ((k % 2) ? 3333 : -3333)) << 8) ; - zero_count = int_out [k] ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - test_write_int_or_die (file, 0, int_out, items, __LINE__) ; - - sf_close (file) ; - - memset (int_in, 0, items * sizeof (int)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_int_or_die (file, 0, int_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (int_out [k] != int_in [k]) - { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* Lite remove start */ - /*-------------------------------------------------------------------------- - ** Test sf_read/write_float () - */ - zero_count = 0 ; - - float_out = data_out.f ; - float_in = data_in.f ; - for (k = 0 ; k < items ; k++) - { float_out [k] = (k * ((k % 2) ? 3333 : -3333)) ; - zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - test_write_float_or_die (file, 0, float_out, items, __LINE__) ; - - sf_close (file) ; - - memset (float_in, 0, items * sizeof (float)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - test_read_float_or_die (file, 0, float_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (fabs (float_out [k] - float_in [k]) > 1e-10) - { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /*-------------------------------------------------------------------------- - ** Test sf_read/write_double () - */ - zero_count = 0 ; - - double_out = data_out.d ; - double_in = data_in.d ; - for (k = 0 ; k < items ; k++) - { double_out [k] = (k * ((k % 2) ? 3333 : -3333)) ; - zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - test_write_double_or_die (file, 0, double_out, items, __LINE__) ; - - sf_close (file) ; - - memset (double_in, 0, items * sizeof (double)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - test_read_double_or_die (file, 0, double_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (fabs (double_out [k] - double_in [k]) > 1e-10) - { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - /* Lite remove end */ - unlink (filename) ; - - puts ("ok") ; -} /* pcm_test_bits_24 */ - -static void -pcm_test_bits_32 (const char *filename, int filetype, uint64_t hash) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, items, zero_count ; - short *short_out, *short_in ; - int *int_out, *int_in ; - /* Lite remove start */ - float *float_out, *float_in ; - double *double_out, *double_in ; - /* Lite remove end */ - - print_test_name ("pcm_test_bits_32", filename) ; - - items = 1024 ; - - short_out = data_out.s ; - short_in = data_in.s ; - - zero_count = 0 ; - for (k = 0 ; k < items ; k++) - { short_out [k] = (k * ((k % 2) ? 3 : -3)) ; - zero_count = short_out [k] ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - test_write_short_or_die (file, 0, short_out, items, __LINE__) ; - - sf_close (file) ; - - memset (short_in, 0, items * sizeof (short)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_short_or_die (file, 0, short_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (short_out [k] != short_in [k]) - { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* Finally, check the file hash. */ - check_file_hash_or_die (filename, hash, __LINE__) ; - - /*-------------------------------------------------------------------------- - ** Test sf_read/write_int () - */ - zero_count = 0 ; - - int_out = data_out.i ; - int_in = data_in.i ; - for (k = 0 ; k < items ; k++) - { int_out [k] = (k * ((k % 2) ? 333333 : -333333)) ; - zero_count = int_out [k] ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - test_write_int_or_die (file, 0, int_out, items, __LINE__) ; - - sf_close (file) ; - - memset (int_in, 0, items * sizeof (int)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_int_or_die (file, 0, int_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (int_out [k] != int_in [k]) - { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* Lite remove start */ - /*-------------------------------------------------------------------------- - ** Test sf_read/write_float () - */ - zero_count = 0 ; - - float_out = data_out.f ; - float_in = data_in.f ; - for (k = 0 ; k < items ; k++) - { float_out [k] = (k * ((k % 2) ? 333333 : -333333)) ; - zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - test_write_float_or_die (file, 0, float_out, items, __LINE__) ; - - sf_close (file) ; - - memset (float_in, 0, items * sizeof (float)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - test_read_float_or_die (file, 0, float_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (fabs (float_out [k] - float_in [k]) > 1e-10) - { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /*-------------------------------------------------------------------------- - ** Test sf_read/write_double () - */ - zero_count = 0 ; - - double_out = data_out.d ; - double_in = data_in.d ; - for (k = 0 ; k < items ; k++) - { double_out [k] = (k * ((k % 2) ? 333333 : -333333)) ; - zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - test_write_double_or_die (file, 0, double_out, items, __LINE__) ; - - sf_close (file) ; - - memset (double_in, 0, items * sizeof (double)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - test_read_double_or_die (file, 0, double_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (fabs (double_out [k] - double_in [k]) > 1e-10) - { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - /* Lite remove end */ - unlink (filename) ; - - puts ("ok") ; -} /* pcm_test_bits_32 */ - - - -/*============================================================================== -*/ - -static void -pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, items, frames ; - int sign ; - double *data, error ; - - print_test_name (replace_float ? "pcm_test_float (replace)" : "pcm_test_float", filename) ; - - items = BUFFER_SIZE ; - - data = data_out.d ; - for (sign = 1, k = 0 ; k < items ; k++) - { data [k] = ((double) (k * sign)) / 100.0 ; - sign = (sign > 0) ? -1 : 1 ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = items ; - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - test_write_double_or_die (file, 0, data, items, __LINE__) ; - - sf_close (file) ; - - check_file_hash_or_die (filename, hash, __LINE__) ; - - memset (data, 0, items * sizeof (double)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - if (sfinfo.format != filetype) - { printf ("\n\nError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nError (%s:%d) Mono : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_double_or_die (file, 0, data, items, __LINE__) ; - - for (sign = -1, k = 0 ; k < items ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - /* Now test Stereo. */ - - if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */ - { printf ("ok\n") ; - return ; - } ; - - items = BUFFER_SIZE ; - - data = data_out.d ; - for (sign = -1, k = 0 ; k < items ; k++) - data [k] = ((double) k) / 100.0 * (sign *= -1) ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = items ; - sfinfo.channels = 2 ; - sfinfo.format = filetype ; - - frames = items / sfinfo.channels ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - test_writef_double_or_die (file, 0, data, frames, __LINE__) ; - - sf_close (file) ; - - check_file_hash_or_die (filename, hash, __LINE__) ; - - memset (data, 0, items * sizeof (double)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - if (sfinfo.format != filetype) - { printf ("\n\nError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != frames) - { printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, frames, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 2) - { printf ("\n\nError (%s:%d) Stereo : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_readf_double_or_die (file, 0, data, frames, __LINE__) ; - for (sign = -1, k = 0 ; k < items ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, data, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, data + 40, 2, __LINE__) ; - for (k = 40 ; k < 44 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - printf ("ok\n") ; - unlink (filename) ; -} /* pcm_test_float */ - -static void -pcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, items, frames ; - int sign ; - double *data, error ; - - /* This is the best test routine. Other should be brought up to this standard. */ - - print_test_name (replace_float ? "pcm_test_double (replace)" : "pcm_test_double", filename) ; - - items = BUFFER_SIZE ; - - data = data_out.d ; - for (sign = 1, k = 0 ; k < items ; k++) - { data [k] = ((double) (k * sign)) / 100.0 ; - sign = (sign > 0) ? -1 : 1 ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = items ; - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - test_write_double_or_die (file, 0, data, items, __LINE__) ; - - sf_close (file) ; - -#if (defined (WIN32) || defined (_WIN32)) - /* File hashing on Win32 fails due to slighty different - ** calculated values of the sin() function. - */ - hash = hash ; /* Avoid compiler warning. */ -#else - check_file_hash_or_die (filename, hash, __LINE__) ; -#endif - - memset (data, 0, items * sizeof (double)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - if (sfinfo.format != filetype) - { printf ("\n\nError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nError (%s:%d) Mono : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_double_or_die (file, 0, data, items, __LINE__) ; - - for (sign = -1, k = 0 ; k < items ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; - - test_seek_or_die (file, 0, SEEK_CUR, 14, sfinfo.channels, __LINE__) ; - - for (k = 10 ; k < 14 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - /* Now test Stereo. */ - - if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */ - { printf ("ok\n") ; - return ; - } ; - - items = BUFFER_SIZE ; - - data = data_out.d ; - for (sign = -1, k = 0 ; k < items ; k++) - data [k] = ((double) k) / 100.0 * (sign *= -1) ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = items ; - sfinfo.channels = 2 ; - sfinfo.format = filetype ; - - frames = items / sfinfo.channels ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - test_writef_double_or_die (file, 0, data, frames, __LINE__) ; - - sf_close (file) ; - -#if (defined (WIN32) || defined (_WIN32)) - /* File hashing on Win32 fails due to slighty different - ** calculated values. - */ - hash = hash ; /* Avoid compiler warning. */ -#else - check_file_hash_or_die (filename, hash, __LINE__) ; -#endif - - memset (data, 0, items * sizeof (double)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - if (sfinfo.format != filetype) - { printf ("\n\nError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != frames) - { printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, frames, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 2) - { printf ("\n\nError (%s:%d) Stereo : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_readf_double_or_die (file, 0, data, frames, __LINE__) ; - - for (sign = -1, k = 0 ; k < items ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, data + 40, 4, __LINE__) ; - for (k = 40 ; k < 44 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames -10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, data + 20, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - printf ("ok\n") ; - unlink (filename) ; -} /* pcm_test_double */ - -/*============================================================================== -*/ diff --git a/libs/libsndfile/tests/pcm_test.def b/libs/libsndfile/tests/pcm_test.def deleted file mode 100644 index b81f05943b..0000000000 --- a/libs/libsndfile/tests/pcm_test.def +++ /dev/null @@ -1,34 +0,0 @@ -autogen definitions pcm_test.tpl; - -data_type = { - name = "bits_8" ; - item_count = 127 ; - short_func = "((k * ((k % 2) ? 1 : -1)) << 8)" ; - int_func = "((k * ((k % 2) ? 1 : -1)) << 24)" ; - float_func = "(k * ((k % 2) ? 1 : -1))" ; - } ; - -data_type = { - name = "bits_16" ; - item_count = 1024 ; - short_func = "(k * ((k % 2) ? 3 : -3))" ; - int_func = "((k * ((k % 2) ? 3 : -3)) << 16)" ; - float_func = "(k * ((k % 2) ? 3 : -3))" ; - } ; - -data_type = { - name = "bits_24" ; - item_count = 1024 ; - short_func = "(k * ((k % 2) ? 3 : -3))" ; - int_func = "((k * ((k % 2) ? 3333 : -3333)) << 8)" ; - float_func = "(k * ((k % 2) ? 3333 : -3333))" ; - } ; - -data_type = { - name = "bits_32" ; - item_count = 1024 ; - short_func = "(k * ((k % 2) ? 3 : -3))" ; - int_func = "(k * ((k % 2) ? 333333 : -333333))" ; - float_func = "(k * ((k % 2) ? 333333 : -333333))" ; - } ; - diff --git a/libs/libsndfile/tests/pcm_test.tpl b/libs/libsndfile/tests/pcm_test.tpl deleted file mode 100644 index 459e741d0a..0000000000 --- a/libs/libsndfile/tests/pcm_test.tpl +++ /dev/null @@ -1,931 +0,0 @@ -[+ AutoGen5 template c +] -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_SIZE (1 << 12) - -static void lrintf_test (void) ; - -[+ FOR data_type -+]static void pcm_test_[+ (get "name") +] (const char *filename, int filetype, uint64_t hash) ; -[+ ENDFOR data_type -+] -static void pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float) ; -static void pcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float) ; - -typedef union -{ double d [BUFFER_SIZE + 1] ; - float f [BUFFER_SIZE + 1] ; - int i [BUFFER_SIZE + 1] ; - short s [BUFFER_SIZE + 1] ; -} BUFFER ; - -/* Data written to the file. */ -static BUFFER data_out ; - -/* Data read back from the file. */ -static BUFFER data_in ; - -int -main (void) -{ - lrintf_test () ; - - pcm_test_bits_8 ("pcm-s8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_S8, 0x1cda335091249dbfLL) ; - pcm_test_bits_8 ("pcm-u8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_U8, 0x7f748c433d695f3fLL) ; - - pcm_test_bits_16 ("le-pcm16.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0x3a2b956c881ebf08LL) ; - pcm_test_bits_16 ("be-pcm16.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0xd9e2f840c55750f8LL) ; - - pcm_test_bits_24 ("le-pcm24.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0x933b6a759ab496f8LL) ; - pcm_test_bits_24 ("be-pcm24.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xbb1f3eaf9c30b6f8LL) ; - - pcm_test_bits_32 ("le-pcm32.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0xa77aece1c1c17f08LL) ; - pcm_test_bits_32 ("be-pcm32.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0x3099ddf142d0b0f8LL) ; - - /* Lite remove start */ - pcm_test_float ("le-float.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x3c2ad04f7554267aLL, SF_FALSE) ; - pcm_test_float ("be-float.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x074de3e248fa9186LL, SF_FALSE) ; - - pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xc682726f958f669cLL, SF_FALSE) ; - pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xd9a3583f8ee51164LL, SF_FALSE) ; - - pcm_test_float ("le-float.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x3c2ad04f7554267aLL, SF_TRUE) ; - pcm_test_float ("be-float.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x074de3e248fa9186LL, SF_TRUE) ; - - pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xc682726f958f669cLL, SF_TRUE) ; - pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xd9a3583f8ee51164LL, SF_TRUE) ; - /* Lite remove end */ - - return 0 ; -} /* main */ - -/*============================================================================================ -** Here are the test functions. -*/ - -static void -lrintf_test (void) -{ int k, items ; - float *float_data ; - int *int_data ; - - print_test_name ("lrintf_test", "") ; - - items = 1024 ; - - float_data = data_out.f ; - int_data = data_in.i ; - - for (k = 0 ; k < items ; k++) - float_data [k] = (k * ((k % 2) ? 333333.0 : -333333.0)) ; - - for (k = 0 ; k < items ; k++) - int_data [k] = lrintf (float_data [k]) ; - - for (k = 0 ; k < items ; k++) - if (fabs (int_data [k] - float_data [k]) > 1.0) - { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %d).\n", __LINE__, k, float_data [k], int_data [k]) ; - exit (1) ; - } ; - - printf ("ok\n") ; -} /* lrintf_test */ - -[+ FOR data_type -+]static void -pcm_test_[+ (get "name") +] (const char *filename, int filetype, uint64_t hash) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, items, zero_count ; - short *short_out, *short_in ; - int *int_out, *int_in ; - /* Lite remove start */ - float *float_out, *float_in ; - double *double_out, *double_in ; - /* Lite remove end */ - - print_test_name ("pcm_test_[+ (get "name") +]", filename) ; - - items = [+ (get "item_count") +] ; - - short_out = data_out.s ; - short_in = data_in.s ; - - zero_count = 0 ; - for (k = 0 ; k < items ; k++) - { short_out [k] = [+ (get "short_func") +] ; - zero_count = short_out [k] ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - test_write_short_or_die (file, 0, short_out, items, __LINE__) ; - - sf_close (file) ; - - memset (short_in, 0, items * sizeof (short)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_short_or_die (file, 0, short_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (short_out [k] != short_in [k]) - { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* Finally, check the file hash. */ - check_file_hash_or_die (filename, hash, __LINE__) ; - - /*-------------------------------------------------------------------------- - ** Test sf_read/write_int () - */ - zero_count = 0 ; - - int_out = data_out.i ; - int_in = data_in.i ; - for (k = 0 ; k < items ; k++) - { int_out [k] = [+ (get "int_func") +] ; - zero_count = int_out [k] ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - test_write_int_or_die (file, 0, int_out, items, __LINE__) ; - - sf_close (file) ; - - memset (int_in, 0, items * sizeof (int)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_int_or_die (file, 0, int_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (int_out [k] != int_in [k]) - { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* Lite remove start */ - /*-------------------------------------------------------------------------- - ** Test sf_read/write_float () - */ - zero_count = 0 ; - - float_out = data_out.f ; - float_in = data_in.f ; - for (k = 0 ; k < items ; k++) - { float_out [k] = [+ (get "float_func") +] ; - zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - test_write_float_or_die (file, 0, float_out, items, __LINE__) ; - - sf_close (file) ; - - memset (float_in, 0, items * sizeof (float)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - - test_read_float_or_die (file, 0, float_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (fabs (float_out [k] - float_in [k]) > 1e-10) - { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - - /*-------------------------------------------------------------------------- - ** Test sf_read/write_double () - */ - zero_count = 0 ; - - double_out = data_out.d ; - double_in = data_in.d ; - for (k = 0 ; k < items ; k++) - { double_out [k] = [+ (get "float_func") +] ; - zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; - } ; - - if (zero_count > items / 4) - { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; - exit (1) ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - test_write_double_or_die (file, 0, double_out, items, __LINE__) ; - - sf_close (file) ; - - memset (double_in, 0, items * sizeof (double)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - - test_read_double_or_die (file, 0, double_in, items, __LINE__) ; - - for (k = 0 ; k < items ; k++) - if (fabs (double_out [k] - double_in [k]) > 1e-10) - { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ; - exit (1) ; - } ; - - sf_close (file) ; - /* Lite remove end */ - unlink (filename) ; - - puts ("ok") ; -} /* pcm_test_[+ (get "name") +] */ - -[+ ENDFOR data_type -+] - -/*============================================================================== -*/ - -static void -pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, items, frames ; - int sign ; - double *data, error ; - - print_test_name (replace_float ? "pcm_test_float (replace)" : "pcm_test_float", filename) ; - - items = BUFFER_SIZE ; - - data = data_out.d ; - for (sign = 1, k = 0 ; k < items ; k++) - { data [k] = ((double) (k * sign)) / 100.0 ; - sign = (sign > 0) ? -1 : 1 ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = items ; - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - test_write_double_or_die (file, 0, data, items, __LINE__) ; - - sf_close (file) ; - - check_file_hash_or_die (filename, hash, __LINE__) ; - - memset (data, 0, items * sizeof (double)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - if (sfinfo.format != filetype) - { printf ("\n\nError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, items, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nError (%s:%d) Mono : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_double_or_die (file, 0, data, items, __LINE__) ; - - for (sign = -1, k = 0 ; k < items ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to end of file. */ - test_seek_or_die (file, 0, SEEK_END, sfinfo.frames, sfinfo.channels, __LINE__) ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - /* Now test Stereo. */ - - if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */ - { printf ("ok\n") ; - return ; - } ; - - items = BUFFER_SIZE ; - - data = data_out.d ; - for (sign = -1, k = 0 ; k < items ; k++) - data [k] = ((double) k) / 100.0 * (sign *= -1) ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = items ; - sfinfo.channels = 2 ; - sfinfo.format = filetype ; - - frames = items / sfinfo.channels ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - test_writef_double_or_die (file, 0, data, frames, __LINE__) ; - - sf_close (file) ; - - check_file_hash_or_die (filename, hash, __LINE__) ; - - memset (data, 0, items * sizeof (double)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - if (sfinfo.format != filetype) - { printf ("\n\nError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != frames) - { printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, frames, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 2) - { printf ("\n\nError (%s:%d) Stereo : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_readf_double_or_die (file, 0, data, frames, __LINE__) ; - for (sign = -1, k = 0 ; k < items ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, data, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, data + 40, 2, __LINE__) ; - for (k = 40 ; k < 44 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - printf ("ok\n") ; - unlink (filename) ; -} /* pcm_test_float */ - -static void -pcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, items, frames ; - int sign ; - double *data, error ; - - /* This is the best test routine. Other should be brought up to this standard. */ - - print_test_name (replace_float ? "pcm_test_double (replace)" : "pcm_test_double", filename) ; - - items = BUFFER_SIZE ; - - data = data_out.d ; - for (sign = 1, k = 0 ; k < items ; k++) - { data [k] = ((double) (k * sign)) / 100.0 ; - sign = (sign > 0) ? -1 : 1 ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = items ; - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - test_write_double_or_die (file, 0, data, items, __LINE__) ; - - sf_close (file) ; - -#if (defined (WIN32) || defined (_WIN32)) - /* File hashing on Win32 fails due to slighty different - ** calculated values of the sin() function. - */ - hash = hash ; /* Avoid compiler warning. */ -#else - check_file_hash_or_die (filename, hash, __LINE__) ; -#endif - - memset (data, 0, items * sizeof (double)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - if (sfinfo.format != filetype) - { printf ("\n\nError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != items) - { printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, items, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nError (%s:%d) Mono : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_double_or_die (file, 0, data, items, __LINE__) ; - - for (sign = -1, k = 0 ; k < items ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; - - test_seek_or_die (file, 0, SEEK_CUR, 14, sfinfo.channels, __LINE__) ; - - for (k = 10 ; k < 14 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - /* Now test Stereo. */ - - if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */ - { printf ("ok\n") ; - return ; - } ; - - items = BUFFER_SIZE ; - - data = data_out.d ; - for (sign = -1, k = 0 ; k < items ; k++) - data [k] = ((double) k) / 100.0 * (sign *= -1) ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = items ; - sfinfo.channels = 2 ; - sfinfo.format = filetype ; - - frames = items / sfinfo.channels ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - test_writef_double_or_die (file, 0, data, frames, __LINE__) ; - - sf_close (file) ; - -#if (defined (WIN32) || defined (_WIN32)) - /* File hashing on Win32 fails due to slighty different - ** calculated values. - */ - hash = hash ; /* Avoid compiler warning. */ -#else - check_file_hash_or_die (filename, hash, __LINE__) ; -#endif - - memset (data, 0, items * sizeof (double)) ; - - if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; - if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) - { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - if (sfinfo.format != filetype) - { printf ("\n\nError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != frames) - { printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, frames, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 2) - { printf ("\n\nError (%s:%d) Stereo : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_readf_double_or_die (file, 0, data, frames, __LINE__) ; - - for (sign = -1, k = 0 ; k < items ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, data + 40, 4, __LINE__) ; - for (k = 40 ; k < 44 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames -10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, data + 20, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; - if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) - { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; - exit (1) ; - } ; - } ; - - sf_close (file) ; - - printf ("ok\n") ; - unlink (filename) ; -} /* pcm_test_double */ - -/*============================================================================== -*/ diff --git a/libs/libsndfile/tests/peak_chunk_test.c b/libs/libsndfile/tests/peak_chunk_test.c deleted file mode 100644 index 9e5332a1e4..0000000000 --- a/libs/libsndfile/tests/peak_chunk_test.c +++ /dev/null @@ -1,362 +0,0 @@ -/* -** Copyright (C) 2001-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_LEN (1 << 15) -#define LOG_BUFFER_SIZE 1024 - - -static void test_float_peak (const char *filename, int filetype) ; -static void read_write_peak_test (const char *filename, int filetype) ; - -static void check_logged_peaks (char *buffer) ; - -/* Force the start of this buffer to be double aligned. Sparc-solaris will -** choke if its not. -*/ -static double data [BUFFER_LEN] ; -static char log_buffer [LOG_BUFFER_SIZE] ; - -int -main (int argc, char *argv []) -{ int do_all = 0 ; - int test_count = 0 ; - - if (argc != 2) - { printf ("Usage : %s \n", argv [0]) ; - printf (" Where is one of the following:\n") ; - printf (" aiff - test AIFF file PEAK chunk\n") ; - printf (" caf - test CAF file PEAK chunk\n") ; - printf (" wav - test WAV file peak chunk\n") ; - printf (" all - perform all tests\n") ; - exit (1) ; - } ; - - do_all = ! strcmp (argv [1], "all") ; - - if (do_all || ! strcmp (argv [1], "wav")) - { test_float_peak ("peak_float.wav", SF_FORMAT_WAV | SF_FORMAT_FLOAT) ; - test_float_peak ("peak_float.wavex", SF_FORMAT_WAVEX | SF_FORMAT_FLOAT) ; - test_float_peak ("peak_float.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_FLOAT) ; - - read_write_peak_test ("rw_peak.wav", SF_FORMAT_WAV | SF_FORMAT_FLOAT) ; - read_write_peak_test ("rw_peak.wavex", SF_FORMAT_WAVEX | SF_FORMAT_FLOAT) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "aiff")) - { test_float_peak ("peak_float.aiff", SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ; - - read_write_peak_test ("rw_peak.aiff", SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "caf")) - { test_float_peak ("peak_float.caf", SF_FORMAT_CAF | SF_FORMAT_FLOAT) ; - - read_write_peak_test ("rw_peak.caf", SF_FORMAT_CAF | SF_FORMAT_FLOAT) ; - test_count++ ; - } ; - - if (test_count == 0) - { printf ("Mono : ************************************\n") ; - printf ("Mono : * No '%s' test defined.\n", argv [1]) ; - printf ("Mono : ************************************\n") ; - return 1 ; - } ; - - return 0 ; -} /* main */ - -/*============================================================================================ -** Here are the test functions. -*/ - -static void -test_float_peak (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, frames, count ; - - print_test_name ("test_float_peak", filename) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.format = filetype ; - sfinfo.channels = 4 ; - sfinfo.frames = 0 ; - - frames = BUFFER_LEN / sfinfo.channels ; - - /* Create some random data with a peak value of 0.66. */ - for (k = 0 ; k < BUFFER_LEN ; k++) - data [k] = (rand () % 2000) / 3000.0 ; - - /* Insert some larger peaks a know locations. */ - data [4 * (frames / 8) + 0] = (frames / 8) * 0.01 ; /* First channel */ - data [4 * (frames / 6) + 1] = (frames / 6) * 0.01 ; /* Second channel */ - data [4 * (frames / 4) + 2] = (frames / 4) * 0.01 ; /* Third channel */ - data [4 * (frames / 2) + 3] = (frames / 2) * 0.01 ; /* Fourth channel */ - - /* Write a file with PEAK chunks. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, 0, __LINE__) ; - - /* Try to confuse the header writer by adding a removing the PEAK chunk. */ - sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ; - sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; - sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ; - - /* Write the data in four passed. The data is designed so that peaks will - ** be written in the different calls to sf_write_double (). - */ - for (count = 0 ; count < 4 ; count ++) - test_write_double_or_die (file, 0, data + count * BUFFER_LEN / 4, BUFFER_LEN / 4, BUFFER_LEN / 4) ; - - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, 0, __LINE__) ; - - if (sfinfo.format != filetype) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != frames) - { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, frames, (long) sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 4) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - /* Check these two commands. */ - if (sf_command (file, SFC_GET_SIGNAL_MAX, data, sizeof (double)) == SF_FALSE) - { printf ("\n\nLine %d: Command should have returned SF_TRUE.\n", __LINE__) ; - exit (1) ; - } ; - - if (fabs (data [0] - (frames / 2) * 0.01) > 0.01) - { printf ("\n\nLine %d: Bad peak value (%f should be %f) for command SFC_GET_SIGNAL_MAX.\n", __LINE__, data [0], (frames / 2) * 0.01) ; - exit (1) ; - } ; - - if (sf_command (file, SFC_GET_MAX_ALL_CHANNELS, data, sizeof (double) * sfinfo.channels) == SF_FALSE) - { printf ("\n\nLine %d: Command should have returned SF_TRUE.\n", __LINE__) ; - exit (1) ; - } ; - - if (fabs (data [3] - (frames / 2) * 0.01) > 0.01) - { printf ("\n\nLine %d: Bad peak value (%f should be %f) for command SFC_GET_MAX_ALL_CHANNELS.\n", __LINE__, data [0], (frames / 2) * 0.01) ; - exit (1) ; - } ; - - /* Get the log buffer data. */ - log_buffer [0] = 0 ; - sf_command (file, SFC_GET_LOG_INFO, log_buffer, LOG_BUFFER_SIZE) ; - - if (strlen (log_buffer) == 0) - { printf ("\n\nLine %d: Empty log buffer,\n", __LINE__) ; - exit (1) ; - } ; - - check_logged_peaks (log_buffer) ; - - sf_close (file) ; - - /* Write a file ***without*** PEAK chunks. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, 0, __LINE__) ; - - /* Try to confuse the header writer by adding a removing the PEAK chunk. */ - sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; - sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ; - sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; - - /* Write the data in four passed. The data is designed so that peaks will - ** be written in the different calls to sf_write_double (). - */ - for (count = 0 ; count < 4 ; count ++) - test_write_double_or_die (file, 0, data + count * BUFFER_LEN / 4, BUFFER_LEN / 4, BUFFER_LEN / 4) ; - - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, 0, __LINE__) ; - - /* Check these two commands. */ - if (sf_command (file, SFC_GET_SIGNAL_MAX, data, sizeof (double))) - { printf ("\n\nLine %d: Command should have returned SF_FALSE.\n", __LINE__) ; - exit (1) ; - } ; - - if (sf_command (file, SFC_GET_MAX_ALL_CHANNELS, data, sizeof (double) * sfinfo.channels)) - { printf ("\n\nLine %d: Command should have returned SF_FALSE.\n", __LINE__) ; - exit (1) ; - } ; - - /* Get the log buffer data. */ - log_buffer [0] = 0 ; - sf_command (file, SFC_GET_LOG_INFO, log_buffer, LOG_BUFFER_SIZE) ; - - if (strlen (log_buffer) == 0) - { printf ("\n\nLine %d: Empty log buffer,\n", __LINE__) ; - exit (1) ; - } ; - - if (strstr (log_buffer, "PEAK :") != NULL) - { printf ("\n\nLine %d: Should not have a PEAK chunk in this file.\n\n", __LINE__) ; - puts (log_buffer) ; - exit (1) ; - } ; - - sf_close (file) ; - - unlink (filename) ; - printf ("ok\n") ; -} /* test_float_peak */ - -static void -check_logged_peaks (char *buffer) -{ char *cptr ; - int k, chan, channel_count, position ; - float value ; - - if (strstr (buffer, "should") || strstr (buffer, "*")) - { printf ("\n\nLine %d: Something wrong in buffer. Dumping.\n", __LINE__) ; - puts (buffer) ; - exit (1) ; - } ; - - channel_count = 0 ; - cptr = strstr (buffer, "Channels") ; - if (cptr && sscanf (cptr, "Channels : %d", &k) == 1) - channel_count = k ; - else if (cptr && sscanf (cptr, "Channels / frame : %d", &k) == 1) - channel_count = k ; - else - { printf ("\n\nLine %d: Couldn't find channel count.\n", __LINE__) ; - exit (1) ; - } ; - - if (channel_count != 4) - { printf ("\n\nLine %d: Wrong channel count (4 ->%d).\n", __LINE__, channel_count) ; - exit (1) ; - } ; - - if (! (cptr = strstr (buffer, "Ch Position Value"))) - { printf ("\n\nLine %d: Can't find PEAK data.\n", __LINE__) ; - exit (1) ; - } ; - - for (k = 0 ; k < channel_count ; k++) - { if (! (cptr = strchr (cptr, '\n'))) - { printf ("\n\nLine %d: Got lost.\n", __LINE__) ; - exit (1) ; - } ; - if (sscanf (cptr, "%d %d %f", &chan, &position, &value) != 3) - { printf ("\n\nLine %d: sscanf failed.\n", __LINE__) ; - exit (1) ; - } ; - if (position == 0) - { printf ("\n\nLine %d: peak position for channel %d should not be at offset 0.\n", __LINE__, chan) ; - printf ("%s", buffer) ; - exit (1) ; - } ; - if (chan != k || fabs ((position) * 0.01 - value) > 1e-6) - { printf ("\n\nLine %d: Error : peak value incorrect!\n", __LINE__) ; - printf ("%s", buffer) ; - printf ("\n\nLine %d: %d %f %f\n", __LINE__, chan, position * 0.01, value) ; - exit (1) ; - } ; - cptr ++ ; /* Move past current newline. */ - } ; - -} /* check_logged_peaks */ - -static void -read_write_peak_test (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - - double small_data [10], max_peak = 0.0 ; - unsigned k ; - - print_test_name (__func__, filename) ; - - for (k = 0 ; k < ARRAY_LEN (small_data) ; k ++) - small_data [k] = 0.1 ; - - sfinfo.samplerate = 44100 ; - sfinfo.channels = 2 ; - sfinfo.format = filetype ; - sfinfo.frames = 0 ; - - /* Open the file, add peak chunk and write samples with value 0.1. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - - sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ; - - test_write_double_or_die (file, 0, small_data, ARRAY_LEN (small_data), __LINE__) ; - - sf_close (file) ; - - /* Open the fiel RDWR, write sample valied 1.25. */ - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ; - - for (k = 0 ; k < ARRAY_LEN (small_data) ; k ++) - small_data [k] = 1.0 ; - - test_write_double_or_die (file, 0, small_data, ARRAY_LEN (small_data), __LINE__) ; - - sf_command (file, SFC_GET_SIGNAL_MAX, &max_peak, sizeof (max_peak)) ; - - sf_close (file) ; - - exit_if_true (max_peak < 0.1, "\n\nLine %d : max peak (%5.3f) should not be 0.1.\n\n", __LINE__, max_peak) ; - - /* Open the file and test the values written to the PEAK chunk. */ - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - exit_if_true (sfinfo.channels * sfinfo.frames != 2 * ARRAY_LEN (small_data), - "Line %d : frame count is %" PRId64 ", should be %zd\n", __LINE__, sfinfo.frames, 2 * ARRAY_LEN (small_data)) ; - - sf_command (file, SFC_GET_SIGNAL_MAX, &max_peak, sizeof (double)) ; - - sf_close (file) ; - - exit_if_true (max_peak < 1.0, "\n\nLine %d : max peak (%5.3f) should be 1.0.\n\n", __LINE__, max_peak) ; - - unlink (filename) ; - puts ("ok") ; -} /* read_write_peak_test */ - diff --git a/libs/libsndfile/tests/pedantic-header-test.sh.in b/libs/libsndfile/tests/pedantic-header-test.sh.in deleted file mode 100644 index 8b1962803a..0000000000 --- a/libs/libsndfile/tests/pedantic-header-test.sh.in +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash - -# Copyright (C) 2010-2011 Erik de Castro Lopo -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# * Neither the author nor the names of any contributors may be used -# to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -if test ! -f @top_srcdir@/tests/sfversion.c ; then - exit 0 - fi - -echo -n " Pedantic header test : " - -# Only do this if the compiler is GCC. -if test -n "@GCC_MAJOR_VERSION@" ; then - - CC=`echo "@CC@" | sed "s/.*shave cc //"` - # Compile with -Werror and -pedantic. - $CC -std=c99 -Werror -pedantic -I@top_builddir@/src -c @top_srcdir@/tests/sfversion.c -o /dev/null - - # Check compiler return status. - if test $? -ne 0 ; then - echo - exit 1 - fi - - echo "ok" -else - echo "n/a" - fi - -exit 0 diff --git a/libs/libsndfile/tests/pipe_test.c b/libs/libsndfile/tests/pipe_test.c deleted file mode 100644 index 10fa5725c9..0000000000 --- a/libs/libsndfile/tests/pipe_test.c +++ /dev/null @@ -1,525 +0,0 @@ -/* -** Copyright (C) 2001-2011 Erik de Castro Lopo -** -** 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. -*/ - -/*========================================================================== -** This is a test program which tests reading from and writing to pipes. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#if (OS_IS_WIN32 || HAVE_PIPE == 0 || HAVE_WAITPID == 0) - -int -main (void) -{ - puts (" pipe_test : this test doesn't work on this OS.") ; - return 0 ; -} /* main */ - -#else - -#if HAVE_UNISTD_H -#include -#endif - -#include -#include -#include -#include - -#include - -#include "utils.h" - -typedef struct -{ int format ; - const char *ext ; -} FILETYPE ; - -static int file_exists (const char *filename) ; -static void useek_pipe_rw_test (int filetype, const char *ext) ; -static void pipe_read_test (int filetype, const char *ext) ; -static void pipe_write_test (const char *ext) ; -static void pipe_test_others (FILETYPE*, FILETYPE*) ; - -static FILETYPE read_write_types [] = -{ { SF_FORMAT_RAW , "raw" }, - { SF_FORMAT_AU , "au" }, - /* Lite remove start */ - { SF_FORMAT_PAF , "paf" }, - { SF_FORMAT_IRCAM , "ircam" }, - { SF_FORMAT_PVF , "pvf" }, - /* Lite remove end */ - { 0 , NULL } -} ; - -static FILETYPE read_only_types [] = -{ { SF_FORMAT_RAW , "raw" }, - { SF_FORMAT_AU , "au" }, - { SF_FORMAT_AIFF , "aiff" }, - { SF_FORMAT_WAV , "wav" }, - { SF_FORMAT_W64 , "w64" }, - /* Lite remove start */ - { SF_FORMAT_PAF , "paf" }, - { SF_FORMAT_NIST , "nist" }, - { SF_FORMAT_IRCAM , "ircam" }, - { SF_FORMAT_MAT4 , "mat4" }, - { SF_FORMAT_MAT5 , "mat5" }, - { SF_FORMAT_SVX , "svx" }, - { SF_FORMAT_PVF , "pvf" }, - /* Lite remove end */ - { 0 , NULL } -} ; - -int -main (void) -{ int k ; - - if (file_exists ("libsndfile.spec.in")) - exit_if_true (chdir ("tests") != 0, "\n Error : chdir ('tests') failed.\n") ; - - for (k = 0 ; read_only_types [k].format ; k++) - pipe_read_test (read_only_types [k].format, read_only_types [k].ext) ; - - for (k = 0 ; read_write_types [k].format ; k++) - pipe_write_test (read_write_types [k].ext) ; - - for (k = 0 ; read_write_types [k].format ; k++) - useek_pipe_rw_test (read_write_types [k].format, read_write_types [k].ext) ; - - if (0) - pipe_test_others (read_write_types, read_only_types) ; - - return 0 ; -} /* main */ - -/*============================================================================== -*/ - -static void -pipe_read_test (int filetype, const char *ext) -{ static short data [PIPE_TEST_LEN] ; - static char buffer [256] ; - static char filename [256] ; - - SNDFILE *outfile ; - SF_INFO sfinfo ; - int k, retval ; - - snprintf (filename, sizeof (filename), "pipe_in.%s", ext) ; - print_test_name ("pipe_read_test", filename) ; - - sfinfo.format = filetype | SF_FORMAT_PCM_16 ; - sfinfo.channels = 1 ; - sfinfo.samplerate = 44100 ; - - for (k = 0 ; k < PIPE_TEST_LEN ; k++) - data [k] = PIPE_INDEX (k) ; - - outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_writef_short_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; - sf_close (outfile) ; - - snprintf (buffer, sizeof (buffer), "cat %s | ./stdin_test %s ", filename, ext) ; - if ((retval = system (buffer)) != 0) - { retval = WEXITSTATUS (retval) ; - printf ("\n\n Line %d : pipe test returned error for file type \"%s\".\n\n", __LINE__, ext) ; - exit (retval) ; - } ; - - unlink (filename) ; - puts ("ok") ; - - return ; -} /* pipe_read_test */ - -static void -pipe_write_test (const char *ext) -{ static char buffer [256] ; - - int retval ; - - print_test_name ("pipe_write_test", ext) ; - - snprintf (buffer, sizeof (buffer), "./stdout_test %s | ./stdin_test %s ", ext, ext) ; - if ((retval = system (buffer))) - { retval = WEXITSTATUS (retval) ; - printf ("\n\n Line %d : pipe test returned error file type \"%s\".\n\n", __LINE__, ext) ; - exit (retval) ; - } ; - - puts ("ok") ; - - return ; -} /* pipe_write_test */ - -/*============================================================================== -*/ - - -static void -useek_pipe_rw_short (const char * ext, SF_INFO * psfinfo_write, SF_INFO * psfinfo_read) -{ static short buffer [PIPE_TEST_LEN] ; - static short data [PIPE_TEST_LEN] ; - SNDFILE *outfile ; - SNDFILE *infile_piped ; - - int k, status = 0 ; - int pipefd [2] ; - pid_t pida ; - - for (k = 0 ; k < PIPE_TEST_LEN ; k++) - data [k] = PIPE_INDEX (k) ; - - /* - ** Create the pipe. - */ - exit_if_true (pipe (pipefd) != 0, "\n\n%s %d : pipe failed : %s\n", __func__, __LINE__, strerror (errno)) ; - - /* - ** Attach the write end of the pipe to be written to. - */ - if ((outfile = sf_open_fd (pipefd [1], SFM_WRITE, psfinfo_write, SF_TRUE)) == NULL) - { printf ("\n\n%s %d : unable to create unseekable pipe for write type \"%s\".\n", __func__, __LINE__, ext) ; - printf ("\t%s\n\n", sf_strerror (outfile)) ; - exit (1) ; - } ; - - if (sf_error (outfile) != SF_ERR_NO_ERROR) - { printf ("\n\n%s %d : unable to open unseekable pipe for write type \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - /* - ** Attach the read end of the pipe to be read from. - */ - if ((infile_piped = sf_open_fd (pipefd [0], SFM_READ, psfinfo_read, SF_TRUE)) == NULL) - { printf ("\n\n%s %d : unable to create unseekable pipe for read type. \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - if (sf_error (infile_piped) != SF_ERR_NO_ERROR) - { printf ("\n\n%s %d : unable to open unseekable pipe for read type \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - /* Fork a child process that will write directly into the pipe. */ - if ((pida = fork ()) == 0) /* child process */ - { test_writef_short_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; - exit (0) ; - } ; - - /* In the parent process, read from the pipe and compare what is read - ** to what is written, if they match everything went as planned. - */ - test_readf_short_or_die (infile_piped, 0, buffer, PIPE_TEST_LEN, __LINE__) ; - if (memcmp (buffer, data, sizeof (buffer)) != 0) - { printf ("\n\n%s %d : unseekable pipe test failed for file type \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - /* Wait for the child process to return. */ - waitpid (pida, &status, 0) ; - status = WEXITSTATUS (status) ; - sf_close (outfile) ; - sf_close (infile_piped) ; - - if (status != 0) - { printf ("\n\n%s %d : status of child process is %d for file type %s.\n\n", __func__, __LINE__, status, ext) ; - exit (1) ; - } ; - - return ; -} /* useek_pipe_rw_short */ - - -static void -useek_pipe_rw_float (const char * ext, SF_INFO * psfinfo_write, SF_INFO * psfinfo_read) -{ static float buffer [PIPE_TEST_LEN] ; - static float data [PIPE_TEST_LEN] ; - SNDFILE *outfile ; - SNDFILE *infile_piped ; - - int k, status = 0 ; - int pipefd [2] ; - pid_t pida ; - - for (k = 0 ; k < PIPE_TEST_LEN ; k++) - data [k] = PIPE_INDEX (k) ; - - /* - ** Create the pipe. - */ - exit_if_true (pipe (pipefd) != 0, "\n\n%s %d : pipe failed : %s\n", __func__, __LINE__, strerror (errno)) ; - - /* - ** Attach the write end of the pipe to be written to. - */ - if ((outfile = sf_open_fd (pipefd [1], SFM_WRITE, psfinfo_write, SF_TRUE)) == NULL) - { printf ("\n\n%s %d : unable to create unseekable pipe for write type \"%s\".\n", __func__, __LINE__, ext) ; - printf ("\t%s\n\n", sf_strerror (outfile)) ; - exit (1) ; - } ; - - if (sf_error (outfile) != SF_ERR_NO_ERROR) - { printf ("\n\n%s %d : unable to open unseekable pipe for write type \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - /* - ** Attach the read end of the pipe to be read from. - */ - if ((infile_piped = sf_open_fd (pipefd [0], SFM_READ, psfinfo_read, SF_TRUE)) == NULL) - { printf ("\n\n%s %d : unable to create unseekable pipe for read type. \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - if (sf_error (infile_piped) != SF_ERR_NO_ERROR) - { printf ("\n\n%s %d : unable to open unseekable pipe for read type \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - /* Fork a child process that will write directly into the pipe. */ - if ((pida = fork ()) == 0) /* child process */ - { test_writef_float_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; - exit (0) ; - } ; - - /* In the parent process, read from the pipe and compare what is read - ** to what is written, if they match everything went as planned. - */ - test_readf_float_or_die (infile_piped, 0, buffer, PIPE_TEST_LEN, __LINE__) ; - if (memcmp (buffer, data, sizeof (buffer)) != 0) - { printf ("\n\n%s %d : unseekable pipe test failed for file type \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - /* Wait for the child process to return. */ - waitpid (pida, &status, 0) ; - status = WEXITSTATUS (status) ; - sf_close (outfile) ; - sf_close (infile_piped) ; - - if (status != 0) - { printf ("\n\n%s %d : status of child process is %d for file type %s.\n\n", __func__, __LINE__, status, ext) ; - exit (1) ; - } ; - - return ; -} /* useek_pipe_rw_float */ - - -static void -useek_pipe_rw_double (const char * ext, SF_INFO * psfinfo_write, SF_INFO * psfinfo_read) -{ static double buffer [PIPE_TEST_LEN] ; - static double data [PIPE_TEST_LEN] ; - SNDFILE *outfile ; - SNDFILE *infile_piped ; - - int k, status = 0 ; - int pipefd [2] ; - pid_t pida ; - - for (k = 0 ; k < PIPE_TEST_LEN ; k++) - data [k] = PIPE_INDEX (k) ; - - /* - ** Create the pipe. - */ - exit_if_true (pipe (pipefd) != 0, "\n\n%s %d : pipe failed : %s\n", __func__, __LINE__, strerror (errno)) ; - - /* - ** Attach the write end of the pipe to be written to. - */ - if ((outfile = sf_open_fd (pipefd [1], SFM_WRITE, psfinfo_write, SF_TRUE)) == NULL) - { printf ("\n\n%s %d : unable to create unseekable pipe for write type \"%s\".\n", __func__, __LINE__, ext) ; - printf ("\t%s\n\n", sf_strerror (outfile)) ; - exit (1) ; - } ; - - if (sf_error (outfile) != SF_ERR_NO_ERROR) - { printf ("\n\n%s %d : unable to open unseekable pipe for write type \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - /* - ** Attach the read end of the pipe to be read from. - */ - if ((infile_piped = sf_open_fd (pipefd [0], SFM_READ, psfinfo_read, SF_TRUE)) == NULL) - { printf ("\n\n%s %d : unable to create unseekable pipe for read type. \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - if (sf_error (infile_piped) != SF_ERR_NO_ERROR) - { printf ("\n\n%s %d : unable to open unseekable pipe for read type \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - /* Fork a child process that will write directly into the pipe. */ - if ((pida = fork ()) == 0) /* child process */ - { test_writef_double_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; - exit (0) ; - } ; - - /* In the parent process, read from the pipe and compare what is read - ** to what is written, if they match everything went as planned. - */ - test_readf_double_or_die (infile_piped, 0, buffer, PIPE_TEST_LEN, __LINE__) ; - if (memcmp (buffer, data, sizeof (buffer)) != 0) - { printf ("\n\n%s %d : unseekable pipe test failed for file type \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - /* Wait for the child process to return. */ - waitpid (pida, &status, 0) ; - status = WEXITSTATUS (status) ; - sf_close (outfile) ; - sf_close (infile_piped) ; - - if (status != 0) - { printf ("\n\n%s %d : status of child process is %d for file type %s.\n\n", __func__, __LINE__, status, ext) ; - exit (1) ; - } ; - - return ; -} /* useek_pipe_rw_double */ - - - - -static void -useek_pipe_rw_test (int filetype, const char *ext) -{ SF_INFO sfinfo_write ; - SF_INFO sfinfo_read ; - - print_test_name ("useek_pipe_rw_test", ext) ; - - /* - ** Setup the INFO structures for the filetype we will be - ** working with. - */ - sfinfo_write.format = filetype | SF_FORMAT_PCM_16 ; - sfinfo_write.channels = 1 ; - sfinfo_write.samplerate = 44100 ; - - - sfinfo_read.format = 0 ; - if (filetype == SF_FORMAT_RAW) - { sfinfo_read.format = filetype | SF_FORMAT_PCM_16 ; - sfinfo_read.channels = 1 ; - sfinfo_read.samplerate = 44100 ; - } ; - - useek_pipe_rw_short (ext, &sfinfo_write, &sfinfo_read) ; - - sfinfo_read.format = sfinfo_write.format = filetype | SF_FORMAT_FLOAT ; - if (sf_format_check (&sfinfo_read) != 0) - useek_pipe_rw_float (ext, &sfinfo_write, &sfinfo_read) ; - - sfinfo_read.format = sfinfo_write.format = filetype | SF_FORMAT_DOUBLE ; - if (sf_format_check (&sfinfo_read) != 0) - useek_pipe_rw_double (ext, &sfinfo_write, &sfinfo_read) ; - - puts ("ok") ; - return ; -} /* useek_pipe_rw_test */ - - - -static void -pipe_test_others (FILETYPE* list1, FILETYPE* list2) -{ SF_FORMAT_INFO info ; - int k, m, major_count, in_list ; - - print_test_name ("pipe_test_others", "") ; - - sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &major_count, sizeof (int)) ; - - for (k = 0 ; k < major_count ; k++) - { info.format = k ; - - sf_command (NULL, SFC_GET_FORMAT_MAJOR, &info, sizeof (info)) ; - - in_list = SF_FALSE ; - for (m = 0 ; list1 [m].format ; m++) - if (info.format == list1 [m].format) - in_list = SF_TRUE ; - - for (m = 0 ; list2 [m].format ; m++) - if (info.format == list2 [m].format) - in_list = SF_TRUE ; - - if (in_list) - continue ; - - printf ("%s %x\n", info.name, info.format) ; - - if (1) - { static short data [PIPE_TEST_LEN] ; - static char buffer [256] ; - static const char *filename = "pipe_in.dat" ; - - SNDFILE *outfile ; - SF_INFO sfinfo ; - int retval ; - - sfinfo.format = info.format | SF_FORMAT_PCM_16 ; - sfinfo.channels = 1 ; - sfinfo.samplerate = 44100 ; - - outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_writef_short_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; - sf_close (outfile) ; - - snprintf (buffer, sizeof (buffer), "cat %s | ./stdin_test %s %d ", filename, info.extension, PIPE_TEST_LEN) ; - if ((retval = system (buffer)) == 0) - { retval = WEXITSTATUS (retval) ; - printf ("\n\n Line %d : pipe test should have returned error file type \"%s\" but didn't.\n\n", __LINE__, info.name) ; - exit (1) ; - } ; - - unlink (filename) ; - } ; - } ; - - - puts ("ok") ; - - return ; -} /* pipe_test_others */ - - -/*============================================================================== -*/ - -static int -file_exists (const char *filename) -{ struct stat buf ; - - if (stat (filename, &buf)) - return 0 ; - - return 1 ; -} /* file_exists */ - -#endif - diff --git a/libs/libsndfile/tests/pipe_test.def b/libs/libsndfile/tests/pipe_test.def deleted file mode 100644 index 6469cca1ec..0000000000 --- a/libs/libsndfile/tests/pipe_test.def +++ /dev/null @@ -1,14 +0,0 @@ -autogen definitions pipe_test.tpl; - -data_type = { - type_name = short ; - }; - -data_type = { - type_name = float ; - }; - -data_type = { - type_name = double ; - }; - diff --git a/libs/libsndfile/tests/pipe_test.tpl b/libs/libsndfile/tests/pipe_test.tpl deleted file mode 100644 index 1bc1f4367e..0000000000 --- a/libs/libsndfile/tests/pipe_test.tpl +++ /dev/null @@ -1,374 +0,0 @@ -[+ AutoGen5 template c +] -/* -** Copyright (C) 2001-2012 Erik de Castro Lopo -** -** 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. -*/ - -/*========================================================================== -** This is a test program which tests reading from and writing to pipes. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#if (OS_IS_WIN32 || defined __OS2__ || HAVE_PIPE == 0 || HAVE_WAITPID == 0) - -int -main (void) -{ - puts (" pipe_test : this test doesn't work on this OS.") ; - return 0 ; -} /* main */ - -#else - -#if HAVE_UNISTD_H -#include -#endif - -#include -#include -#include -#include - -#include - -#include "utils.h" - -typedef struct -{ int format ; - const char *ext ; -} FILETYPE ; - -static int file_exists (const char *filename) ; -static void useek_pipe_rw_test (int filetype, const char *ext) ; -static void pipe_read_test (int filetype, const char *ext) ; -static void pipe_write_test (const char *ext) ; -static void pipe_test_others (FILETYPE*, FILETYPE*) ; - -static FILETYPE read_write_types [] = -{ { SF_FORMAT_RAW , "raw" }, - { SF_FORMAT_AU , "au" }, - /* Lite remove start */ - { SF_FORMAT_PAF , "paf" }, - { SF_FORMAT_IRCAM , "ircam" }, - { SF_FORMAT_PVF , "pvf" }, - /* Lite remove end */ - { 0 , NULL } -} ; - -static FILETYPE read_only_types [] = -{ { SF_FORMAT_RAW , "raw" }, - { SF_FORMAT_AU , "au" }, - { SF_FORMAT_AIFF , "aiff" }, - { SF_FORMAT_WAV , "wav" }, - { SF_FORMAT_W64 , "w64" }, - /* Lite remove start */ - { SF_FORMAT_PAF , "paf" }, - { SF_FORMAT_NIST , "nist" }, - { SF_FORMAT_IRCAM , "ircam" }, - { SF_FORMAT_MAT4 , "mat4" }, - { SF_FORMAT_MAT5 , "mat5" }, - { SF_FORMAT_SVX , "svx" }, - { SF_FORMAT_PVF , "pvf" }, - /* Lite remove end */ - { 0 , NULL } -} ; - -int -main (void) -{ int k ; - - if (file_exists ("libsndfile.spec.in")) - exit_if_true (chdir ("tests") != 0, "\n Error : chdir ('tests') failed.\n") ; - - for (k = 0 ; read_only_types [k].format ; k++) - pipe_read_test (read_only_types [k].format, read_only_types [k].ext) ; - - for (k = 0 ; read_write_types [k].format ; k++) - pipe_write_test (read_write_types [k].ext) ; - - for (k = 0 ; read_write_types [k].format ; k++) - useek_pipe_rw_test (read_write_types [k].format, read_write_types [k].ext) ; - - if (0) - pipe_test_others (read_write_types, read_only_types) ; - - return 0 ; -} /* main */ - -/*============================================================================== -*/ - -static void -pipe_read_test (int filetype, const char *ext) -{ static short data [PIPE_TEST_LEN] ; - static char buffer [256] ; - static char filename [256] ; - - SNDFILE *outfile ; - SF_INFO sfinfo ; - int k, retval ; - - snprintf (filename, sizeof (filename), "pipe_in.%s", ext) ; - print_test_name ("pipe_read_test", filename) ; - - sfinfo.format = filetype | SF_FORMAT_PCM_16 ; - sfinfo.channels = 1 ; - sfinfo.samplerate = 44100 ; - - for (k = 0 ; k < PIPE_TEST_LEN ; k++) - data [k] = PIPE_INDEX (k) ; - - outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_writef_short_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; - sf_close (outfile) ; - - snprintf (buffer, sizeof (buffer), "cat %s | ./stdin_test %s ", filename, ext) ; - if ((retval = system (buffer)) != 0) - { retval = WEXITSTATUS (retval) ; - printf ("\n\n Line %d : pipe test returned error for file type \"%s\".\n\n", __LINE__, ext) ; - exit (retval) ; - } ; - - unlink (filename) ; - puts ("ok") ; - - return ; -} /* pipe_read_test */ - -static void -pipe_write_test (const char *ext) -{ static char buffer [256] ; - - int retval ; - - print_test_name ("pipe_write_test", ext) ; - - snprintf (buffer, sizeof (buffer), "./stdout_test %s | ./stdin_test %s ", ext, ext) ; - if ((retval = system (buffer))) - { retval = WEXITSTATUS (retval) ; - printf ("\n\n Line %d : pipe test returned error file type \"%s\".\n\n", __LINE__, ext) ; - exit (retval) ; - } ; - - puts ("ok") ; - - return ; -} /* pipe_write_test */ - -/*============================================================================== -*/ - -[+ FOR data_type +] -static void -useek_pipe_rw_[+ (get "type_name") +] (const char * ext, SF_INFO * psfinfo_write, SF_INFO * psfinfo_read) -{ static [+ (get "type_name") +] buffer [PIPE_TEST_LEN] ; - static [+ (get "type_name") +] data [PIPE_TEST_LEN] ; - SNDFILE *outfile ; - SNDFILE *infile_piped ; - - int k, status = 0 ; - int pipefd [2] ; - pid_t pida ; - - for (k = 0 ; k < PIPE_TEST_LEN ; k++) - data [k] = PIPE_INDEX (k) ; - - /* - ** Create the pipe. - */ - exit_if_true (pipe (pipefd) != 0, "\n\n%s %d : pipe failed : %s\n", __func__, __LINE__, strerror (errno)) ; - - /* - ** Attach the write end of the pipe to be written to. - */ - if ((outfile = sf_open_fd (pipefd [1], SFM_WRITE, psfinfo_write, SF_TRUE)) == NULL) - { printf ("\n\n%s %d : unable to create unseekable pipe for write type \"%s\".\n", __func__, __LINE__, ext) ; - printf ("\t%s\n\n", sf_strerror (outfile)) ; - exit (1) ; - } ; - - if (sf_error (outfile) != SF_ERR_NO_ERROR) - { printf ("\n\n%s %d : unable to open unseekable pipe for write type \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - /* - ** Attach the read end of the pipe to be read from. - */ - if ((infile_piped = sf_open_fd (pipefd [0], SFM_READ, psfinfo_read, SF_TRUE)) == NULL) - { printf ("\n\n%s %d : unable to create unseekable pipe for read type. \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - if (sf_error (infile_piped) != SF_ERR_NO_ERROR) - { printf ("\n\n%s %d : unable to open unseekable pipe for read type \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - /* Fork a child process that will write directly into the pipe. */ - if ((pida = fork ()) == 0) /* child process */ - { test_writef_[+ (get "type_name") +]_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; - exit (0) ; - } ; - - /* In the parent process, read from the pipe and compare what is read - ** to what is written, if they match everything went as planned. - */ - test_readf_[+ (get "type_name") +]_or_die (infile_piped, 0, buffer, PIPE_TEST_LEN, __LINE__) ; - if (memcmp (buffer, data, sizeof (buffer)) != 0) - { printf ("\n\n%s %d : unseekable pipe test failed for file type \"%s\".\n\n", __func__, __LINE__, ext) ; - exit (1) ; - } ; - - /* Wait for the child process to return. */ - waitpid (pida, &status, 0) ; - status = WEXITSTATUS (status) ; - sf_close (outfile) ; - sf_close (infile_piped) ; - - if (status != 0) - { printf ("\n\n%s %d : status of child process is %d for file type %s.\n\n", __func__, __LINE__, status, ext) ; - exit (1) ; - } ; - - return ; -} /* useek_pipe_rw_[+ (get "type_name") +] */ - -[+ ENDFOR data_type +] - - -static void -useek_pipe_rw_test (int filetype, const char *ext) -{ SF_INFO sfinfo_write ; - SF_INFO sfinfo_read ; - - print_test_name ("useek_pipe_rw_test", ext) ; - - /* - ** Setup the INFO structures for the filetype we will be - ** working with. - */ - sfinfo_write.format = filetype | SF_FORMAT_PCM_16 ; - sfinfo_write.channels = 1 ; - sfinfo_write.samplerate = 44100 ; - - - sfinfo_read.format = 0 ; - if (filetype == SF_FORMAT_RAW) - { sfinfo_read.format = filetype | SF_FORMAT_PCM_16 ; - sfinfo_read.channels = 1 ; - sfinfo_read.samplerate = 44100 ; - } ; - - useek_pipe_rw_short (ext, &sfinfo_write, &sfinfo_read) ; - - sfinfo_read.format = sfinfo_write.format = filetype | SF_FORMAT_FLOAT ; - if (sf_format_check (&sfinfo_read) != 0) - useek_pipe_rw_float (ext, &sfinfo_write, &sfinfo_read) ; - - sfinfo_read.format = sfinfo_write.format = filetype | SF_FORMAT_DOUBLE ; - if (sf_format_check (&sfinfo_read) != 0) - useek_pipe_rw_double (ext, &sfinfo_write, &sfinfo_read) ; - - puts ("ok") ; - return ; -} /* useek_pipe_rw_test */ - - - -static void -pipe_test_others (FILETYPE* list1, FILETYPE* list2) -{ SF_FORMAT_INFO info ; - int k, m, major_count, in_list ; - - print_test_name ("pipe_test_others", "") ; - - sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &major_count, sizeof (int)) ; - - for (k = 0 ; k < major_count ; k++) - { info.format = k ; - - sf_command (NULL, SFC_GET_FORMAT_MAJOR, &info, sizeof (info)) ; - - in_list = SF_FALSE ; - for (m = 0 ; list1 [m].format ; m++) - if (info.format == list1 [m].format) - in_list = SF_TRUE ; - - for (m = 0 ; list2 [m].format ; m++) - if (info.format == list2 [m].format) - in_list = SF_TRUE ; - - if (in_list) - continue ; - - printf ("%s %x\n", info.name, info.format) ; - - if (1) - { static short data [PIPE_TEST_LEN] ; - static char buffer [256] ; - static const char *filename = "pipe_in.dat" ; - - SNDFILE *outfile ; - SF_INFO sfinfo ; - int retval ; - - sfinfo.format = info.format | SF_FORMAT_PCM_16 ; - sfinfo.channels = 1 ; - sfinfo.samplerate = 44100 ; - - outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_writef_short_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; - sf_close (outfile) ; - - snprintf (buffer, sizeof (buffer), "cat %s | ./stdin_test %s %d ", filename, info.extension, PIPE_TEST_LEN) ; - if ((retval = system (buffer)) == 0) - { retval = WEXITSTATUS (retval) ; - printf ("\n\n Line %d : pipe test should have returned error file type \"%s\" but didn't.\n\n", __LINE__, info.name) ; - exit (1) ; - } ; - - unlink (filename) ; - } ; - } ; - - - puts ("ok") ; - - return ; -} /* pipe_test_others */ - - -/*============================================================================== -*/ - -static int -file_exists (const char *filename) -{ struct stat buf ; - - if (stat (filename, &buf)) - return 0 ; - - return 1 ; -} /* file_exists */ - -#endif - diff --git a/libs/libsndfile/tests/raw_test.c b/libs/libsndfile/tests/raw_test.c deleted file mode 100644 index 002f3ee4ab..0000000000 --- a/libs/libsndfile/tests/raw_test.c +++ /dev/null @@ -1,187 +0,0 @@ -/* -** Copyright (C) 2002-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_LEN (1 << 10) -#define LOG_BUFFER_SIZE 1024 - -static void raw_offset_test (const char *filename, int typeminor) ; -static void bad_raw_test (void) ; - -/* Force the start of this buffer to be double aligned. Sparc-solaris will -** choke if its not. -*/ -static short data [BUFFER_LEN] ; - -int -main (void) -{ - raw_offset_test ("offset.raw", SF_FORMAT_PCM_16) ; - bad_raw_test () ; - - return 0 ; -} /* main */ - -/*============================================================================================ -** Here are the test functions. -*/ - -static void -raw_offset_test (const char *filename, int typeminor) -{ SNDFILE *sndfile ; - SF_INFO sfinfo ; - sf_count_t start ; - int k ; - - print_test_name ("raw_offset_test", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = SF_FORMAT_RAW | typeminor ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - - sndfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; - - start = 0 ; - sf_command (sndfile, SFC_FILE_TRUNCATE, &start, sizeof (start)) ; - - for (k = 0 ; k < BUFFER_LEN ; k++) - data [k] = k ; - test_write_short_or_die (sndfile, 0, data, BUFFER_LEN, __LINE__) ; - - sf_close (sndfile) ; - - sndfile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - check_log_buffer_or_die (sndfile, __LINE__) ; - - if (abs (BUFFER_LEN - sfinfo.frames) > 1) - { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, BUFFER_LEN) ; - dump_log_buffer (sndfile) ; - exit (1) ; - } ; - - memset (data, 0 , sizeof (data)) ; - test_read_short_or_die (sndfile, 0, data, BUFFER_LEN, __LINE__) ; - for (k = 0 ; k < BUFFER_LEN ; k++) - if (data [k] != k) - printf ("Error : line %d\n", __LINE__) ; - - /* Set dataoffset to 2 bytes from beginning of file. */ - start = 2 ; - sf_command (sndfile, SFC_SET_RAW_START_OFFSET, &start, sizeof (start)) ; - - /* Seek to new start */ - test_seek_or_die (sndfile, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - memset (data, 0 , sizeof (data)) ; - test_read_short_or_die (sndfile, 0, data, BUFFER_LEN - 1, __LINE__) ; - for (k = 0 ; k < BUFFER_LEN - 1 ; k++) - if (data [k] != k + 1) - { printf ("Error : line %d\n", __LINE__) ; - exit (1) ; - } ; - - /* Set dataoffset to 4 bytes from beginning of file. */ - start = 4 ; - sf_command (sndfile, SFC_SET_RAW_START_OFFSET, &start, sizeof (start)) ; - - /* Seek to new start */ - test_seek_or_die (sndfile, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - memset (data, 0 , sizeof (data)) ; - test_read_short_or_die (sndfile, 0, data, BUFFER_LEN - 2, __LINE__) ; - for (k = 0 ; k < BUFFER_LEN - 2 ; k++) - if (data [k] != k + 2) - { printf ("Error : line %d\n", __LINE__) ; - exit (1) ; - } ; - - /* Set dataoffset back to 0 bytes from beginning of file. */ - start = 0 ; - sf_command (sndfile, SFC_SET_RAW_START_OFFSET, &start, sizeof (start)) ; - - /* Seek to new start */ - test_seek_or_die (sndfile, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - memset (data, 0 , sizeof (data)) ; - test_read_short_or_die (sndfile, 0, data, BUFFER_LEN, __LINE__) ; - for (k = 0 ; k < BUFFER_LEN ; k++) - if (data [k] != k) - { printf ("Error : line %d\n", __LINE__) ; - exit (1) ; - } ; - - sf_close (sndfile) ; - unlink (filename) ; - - puts ("ok") ; -} /* raw_offset_test */ - -static void -bad_raw_test (void) -{ FILE *textfile ; - SNDFILE *file ; - SF_INFO sfinfo ; - const char *errorstr, *filename = "bad.raw" ; - - print_test_name ("bad_raw_test", filename) ; - - if ((textfile = fopen (filename, "w")) == NULL) - { printf ("\n\nLine %d : not able to open text file for write.\n", __LINE__) ; - exit (1) ; - } ; - - fprintf (textfile, "This is not a valid file.\n") ; - fclose (textfile) ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = SF_FORMAT_RAW | 0xABCD ; - sfinfo.channels = 1 ; - - if ((file = sf_open (filename, SFM_READ, &sfinfo)) != NULL) - { printf ("\n\nLine %d : Error, file should not have opened.\n", __LINE__ - 1) ; - exit (1) ; - } ; - - errorstr = sf_strerror (file) ; - - if (strstr (errorstr, "Bad format field in SF_INFO struct") == NULL) - { printf ("\n\nLine %d : Error bad error string : %s.\n", __LINE__ - 1, errorstr) ; - exit (1) ; - } ; - - unlink (filename) ; - - puts ("ok") ; -} /* bad_raw_test */ - diff --git a/libs/libsndfile/tests/rdwr_test.def b/libs/libsndfile/tests/rdwr_test.def deleted file mode 100644 index 43c1089818..0000000000 --- a/libs/libsndfile/tests/rdwr_test.def +++ /dev/null @@ -1,32 +0,0 @@ -autogen definitions rdwr_test.tpl; - -data_type = { - name = "short" ; - type = "short" ; - format = "SF_FORMAT_PCM_16" ; - } ; - -data_type = { - name = "int" ; - type = "int" ; - format = "SF_FORMAT_PCM_32" ; - } ; - -data_type = { - name = "float" ; - type = "float" ; - format = "SF_FORMAT_FLOAT" ; - } ; - -data_type = { - name = "double" ; - type = "double" ; - format = "SF_FORMAT_DOUBLE" ; - } ; - -data_type = { - name = "raw" ; - type = "unsigned char" ; - format = "SF_FORMAT_PCM_U8" ; - } ; - diff --git a/libs/libsndfile/tests/rdwr_test.tpl b/libs/libsndfile/tests/rdwr_test.tpl deleted file mode 100644 index 8cfdd3687e..0000000000 --- a/libs/libsndfile/tests/rdwr_test.tpl +++ /dev/null @@ -1,105 +0,0 @@ -[+ AutoGen5 template c +] -/* -** Copyright (C) 2010-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if (HAVE_DECL_S_IRGRP == 0) -#include -#endif - -#if (defined (WIN32) || defined (_WIN32)) -#include -#include -#endif - -#include - -#include "utils.h" - -[+ FOR data_type -+]static void rdwr_[+ (get "name") +]_test (const char *filename) ; -[+ ENDFOR data_type -+] - -int -main (void) -{ - rdwr_short_test ("rdwr_short.wav") ; - rdwr_int_test ("rdwr_int.wav") ; - rdwr_float_test ("rdwr_float.wav") ; - rdwr_double_test ("rdwr_double.wav") ; - rdwr_raw_test ("rdwr_raw.wav") ; - - return 0 ; -} /* main */ - - -/*============================================================================================ -** Here are the test functions. -*/ - -[+ FOR data_type -+]static void -rdwr_[+ (get "name") +]_test (const char *filename) -{ SNDFILE *file ; - SF_INFO sfinfo ; - sf_count_t frames ; - [+ (get "type") +] buffer [160] ; - - print_test_name ("rdwr_[+ (get "name") +]_test", filename) ; - - memset (buffer, 0, sizeof (buffer)) ; - - /* Create sound file with no data. */ - sfinfo.format = SF_FORMAT_WAV | [+ (get "format") +] ; - sfinfo.samplerate = 16000 ; - sfinfo.channels = 1 ; - - unlink (filename) ; - - frames = ARRAY_LEN (buffer) ; - - /* Open again for read/write. */ - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; - - test_write_[+ (get "name") +]_or_die (file, 0, buffer, frames, __LINE__) ; - - test_read_[+ (get "name") +]_or_die (file, 0, buffer, frames, __LINE__) ; - - sf_close (file) ; - unlink (filename) ; - - puts ("ok") ; - return ; -} /* rdwr_[+ (get "name") +]_test */ - -[+ ENDFOR data_type -+] - diff --git a/libs/libsndfile/tests/scale_clip_test.c b/libs/libsndfile/tests/scale_clip_test.c deleted file mode 100644 index 57b0b96073..0000000000 --- a/libs/libsndfile/tests/scale_clip_test.c +++ /dev/null @@ -1,1853 +0,0 @@ -/* -** Copyright (C) 1999-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include - -#include "utils.h" - -#ifndef M_PI -#define M_PI 3.14159265358979323846264338 -#endif - -#define HALF_BUFFER_SIZE (1 << 12) -#define BUFFER_SIZE (2 * HALF_BUFFER_SIZE) - -#define SINE_AMP 1.1 -#define MAX_ERROR 0.0202 - - -static void flt_scale_clip_test_16 (const char *filename, int filetype, float maxval) ; -static void flt_scale_clip_test_24 (const char *filename, int filetype, float maxval) ; -static void flt_scale_clip_test_32 (const char *filename, int filetype, float maxval) ; -static void flt_scale_clip_test_08 (const char *filename, int filetype, float maxval) ; - -static void dbl_scale_clip_test_16 (const char *filename, int filetype, float maxval) ; -static void dbl_scale_clip_test_24 (const char *filename, int filetype, float maxval) ; -static void dbl_scale_clip_test_32 (const char *filename, int filetype, float maxval) ; -static void dbl_scale_clip_test_08 (const char *filename, int filetype, float maxval) ; - - - -static void flt_short_clip_read_test (const char *filename, int filetype) ; -static void flt_int_clip_read_test (const char *filename, int filetype) ; - -static void dbl_short_clip_read_test (const char *filename, int filetype) ; -static void dbl_int_clip_read_test (const char *filename, int filetype) ; - - - -static void short_flt_scale_write_test (const char *filename, int filetype) ; -static void short_dbl_scale_write_test (const char *filename, int filetype) ; - -static void int_flt_scale_write_test (const char *filename, int filetype) ; -static void int_dbl_scale_write_test (const char *filename, int filetype) ; - - -typedef union -{ double dbl [BUFFER_SIZE] ; - float flt [BUFFER_SIZE] ; - int i [BUFFER_SIZE] ; - short s [BUFFER_SIZE] ; -} BUFFER ; - -/* Data buffer. */ -static BUFFER buffer_out ; -static BUFFER buffer_in ; - -int -main (void) -{ - flt_scale_clip_test_08 ("scale_clip_s8.au", SF_FORMAT_AU | SF_FORMAT_PCM_S8, 1.0 * 0x80) ; - flt_scale_clip_test_08 ("scale_clip_u8.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8, 1.0 * 0x80) ; - - dbl_scale_clip_test_08 ("scale_clip_s8.au", SF_FORMAT_AU | SF_FORMAT_PCM_S8, 1.0 * 0x80) ; - dbl_scale_clip_test_08 ("scale_clip_u8.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8, 1.0 * 0x80) ; - - /* - ** Now use SF_FORMAT_AU where possible because it allows both - ** big and little endian files. - */ - - flt_scale_clip_test_16 ("scale_clip_be16.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; - flt_scale_clip_test_16 ("scale_clip_le16.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; - flt_scale_clip_test_24 ("scale_clip_be24.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; - flt_scale_clip_test_24 ("scale_clip_le24.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; - flt_scale_clip_test_32 ("scale_clip_be32.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; - flt_scale_clip_test_32 ("scale_clip_le32.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; - - dbl_scale_clip_test_16 ("scale_clip_be16.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; - dbl_scale_clip_test_16 ("scale_clip_le16.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; - dbl_scale_clip_test_24 ("scale_clip_be24.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; - dbl_scale_clip_test_24 ("scale_clip_le24.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; - dbl_scale_clip_test_32 ("scale_clip_be32.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; - dbl_scale_clip_test_32 ("scale_clip_le32.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; - - flt_short_clip_read_test ("flt_short.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; - flt_int_clip_read_test ("flt_int.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; - dbl_short_clip_read_test ("dbl_short.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; - dbl_int_clip_read_test ("dbl_int.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; - - short_flt_scale_write_test ("short_flt.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; - int_flt_scale_write_test ("int_flt.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; - short_dbl_scale_write_test ("short_dbl.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; - int_dbl_scale_write_test ("int_dbl.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; - - return 0 ; -} /* main */ - -/*============================================================================================ -** Here are the test functions. -*/ - - -static void -flt_scale_clip_test_16 (const char *filename, int filetype, float maxval) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k ; - float *data_out, *data_in ; - double diff, clip_max_diff ; - - print_test_name ("flt_scale_clip_test_16", filename) ; - - data_out = buffer_out.flt ; - data_in = buffer_in.flt ; - - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; - data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - /* - ** Write two versions of the data: - ** normalized and clipped - ** un-normalized and clipped. - */ - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; - test_write_float_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - test_write_float_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&buffer_in, 0, sizeof (buffer_in)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_float_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - test_read_float_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - /* Check normalized version. */ - clip_max_diff = 0.0 ; - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > 1.0) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > 1.0) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0 / 0x8000) - { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - /* Check the un-normalized data. */ - clip_max_diff = 0.0 ; - for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > maxval) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > maxval) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0) - { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - printf ("ok\n") ; - unlink (filename) ; -} /* flt_scale_clip_test_16 */ - -static void -flt_scale_clip_test_24 (const char *filename, int filetype, float maxval) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k ; - float *data_out, *data_in ; - double diff, clip_max_diff ; - - print_test_name ("flt_scale_clip_test_24", filename) ; - - data_out = buffer_out.flt ; - data_in = buffer_in.flt ; - - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; - data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - /* - ** Write two versions of the data: - ** normalized and clipped - ** un-normalized and clipped. - */ - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; - test_write_float_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - test_write_float_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&buffer_in, 0, sizeof (buffer_in)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_float_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - test_read_float_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - /* Check normalized version. */ - clip_max_diff = 0.0 ; - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > 1.0) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > 1.0) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0 / 0x800000) - { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - /* Check the un-normalized data. */ - clip_max_diff = 0.0 ; - for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > maxval) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > maxval) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0) - { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - printf ("ok\n") ; - unlink (filename) ; -} /* flt_scale_clip_test_24 */ - -static void -flt_scale_clip_test_32 (const char *filename, int filetype, float maxval) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k ; - float *data_out, *data_in ; - double diff, clip_max_diff ; - - print_test_name ("flt_scale_clip_test_32", filename) ; - - data_out = buffer_out.flt ; - data_in = buffer_in.flt ; - - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; - data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - /* - ** Write two versions of the data: - ** normalized and clipped - ** un-normalized and clipped. - */ - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; - test_write_float_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - test_write_float_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&buffer_in, 0, sizeof (buffer_in)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_float_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - test_read_float_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - /* Check normalized version. */ - clip_max_diff = 0.0 ; - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > 1.0) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > 1.0) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0 / 0x80000000) - { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - /* Check the un-normalized data. */ - clip_max_diff = 0.0 ; - for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > maxval) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > maxval) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0) - { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - printf ("ok\n") ; - unlink (filename) ; -} /* flt_scale_clip_test_32 */ - -static void -flt_scale_clip_test_08 (const char *filename, int filetype, float maxval) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k ; - float *data_out, *data_in ; - double diff, clip_max_diff ; - - print_test_name ("flt_scale_clip_test_08", filename) ; - - data_out = buffer_out.flt ; - data_in = buffer_in.flt ; - - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; - data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - /* - ** Write two versions of the data: - ** normalized and clipped - ** un-normalized and clipped. - */ - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; - test_write_float_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - test_write_float_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&buffer_in, 0, sizeof (buffer_in)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_float_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; - test_read_float_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - /* Check normalized version. */ - clip_max_diff = 0.0 ; - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > 1.0) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > 1.0) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0 / 0x80) - { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - /* Check the un-normalized data. */ - clip_max_diff = 0.0 ; - for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > maxval) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > maxval) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0) - { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - printf ("ok\n") ; - unlink (filename) ; -} /* flt_scale_clip_test_08 */ - - - -static void -dbl_scale_clip_test_16 (const char *filename, int filetype, float maxval) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k ; - double *data_out, *data_in ; - double diff, clip_max_diff ; - - print_test_name ("dbl_scale_clip_test_16", filename) ; - - data_out = buffer_out.dbl ; - data_in = buffer_in.dbl ; - - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; - data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - /* - ** Write two versions of the data: - ** normalized and clipped - ** un-normalized and clipped. - */ - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; - test_write_double_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - test_write_double_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&buffer_in, 0, sizeof (buffer_in)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_double_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - test_read_double_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - /* Check normalized version. */ - clip_max_diff = 0.0 ; - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > 1.0) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > 1.0) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0 / 0x8000) - { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - /* Check the un-normalized data. */ - clip_max_diff = 0.0 ; - for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > maxval) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > maxval) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0) - { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - printf ("ok\n") ; - unlink (filename) ; -} /* dbl_scale_clip_test_16 */ - -static void -dbl_scale_clip_test_24 (const char *filename, int filetype, float maxval) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k ; - double *data_out, *data_in ; - double diff, clip_max_diff ; - - print_test_name ("dbl_scale_clip_test_24", filename) ; - - data_out = buffer_out.dbl ; - data_in = buffer_in.dbl ; - - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; - data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - /* - ** Write two versions of the data: - ** normalized and clipped - ** un-normalized and clipped. - */ - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; - test_write_double_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - test_write_double_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&buffer_in, 0, sizeof (buffer_in)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_double_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - test_read_double_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - /* Check normalized version. */ - clip_max_diff = 0.0 ; - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > 1.0) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > 1.0) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0 / 0x800000) - { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - /* Check the un-normalized data. */ - clip_max_diff = 0.0 ; - for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > maxval) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > maxval) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0) - { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - printf ("ok\n") ; - unlink (filename) ; -} /* dbl_scale_clip_test_24 */ - -static void -dbl_scale_clip_test_32 (const char *filename, int filetype, float maxval) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k ; - double *data_out, *data_in ; - double diff, clip_max_diff ; - - print_test_name ("dbl_scale_clip_test_32", filename) ; - - data_out = buffer_out.dbl ; - data_in = buffer_in.dbl ; - - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; - data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - /* - ** Write two versions of the data: - ** normalized and clipped - ** un-normalized and clipped. - */ - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; - test_write_double_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - test_write_double_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&buffer_in, 0, sizeof (buffer_in)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_double_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - test_read_double_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - /* Check normalized version. */ - clip_max_diff = 0.0 ; - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > 1.0) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > 1.0) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0 / 0x80000000) - { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - /* Check the un-normalized data. */ - clip_max_diff = 0.0 ; - for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > maxval) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > maxval) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0) - { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - printf ("ok\n") ; - unlink (filename) ; -} /* dbl_scale_clip_test_32 */ - -static void -dbl_scale_clip_test_08 (const char *filename, int filetype, float maxval) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k ; - double *data_out, *data_in ; - double diff, clip_max_diff ; - - print_test_name ("dbl_scale_clip_test_08", filename) ; - - data_out = buffer_out.dbl ; - data_in = buffer_in.dbl ; - - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; - data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - /* - ** Write two versions of the data: - ** normalized and clipped - ** un-normalized and clipped. - */ - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; - test_write_double_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - test_write_double_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&buffer_in, 0, sizeof (buffer_in)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_double_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; - test_read_double_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - /* Check normalized version. */ - clip_max_diff = 0.0 ; - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > 1.0) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > 1.0) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0 / 0x80) - { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - /* Check the un-normalized data. */ - clip_max_diff = 0.0 ; - for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > maxval) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > maxval) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0) - { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - printf ("ok\n") ; - unlink (filename) ; -} /* dbl_scale_clip_test_08 */ - - - - -/*============================================================================== -*/ - - -static void flt_short_clip_read_test (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - float *data_out ; - short *data_in, max_value ; - int k ; - - print_test_name ("flt_short_clip_read_test", filename) ; - - data_out = buffer_out.flt ; - data_in = buffer_in.s ; - - for (k = 0 ; k < BUFFER_SIZE ; k++) - data_out [k] = 0.995 * sin (4 * M_PI * k / BUFFER_SIZE) ; - data_out [BUFFER_SIZE / 8] = 1.0 ; - data_out [3 * BUFFER_SIZE / 8] = -1.000000001 ; - data_out [5 * BUFFER_SIZE / 8] = 1.0 ; - data_out [7 * BUFFER_SIZE / 8] = -1.000000001 ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - /* Save unclipped data to the file. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_float_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; - test_read_short_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - /*-sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;-*/ - sf_close (file) ; - - /* Check the first half. */ - max_value = 0 ; - for (k = 0 ; k < sfinfo.frames ; k++) - { /* Check if data_out has different sign from data_in. */ - if ((data_out [k] < 0.0 && data_in [k] > 0) || (data_out [k] > 0.0 && data_in [k] < 0)) - { printf ("\n\nLine %d: Data wrap around at index %d/%d (%f -> %d).\n\n", __LINE__, k, BUFFER_SIZE, data_out [k], data_in [k]) ; - exit (1) ; - } ; - max_value = (max_value > abs (data_in [k])) ? max_value : abs (data_in [k]) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* flt_short_clip_read_test */ -static void flt_int_clip_read_test (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - float *data_out ; - int *data_in, max_value ; - int k ; - - print_test_name ("flt_int_clip_read_test", filename) ; - - data_out = buffer_out.flt ; - data_in = buffer_in.i ; - - for (k = 0 ; k < BUFFER_SIZE ; k++) - data_out [k] = 0.995 * sin (4 * M_PI * k / BUFFER_SIZE) ; - data_out [BUFFER_SIZE / 8] = 1.0 ; - data_out [3 * BUFFER_SIZE / 8] = -1.000000001 ; - data_out [5 * BUFFER_SIZE / 8] = 1.0 ; - data_out [7 * BUFFER_SIZE / 8] = -1.000000001 ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - /* Save unclipped data to the file. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_float_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; - test_read_int_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - /*-sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;-*/ - sf_close (file) ; - - /* Check the first half. */ - max_value = 0 ; - for (k = 0 ; k < sfinfo.frames ; k++) - { /* Check if data_out has different sign from data_in. */ - if ((data_out [k] < 0.0 && data_in [k] > 0) || (data_out [k] > 0.0 && data_in [k] < 0)) - { printf ("\n\nLine %d: Data wrap around at index %d/%d (%f -> %d).\n\n", __LINE__, k, BUFFER_SIZE, data_out [k], data_in [k]) ; - exit (1) ; - } ; - max_value = (max_value > abs (data_in [k])) ? max_value : abs (data_in [k]) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* flt_int_clip_read_test */ - -static void dbl_short_clip_read_test (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - double *data_out ; - short *data_in, max_value ; - int k ; - - print_test_name ("dbl_short_clip_read_test", filename) ; - - data_out = buffer_out.dbl ; - data_in = buffer_in.s ; - - for (k = 0 ; k < BUFFER_SIZE ; k++) - data_out [k] = 0.995 * sin (4 * M_PI * k / BUFFER_SIZE) ; - data_out [BUFFER_SIZE / 8] = 1.0 ; - data_out [3 * BUFFER_SIZE / 8] = -1.000000001 ; - data_out [5 * BUFFER_SIZE / 8] = 1.0 ; - data_out [7 * BUFFER_SIZE / 8] = -1.000000001 ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - /* Save unclipped data to the file. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_double_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; - test_read_short_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - /*-sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;-*/ - sf_close (file) ; - - /* Check the first half. */ - max_value = 0 ; - for (k = 0 ; k < sfinfo.frames ; k++) - { /* Check if data_out has different sign from data_in. */ - if ((data_out [k] < 0.0 && data_in [k] > 0) || (data_out [k] > 0.0 && data_in [k] < 0)) - { printf ("\n\nLine %d: Data wrap around at index %d/%d (%f -> %d).\n\n", __LINE__, k, BUFFER_SIZE, data_out [k], data_in [k]) ; - exit (1) ; - } ; - max_value = (max_value > abs (data_in [k])) ? max_value : abs (data_in [k]) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* dbl_short_clip_read_test */ -static void dbl_int_clip_read_test (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - double *data_out ; - int *data_in, max_value ; - int k ; - - print_test_name ("dbl_int_clip_read_test", filename) ; - - data_out = buffer_out.dbl ; - data_in = buffer_in.i ; - - for (k = 0 ; k < BUFFER_SIZE ; k++) - data_out [k] = 0.995 * sin (4 * M_PI * k / BUFFER_SIZE) ; - data_out [BUFFER_SIZE / 8] = 1.0 ; - data_out [3 * BUFFER_SIZE / 8] = -1.000000001 ; - data_out [5 * BUFFER_SIZE / 8] = 1.0 ; - data_out [7 * BUFFER_SIZE / 8] = -1.000000001 ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - /* Save unclipped data to the file. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_double_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; - test_read_int_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - /*-sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;-*/ - sf_close (file) ; - - /* Check the first half. */ - max_value = 0 ; - for (k = 0 ; k < sfinfo.frames ; k++) - { /* Check if data_out has different sign from data_in. */ - if ((data_out [k] < 0.0 && data_in [k] > 0) || (data_out [k] > 0.0 && data_in [k] < 0)) - { printf ("\n\nLine %d: Data wrap around at index %d/%d (%f -> %d).\n\n", __LINE__, k, BUFFER_SIZE, data_out [k], data_in [k]) ; - exit (1) ; - } ; - max_value = (max_value > abs (data_in [k])) ? max_value : abs (data_in [k]) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* dbl_int_clip_read_test */ - - -/*============================================================================== -*/ - - -static void short_flt_scale_write_test (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - short *data_out ; - float *data_in, max_value ; - int k ; - - print_test_name ("short_flt_clip_write_test", filename) ; - - data_out = buffer_out.s ; - data_in = buffer_in.flt ; - - for (k = 0 ; k < BUFFER_SIZE ; k++) - data_out [k] = lrintf (0x7FFFF * 0.995 * sin (4 * M_PI * k / BUFFER_SIZE)) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_short_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_TRUE) ; - test_write_short_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_FALSE) ; - test_write_short_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != 3 * BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, 3 * BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - /* Check the first section. */ - test_read_float_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value < 1000.0) - { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - /* Check the second section. */ - test_read_float_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value > 1.0) - { printf ("\n\nLine %d: Max value (%f) > 1.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - /* Check the third section. */ - test_read_float_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value < 1000.0) - { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - sf_close (file) ; - - unlink (filename) ; - puts ("ok") ; -} /* short_flt_scale_write_test */ -static void short_dbl_scale_write_test (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - short *data_out ; - double *data_in, max_value ; - int k ; - - print_test_name ("short_dbl_clip_write_test", filename) ; - - data_out = buffer_out.s ; - data_in = buffer_in.dbl ; - - for (k = 0 ; k < BUFFER_SIZE ; k++) - data_out [k] = lrint (0x7FFFF * 0.995 * sin (4 * M_PI * k / BUFFER_SIZE)) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_short_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_TRUE) ; - test_write_short_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_FALSE) ; - test_write_short_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != 3 * BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, 3 * BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - /* Check the first section. */ - test_read_double_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value < 1000.0) - { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - /* Check the second section. */ - test_read_double_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value > 1.0) - { printf ("\n\nLine %d: Max value (%f) > 1.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - /* Check the third section. */ - test_read_double_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value < 1000.0) - { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - sf_close (file) ; - - unlink (filename) ; - puts ("ok") ; -} /* short_dbl_scale_write_test */ - -static void int_flt_scale_write_test (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int *data_out ; - float *data_in, max_value ; - int k ; - - print_test_name ("int_flt_clip_write_test", filename) ; - - data_out = buffer_out.i ; - data_in = buffer_in.flt ; - - for (k = 0 ; k < BUFFER_SIZE ; k++) - data_out [k] = lrintf (0x7FFFFFFF * 0.995 * sin (4 * M_PI * k / BUFFER_SIZE)) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_int_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_TRUE) ; - test_write_int_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_FALSE) ; - test_write_int_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != 3 * BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, 3 * BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - /* Check the first section. */ - test_read_float_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value < 1000.0) - { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - /* Check the second section. */ - test_read_float_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value > 1.0) - { printf ("\n\nLine %d: Max value (%f) > 1.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - /* Check the third section. */ - test_read_float_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value < 1000.0) - { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - sf_close (file) ; - - unlink (filename) ; - puts ("ok") ; -} /* int_flt_scale_write_test */ -static void int_dbl_scale_write_test (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int *data_out ; - double *data_in, max_value ; - int k ; - - print_test_name ("int_dbl_clip_write_test", filename) ; - - data_out = buffer_out.i ; - data_in = buffer_in.dbl ; - - for (k = 0 ; k < BUFFER_SIZE ; k++) - data_out [k] = lrint (0x7FFFFFFF * 0.995 * sin (4 * M_PI * k / BUFFER_SIZE)) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_int_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_TRUE) ; - test_write_int_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_FALSE) ; - test_write_int_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != 3 * BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, 3 * BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - /* Check the first section. */ - test_read_double_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value < 1000.0) - { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - /* Check the second section. */ - test_read_double_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value > 1.0) - { printf ("\n\nLine %d: Max value (%f) > 1.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - /* Check the third section. */ - test_read_double_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value < 1000.0) - { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - sf_close (file) ; - - unlink (filename) ; - puts ("ok") ; -} /* int_dbl_scale_write_test */ - - - diff --git a/libs/libsndfile/tests/scale_clip_test.def b/libs/libsndfile/tests/scale_clip_test.def deleted file mode 100644 index 345981912b..0000000000 --- a/libs/libsndfile/tests/scale_clip_test.def +++ /dev/null @@ -1,56 +0,0 @@ -autogen definitions scale_clip_test.tpl; - -float_type = { - float_type_name = "float" ; - float_short_name = "flt" ; - float_upper_name = "FLOAT" ; - float_to_int = "lrintf" ; - } ; - -float_type = { - float_type_name = "double" ; - float_short_name = "dbl" ; - float_upper_name = "DOUBLE" ; - float_to_int = "lrint" ; - } ; - - - -int_type = { - int_type_name = "short" ; - int_short_name = "s" ; - int_max_value = 0x7FFFF ; - } ; - -int_type = { - int_type_name = "int" ; - int_short_name = "i" ; - int_max_value = 0x7FFFFFFF ; - } ; - - - -data_type = { - name = "16" ; - bit_count = 16 ; - error_val = "1.0 / 0x8000" ; - } ; - -data_type = { - name = "24" ; - bit_count = 24 ; - error_val = "1.0 / 0x800000" ; - } ; - -data_type = { - name = "32" ; - bit_count = 32 ; - error_val = "1.0 / 0x80000000" ; - } ; - -data_type = { - name = "08" ; - bit_count = 8 ; - error_val = "1.0 / 0x80" ; - } ; - diff --git a/libs/libsndfile/tests/scale_clip_test.tpl b/libs/libsndfile/tests/scale_clip_test.tpl deleted file mode 100644 index 39ddf57c1f..0000000000 --- a/libs/libsndfile/tests/scale_clip_test.tpl +++ /dev/null @@ -1,438 +0,0 @@ -[+ AutoGen5 template c +] -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -#ifndef M_PI -#define M_PI 3.14159265358979323846264338 -#endif - -#define HALF_BUFFER_SIZE (1 << 12) -#define BUFFER_SIZE (2 * HALF_BUFFER_SIZE) - -#define SINE_AMP 1.1 -#define MAX_ERROR 0.0202 - -[+ FOR float_type +] -[+ FOR data_type -+]static void [+ (get "float_short_name") +]_scale_clip_test_[+ (get "name") +] (const char *filename, int filetype, float maxval) ; -[+ ENDFOR data_type -+][+ ENDFOR float_type +] - -[+ FOR float_type +] -[+ FOR int_type -+]static void [+ (get "float_short_name") +]_[+ (get "int_type_name") +]_clip_read_test (const char *filename, int filetype) ; -[+ ENDFOR int_type -+][+ ENDFOR float_type +] - -[+ FOR int_type +] -[+ FOR float_type -+]static void [+ (get "int_type_name") +]_[+ (get "float_short_name") +]_scale_write_test (const char *filename, int filetype) ; -[+ ENDFOR float_type -+][+ ENDFOR int_type +] - -typedef union -{ double dbl [BUFFER_SIZE] ; - float flt [BUFFER_SIZE] ; - int i [BUFFER_SIZE] ; - short s [BUFFER_SIZE] ; -} BUFFER ; - -/* Data buffer. */ -static BUFFER buffer_out ; -static BUFFER buffer_in ; - -int -main (void) -{ - flt_scale_clip_test_08 ("scale_clip_s8.au", SF_FORMAT_AU | SF_FORMAT_PCM_S8, 1.0 * 0x80) ; - flt_scale_clip_test_08 ("scale_clip_u8.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8, 1.0 * 0x80) ; - - dbl_scale_clip_test_08 ("scale_clip_s8.au", SF_FORMAT_AU | SF_FORMAT_PCM_S8, 1.0 * 0x80) ; - dbl_scale_clip_test_08 ("scale_clip_u8.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8, 1.0 * 0x80) ; - - /* - ** Now use SF_FORMAT_AU where possible because it allows both - ** big and little endian files. - */ - - flt_scale_clip_test_16 ("scale_clip_be16.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; - flt_scale_clip_test_16 ("scale_clip_le16.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; - flt_scale_clip_test_24 ("scale_clip_be24.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; - flt_scale_clip_test_24 ("scale_clip_le24.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; - flt_scale_clip_test_32 ("scale_clip_be32.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; - flt_scale_clip_test_32 ("scale_clip_le32.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; - - dbl_scale_clip_test_16 ("scale_clip_be16.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; - dbl_scale_clip_test_16 ("scale_clip_le16.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; - dbl_scale_clip_test_24 ("scale_clip_be24.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; - dbl_scale_clip_test_24 ("scale_clip_le24.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; - dbl_scale_clip_test_32 ("scale_clip_be32.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; - dbl_scale_clip_test_32 ("scale_clip_le32.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; - - flt_short_clip_read_test ("flt_short.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; - flt_int_clip_read_test ("flt_int.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; - dbl_short_clip_read_test ("dbl_short.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; - dbl_int_clip_read_test ("dbl_int.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; - - short_flt_scale_write_test ("short_flt.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; - int_flt_scale_write_test ("int_flt.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; - short_dbl_scale_write_test ("short_dbl.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; - int_dbl_scale_write_test ("int_dbl.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; - - return 0 ; -} /* main */ - -/*============================================================================================ -** Here are the test functions. -*/ - -[+ FOR float_type +] -[+ FOR data_type -+]static void -[+ (get "float_short_name") +]_scale_clip_test_[+ (get "name") +] (const char *filename, int filetype, float maxval) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k ; - [+ (get "float_type_name") +] *data_out, *data_in ; - double diff, clip_max_diff ; - - print_test_name ("[+ (get "float_short_name") +]_scale_clip_test_[+ (get "name") +]", filename) ; - - data_out = buffer_out.[+ (get "float_short_name") +] ; - data_in = buffer_in.[+ (get "float_short_name") +] ; - - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; - data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; - } ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - /* - ** Write two versions of the data: - ** normalized and clipped - ** un-normalized and clipped. - */ - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; - test_write_[+ (get "float_type_name") +]_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_[+ (get "float_upper_name") +], NULL, SF_FALSE) ; - test_write_[+ (get "float_type_name") +]_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&buffer_in, 0, sizeof (buffer_in)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_[+ (get "float_type_name") +]_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_NORM_[+ (get "float_upper_name") +], NULL, SF_FALSE) ; - test_read_[+ (get "float_type_name") +]_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - /* Check normalized version. */ - clip_max_diff = 0.0 ; - for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > 1.0) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > 1.0) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > [+ (get "error_val") +]) - { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - /* Check the un-normalized data. */ - clip_max_diff = 0.0 ; - for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) - { if (fabs (data_in [k]) > maxval) - { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; - exit (1) ; - } ; - - if (data_out [k] * data_in [k] < 0.0) - { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; - exit (1) ; - } ; - - if (fabs (data_out [k]) > maxval) - continue ; - - diff = fabs (data_out [k] - data_in [k]) ; - if (diff > clip_max_diff) - clip_max_diff = diff ; - } ; - - if (clip_max_diff < 1e-20) - { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - if (clip_max_diff > 1.0) - { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; - exit (1) ; - } ; - - printf ("ok\n") ; - unlink (filename) ; -} /* [+ (get "float_short_name") +]_scale_clip_test_[+ (get "name") +] */ - -[+ ENDFOR data_type -+] -[+ ENDFOR float_type +] - -/*============================================================================== -*/ - -[+ FOR float_type +] -[+ FOR int_type -+]static void [+ (get "float_short_name") +]_[+ (get "int_type_name") +]_clip_read_test (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - [+ (get "float_type_name") +] *data_out ; - [+ (get "int_type_name") +] *data_in, max_value ; - int k ; - - print_test_name ("[+ (get "float_short_name") +]_[+ (get "int_type_name") +]_clip_read_test", filename) ; - - data_out = buffer_out.[+ (get "float_short_name") +] ; - data_in = buffer_in.[+ (get "int_short_name") +] ; - - for (k = 0 ; k < BUFFER_SIZE ; k++) - data_out [k] = 0.995 * sin (4 * M_PI * k / BUFFER_SIZE) ; - data_out [BUFFER_SIZE / 8] = 1.0 ; - data_out [3 * BUFFER_SIZE / 8] = -1.000000001 ; - data_out [5 * BUFFER_SIZE / 8] = 1.0 ; - data_out [7 * BUFFER_SIZE / 8] = -1.000000001 ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - /* Save unclipped data to the file. */ - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_[+ (get "float_type_name") +]_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; - test_read_[+ (get "int_type_name") +]_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - /*-sf_command (file, SFC_SET_NORM_[+ (get "float_upper_name") +], NULL, SF_FALSE) ;-*/ - sf_close (file) ; - - /* Check the first half. */ - max_value = 0 ; - for (k = 0 ; k < sfinfo.frames ; k++) - { /* Check if data_out has different sign from data_in. */ - if ((data_out [k] < 0.0 && data_in [k] > 0) || (data_out [k] > 0.0 && data_in [k] < 0)) - { printf ("\n\nLine %d: Data wrap around at index %d/%d (%f -> %d).\n\n", __LINE__, k, BUFFER_SIZE, data_out [k], data_in [k]) ; - exit (1) ; - } ; - max_value = (max_value > abs (data_in [k])) ? max_value : abs (data_in [k]) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* [+ (get "float_short_name") +]_[+ (get "int_type_name") +]_clip_read_test */ -[+ ENDFOR int_type -+][+ ENDFOR float_type +] - -/*============================================================================== -*/ - -[+ FOR int_type +] -[+ FOR float_type -+]static void [+ (get "int_type_name") +]_[+ (get "float_short_name") +]_scale_write_test (const char *filename, int filetype) -{ SNDFILE *file ; - SF_INFO sfinfo ; - [+ (get "int_type_name") +] *data_out ; - [+ (get "float_type_name") +] *data_in, max_value ; - int k ; - - print_test_name ("[+ (get "int_type_name") +]_[+ (get "float_short_name") +]_clip_write_test", filename) ; - - data_out = buffer_out.[+ (get "int_short_name") +] ; - data_in = buffer_in.[+ (get "float_short_name") +] ; - - for (k = 0 ; k < BUFFER_SIZE ; k++) - data_out [k] = [+ (get "float_to_int") +] ([+ (get "int_max_value") +] * 0.995 * sin (4 * M_PI * k / BUFFER_SIZE)) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = filetype ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_[+ (get "int_type_name") +]_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_TRUE) ; - test_write_[+ (get "int_type_name") +]_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_FALSE) ; - test_write_[+ (get "int_type_name") +]_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; - sf_close (file) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; - - if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) - { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames != 3 * BUFFER_SIZE) - { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, 3 * BUFFER_SIZE, sfinfo.frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - /* Check the first section. */ - test_read_[+ (get "float_type_name") +]_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value < 1000.0) - { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - /* Check the second section. */ - test_read_[+ (get "float_type_name") +]_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value > 1.0) - { printf ("\n\nLine %d: Max value (%f) > 1.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - /* Check the third section. */ - test_read_[+ (get "float_type_name") +]_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; - - max_value = 0.0 ; - for (k = 0 ; k < BUFFER_SIZE ; k++) - max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; - - if (max_value < 1000.0) - { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; - exit (1) ; - } ; - - sf_close (file) ; - - unlink (filename) ; - puts ("ok") ; -} /* [+ (get "int_type_name") +]_[+ (get "float_short_name") +]_scale_write_test */ -[+ ENDFOR float_type -+][+ ENDFOR int_type +] - - diff --git a/libs/libsndfile/tests/sftest.c b/libs/libsndfile/tests/sftest.c deleted file mode 100644 index 78a9f7faaf..0000000000 --- a/libs/libsndfile/tests/sftest.c +++ /dev/null @@ -1,65 +0,0 @@ -/* -** Copyright (C) 1999-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#define BUFFER_SIZE (1024) - - -static short buffer [BUFFER_SIZE] ; - -int -main (int argc, char *argv []) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int k, count, max = 0, total = 0 ; - - if (argc < 2) - { printf ("Expecting input file name.\n") ; - return 0 ; - } ; - - if (! (file = sf_open (argv [1], SFM_READ, &sfinfo))) - { printf ("sf_open_read failed with error : ") ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - while ((count = sf_read_short (file, buffer, BUFFER_SIZE))) - { for (k = 0 ; k < count ; k++) - if (abs (buffer [k]) > max) - max = abs (buffer [k]) ; - total += count ; - } ; - - printf ("Total : %d\n", total) ; - printf ("Maximun value : %d\n", max) ; - - sf_close (file) ; - - return 0 ; -} /* main */ - diff --git a/libs/libsndfile/tests/sfversion.c b/libs/libsndfile/tests/sfversion.c deleted file mode 100644 index c464f08647..0000000000 --- a/libs/libsndfile/tests/sfversion.c +++ /dev/null @@ -1,45 +0,0 @@ -/* -** Copyright (C) 1999-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include -#include -#include - -#include - -#define BUFFER_SIZE (256) - - -int -main (void) -{ static char strbuffer [BUFFER_SIZE] ; - const char * ver ; - - sf_command (NULL, SFC_GET_LIB_VERSION, strbuffer, sizeof (strbuffer)) ; - ver = sf_version_string () ; - - if (strcmp (ver, strbuffer) != 0) - { printf ("Version mismatch : '%s' != '%s'\n\n", ver, strbuffer) ; - exit (1) ; - } ; - - printf ("%s", strbuffer) ; - - return 0 ; -} /* main */ - diff --git a/libs/libsndfile/tests/stdin_test.c b/libs/libsndfile/tests/stdin_test.c deleted file mode 100644 index a893915cce..0000000000 --- a/libs/libsndfile/tests/stdin_test.c +++ /dev/null @@ -1,204 +0,0 @@ -/* -** Copyright (C) 2001-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_LEN (1 << 16) - -static void stdin_test (int typemajor, int count) ; - -int -main (int argc, char *argv []) -{ int do_all = 0, test_count = 0 ; - - if (BUFFER_LEN < PIPE_TEST_LEN) - { fprintf (stderr, "Error : BUFFER_LEN < PIPE_TEST_LEN.\n\n") ; - exit (1) ; - } ; - - if (argc != 2) - { fprintf (stderr, "This program cannot be run by itself. It needs\n") ; - fprintf (stderr, "to be run from the stdio_test program.\n") ; - exit (1) ; - } ; - - do_all = ! strcmp (argv [1], "all") ; - - if (do_all || ! strcmp (argv [1], "raw")) - { stdin_test (SF_FORMAT_RAW, PIPE_TEST_LEN) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "wav")) - { stdin_test (SF_FORMAT_WAV, PIPE_TEST_LEN) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "aiff")) - { stdin_test (SF_FORMAT_AIFF, PIPE_TEST_LEN) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "au")) - { stdin_test (SF_FORMAT_AU, PIPE_TEST_LEN) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "paf")) - { stdin_test (SF_FORMAT_PAF, PIPE_TEST_LEN) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "svx")) - { stdin_test (SF_FORMAT_SVX, PIPE_TEST_LEN) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "nist")) - { stdin_test (SF_FORMAT_NIST, PIPE_TEST_LEN) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "ircam")) - { stdin_test (SF_FORMAT_IRCAM, PIPE_TEST_LEN) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "voc")) - { stdin_test (SF_FORMAT_VOC, PIPE_TEST_LEN) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "w64")) - { stdin_test (SF_FORMAT_W64, PIPE_TEST_LEN) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat4")) - { stdin_test (SF_FORMAT_MAT4, PIPE_TEST_LEN) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat5")) - { stdin_test (SF_FORMAT_MAT5, PIPE_TEST_LEN) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "pvf")) - { stdin_test (SF_FORMAT_PVF, PIPE_TEST_LEN) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "htk")) - { stdin_test (SF_FORMAT_HTK, PIPE_TEST_LEN) ; - test_count++ ; - } ; - - if (test_count == 0) - { fprintf (stderr, "\n*****************************************\n") ; - fprintf (stderr, "* stdin_test : No '%s' test defined.\n", argv [1]) ; - fprintf (stderr, "*****************************************\n") ; - return 1 ; - } ; - - return 0 ; -} /* main */ - -static void -stdin_test (int typemajor, int count) -{ static short data [BUFFER_LEN] ; - - SNDFILE *file ; - SF_INFO sfinfo ; - int k, total, err ; - - if (typemajor == SF_FORMAT_RAW) - { sfinfo.samplerate = 44100 ; - sfinfo.format = SF_FORMAT_RAW | SF_FORMAT_PCM_16 ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - } - else - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - if ((file = sf_open_fd (STDIN_FILENO, SFM_READ, &sfinfo, SF_TRUE)) == NULL) - { fprintf (stderr, "sf_open_fd failed with error : ") ; - puts (sf_strerror (NULL)) ; - dump_log_buffer (NULL) ; - exit (1) ; - } ; - - err = sf_error (file) ; - if (err != SF_ERR_NO_ERROR) - { printf ("Line %d : unexpected error : %s\n", __LINE__, sf_error_number (err)) ; - exit (1) ; - } ; - - if ((sfinfo.format & SF_FORMAT_TYPEMASK) != typemajor) - { fprintf (stderr, "\n\nError : File type doesn't match.\n") ; - exit (1) ; - } ; - - if (sfinfo.samplerate != 44100) - { fprintf (stderr, "\n\nError : Sample rate (%d) should be 44100\n", sfinfo.samplerate) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { fprintf (stderr, "\n\nError : Channels (%d) should be 1\n", sfinfo.channels) ; - exit (1) ; - } ; - - if (sfinfo.frames < count) - { fprintf (stderr, "\n\nError : Sample count (%ld) should be %d\n", (long) sfinfo.frames, count) ; - exit (1) ; - } ; - - total = 0 ; - while ((k = sf_read_short (file, data + total, BUFFER_LEN - total)) > 0) - total += k ; - - if (total != count) - { fprintf (stderr, "\n\nError : Expected %d frames, read %d.\n", count, total) ; - exit (1) ; - } ; - - for (k = 0 ; k < total ; k++) - if (data [k] != PIPE_INDEX (k)) - { printf ("\n\nError : data [%d] == %d, should have been %d.\n\n", k, data [k], k) ; - exit (1) ; - } ; - - sf_close (file) ; - - return ; -} /* stdin_test */ - diff --git a/libs/libsndfile/tests/stdio_test.c b/libs/libsndfile/tests/stdio_test.c deleted file mode 100644 index 80a696cf53..0000000000 --- a/libs/libsndfile/tests/stdio_test.c +++ /dev/null @@ -1,153 +0,0 @@ -/* -** Copyright (C) 2001-2011 Erik de Castro Lopo -** -** 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. -*/ - -/*========================================================================== -** This is a test program which tests reading from stdin and writing to -** stdout. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include -#include - -#if HAVE_SYS_WAIT_H -#include -#endif - -#include "utils.h" - -/* EMX is OS/2. */ -#if (OS_IS_WIN32) || defined (__EMX__) - -int -main (void) -{ - puts (" stdio_test : this test doesn't work on win32.") ; - return 0 ; -} /* main */ - -#else - -#ifndef WIFEXITED -#define WIFEXITED(s) (((s) & 0xff) == 0) -#endif -#ifndef WEXITSTATUS -#define WEXITSTATUS(s) (((s) & 0xff00) >> 8) -#endif - - -static size_t file_length (const char *filename) ; -static int file_exists (const char *filename) ; -static void stdio_test (const char *filetype) ; - -static const char *filetypes [] = -{ "raw", "wav", "aiff", "au", "paf", "svx", "nist", "ircam", - "voc", "w64", "mat4", "mat5", "pvf", - NULL -} ; - -int -main (void) -{ int k ; - - if (file_exists ("libsndfile.spec.in")) - exit_if_true (chdir ("tests") != 0, "\n Error : chdir ('tests') failed.\n") ; - - for (k = 0 ; filetypes [k] ; k++) - stdio_test (filetypes [k]) ; - - return 0 ; -} /* main */ - - -static void -stdio_test (const char *filetype) -{ static char buffer [256] ; - - int file_size, retval ; - - print_test_name ("stdio_test", filetype) ; - - snprintf (buffer, sizeof (buffer), "./stdout_test %s > stdio.%s", filetype, filetype) ; - if ((retval = system (buffer))) - { retval = WIFEXITED (retval) ? WEXITSTATUS (retval) : 1 ; - printf ("%s : %s", buffer, (strerror (retval))) ; - exit (1) ; - } ; - - snprintf (buffer, sizeof (buffer), "stdio.%s", filetype) ; - if ((file_size = file_length (buffer)) < PIPE_TEST_LEN) - { printf ("\n Error : test file '%s' too small (%d).\n\n", buffer, file_size) ; - exit (1) ; - } ; - - snprintf (buffer, sizeof (buffer), "./stdin_test %s < stdio.%s", filetype, filetype) ; - if ((retval = system (buffer))) - { retval = WIFEXITED (retval) ? WEXITSTATUS (retval) : 1 ; - printf ("%s : %s", buffer, (strerror (retval))) ; - exit (1) ; - } ; - - snprintf (buffer, sizeof (buffer), "rm stdio.%s", filetype) ; - if ((retval = system (buffer))) - { retval = WIFEXITED (retval) ? WEXITSTATUS (retval) : 1 ; - printf ("%s : %s", buffer, (strerror (retval))) ; - exit (1) ; - } ; - - puts ("ok") ; - - return ; -} /* stdio_test */ - - - - -static size_t -file_length (const char *filename) -{ struct stat buf ; - - if (stat (filename, &buf)) - { perror (filename) ; - exit (1) ; - } ; - - return buf.st_size ; -} /* file_length */ - -static int -file_exists (const char *filename) -{ struct stat buf ; - - if (stat (filename, &buf)) - return 0 ; - - return 1 ; -} /* file_exists */ - -#endif - diff --git a/libs/libsndfile/tests/stdout_test.c b/libs/libsndfile/tests/stdout_test.c deleted file mode 100644 index 850718dc1b..0000000000 --- a/libs/libsndfile/tests/stdout_test.c +++ /dev/null @@ -1,161 +0,0 @@ -/* -** Copyright (C) 2001-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -static void stdout_test (int typemajor, int count) ; - -int -main (int argc, char *argv []) -{ int do_all, test_count = 0 ; - - if (argc != 2) - { fprintf (stderr, "This program cannot be run by itself. It needs\n") ; - fprintf (stderr, "to be run from the stdio_test program.\n") ; - exit (1) ; - } ; - - do_all = ! strcmp (argv [1], "all") ; - - if (do_all || ! strcmp (argv [1], "raw")) - { stdout_test (SF_FORMAT_RAW, PIPE_TEST_LEN) ; - test_count ++ ; - } ; - - if (do_all || ! strcmp (argv [1], "wav")) - { stdout_test (SF_FORMAT_WAV, PIPE_TEST_LEN) ; - test_count ++ ; - } ; - - if (do_all || ! strcmp (argv [1], "aiff")) - { stdout_test (SF_FORMAT_AIFF, PIPE_TEST_LEN) ; - test_count ++ ; - } ; - - if (do_all || ! strcmp (argv [1], "au")) - { stdout_test (SF_FORMAT_AU, PIPE_TEST_LEN) ; - test_count ++ ; - } ; - - if (do_all || ! strcmp (argv [1], "paf")) - { stdout_test (SF_FORMAT_PAF, PIPE_TEST_LEN) ; - test_count ++ ; - } ; - - if (do_all || ! strcmp (argv [1], "svx")) - { stdout_test (SF_FORMAT_SVX, PIPE_TEST_LEN) ; - test_count ++ ; - } ; - - if (do_all || ! strcmp (argv [1], "nist")) - { stdout_test (SF_FORMAT_NIST, PIPE_TEST_LEN) ; - test_count ++ ; - } ; - - if (do_all || ! strcmp (argv [1], "ircam")) - { stdout_test (SF_FORMAT_IRCAM, PIPE_TEST_LEN) ; - test_count ++ ; - } ; - - if (do_all || ! strcmp (argv [1], "voc")) - { stdout_test (SF_FORMAT_VOC, PIPE_TEST_LEN) ; - test_count ++ ; - } ; - - if (do_all || ! strcmp (argv [1], "w64")) - { stdout_test (SF_FORMAT_W64, PIPE_TEST_LEN) ; - test_count ++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat4")) - { stdout_test (SF_FORMAT_MAT4, PIPE_TEST_LEN) ; - test_count ++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat5")) - { stdout_test (SF_FORMAT_MAT5, PIPE_TEST_LEN) ; - test_count ++ ; - } ; - - if (do_all || ! strcmp (argv [1], "pvf")) - { stdout_test (SF_FORMAT_PVF, PIPE_TEST_LEN) ; - test_count ++ ; - } ; - - if (test_count == 0) - { fprintf (stderr, "\n******************************************\n") ; - fprintf (stderr, "* stdout_test : No '%s' test defined.\n", argv [1]) ; - fprintf (stderr, "******************************************\n") ; - return 1 ; - } ; - - return 0 ; -} /* main */ - -static void -stdout_test (int typemajor, int count) -{ static short data [PIPE_TEST_LEN] ; - - SNDFILE *file ; - SF_INFO sfinfo ; - int k, total, this_write ; - - sfinfo.samplerate = 44100 ; - sfinfo.format = (typemajor | SF_FORMAT_PCM_16) ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - - /* Create some random data. */ - for (k = 0 ; k < PIPE_TEST_LEN ; k++) - data [k] = PIPE_INDEX (k) ; - - if ((file = sf_open ("-", SFM_WRITE, &sfinfo)) == NULL) - { fprintf (stderr, "sf_open_write failed with error : ") ; - fprintf (stderr, "%s\n", sf_strerror (NULL)) ; - exit (1) ; - } ; - - total = 0 ; - - while (total < count) - { this_write = (count - total > 1024) ? 1024 : count - total ; - if ((k = sf_write_short (file, data + total, this_write)) != this_write) - { fprintf (stderr, "sf_write_short # %d failed with short write (%d -> %d)\n", count, this_write, k) ; - exit (1) ; - } ; - total += k ; - } ; - - sf_close (file) ; - - return ; -} /* stdout_test */ - diff --git a/libs/libsndfile/tests/string_test.c b/libs/libsndfile/tests/string_test.c deleted file mode 100644 index eac716e8b2..0000000000 --- a/libs/libsndfile/tests/string_test.c +++ /dev/null @@ -1,795 +0,0 @@ -/* -** Copyright (C) 2003-2013 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_LEN (1 << 10) -#define LOG_BUFFER_SIZE 1024 - -static void string_start_test (const char *filename, int typemajor) ; -static void string_start_end_test (const char *filename, int typemajor) ; -static void string_multi_set_test (const char *filename, int typemajor) ; -static void string_rdwr_test (const char *filename, int typemajor) ; -static void string_short_rdwr_test (const char *filename, int typemajor) ; -static void string_rdwr_grow_test (const char *filename, int typemajor) ; -static void string_header_update (const char *filename, int typemajor) ; - -static void software_string_test (const char *filename) ; - -static int str_count (const char * haystack, const char * needle) ; - -int -main (int argc, char *argv []) -{ int do_all = 0 ; - int test_count = 0 ; - - if (argc != 2) - { printf ("Usage : %s \n", argv [0]) ; - printf (" Where is one of the following:\n") ; - printf (" wav - test adding strings to WAV files\n") ; - printf (" aiff - test adding strings to AIFF files\n") ; - printf (" flac - test adding strings to FLAC files\n") ; - printf (" ogg - test adding strings to OGG files\n") ; - printf (" all - perform all tests\n") ; - exit (1) ; - } ; - - do_all = ! strcmp (argv [1], "all") ; - - if (do_all || ! strcmp (argv [1], "wav")) - { string_start_end_test ("strings.wav", SF_FORMAT_WAV) ; - string_multi_set_test ("multi.wav", SF_FORMAT_WAV) ; - string_rdwr_test ("rdwr.wav", SF_FORMAT_WAV) ; - string_short_rdwr_test ("short_rdwr.wav", SF_FORMAT_WAV) ; - string_rdwr_grow_test ("rdwr_grow.wav", SF_FORMAT_WAV) ; - string_header_update ("header_update.wav", SF_FORMAT_WAV) ; - - string_start_end_test ("strings.wavex", SF_FORMAT_WAVEX) ; - string_multi_set_test ("multi.wavex", SF_FORMAT_WAVEX) ; - string_rdwr_test ("rdwr.wavex", SF_FORMAT_WAVEX) ; - string_short_rdwr_test ("short_rdwr.wavex", SF_FORMAT_WAVEX) ; - - string_start_end_test ("strings.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ; - string_multi_set_test ("multi.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ; - string_rdwr_test ("rdwr.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ; - string_short_rdwr_test ("short_rdwr.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ; - - software_string_test ("software_string.wav") ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "aiff")) - { string_start_end_test ("strings.aiff", SF_FORMAT_AIFF) ; - /* - TODO : Fix src/aiff.c so these tests pass. - string_multi_set_test ("multi.aiff", SF_FORMAT_AIFF) ; - string_rdwr_test ("rdwr.aiff", SF_FORMAT_AIFF) ; - string_short_rdwr_test ("short_rdwr.aiff", SF_FORMAT_AIFF) ; - string_rdwr_grow_test ("rdwr_grow.aiff", SF_FORMAT_AIFF) ; - string_header_update ("header_update.aiff", SF_FORMAT_AIFF) ; - */ - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "flac")) - { if (HAVE_EXTERNAL_LIBS) - string_start_test ("strings.flac", SF_FORMAT_FLAC) ; - else - puts (" No FLAC tests because FLAC support was not compiled in.") ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "ogg")) - { if (HAVE_EXTERNAL_LIBS) - string_start_test ("vorbis.oga", SF_FORMAT_OGG) ; - else - puts (" No Ogg/Vorbis tests because Ogg/Vorbis support was not compiled in.") ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "rf64")) - { puts ("\n\n **** String test not working yet for RF64 format. ****\n") ; - /* - string_start_end_test ("strings.rf64", SF_FORMAT_RF64) ; - string_multi_set_test ("multi.rf64", SF_FORMAT_RF64) ; - string_rdwr_test ("rdwr.rf64", SF_FORMAT_RF64) ; - string_short_rdwr_test ("short_rdwr.rf64", SF_FORMAT_RF64) ; - */ - test_count++ ; - } ; - - if (test_count == 0) - { printf ("Mono : ************************************\n") ; - printf ("Mono : * No '%s' test defined.\n", argv [1]) ; - printf ("Mono : ************************************\n") ; - return 1 ; - } ; - - return 0 ; -} /* main */ - - -/*============================================================================================ -** Here are the test functions. -*/ - -static const char - software [] = "software (libsndfile-X.Y.Z)", - artist [] = "The Artist", - copyright [] = "Copyright (c) 2001 Artist", - comment [] = "Comment goes here!!!", - date [] = "2001/01/27", - album [] = "The Album", - license [] = "The license", - title [] = "This is the title", - long_title [] = "This is a very long and very boring title for this file", - long_artist [] = "The artist who kept on changing its name", - genre [] = "The genre", - trackno [] = "Track three" ; - - -static short data_out [BUFFER_LEN] ; - -static void -string_start_end_test (const char *filename, int typemajor) -{ const char *cptr ; - SNDFILE *file ; - SF_INFO sfinfo ; - int errors = 0 ; - - print_test_name ("string_start_end_test", filename) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - sfinfo.format = typemajor | SF_FORMAT_PCM_16 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - /* Write stuff at start of file. */ - sf_set_string (file, SF_STR_TITLE, filename) ; - sf_set_string (file, SF_STR_SOFTWARE, software) ; - sf_set_string (file, SF_STR_ARTIST, artist) ; - sf_set_string (file, SF_STR_GENRE, genre) ; - sf_set_string (file, SF_STR_TRACKNUMBER, trackno) ; - - /* Write data to file. */ - test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - /* Write more stuff at end of file. */ - sf_set_string (file, SF_STR_COPYRIGHT, copyright) ; - sf_set_string (file, SF_STR_COMMENT, comment) ; - sf_set_string (file, SF_STR_DATE, date) ; - sf_set_string (file, SF_STR_ALBUM, album) ; - sf_set_string (file, SF_STR_LICENSE, license) ; - - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - check_log_buffer_or_die (file, __LINE__) ; - - if (sfinfo.frames != BUFFER_LEN) - { printf ("***** Bad frame count %d (should be %d)\n\n", (int) sfinfo.frames, BUFFER_LEN) ; - errors ++ ; - } ; - - cptr = sf_get_string (file, SF_STR_TITLE) ; - if (cptr == NULL || strcmp (filename, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad filename : %s\n", cptr) ; - } ; - - cptr = sf_get_string (file, SF_STR_COPYRIGHT) ; - if (cptr == NULL || strcmp (copyright, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad copyright : %s\n", cptr) ; - } ; - - cptr = sf_get_string (file, SF_STR_SOFTWARE) ; - if (cptr == NULL || strstr (cptr, software) != cptr) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad software : %s\n", cptr) ; - } ; - - if (str_count (cptr, "libsndfile") != 1) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad software : %s\n", cptr) ; - } ; - - cptr = sf_get_string (file, SF_STR_ARTIST) ; - if (cptr == NULL || strcmp (artist, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad artist : %s\n", cptr) ; - } ; - - cptr = sf_get_string (file, SF_STR_COMMENT) ; - if (cptr == NULL || strcmp (comment, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad comment : %s\n", cptr) ; - } ; - - if (typemajor != SF_FORMAT_AIFF) - { cptr = sf_get_string (file, SF_STR_DATE) ; - if (cptr == NULL || strcmp (date, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad date : %s\n", cptr) ; - } ; - - cptr = sf_get_string (file, SF_STR_GENRE) ; - if (cptr == NULL || strcmp (genre, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad genre : %s\n", cptr) ; - } ; - } ; - - switch (typemajor) - { case SF_FORMAT_AIFF : - case SF_FORMAT_WAV : - case SF_FORMAT_WAVEX : - case SF_ENDIAN_BIG | SF_FORMAT_WAV : - break ; - - default : - cptr = sf_get_string (file, SF_STR_ALBUM) ; - if (cptr == NULL || strcmp (album, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad album : %s\n", cptr) ; - } ; - - cptr = sf_get_string (file, SF_STR_LICENSE) ; - if (cptr == NULL || strcmp (license, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad license : %s\n", cptr) ; - } ; - - cptr = sf_get_string (file, SF_STR_TRACKNUMBER) ; - if (cptr == NULL || strcmp (genre, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad track no. : %s\n", cptr) ; - } ; - break ; - } ; - - if (errors > 0) - { printf ("\n*** Error count : %d ***\n\n", errors) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - sf_close (file) ; - unlink (filename) ; - - puts ("ok") ; -} /* string_start_end_test */ - -static void -string_start_test (const char *filename, int typemajor) -{ const char *cptr ; - SNDFILE *file ; - SF_INFO sfinfo ; - int errors = 0 ; - - print_test_name ("string_start_test", filename) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - - switch (typemajor) - { case SF_FORMAT_OGG : - sfinfo.format = typemajor | SF_FORMAT_VORBIS ; - break ; - - default : - sfinfo.format = typemajor | SF_FORMAT_PCM_16 ; - break ; - } ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - /* Write stuff at start of file. */ - sf_set_string (file, SF_STR_TITLE, filename) ; - sf_set_string (file, SF_STR_SOFTWARE, software) ; - sf_set_string (file, SF_STR_ARTIST, artist) ; - sf_set_string (file, SF_STR_COPYRIGHT, copyright) ; - sf_set_string (file, SF_STR_COMMENT, comment) ; - sf_set_string (file, SF_STR_DATE, date) ; - sf_set_string (file, SF_STR_ALBUM, album) ; - sf_set_string (file, SF_STR_LICENSE, license) ; - - /* Write data to file. */ - test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; - - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - - check_log_buffer_or_die (file, __LINE__) ; - - if (sfinfo.frames != BUFFER_LEN) - { printf ("***** Bad frame count %d (should be %d)\n\n", (int) sfinfo.frames, BUFFER_LEN) ; - errors ++ ; - } ; - - cptr = sf_get_string (file, SF_STR_TITLE) ; - if (cptr == NULL || strcmp (filename, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad filename : %s\n", cptr) ; - } ; - - cptr = sf_get_string (file, SF_STR_COPYRIGHT) ; - if (cptr == NULL || strcmp (copyright, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad copyright : %s\n", cptr) ; - } ; - - cptr = sf_get_string (file, SF_STR_SOFTWARE) ; - if (cptr == NULL || strstr (cptr, software) != cptr) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad software : %s\n", cptr) ; - } ; - - if (str_count (cptr, "libsndfile") != 1) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad software : %s\n", cptr) ; - } ; - - cptr = sf_get_string (file, SF_STR_ARTIST) ; - if (cptr == NULL || strcmp (artist, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad artist : %s\n", cptr) ; - } ; - - cptr = sf_get_string (file, SF_STR_COMMENT) ; - if (cptr == NULL || strcmp (comment, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad comment : %s\n", cptr) ; - } ; - - if (typemajor != SF_FORMAT_AIFF) - { cptr = sf_get_string (file, SF_STR_DATE) ; - if (cptr == NULL || strcmp (date, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad date : %s\n", cptr) ; - } ; - } ; - - if (typemajor != SF_FORMAT_WAV && typemajor != SF_FORMAT_AIFF) - { cptr = sf_get_string (file, SF_STR_ALBUM) ; - if (cptr == NULL || strcmp (album, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad album : %s\n", cptr) ; - } ; - } ; - - if (typemajor != SF_FORMAT_WAV && typemajor != SF_FORMAT_AIFF) - { cptr = sf_get_string (file, SF_STR_LICENSE) ; - if (cptr == NULL || strcmp (license, cptr) != 0) - { if (errors++ == 0) - puts ("\n") ; - printf (" Bad license : %s\n", cptr) ; - } ; - } ; - - if (errors > 0) - { printf ("\n*** Error count : %d ***\n\n", errors) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - sf_close (file) ; - unlink (filename) ; - - puts ("ok") ; -} /* string_start_test */ - -static void -string_multi_set_test (const char *filename, int typemajor) -{ static const char - new_software [] = "new software (libsndfile-X.Y.Z)", - new_copyright [] = "Copyright (c) 2001 New Artist", - new_artist [] = "The New Artist", - new_title [] = "This is the new title" ; - - static char buffer [2048] ; - SNDFILE *file ; - SF_INFO sfinfo ; - int count ; - - print_test_name (__func__, filename) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.format = typemajor | SF_FORMAT_PCM_16 ; - sfinfo.samplerate = 44100 ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - - /* Write stuff at start of file. */ - sf_set_string (file, SF_STR_TITLE, title) ; - sf_set_string (file, SF_STR_SOFTWARE, software) ; - sf_set_string (file, SF_STR_ARTIST, artist) ; - - /* Write data to file. */ - test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; - - /* Write it all again. */ - - sf_set_string (file, SF_STR_TITLE, new_title) ; - sf_set_string (file, SF_STR_SOFTWARE, new_software) ; - sf_set_string (file, SF_STR_ARTIST, new_artist) ; - - sf_set_string (file, SF_STR_COPYRIGHT, copyright) ; - sf_set_string (file, SF_STR_COMMENT, comment) ; - sf_set_string (file, SF_STR_DATE, date) ; - sf_set_string (file, SF_STR_ALBUM, album) ; - sf_set_string (file, SF_STR_LICENSE, license) ; - sf_set_string (file, SF_STR_COPYRIGHT, new_copyright) ; - sf_set_string (file, SF_STR_COMMENT, comment) ; - sf_set_string (file, SF_STR_DATE, date) ; - sf_set_string (file, SF_STR_ALBUM, album) ; - sf_set_string (file, SF_STR_LICENSE, license) ; - - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - sf_command (file, SFC_GET_LOG_INFO, buffer, sizeof (buffer)) ; - sf_close (file) ; - - count = str_count (buffer, new_title) ; - exit_if_true (count < 1, "\n\nLine %d : Could not find new_title in :\n%s\n", __LINE__, buffer) ; - exit_if_true (count > 1, "\n\nLine %d : new_title appears %d times in :\n\n%s\n", __LINE__, count, buffer) ; - - count = str_count (buffer, software) ; - exit_if_true (count < 1, "\n\nLine %d : Could not find new_software in :\n%s\n", __LINE__, buffer) ; - exit_if_true (count > 1, "\n\nLine %d : new_software appears %d times in :\n\n%s\n", __LINE__, count, buffer) ; - - count = str_count (buffer, new_artist) ; - exit_if_true (count < 1, "\n\nLine %d : Could not find new_artist in :\n%s\n", __LINE__, buffer) ; - exit_if_true (count > 1, "\n\nLine %d : new_artist appears %d times in :\n\n%s\n", __LINE__, count, buffer) ; - - count = str_count (buffer, new_copyright) ; - exit_if_true (count < 1, "\n\nLine %d : Could not find new_copyright in :\n%s\n", __LINE__, buffer) ; - exit_if_true (count > 1, "\n\nLine %d : new_copyright appears %d times in :\n\n%s\n", __LINE__, count, buffer) ; - - unlink (filename) ; - - puts ("ok") ; -} /* string_multi_set_test */ - -static void -string_rdwr_test (const char *filename, int typemajor) -{ SNDFILE *file ; - SF_INFO sfinfo ; - sf_count_t frames ; - const char * str ; - - print_test_name (__func__, filename) ; - create_short_sndfile (filename, typemajor | SF_FORMAT_PCM_16, 2) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ; - frames = sfinfo.frames ; - sf_set_string (file, SF_STR_TITLE, title) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ; - str = sf_get_string (file, SF_STR_TITLE) ; - exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; - exit_if_true (strcmp (str, title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ; - frames = sfinfo.frames ; - sf_set_string (file, SF_STR_TITLE, title) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ; - str = sf_get_string (file, SF_STR_TITLE) ; - exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; - sf_set_string (file, SF_STR_ARTIST, artist) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - str = sf_get_string (file, SF_STR_ARTIST) ; - exit_if_true (str == NULL, "\n\nLine %d : SF_STR_ARTIST string is NULL.\n", __LINE__) ; - exit_if_true (strcmp (str, artist) != 0, "\n\nLine %d : SF_STR_ARTIST doesn't match what was written.\n", __LINE__) ; - - str = sf_get_string (file, SF_STR_TITLE) ; - exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; - exit_if_true (strcmp (str, title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ; - - exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ; - - sf_close (file) ; - unlink (filename) ; - - puts ("ok") ; -} /* string_rdwr_test */ - -static void -string_short_rdwr_test (const char *filename, int typemajor) -{ SNDFILE *file ; - SF_INFO sfinfo ; - sf_count_t frames = BUFFER_LEN ; - const char * str ; - - print_test_name (__func__, filename) ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.format = typemajor | SF_FORMAT_PCM_16 ; - sfinfo.samplerate = 44100 ; - sfinfo.channels = 1 ; - sfinfo.frames = 0 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - - /* Write data to file. */ - test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; - - sf_set_string (file, SF_STR_TITLE, long_title) ; - sf_set_string (file, SF_STR_ARTIST, long_artist) ; - sf_close (file) ; - - /* Open the file RDWR. */ - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ; - exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ; - str = sf_get_string (file, SF_STR_TITLE) ; - exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; - exit_if_true (strcmp (str, long_title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ; - str = sf_get_string (file, SF_STR_ARTIST) ; - exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; - exit_if_true (strcmp (str, long_artist) != 0, "\n\nLine %d : SF_STR_ARTIST doesn't match what was written.\n", __LINE__) ; - - /* Change title and artist. */ - sf_set_string (file, SF_STR_TITLE, title) ; - sf_set_string (file, SF_STR_ARTIST, artist) ; - - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - - check_log_buffer_or_die (file, __LINE__) ; - - str = sf_get_string (file, SF_STR_TITLE) ; - exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; - exit_if_true (strcmp (str, title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ; - - str = sf_get_string (file, SF_STR_ARTIST) ; - exit_if_true (str == NULL, "\n\nLine %d : SF_STR_ARTIST string is NULL.\n", __LINE__) ; - exit_if_true (strcmp (str, artist) != 0, "\n\nLine %d : SF_STR_ARTIST doesn't match what was written.\n", __LINE__) ; - - sf_close (file) ; - unlink (filename) ; - - puts ("ok") ; -} /* string_short_rdwr_test */ - -static int -str_count (const char * haystack, const char * needle) -{ int count = 0 ; - - while ((haystack = strstr (haystack, needle)) != NULL) - { count ++ ; - haystack ++ ; - } ; - - return count ; -} /* str_count */ - -#define MIN(a, b) ((a) < (b) ? (a) : (b)) - -static void -software_string_test (const char *filename) -{ size_t k ; - - print_test_name (__func__, filename) ; - - for (k = 0 ; k < 50 ; k++) - { const char *result ; - char sfname [64] = "" ; - SNDFILE *file ; - SF_INFO info ; - - sf_info_setup (&info, SF_FORMAT_WAV | SF_FORMAT_PCM_16, 44100, 1) ; - file = test_open_file_or_die (filename, SFM_WRITE, &info, SF_TRUE, __LINE__) ; - - snprintf (sfname, MIN (k, sizeof (sfname)), "%s", "abcdefghijklmnopqrestvwxyz0123456789abcdefghijklmnopqrestvwxyz") ; - - exit_if_true (sf_set_string (file, SF_STR_SOFTWARE, sfname), - "\n\nLine %d : sf_set_string (f, SF_STR_SOFTWARE, '%s') failed : %s\n", __LINE__, sfname, sf_strerror (file)) ; - - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &info, SF_TRUE, __LINE__) ; - result = sf_get_string (file, SF_STR_SOFTWARE) ; - - exit_if_true (result == NULL, "\n\nLine %d : sf_get_string (file, SF_STR_SOFTWARE) returned NULL.\n\n", __LINE__) ; - - exit_if_true (strstr (result, sfname) != result, - "\n\nLine %d : Can't fine string '%s' in '%s'\n\n", __LINE__, sfname, result) ; - sf_close (file) ; - } ; - - unlink (filename) ; - puts ("ok") ; -} /* software_string_test */ - - -static void -string_rdwr_grow_test (const char *filename, int typemajor) -{ SNDFILE *file ; - SF_INFO sfinfo ; - sf_count_t frames ; - const char * str ; - - print_test_name (__func__, filename) ; - - /* Create a file that contains some strings. Then open the file in RDWR mode and - grow the file by writing more audio data to it. Check that the audio data has - been added to the file, and that the strings are still there. */ - - /* Create a short file that contains a string. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.channels = 2 ; - sfinfo.frames = 0 ; - sfinfo.format = typemajor | SF_FORMAT_PCM_16 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - /* Write data to file. */ - test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; - - /* Write some strings at end of file. */ - sf_set_string (file, SF_STR_TITLE , title) ; - sf_set_string (file, SF_STR_COMMENT, comment) ; - sf_close (file) ; - - - /* Now open file again in SFM_RDWR mode and write more audio data to it. */ - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; - /* Write more data to file. */ - test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; - sf_close (file) ; - - - /* Now open file again. It should now contain two BUFFER_LEN's worth of frames and the strings. */ - frames = 2 * BUFFER_LEN / sfinfo.channels ; - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ; - - /* Check the strings */ - str = sf_get_string (file, SF_STR_TITLE) ; - exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; - exit_if_true (strcmp (str, title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ; - - str = sf_get_string (file, SF_STR_COMMENT) ; - exit_if_true (str == NULL, "\n\nLine %d : SF_STR_COMMENT string is NULL.\n", __LINE__) ; - exit_if_true (strcmp (str, comment) != 0, "\n\nLine %d : SF_STR_COMMENT doesn't match what was written.\n", __LINE__) ; - - sf_close (file) ; - unlink (filename) ; - - puts ("ok") ; -} /* string_rdwr_grow_test */ - -static void -string_header_update (const char *filename, int typemajor) -{ SNDFILE *file , *file1 ; - SF_INFO sfinfo , sfinfo1 ; - sf_count_t frames ; - const char * str ; - const int GROW_BUFFER_AMOUNT = 4 ; /* this should be less than half the size of the string header */ - - print_test_name (__func__, filename) ; - - /* Create a short file. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.samplerate = 44100 ; - sfinfo.channels = 2 ; - sfinfo.frames = 0 ; - sfinfo.format = typemajor | SF_FORMAT_PCM_16 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; - sf_set_string (file, SF_STR_TITLE, long_title) ; - sf_close (file) ; - - - /* Check that SFC_UPDATE_HEADER_NOW correctly calculates datalength. */ - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; - /* Write a very small amount of new audio data that doesn't completely overwrite the existing header. */ - test_write_short_or_die (file, 0, data_out, GROW_BUFFER_AMOUNT, __LINE__) ; - - /* Update the header without closing the file. */ - sf_command (file, SFC_UPDATE_HEADER_NOW, NULL, 0) ; - - /* The file should now contain BUFFER_LEN + GROW_BUFFER_AMOUNT frames. - Open a second handle to the file and check the reported length. */ - memset (&sfinfo1, 0, sizeof (sfinfo1)) ; - file1 = test_open_file_or_die (filename, SFM_READ, &sfinfo1, SF_TRUE, __LINE__) ; - - frames = (BUFFER_LEN + GROW_BUFFER_AMOUNT) / sfinfo.channels ; - exit_if_true (frames != sfinfo1.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo1.frames, frames) ; - - /* The strings are probably not readable by the second soundfile handle because write_tailer has not yet been called. - It's a design decision whether SFC_UPDATE_HEADER_NOW should write the tailer. I think it's fine that it doesn't. */ - - sf_close (file1) ; - sf_close (file) ; - - - /* Check that sf_close correctly calculates datalength. */ - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; - /* Write a very small amount of new audio data that doesn't completely overwrite the existing header. */ - test_write_short_or_die (file, 0, data_out, GROW_BUFFER_AMOUNT, __LINE__) ; - sf_close (file) ; - - - /* Open file again and verify data and string. */ - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; - frames = (BUFFER_LEN + 2*GROW_BUFFER_AMOUNT) / sfinfo.channels ; - exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ; - str = sf_get_string (file, SF_STR_TITLE) ; - exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; - exit_if_true (strcmp (str, long_title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ; - sf_close (file) ; - unlink (filename) ; - puts ("ok") ; -} /* string_header_update */ diff --git a/libs/libsndfile/tests/test_wrapper.sh.in b/libs/libsndfile/tests/test_wrapper.sh.in deleted file mode 100644 index daf030b05f..0000000000 --- a/libs/libsndfile/tests/test_wrapper.sh.in +++ /dev/null @@ -1,365 +0,0 @@ -#!/bin/sh - -# Copyright (C) 2008-2013 Erik de Castro Lopo -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# * Neither the author nor the names of any contributors may be used -# to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -HOST_TRIPLET=@HOST_TRIPLET@ -PACKAGE_VERSION=@PACKAGE_VERSION@ -LIB_VERSION=`echo $PACKAGE_VERSION | sed "s/[a-z].*//"` - -if test -f tests/sfversion@EXEEXT@ ; then - cd tests - fi - -if test ! -f sfversion@EXEEXT@ ; then - echo "Not able to find test executables." - exit 1 - fi - -if test -f libsndfile.so.$LIB_VERSION ; then - # This will work on Linux, but not on Mac. - # Windows is already sorted out. - export LD_LIBRARY_PATH=`pwd` - if test ! -f libsndfile.so.1 ; then - ln -s libsndfile.so.$LIB_VERSION libsndfile.so.1 - fi - fi - -sfversion=`./sfversion@EXEEXT@ | sed "s/-exp$//"` - -if test $sfversion != libsndfile-$PACKAGE_VERSION ; then - echo "Error : sfversion ($sfversion) and PACKAGE_VERSION ($PACKAGE_VERSION) don't match." - exit 1 - fi - -# Force exit on errors. -set -e - -# Generic-tests -uname -a - -# Check the header file. -sh pedantic-header-test.sh - -# Need this for when we're running from files collected into the -# libsndfile-testsuite-@PACKAGE_VERSION@ tarball. -if test -x test_main@EXEEXT@ ; then - echo "Running unit tests from src/ directory of source code tree." - ./test_main@EXEEXT@ - echo - echo "Running end-to-end tests from tests/ directory." - fi - -./error_test@EXEEXT@ -./pcm_test@EXEEXT@ -./ulaw_test@EXEEXT@ -./alaw_test@EXEEXT@ -./dwvw_test@EXEEXT@ -./command_test@EXEEXT@ ver -./command_test@EXEEXT@ norm -./command_test@EXEEXT@ format -./command_test@EXEEXT@ peak -./command_test@EXEEXT@ trunc -./command_test@EXEEXT@ inst -./command_test@EXEEXT@ current_sf_info -./command_test@EXEEXT@ bext -./command_test@EXEEXT@ bextch -./command_test@EXEEXT@ chanmap -./command_test@EXEEXT@ cart -./floating_point_test@EXEEXT@ -./checksum_test@EXEEXT@ -./scale_clip_test@EXEEXT@ -./headerless_test@EXEEXT@ -./rdwr_test@EXEEXT@ -./locale_test@EXEEXT@ -./win32_ordinal_test@EXEEXT@ -./external_libs_test@EXEEXT@ -./format_check_test@EXEEXT@ -./channel_test@EXEEXT@ - -# The w64 G++ compiler requires an extra runtime DLL which we don't have, -# so skip this test. -case "$HOST_TRIPLET" in - x86_64-w64-mingw32) - ;; - i686-w64-mingw32) - ;; - *) - ./cpp_test@EXEEXT@ - ;; - esac - -echo "----------------------------------------------------------------------" -echo " $sfversion passed common tests." -echo "----------------------------------------------------------------------" - -# aiff-tests -./write_read_test@EXEEXT@ aiff -./lossy_comp_test@EXEEXT@ aiff_ulaw -./lossy_comp_test@EXEEXT@ aiff_alaw -./lossy_comp_test@EXEEXT@ aiff_gsm610 -echo "==========================" -echo "./lossy_comp_test@EXEEXT@ aiff_ima" -echo "==========================" -./peak_chunk_test@EXEEXT@ aiff -./header_test@EXEEXT@ aiff -./misc_test@EXEEXT@ aiff -./string_test@EXEEXT@ aiff -./multi_file_test@EXEEXT@ aiff -./aiff_rw_test@EXEEXT@ -./chunk_test@EXEEXT@ aiff -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on AIFF files." -echo "----------------------------------------------------------------------" - -# au-tests -./write_read_test@EXEEXT@ au -./lossy_comp_test@EXEEXT@ au_ulaw -./lossy_comp_test@EXEEXT@ au_alaw -./lossy_comp_test@EXEEXT@ au_g721 -./lossy_comp_test@EXEEXT@ au_g723 -./header_test@EXEEXT@ au -./misc_test@EXEEXT@ au -./multi_file_test@EXEEXT@ au -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on AU files." -echo "----------------------------------------------------------------------" - -# caf-tests -./write_read_test@EXEEXT@ caf -./lossy_comp_test@EXEEXT@ caf_ulaw -./lossy_comp_test@EXEEXT@ caf_alaw -./header_test@EXEEXT@ caf -./peak_chunk_test@EXEEXT@ caf -./misc_test@EXEEXT@ caf -./chunk_test@EXEEXT@ caf -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on CAF files." -echo "----------------------------------------------------------------------" - -# wav-tests -./write_read_test@EXEEXT@ wav -./lossy_comp_test@EXEEXT@ wav_pcm -./lossy_comp_test@EXEEXT@ wav_ima -./lossy_comp_test@EXEEXT@ wav_msadpcm -./lossy_comp_test@EXEEXT@ wav_ulaw -./lossy_comp_test@EXEEXT@ wav_alaw -./lossy_comp_test@EXEEXT@ wav_gsm610 -./lossy_comp_test@EXEEXT@ wav_g721 -./peak_chunk_test@EXEEXT@ wav -./header_test@EXEEXT@ wav -./misc_test@EXEEXT@ wav -./string_test@EXEEXT@ wav -./multi_file_test@EXEEXT@ wav -./chunk_test@EXEEXT@ wav -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on WAV files." -echo "----------------------------------------------------------------------" - -# w64-tests -./write_read_test@EXEEXT@ w64 -./lossy_comp_test@EXEEXT@ w64_ima -./lossy_comp_test@EXEEXT@ w64_msadpcm -./lossy_comp_test@EXEEXT@ w64_ulaw -./lossy_comp_test@EXEEXT@ w64_alaw -./lossy_comp_test@EXEEXT@ w64_gsm610 -./header_test@EXEEXT@ w64 -./misc_test@EXEEXT@ w64 -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on W64 files." -echo "----------------------------------------------------------------------" - -# rf64-tests -./write_read_test@EXEEXT@ rf64 -./header_test@EXEEXT@ rf64 -./misc_test@EXEEXT@ rf64 -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on RF64 files." -echo "----------------------------------------------------------------------" - -# raw-tests -./write_read_test@EXEEXT@ raw -./lossy_comp_test@EXEEXT@ raw_ulaw -./lossy_comp_test@EXEEXT@ raw_alaw -./lossy_comp_test@EXEEXT@ raw_gsm610 -./lossy_comp_test@EXEEXT@ vox_adpcm -./raw_test@EXEEXT@ -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on RAW (header-less) files." -echo "----------------------------------------------------------------------" - -# paf-tests -./write_read_test@EXEEXT@ paf -./header_test@EXEEXT@ paf -./misc_test@EXEEXT@ paf -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on PAF files." -echo "----------------------------------------------------------------------" - -# svx-tests -./write_read_test@EXEEXT@ svx -./header_test@EXEEXT@ svx -./misc_test@EXEEXT@ svx -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on SVX files." -echo "----------------------------------------------------------------------" - -# nist-tests -./write_read_test@EXEEXT@ nist -./lossy_comp_test@EXEEXT@ nist_ulaw -./lossy_comp_test@EXEEXT@ nist_alaw -./header_test@EXEEXT@ nist -./misc_test@EXEEXT@ nist -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on NIST files." -echo "----------------------------------------------------------------------" - -# ircam-tests -./write_read_test@EXEEXT@ ircam -./lossy_comp_test@EXEEXT@ ircam_ulaw -./lossy_comp_test@EXEEXT@ ircam_alaw -./header_test@EXEEXT@ ircam -./misc_test@EXEEXT@ ircam -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on IRCAM files." -echo "----------------------------------------------------------------------" - -# voc-tests -./write_read_test@EXEEXT@ voc -./lossy_comp_test@EXEEXT@ voc_ulaw -./lossy_comp_test@EXEEXT@ voc_alaw -./header_test@EXEEXT@ voc -./misc_test@EXEEXT@ voc -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on VOC files." -echo "----------------------------------------------------------------------" - -# mat4-tests -./write_read_test@EXEEXT@ mat4 -./header_test@EXEEXT@ mat4 -./misc_test@EXEEXT@ mat4 -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on MAT4 files." -echo "----------------------------------------------------------------------" - -# mat5-tests -./write_read_test@EXEEXT@ mat5 -./header_test@EXEEXT@ mat5 -./misc_test@EXEEXT@ mat5 -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on MAT5 files." -echo "----------------------------------------------------------------------" - -# pvf-tests -./write_read_test@EXEEXT@ pvf -./header_test@EXEEXT@ pvf -./misc_test@EXEEXT@ pvf -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on PVF files." -echo "----------------------------------------------------------------------" - -# xi-tests -./lossy_comp_test@EXEEXT@ xi_dpcm -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on XI files." -echo "----------------------------------------------------------------------" - -# htk-tests -./write_read_test@EXEEXT@ htk -./header_test@EXEEXT@ htk -./misc_test@EXEEXT@ htk -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on HTK files." -echo "----------------------------------------------------------------------" - -# avr-tests -./write_read_test@EXEEXT@ avr -./header_test@EXEEXT@ avr -./misc_test@EXEEXT@ avr -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on AVR files." -echo "----------------------------------------------------------------------" - -# sds-tests -./write_read_test@EXEEXT@ sds -./header_test@EXEEXT@ sds -./misc_test@EXEEXT@ sds -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on SDS files." -echo "----------------------------------------------------------------------" - -# sd2-tests -./write_read_test@EXEEXT@ sd2 -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on SD2 files." -echo "----------------------------------------------------------------------" - -# wve-tests -./lossy_comp_test@EXEEXT@ wve -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on WVE files." -echo "----------------------------------------------------------------------" - -# mpc2k-tests -./write_read_test@EXEEXT@ mpc2k -./header_test@EXEEXT@ mpc2k -./misc_test@EXEEXT@ mpc2k -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on MPC 2000 files." -echo "----------------------------------------------------------------------" - -# flac-tests -./write_read_test@EXEEXT@ flac -./compression_size_test@EXEEXT@ flac -./string_test@EXEEXT@ flac -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on FLAC files." -echo "----------------------------------------------------------------------" - -# vorbis-tests -./ogg_test@EXEEXT@ -./compression_size_test@EXEEXT@ vorbis -./lossy_comp_test@EXEEXT@ ogg_vorbis -./string_test@EXEEXT@ ogg -./misc_test@EXEEXT@ ogg -echo "----------------------------------------------------------------------" -echo " $sfversion passed tests on OGG/VORBIS files." -echo "----------------------------------------------------------------------" - -# io-tests -./stdio_test@EXEEXT@ -./pipe_test@EXEEXT@ -./virtual_io_test@EXEEXT@ -echo "----------------------------------------------------------------------" -echo " $sfversion passed stdio/pipe/vio tests." -echo "----------------------------------------------------------------------" - - diff --git a/libs/libsndfile/tests/ulaw_test.c b/libs/libsndfile/tests/ulaw_test.c deleted file mode 100644 index fc0d497aa0..0000000000 --- a/libs/libsndfile/tests/ulaw_test.c +++ /dev/null @@ -1,257 +0,0 @@ -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" - -#define BUFFER_SIZE (65536) - -static unsigned char ulaw_encode (int sample) ; -static int ulaw_decode (unsigned int ulawbyte) ; - -static short short_buffer [BUFFER_SIZE] ; -static unsigned char ulaw_buffer [BUFFER_SIZE] ; - -int -main (void) -{ SNDFILE *file ; - SF_INFO sfinfo ; - const char *filename ; - int k ; - - print_test_name ("ulaw_test", "encoder") ; - - filename = "test.raw" ; - - sf_info_setup (&sfinfo, SF_FORMAT_RAW | SF_FORMAT_ULAW, 44100, 1) ; - - if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) - { printf ("sf_open_write failed with error : ") ; - fflush (stdout) ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - /* Generate a file containing all possible 16 bit sample values - ** and write it to disk as ulaw encoded.frames. - */ - - for (k = 0 ; k < 0x10000 ; k++) - short_buffer [k] = k & 0xFFFF ; - - sf_write_short (file, short_buffer, BUFFER_SIZE) ; - sf_close (file) ; - - /* Now open that file and compare the ulaw encoded sample values - ** with what they should be. - */ - - if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) - { printf ("sf_open_write failed with error : ") ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - if (sf_read_raw (file, ulaw_buffer, BUFFER_SIZE) != BUFFER_SIZE) - { printf ("sf_read_raw : ") ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - for (k = 0 ; k < 0x10000 ; k++) - if (ulaw_encode (short_buffer [k]) != ulaw_buffer [k]) - { printf ("Encoder error : sample #%d (0x%02X should be 0x%02X)\n", k, ulaw_buffer [k], ulaw_encode (short_buffer [k])) ; - exit (1) ; - } ; - - sf_close (file) ; - - puts ("ok") ; - - print_test_name ("ulaw_test", "decoder") ; - - /* Now generate a file containing all possible 8 bit encoded - ** sample values and write it to disk as ulaw encoded.frames. - */ - - if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) - { printf ("sf_open_write failed with error : ") ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - for (k = 0 ; k < 256 ; k++) - ulaw_buffer [k] = k & 0xFF ; - - sf_write_raw (file, ulaw_buffer, 256) ; - sf_close (file) ; - - /* Now open that file and compare the ulaw decoded sample values - ** with what they should be. - */ - - if (! (file = sf_open (filename, SFM_READ, &sfinfo))) - { printf ("sf_open_write failed with error : ") ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - if (sf_read_short (file, short_buffer, 256) != 256) - { printf ("sf_read_short : ") ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - - for (k = 0 ; k < 256 ; k++) - if (short_buffer [k] != ulaw_decode (ulaw_buffer [k])) - { printf ("Decoder error : sample #%d (0x%04X should be 0x%04X)\n", k, short_buffer [k], ulaw_decode (ulaw_buffer [k])) ; - exit (1) ; - } ; - - sf_close (file) ; - - puts ("ok") ; - - unlink (filename) ; - - return 0 ; -} /* main */ - - -/*================================================================================= -** The following routines came from the sox-12.15 (Sound eXcahcnge) distribution. -** -** This code is not compiled into libsndfile. It is only used to test the -** libsndfile lookup tables for correctness. -** -** I have included the original authors comments. -*/ - -/* -** This routine converts from linear to ulaw. -** -** Craig Reese: IDA/Supercomputing Research Center -** Joe Campbell: Department of Defense -** 29 September 1989 -** -** References: -** 1) CCITT Recommendation G.711 (very difficult to follow) -** 2) "A New Digital Technique for Implementation of Any -** Continuous PCM Companding Law," Villeret, Michel, -** et al. 1973 IEEE Int. Conf. on Communications, Vol 1, -** 1973, pg. 11.12-11.17 -** 3) MIL-STD-188-113,"Interoperability and Performance Standards -** for Analog-to_Digital Conversion Techniques," -** 17 February 1987 -** -** Input: Signed 16 bit linear sample -** Output: 8 bit ulaw sample -*/ - -#define uBIAS 0x84 /* define the add-in bias for 16 bit.frames */ -#define uCLIP 32635 - -static -unsigned char ulaw_encode (int sample) -{ static int exp_lut [256] = - { 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 - } ; - - int sign, exponent, mantissa ; - unsigned char ulawbyte ; - - /* Get the sample into sign-magnitude. */ - sign = (sample >> 8) & 0x80 ; /* set aside the sign */ - if (sign != 0) - sample = -sample ; /* get magnitude */ - if (sample > uCLIP) - sample = uCLIP ; /* clip the magnitude */ - - /* Convert from 16 bit linear to ulaw. */ - sample = sample + uBIAS ; - exponent = exp_lut [(sample >> 7) & 0xFF] ; - mantissa = (sample >> (exponent + 3)) & 0x0F ; - ulawbyte = ~ (sign | (exponent << 4) | mantissa) ; - - return ulawbyte ; -} /* ulaw_encode */ - - -/* -** This routine converts from ulaw to 16 bit linear. -** -** Craig Reese: IDA/Supercomputing Research Center -** 29 September 1989 -** -** References: -** 1) CCITT Recommendation G.711 (very difficult to follow) -** 2) MIL-STD-188-113,"Interoperability and Performance Standards -** for Analog-to_Digital Conversion Techniques," -** 17 February 1987 -** -** Input: 8 bit ulaw sample -** Output: signed 16 bit linear sample -*/ - -static -int ulaw_decode (unsigned int ulawbyte) -{ static int exp_lut [8] = { 0, 132, 396, 924, 1980, 4092, 8316, 16764 } ; - int sign, exponent, mantissa, sample ; - - ulawbyte = ~ ulawbyte ; - sign = (ulawbyte & 0x80) ; - exponent = (ulawbyte >> 4) & 0x07 ; - mantissa = ulawbyte & 0x0F ; - sample = exp_lut [exponent] + (mantissa << (exponent + 3)) ; - if (sign != 0) - sample = -sample ; - - return sample ; -} /* ulaw_decode */ - diff --git a/libs/libsndfile/tests/utils.c b/libs/libsndfile/tests/utils.c deleted file mode 100644 index 882c969ab1..0000000000 --- a/libs/libsndfile/tests/utils.c +++ /dev/null @@ -1,1162 +0,0 @@ -/* -** Copyright (C) 2002-2011 Erik de Castro Lopo -** -** 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. -*/ - -/* -** Utility functions to make writing the test suite easier. -** -** The .c and .h files were generated automagically with Autogen from -** the files utils.def and utils.tpl. -*/ - - - -#include "sfconfig.h" - -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if (HAVE_DECL_S_IRGRP == 0) -#include -#endif - -#include -#include -#include -#include -#include -#include - -#include - -#include "utils.h" - -#ifndef M_PI -#define M_PI 3.14159265358979323846264338 -#endif - -#define LOG_BUFFER_SIZE 2048 - -/* -** Neat solution to the Win32/OS2 binary file flage requirement. -** If O_BINARY isn't already defined by the inclusion of the system -** headers, set it to zero. -*/ -#ifndef O_BINARY -#define O_BINARY 0 -#endif - - -void -gen_windowed_sine_float (float *data, int len, double maximum) -{ int k ; - - memset (data, 0, len * sizeof (float)) ; - /* - ** Choose a frequency of 1/32 so that it aligns perfectly with a DFT - ** bucket to minimise spreading of energy over more than one bucket. - ** Also do not want to make the frequency too high as some of the - ** codecs (ie gsm610) have a quite severe high frequency roll off. - */ - len /= 2 ; - - for (k = 0 ; k < len ; k++) - { data [k] = sin (2.0 * k * M_PI * 1.0 / 32.0 + 0.4) ; - - /* Apply Hanning Window. */ - data [k] *= maximum * (0.5 - 0.5 * cos (2.0 * M_PI * k / ((len) - 1))) ; - } - - return ; -} /* gen_windowed_sine_float */ - -void -gen_windowed_sine_double (double *data, int len, double maximum) -{ int k ; - - memset (data, 0, len * sizeof (double)) ; - /* - ** Choose a frequency of 1/32 so that it aligns perfectly with a DFT - ** bucket to minimise spreading of energy over more than one bucket. - ** Also do not want to make the frequency too high as some of the - ** codecs (ie gsm610) have a quite severe high frequency roll off. - */ - len /= 2 ; - - for (k = 0 ; k < len ; k++) - { data [k] = sin (2.0 * k * M_PI * 1.0 / 32.0 + 0.4) ; - - /* Apply Hanning Window. */ - data [k] *= maximum * (0.5 - 0.5 * cos (2.0 * M_PI * k / ((len) - 1))) ; - } - - return ; -} /* gen_windowed_sine_double */ - - -void -create_short_sndfile (const char *filename, int format, int channels) -{ short data [2 * 3 * 4 * 5 * 6 * 7] = { 0, } ; - SNDFILE *file ; - SF_INFO sfinfo ; - - sfinfo.samplerate = 44100 ; - sfinfo.channels = channels ; - sfinfo.format = format ; - - if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) - { printf ("Error (%s, %d) : sf_open failed : %s\n", __FILE__, __LINE__, sf_strerror (file)) ; - exit (1) ; - } ; - - sf_write_short (file, data, ARRAY_LEN (data)) ; - - sf_close (file) ; -} /* create_short_sndfile */ - -void -check_file_hash_or_die (const char *filename, uint64_t target_hash, int line_num) -{ static unsigned char buf [4096] ; - uint64_t cksum ; - FILE *file ; - int k, read_count ; - - memset (buf, 0, sizeof (buf)) ; - - /* The 'b' in the mode string means binary for Win32. */ - if ((file = fopen (filename, "rb")) == NULL) - { printf ("\n\nLine %d: could not open file '%s'\n\n", line_num, filename) ; - exit (1) ; - } ; - - cksum = 0 ; - - while ((read_count = fread (buf, 1, sizeof (buf), file))) - for (k = 0 ; k < read_count ; k++) - cksum = cksum * 511 + buf [k] ; - - fclose (file) ; - - if (target_hash == 0) - { printf (" 0x%016" PRIx64 "\n", cksum) ; - return ; - } ; - - if (cksum != target_hash) - { printf ("\n\nLine %d: incorrect hash value 0x%016" PRIx64 " should be 0x%016" PRIx64 ".\n\n", line_num, cksum, target_hash) ; - exit (1) ; - } ; - - return ; -} /* check_file_hash_or_die */ - -void -print_test_name (const char *test, const char *filename) -{ int count ; - - if (test == NULL) - { printf (__FILE__ ": bad test of filename parameter.\n") ; - exit (1) ; - } ; - - if (filename == NULL || strlen (filename) == 0) - { printf (" %-30s : ", test) ; - count = 25 ; - } - else - { printf (" %-30s : %s ", test, filename) ; - count = 24 - strlen (filename) ; - } ; - - while (count -- > 0) - putchar ('.') ; - putchar (' ') ; - - fflush (stdout) ; -} /* print_test_name */ - -void -dump_data_to_file (const char *filename, const void *data, unsigned int datalen) -{ FILE *file ; - - if ((file = fopen (filename, "wb")) == NULL) - { printf ("\n\nLine %d : could not open file : %s\n\n", __LINE__, filename) ; - exit (1) ; - } ; - - if (fwrite (data, 1, datalen, file) != datalen) - { printf ("\n\nLine %d : fwrite failed.\n\n", __LINE__) ; - exit (1) ; - } ; - - fclose (file) ; - -} /* dump_data_to_file */ - -/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -*/ - -static char octfilename [] = "error.dat" ; - -int -oct_save_short (const short *a, const short *b, int len) -{ FILE *file ; - int k ; - - if (! (file = fopen (octfilename, "w"))) - return 1 ; - - fprintf (file, "# Not created by Octave\n") ; - - fprintf (file, "# name: a\n") ; - fprintf (file, "# type: matrix\n") ; - fprintf (file, "# rows: %d\n", len) ; - fprintf (file, "# columns: 1\n") ; - - for (k = 0 ; k < len ; k++) - fprintf (file, "% d" "\n", a [k]) ; - - fprintf (file, "# name: b\n") ; - fprintf (file, "# type: matrix\n") ; - fprintf (file, "# rows: %d\n", len) ; - fprintf (file, "# columns: 1\n") ; - - for (k = 0 ; k < len ; k++) - fprintf (file, "% d" "\n", b [k]) ; - - fclose (file) ; - return 0 ; -} /* oct_save_short */ -int -oct_save_int (const int *a, const int *b, int len) -{ FILE *file ; - int k ; - - if (! (file = fopen (octfilename, "w"))) - return 1 ; - - fprintf (file, "# Not created by Octave\n") ; - - fprintf (file, "# name: a\n") ; - fprintf (file, "# type: matrix\n") ; - fprintf (file, "# rows: %d\n", len) ; - fprintf (file, "# columns: 1\n") ; - - for (k = 0 ; k < len ; k++) - fprintf (file, "% d" "\n", a [k]) ; - - fprintf (file, "# name: b\n") ; - fprintf (file, "# type: matrix\n") ; - fprintf (file, "# rows: %d\n", len) ; - fprintf (file, "# columns: 1\n") ; - - for (k = 0 ; k < len ; k++) - fprintf (file, "% d" "\n", b [k]) ; - - fclose (file) ; - return 0 ; -} /* oct_save_int */ -int -oct_save_float (const float *a, const float *b, int len) -{ FILE *file ; - int k ; - - if (! (file = fopen (octfilename, "w"))) - return 1 ; - - fprintf (file, "# Not created by Octave\n") ; - - fprintf (file, "# name: a\n") ; - fprintf (file, "# type: matrix\n") ; - fprintf (file, "# rows: %d\n", len) ; - fprintf (file, "# columns: 1\n") ; - - for (k = 0 ; k < len ; k++) - fprintf (file, "% g" "\n", a [k]) ; - - fprintf (file, "# name: b\n") ; - fprintf (file, "# type: matrix\n") ; - fprintf (file, "# rows: %d\n", len) ; - fprintf (file, "# columns: 1\n") ; - - for (k = 0 ; k < len ; k++) - fprintf (file, "% g" "\n", b [k]) ; - - fclose (file) ; - return 0 ; -} /* oct_save_float */ -int -oct_save_double (const double *a, const double *b, int len) -{ FILE *file ; - int k ; - - if (! (file = fopen (octfilename, "w"))) - return 1 ; - - fprintf (file, "# Not created by Octave\n") ; - - fprintf (file, "# name: a\n") ; - fprintf (file, "# type: matrix\n") ; - fprintf (file, "# rows: %d\n", len) ; - fprintf (file, "# columns: 1\n") ; - - for (k = 0 ; k < len ; k++) - fprintf (file, "% g" "\n", a [k]) ; - - fprintf (file, "# name: b\n") ; - fprintf (file, "# type: matrix\n") ; - fprintf (file, "# rows: %d\n", len) ; - fprintf (file, "# columns: 1\n") ; - - for (k = 0 ; k < len ; k++) - fprintf (file, "% g" "\n", b [k]) ; - - fclose (file) ; - return 0 ; -} /* oct_save_double */ - - -void -check_log_buffer_or_die (SNDFILE *file, int line_num) -{ static char buffer [LOG_BUFFER_SIZE] ; - int count ; - - memset (buffer, 0, sizeof (buffer)) ; - - /* Get the log buffer data. */ - count = sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ; - - if (LOG_BUFFER_SIZE - count < 2) - { printf ("\n\nLine %d : Possible long log buffer.\n", line_num) ; - exit (1) ; - } - - /* Look for "Should" */ - if (strstr (buffer, "ould")) - { printf ("\n\nLine %d : Log buffer contains `ould'. Dumping.\n", line_num) ; - puts (buffer) ; - exit (1) ; - } ; - - /* Look for "**" */ - if (strstr (buffer, "*")) - { printf ("\n\nLine %d : Log buffer contains `*'. Dumping.\n", line_num) ; - puts (buffer) ; - exit (1) ; - } ; - - /* Look for "Should" */ - if (strstr (buffer, "nknown marker")) - { printf ("\n\nLine %d : Log buffer contains `nknown marker'. Dumping.\n", line_num) ; - puts (buffer) ; - exit (1) ; - } ; - - return ; -} /* check_log_buffer_or_die */ - -int -string_in_log_buffer (SNDFILE *file, const char *s) -{ static char buffer [LOG_BUFFER_SIZE] ; - int count ; - - memset (buffer, 0, sizeof (buffer)) ; - - /* Get the log buffer data. */ - count = sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ; - - if (LOG_BUFFER_SIZE - count < 2) - { printf ("Possible long log buffer.\n") ; - exit (1) ; - } - - /* Look for string */ - return strstr (buffer, s) ? SF_TRUE : SF_FALSE ; -} /* string_in_log_buffer */ - -void -hexdump_file (const char * filename, sf_count_t offset, sf_count_t length) -{ - FILE * file ; - char buffer [16] ; - int k, m, ch, readcount ; - - if (length > 1000000) - { printf ("\n\nError : length (%ld) too long.\n\n", SF_COUNT_TO_LONG (offset)) ; - exit (1) ; - } ; - - if ((file = fopen (filename, "r")) == NULL) - { printf ("\n\nError : hexdump_file (%s) could not open file for read.\n\n", filename) ; - exit (1) ; - } ; - - if (fseek (file, offset, SEEK_SET) != 0) - { printf ("\n\nError : fseek(file, %ld, SEEK_SET) failed : %s\n\n", SF_COUNT_TO_LONG (offset), strerror (errno)) ; - exit (1) ; - } ; - - puts ("\n\n") ; - - for (k = 0 ; k < length ; k+= sizeof (buffer)) - { readcount = fread (buffer, 1, sizeof (buffer), file) ; - - printf ("%08lx : ", SF_COUNT_TO_LONG (offset + k)) ; - - for (m = 0 ; m < readcount ; m++) - printf ("%02x ", buffer [m] & 0xFF) ; - - for (m = readcount ; m < SIGNED_SIZEOF (buffer) ; m++) - printf (" ") ; - - printf (" ") ; - for (m = 0 ; m < readcount ; m++) - { ch = isprint (buffer [m]) ? buffer [m] : '.' ; - putchar (ch) ; - } ; - - if (readcount < SIGNED_SIZEOF (buffer)) - break ; - - putchar ('\n') ; - } ; - - puts ("\n") ; - - fclose (file) ; -} /* hexdump_file */ - -void -dump_log_buffer (SNDFILE *file) -{ static char buffer [LOG_BUFFER_SIZE] ; - - memset (buffer, 0, sizeof (buffer)) ; - - /* Get the log buffer data. */ - sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ; - - if (strlen (buffer) < 1) - puts ("Log buffer empty.\n") ; - else - puts (buffer) ; - - return ; -} /* dump_log_buffer */ - -SNDFILE * -test_open_file_or_die (const char *filename, int mode, SF_INFO *sfinfo, int allow_fd, int line_num) -{ static int count = 0 ; - - SNDFILE *file ; - const char *modestr, *func_name ; - int oflags = 0, omode = 0, err ; - - /* - ** Need to test both sf_open() and sf_open_fd(). - ** Do so alternately. - */ - switch (mode) - { case SFM_READ : - modestr = "SFM_READ" ; - oflags = O_RDONLY | O_BINARY ; - omode = 0 ; - break ; - - case SFM_WRITE : - modestr = "SFM_WRITE" ; - oflags = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ; - omode = S_IRUSR | S_IWUSR | S_IRGRP ; - break ; - - case SFM_RDWR : - modestr = "SFM_RDWR" ; - oflags = O_RDWR | O_CREAT | O_BINARY ; - omode = S_IRUSR | S_IWUSR | S_IRGRP ; - break ; - default : - printf ("\n\nLine %d: Bad mode.\n", line_num) ; - fflush (stdout) ; - exit (1) ; - } ; - - if (OS_IS_WIN32) - { /* Windows does not understand and ignores the S_IRGRP flag, but Wine - ** gives a run time warning message, so just clear it. - */ - omode &= ~S_IRGRP ; - } ; - - if (allow_fd && ((++count) & 1) == 1) - { int fd ; - - /* Only use the three argument open() function if omode != 0. */ - fd = (omode == 0) ? open (filename, oflags) : open (filename, oflags, omode) ; - - if (fd < 0) - { printf ("\n\n%s : open failed : %s\n", __func__, strerror (errno)) ; - exit (1) ; - } ; - - func_name = "sf_open_fd" ; - file = sf_open_fd (fd, mode, sfinfo, SF_TRUE) ; - } - else - { func_name = "sf_open" ; - file = sf_open (filename, mode, sfinfo) ; - } ; - - if (file == NULL) - { printf ("\n\nLine %d: %s (%s) failed : %s\n\n", line_num, func_name, modestr, sf_strerror (NULL)) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - err = sf_error (file) ; - if (err != SF_ERR_NO_ERROR) - { printf ("\n\nLine %d : sf_error : %s\n\n", line_num, sf_error_number (err)) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - return file ; -} /* test_open_file_or_die */ - -void -test_read_write_position_or_die (SNDFILE *file, int line_num, int pass, sf_count_t read_pos, sf_count_t write_pos) -{ sf_count_t pos ; - - /* Check the current read position. */ - if (read_pos >= 0 && (pos = sf_seek (file, 0, SEEK_CUR | SFM_READ)) != read_pos) - { printf ("\n\nLine %d ", line_num) ; - if (pass > 0) - printf ("(pass %d): ", pass) ; - printf ("Read position (%ld) should be %ld.\n", SF_COUNT_TO_LONG (pos), SF_COUNT_TO_LONG (read_pos)) ; - exit (1) ; - } ; - - /* Check the current write position. */ - if (write_pos >= 0 && (pos = sf_seek (file, 0, SEEK_CUR | SFM_WRITE)) != write_pos) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : Write position (%ld) should be %ld.\n", - SF_COUNT_TO_LONG (pos), SF_COUNT_TO_LONG (write_pos)) ; - exit (1) ; - } ; - - return ; -} /* test_read_write_position */ - -void -test_seek_or_die (SNDFILE *file, sf_count_t offset, int whence, sf_count_t new_pos, int channels, int line_num) -{ sf_count_t position ; - const char *channel_name, *whence_name ; - - switch (whence) - { case SEEK_SET : - whence_name = "SEEK_SET" ; - break ; - case SEEK_CUR : - whence_name = "SEEK_CUR" ; - break ; - case SEEK_END : - whence_name = "SEEK_END" ; - break ; - - /* SFM_READ */ - case SEEK_SET | SFM_READ : - whence_name = "SFM_READ | SEEK_SET" ; - break ; - case SEEK_CUR | SFM_READ : - whence_name = "SFM_READ | SEEK_CUR" ; - break ; - case SEEK_END | SFM_READ : - whence_name = "SFM_READ | SEEK_END" ; - break ; - - /* SFM_WRITE */ - case SEEK_SET | SFM_WRITE : - whence_name = "SFM_WRITE | SEEK_SET" ; - break ; - case SEEK_CUR | SFM_WRITE : - whence_name = "SFM_WRITE | SEEK_CUR" ; - break ; - case SEEK_END | SFM_WRITE : - whence_name = "SFM_WRITE | SEEK_END" ; - break ; - - default : - printf ("\n\nLine %d: bad whence parameter.\n", line_num) ; - exit (1) ; - } ; - - channel_name = (channels == 1) ? "Mono" : "Stereo" ; - - if ((position = sf_seek (file, offset, whence)) != new_pos) - { printf ("\n\nLine %d : %s : sf_seek (file, %ld, %s) returned %ld (should be %ld).\n\n", - line_num, channel_name, SF_COUNT_TO_LONG (offset), whence_name, - SF_COUNT_TO_LONG (position), SF_COUNT_TO_LONG (new_pos)) ; - exit (1) ; - } ; - -} /* test_seek_or_die */ - - - -void -test_read_short_or_die (SNDFILE *file, int pass, short *test, sf_count_t items, int line_num) -{ sf_count_t count ; - - if ((count = sf_read_short (file, test, items)) != items) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_read_short failed with short read (%ld => %ld).\n", - SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_read_short_or_die */ - -void -test_read_int_or_die (SNDFILE *file, int pass, int *test, sf_count_t items, int line_num) -{ sf_count_t count ; - - if ((count = sf_read_int (file, test, items)) != items) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_read_int failed with short read (%ld => %ld).\n", - SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_read_int_or_die */ - -void -test_read_float_or_die (SNDFILE *file, int pass, float *test, sf_count_t items, int line_num) -{ sf_count_t count ; - - if ((count = sf_read_float (file, test, items)) != items) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_read_float failed with short read (%ld => %ld).\n", - SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_read_float_or_die */ - -void -test_read_double_or_die (SNDFILE *file, int pass, double *test, sf_count_t items, int line_num) -{ sf_count_t count ; - - if ((count = sf_read_double (file, test, items)) != items) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_read_double failed with short read (%ld => %ld).\n", - SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_read_double_or_die */ - - -void -test_readf_short_or_die (SNDFILE *file, int pass, short *test, sf_count_t frames, int line_num) -{ sf_count_t count ; - - if ((count = sf_readf_short (file, test, frames)) != frames) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_readf_short failed with short readf (%ld => %ld).\n", - SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_readf_short_or_die */ - -void -test_readf_int_or_die (SNDFILE *file, int pass, int *test, sf_count_t frames, int line_num) -{ sf_count_t count ; - - if ((count = sf_readf_int (file, test, frames)) != frames) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_readf_int failed with short readf (%ld => %ld).\n", - SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_readf_int_or_die */ - -void -test_readf_float_or_die (SNDFILE *file, int pass, float *test, sf_count_t frames, int line_num) -{ sf_count_t count ; - - if ((count = sf_readf_float (file, test, frames)) != frames) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_readf_float failed with short readf (%ld => %ld).\n", - SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_readf_float_or_die */ - -void -test_readf_double_or_die (SNDFILE *file, int pass, double *test, sf_count_t frames, int line_num) -{ sf_count_t count ; - - if ((count = sf_readf_double (file, test, frames)) != frames) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_readf_double failed with short readf (%ld => %ld).\n", - SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_readf_double_or_die */ - - -void -test_read_raw_or_die (SNDFILE *file, int pass, void *test, sf_count_t items, int line_num) -{ sf_count_t count ; - - if ((count = sf_read_raw (file, test, items)) != items) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_read_raw failed with short read (%ld => %ld).\n", - SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_read_raw_or_die */ - - - -void -test_write_short_or_die (SNDFILE *file, int pass, const short *test, sf_count_t items, int line_num) -{ sf_count_t count ; - - if ((count = sf_write_short (file, test, items)) != items) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_write_short failed with short write (%ld => %ld).\n", - SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_write_short_or_die */ - -void -test_write_int_or_die (SNDFILE *file, int pass, const int *test, sf_count_t items, int line_num) -{ sf_count_t count ; - - if ((count = sf_write_int (file, test, items)) != items) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_write_int failed with short write (%ld => %ld).\n", - SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_write_int_or_die */ - -void -test_write_float_or_die (SNDFILE *file, int pass, const float *test, sf_count_t items, int line_num) -{ sf_count_t count ; - - if ((count = sf_write_float (file, test, items)) != items) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_write_float failed with short write (%ld => %ld).\n", - SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_write_float_or_die */ - -void -test_write_double_or_die (SNDFILE *file, int pass, const double *test, sf_count_t items, int line_num) -{ sf_count_t count ; - - if ((count = sf_write_double (file, test, items)) != items) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_write_double failed with short write (%ld => %ld).\n", - SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_write_double_or_die */ - - -void -test_writef_short_or_die (SNDFILE *file, int pass, const short *test, sf_count_t frames, int line_num) -{ sf_count_t count ; - - if ((count = sf_writef_short (file, test, frames)) != frames) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_writef_short failed with short writef (%ld => %ld).\n", - SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_writef_short_or_die */ - -void -test_writef_int_or_die (SNDFILE *file, int pass, const int *test, sf_count_t frames, int line_num) -{ sf_count_t count ; - - if ((count = sf_writef_int (file, test, frames)) != frames) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_writef_int failed with short writef (%ld => %ld).\n", - SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_writef_int_or_die */ - -void -test_writef_float_or_die (SNDFILE *file, int pass, const float *test, sf_count_t frames, int line_num) -{ sf_count_t count ; - - if ((count = sf_writef_float (file, test, frames)) != frames) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_writef_float failed with short writef (%ld => %ld).\n", - SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_writef_float_or_die */ - -void -test_writef_double_or_die (SNDFILE *file, int pass, const double *test, sf_count_t frames, int line_num) -{ sf_count_t count ; - - if ((count = sf_writef_double (file, test, frames)) != frames) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_writef_double failed with short writef (%ld => %ld).\n", - SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_writef_double_or_die */ - - -void -test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t items, int line_num) -{ sf_count_t count ; - - if ((count = sf_write_raw (file, test, items)) != items) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_write_raw failed with short write (%ld => %ld).\n", - SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_write_raw_or_die */ - - -void -compare_short_or_die (const short *left, const short *right, unsigned count, int line_num) -{ - unsigned k ; - - for (k = 0 ; k < count ;k++) - if (left [k] != right [k]) - { printf ("\n\nLine %d : Error at index %d, " "% d" " should be " "% d" ".\n\n", line_num, k, left [k], right [k]) ; - exit (1) ; - } ; - - return ; -} /* compare_short_or_die */ -void -compare_int_or_die (const int *left, const int *right, unsigned count, int line_num) -{ - unsigned k ; - - for (k = 0 ; k < count ;k++) - if (left [k] != right [k]) - { printf ("\n\nLine %d : Error at index %d, " "% d" " should be " "% d" ".\n\n", line_num, k, left [k], right [k]) ; - exit (1) ; - } ; - - return ; -} /* compare_int_or_die */ -void -compare_float_or_die (const float *left, const float *right, unsigned count, int line_num) -{ - unsigned k ; - - for (k = 0 ; k < count ;k++) - if (left [k] != right [k]) - { printf ("\n\nLine %d : Error at index %d, " "% g" " should be " "% g" ".\n\n", line_num, k, left [k], right [k]) ; - exit (1) ; - } ; - - return ; -} /* compare_float_or_die */ -void -compare_double_or_die (const double *left, const double *right, unsigned count, int line_num) -{ - unsigned k ; - - for (k = 0 ; k < count ;k++) - if (left [k] != right [k]) - { printf ("\n\nLine %d : Error at index %d, " "% g" " should be " "% g" ".\n\n", line_num, k, left [k], right [k]) ; - exit (1) ; - } ; - - return ; -} /* compare_double_or_die */ - - - -void -delete_file (int format, const char *filename) -{ char rsrc_name [512], *fname ; - - unlink (filename) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_SD2) - return ; - - /* - ** Now try for a resource fork stored as a separate file. - ** Grab the un-adulterated filename again. - */ - snprintf (rsrc_name, sizeof (rsrc_name), "%s", filename) ; - - if ((fname = strrchr (rsrc_name, '/')) != NULL) - fname ++ ; - else if ((fname = strrchr (rsrc_name, '\\')) != NULL) - fname ++ ; - else - fname = rsrc_name ; - - memmove (fname + 2, fname, strlen (fname) + 1) ; - fname [0] = '.' ; - fname [1] = '_' ; - - unlink (rsrc_name) ; -} /* delete_file */ - -static int allowed_open_files = -1 ; - -void -count_open_files (void) -{ -#if OS_IS_WIN32 - return ; -#else - int k, count = 0 ; - struct stat statbuf ; - - if (allowed_open_files > 0) - return ; - - for (k = 0 ; k < 1024 ; k++) - if (fstat (k, &statbuf) == 0) - count ++ ; - - allowed_open_files = count ; -#endif -} /* count_open_files */ - -void -increment_open_file_count (void) -{ allowed_open_files ++ ; -} /* increment_open_file_count */ - -void -check_open_file_count_or_die (int lineno) -{ -#if OS_IS_WIN32 - lineno = 0 ; - return ; -#else - int k, count = 0 ; - struct stat statbuf ; - - if (allowed_open_files < 0) - count_open_files () ; - - for (k = 0 ; k < 1024 ; k++) - if (fstat (k, &statbuf) == 0) - count ++ ; - - if (count > allowed_open_files) - { printf ("\nLine %d : number of open files (%d) > allowed (%d).\n\n", lineno, count, allowed_open_files) ; - exit (1) ; - } ; -#endif -} /* check_open_file_count_or_die */ - -void -write_mono_file (const char * filename, int format, int srate, float * output, int len) -{ SNDFILE * file ; - SF_INFO sfinfo ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - sfinfo.samplerate = srate ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) - { printf ("sf_open (%s) : %s\n", filename, sf_strerror (NULL)) ; - exit (1) ; - } ; - - sf_write_float (file, output, len) ; - - sf_close (file) ; -} /* write_mono_file */ - -void -gen_lowpass_noise_float (float *data, int len) -{ int32_t value = 0x1243456 ; - double sample, last_val = 0.0 ; - int k ; - - for (k = 0 ; k < len ; k++) - { /* Not a crypto quality RNG. */ - value = 11117 * value + 211231 ; - value = 11117 * value + 211231 ; - value = 11117 * value + 211231 ; - - sample = value / (0x7fffffff * 1.000001) ; - sample = 0.2 * sample - 0.9 * last_val ; - - data [k] = last_val = sample ; - } ; - -} /* gen_lowpass_noise_float */ - - -/* -** Windows is fucked. -** If a file is opened R/W and data is written to it, then fstat will return -** the correct file length, but stat will return zero. -*/ - -sf_count_t -file_length (const char * fname) -{ struct stat data ; - - if (stat (fname, &data) != 0) - return 0 ; - - return (sf_count_t) data.st_size ; -} /* file_length */ - -sf_count_t -file_length_fd (int fd) -{ struct stat data ; - - memset (&data, 0, sizeof (data)) ; - if (fstat (fd, &data) != 0) - return 0 ; - - return (sf_count_t) data.st_size ; -} /* file_length_fd */ - - - - diff --git a/libs/libsndfile/tests/utils.def b/libs/libsndfile/tests/utils.def deleted file mode 100644 index 0d94183d2e..0000000000 --- a/libs/libsndfile/tests/utils.def +++ /dev/null @@ -1,52 +0,0 @@ -autogen definitions utils.tpl; - -float_type = { - name = float ; - }; - -float_type = { - name = double ; - }; - -/*----------------------------------*/ - -io_type = { - io_element = short ; - format_str = "\"% d\"" ; - }; - -io_type = { - io_element = int ; - format_str = "\"% d\"" ; - }; - -io_type = { - io_element = float ; - format_str = "\"% g\"" ; - }; - -io_type = { - io_element = double ; - format_str = "\"% g\"" ; - }; - -read_op = { - op_element = read ; - count_name = items ; - }; - -read_op = { - op_element = readf ; - count_name = frames ; - }; - -write_op = { - op_element = write ; - count_name = items ; - }; - -write_op = { - op_element = writef ; - count_name = frames ; - }; - diff --git a/libs/libsndfile/tests/utils.h b/libs/libsndfile/tests/utils.h deleted file mode 100644 index 79da2861dc..0000000000 --- a/libs/libsndfile/tests/utils.h +++ /dev/null @@ -1,183 +0,0 @@ -/* -** Copyright (C) 2002-2011 Erik de Castro Lopo -** -** 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. -*/ - -/* -** Utility functions to make writing the test suite easier. -** -** The .c and .h files were generated automagically with Autogen from -** the files utils.def and utils.tpl. -*/ - - - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include -#include - -#define SF_COUNT_TO_LONG(x) ((long) (x)) -#define ARRAY_LEN(x) ((int) (sizeof (x)) / (sizeof ((x) [0]))) -#define SIGNED_SIZEOF(x) ((int64_t) (sizeof (x))) -#define NOT(x) (! (x)) - -#define PIPE_INDEX(x) ((x) + 500) -#define PIPE_TEST_LEN 12345 - - -void gen_windowed_sine_float (float *data, int len, double maximum) ; -void gen_windowed_sine_double (double *data, int len, double maximum) ; - - -void create_short_sndfile (const char *filename, int format, int channels) ; - -void check_file_hash_or_die (const char *filename, uint64_t target_hash, int line_num) ; - -void print_test_name (const char *test, const char *filename) ; - -void dump_data_to_file (const char *filename, const void *data, unsigned int datalen) ; - -void write_mono_file (const char * filename, int format, int srate, float * output, int len) ; - -static inline void -exit_if_true (int test, const char *format, ...) -{ if (test) - { va_list argptr ; - va_start (argptr, format) ; - vprintf (format, argptr) ; - va_end (argptr) ; - exit (1) ; - } ; -} /* exit_if_true */ - -/* -** Functions for saving two vectors of data in an ascii text file which -** can then be loaded into GNU octave for comparison. -*/ - -int oct_save_short (const short *a, const short *b, int len) ; -int oct_save_int (const int *a, const int *b, int len) ; -int oct_save_float (const float *a, const float *b, int len) ; -int oct_save_double (const double *a, const double *b, int len) ; - - -void delete_file (int format, const char *filename) ; - -void count_open_files (void) ; -void increment_open_file_count (void) ; -void check_open_file_count_or_die (int lineno) ; - -#ifdef SNDFILE_H - -static inline void -sf_info_clear (SF_INFO * info) -{ memset (info, 0, sizeof (SF_INFO)) ; -} /* sf_info_clear */ - -static inline void -sf_info_setup (SF_INFO * info, int format, int samplerate, int channels) -{ sf_info_clear (info) ; - - info->format = format ; - info->samplerate = samplerate ; - info->channels = channels ; -} /* sf_info_setup */ - - -void dump_log_buffer (SNDFILE *file) ; -void check_log_buffer_or_die (SNDFILE *file, int line_num) ; -int string_in_log_buffer (SNDFILE *file, const char *s) ; -void hexdump_file (const char * filename, sf_count_t offset, sf_count_t length) ; - - -SNDFILE *test_open_file_or_die - (const char *filename, int mode, SF_INFO *sfinfo, int allow_fd, int line_num) ; - -void test_read_write_position_or_die - (SNDFILE *file, int line_num, int pass, sf_count_t read_pos, sf_count_t write_pos) ; - -void test_seek_or_die - (SNDFILE *file, sf_count_t offset, int whence, sf_count_t new_pos, int channels, int line_num) ; - - -void test_read_short_or_die - (SNDFILE *file, int pass, short *test, sf_count_t items, int line_num) ; -void test_read_int_or_die - (SNDFILE *file, int pass, int *test, sf_count_t items, int line_num) ; -void test_read_float_or_die - (SNDFILE *file, int pass, float *test, sf_count_t items, int line_num) ; -void test_read_double_or_die - (SNDFILE *file, int pass, double *test, sf_count_t items, int line_num) ; - -void test_readf_short_or_die - (SNDFILE *file, int pass, short *test, sf_count_t frames, int line_num) ; -void test_readf_int_or_die - (SNDFILE *file, int pass, int *test, sf_count_t frames, int line_num) ; -void test_readf_float_or_die - (SNDFILE *file, int pass, float *test, sf_count_t frames, int line_num) ; -void test_readf_double_or_die - (SNDFILE *file, int pass, double *test, sf_count_t frames, int line_num) ; - - -void -test_read_raw_or_die (SNDFILE *file, int pass, void *test, sf_count_t items, int line_num) ; - - -void test_write_short_or_die - (SNDFILE *file, int pass, const short *test, sf_count_t items, int line_num) ; -void test_write_int_or_die - (SNDFILE *file, int pass, const int *test, sf_count_t items, int line_num) ; -void test_write_float_or_die - (SNDFILE *file, int pass, const float *test, sf_count_t items, int line_num) ; -void test_write_double_or_die - (SNDFILE *file, int pass, const double *test, sf_count_t items, int line_num) ; - -void test_writef_short_or_die - (SNDFILE *file, int pass, const short *test, sf_count_t frames, int line_num) ; -void test_writef_int_or_die - (SNDFILE *file, int pass, const int *test, sf_count_t frames, int line_num) ; -void test_writef_float_or_die - (SNDFILE *file, int pass, const float *test, sf_count_t frames, int line_num) ; -void test_writef_double_or_die - (SNDFILE *file, int pass, const double *test, sf_count_t frames, int line_num) ; - - -void -test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t items, int line_num) ; - -void compare_short_or_die (const short *left, const short *right, unsigned count, int line_num) ; -void compare_int_or_die (const int *left, const int *right, unsigned count, int line_num) ; -void compare_float_or_die (const float *left, const float *right, unsigned count, int line_num) ; -void compare_double_or_die (const double *left, const double *right, unsigned count, int line_num) ; - - - -void gen_lowpass_noise_float (float *data, int len) ; - -sf_count_t file_length (const char * fname) ; -sf_count_t file_length_fd (int fd) ; - -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - - - diff --git a/libs/libsndfile/tests/utils.tpl b/libs/libsndfile/tests/utils.tpl deleted file mode 100644 index d88e263ff0..0000000000 --- a/libs/libsndfile/tests/utils.tpl +++ /dev/null @@ -1,897 +0,0 @@ -[+ AutoGen5 template h c +] -/* -** Copyright (C) 2002-2012 Erik de Castro Lopo -** -** 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. -*/ - -/* -** Utility functions to make writing the test suite easier. -** -** The .c and .h files were generated automagically with Autogen from -** the files utils.def and utils.tpl. -*/ - -[+ CASE (suffix) +] -[+ == h +] - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include -#include - -#define ARRAY_LEN(x) ((int) (sizeof (x)) / (sizeof ((x) [0]))) -#define SIGNED_SIZEOF(x) ((int64_t) (sizeof (x))) -#define NOT(x) (! (x)) - -#define PIPE_INDEX(x) ((x) + 500) -#define PIPE_TEST_LEN 12345 - - -[+ FOR float_type -+]void gen_windowed_sine_[+ (get "name") +] ([+ (get "name") +] *data, int len, double maximum) ; -[+ ENDFOR float_type -+] - -void create_short_sndfile (const char *filename, int format, int channels) ; - -void check_file_hash_or_die (const char *filename, uint64_t target_hash, int line_num) ; - -void print_test_name (const char *test, const char *filename) ; - -void dump_data_to_file (const char *filename, const void *data, unsigned int datalen) ; - -void write_mono_file (const char * filename, int format, int srate, float * output, int len) ; - -#ifdef __GNUC__ -static inline void -exit_if_true (int test, const char *format, ...) -#ifdef __USE_MINGW_ANSI_STDIO - __attribute__ ((format (gnu_printf, 2, 3))) ; -#else - __attribute__ ((format (printf, 2, 3))) ; -#endif -#endif - -static inline void -exit_if_true (int test, const char *format, ...) -{ if (test) - { va_list argptr ; - va_start (argptr, format) ; - vprintf (format, argptr) ; - va_end (argptr) ; - exit (1) ; - } ; -} /* exit_if_true */ - -/* -** Functions for saving two vectors of data in an ascii text file which -** can then be loaded into GNU octave for comparison. -*/ - -[+ FOR io_type -+]int oct_save_[+ (get "io_element") +] (const [+ (get "io_element") +] *a, const [+ (get "io_element") +] *b, int len) ; -[+ ENDFOR io_type -+] - -void delete_file (int format, const char *filename) ; - -void count_open_files (void) ; -void increment_open_file_count (void) ; -void check_open_file_count_or_die (int lineno) ; - -#ifdef SNDFILE_H - -static inline void -sf_info_clear (SF_INFO * info) -{ memset (info, 0, sizeof (SF_INFO)) ; -} /* sf_info_clear */ - -static inline void -sf_info_setup (SF_INFO * info, int format, int samplerate, int channels) -{ sf_info_clear (info) ; - - info->format = format ; - info->samplerate = samplerate ; - info->channels = channels ; -} /* sf_info_setup */ - - -void dump_log_buffer (SNDFILE *file) ; -void check_log_buffer_or_die (SNDFILE *file, int line_num) ; -int string_in_log_buffer (SNDFILE *file, const char *s) ; -void hexdump_file (const char * filename, sf_count_t offset, sf_count_t length) ; - - -SNDFILE *test_open_file_or_die - (const char *filename, int mode, SF_INFO *sfinfo, int allow_fd, int line_num) ; - -void test_read_write_position_or_die - (SNDFILE *file, int line_num, int pass, sf_count_t read_pos, sf_count_t write_pos) ; - -void test_seek_or_die - (SNDFILE *file, sf_count_t offset, int whence, sf_count_t new_pos, int channels, int line_num) ; - -[+ FOR read_op +] -[+ FOR io_type -+]void test_[+ (get "op_element") +]_[+ (get "io_element") +]_or_die - (SNDFILE *file, int pass, [+ (get "io_element") +] *test, sf_count_t [+ (get "count_name") +], int line_num) ; -[+ ENDFOR io_type +][+ ENDFOR read_op +] - -void -test_read_raw_or_die (SNDFILE *file, int pass, void *test, sf_count_t items, int line_num) ; - -[+ FOR write_op +] -[+ FOR io_type -+]void test_[+ (get "op_element") +]_[+ (get "io_element") +]_or_die - (SNDFILE *file, int pass, const [+ (get "io_element") +] *test, sf_count_t [+ (get "count_name") +], int line_num) ; -[+ ENDFOR io_type +][+ ENDFOR write_op +] - -void -test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t items, int line_num) ; - -[+ FOR io_type -+]void compare_[+ (get "io_element") +]_or_die (const [+ (get "io_element") +] *expected, const [+ (get "io_element") +] *actual, unsigned count, int line_num) ; -[+ ENDFOR io_type +] - - -void gen_lowpass_signal_float (float *data, int len) ; - -sf_count_t file_length (const char * fname) ; -sf_count_t file_length_fd (int fd) ; - -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -[+ == c +] - -#include "sfconfig.h" - -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if (HAVE_DECL_S_IRGRP == 0) -#include -#endif - -#include -#include -#include -#include -#include -#include - -#include - -#include "utils.h" - -#ifndef M_PI -#define M_PI 3.14159265358979323846264338 -#endif - -#define LOG_BUFFER_SIZE 2048 - -/* -** Neat solution to the Win32/OS2 binary file flage requirement. -** If O_BINARY isn't already defined by the inclusion of the system -** headers, set it to zero. -*/ -#ifndef O_BINARY -#define O_BINARY 0 -#endif - -[+ FOR float_type +] -void -gen_windowed_sine_[+ (get "name") +] ([+ (get "name") +] *data, int len, double maximum) -{ int k ; - - memset (data, 0, len * sizeof ([+ (get "name") +])) ; - /* - ** Choose a frequency of 1/32 so that it aligns perfectly with a DFT - ** bucket to minimise spreading of energy over more than one bucket. - ** Also do not want to make the frequency too high as some of the - ** codecs (ie gsm610) have a quite severe high frequency roll off. - */ - len /= 2 ; - - for (k = 0 ; k < len ; k++) - { data [k] = sin (2.0 * k * M_PI * 1.0 / 32.0 + 0.4) ; - - /* Apply Hanning Window. */ - data [k] *= maximum * (0.5 - 0.5 * cos (2.0 * M_PI * k / ((len) - 1))) ; - } - - return ; -} /* gen_windowed_sine_[+ (get "name") +] */ -[+ ENDFOR float_type +] - -void -create_short_sndfile (const char *filename, int format, int channels) -{ short data [2 * 3 * 4 * 5 * 6 * 7] = { 0, } ; - SNDFILE *file ; - SF_INFO sfinfo ; - - sfinfo.samplerate = 44100 ; - sfinfo.channels = channels ; - sfinfo.format = format ; - - if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) - { printf ("Error (%s, %d) : sf_open failed : %s\n", __FILE__, __LINE__, sf_strerror (file)) ; - exit (1) ; - } ; - - sf_write_short (file, data, ARRAY_LEN (data)) ; - - sf_close (file) ; -} /* create_short_sndfile */ - -void -check_file_hash_or_die (const char *filename, uint64_t target_hash, int line_num) -{ static unsigned char buf [4096] ; - uint64_t cksum ; - FILE *file ; - int k, read_count ; - - memset (buf, 0, sizeof (buf)) ; - - /* The 'b' in the mode string means binary for Win32. */ - if ((file = fopen (filename, "rb")) == NULL) - { printf ("\n\nLine %d: could not open file '%s'\n\n", line_num, filename) ; - exit (1) ; - } ; - - cksum = 0 ; - - while ((read_count = fread (buf, 1, sizeof (buf), file))) - for (k = 0 ; k < read_count ; k++) - cksum = cksum * 511 + buf [k] ; - - fclose (file) ; - - if (target_hash == 0) - { printf (" 0x%016" PRIx64 "\n", cksum) ; - return ; - } ; - - if (cksum != target_hash) - { printf ("\n\nLine %d: incorrect hash value 0x%016" PRIx64 " should be 0x%016" PRIx64 ".\n\n", line_num, cksum, target_hash) ; - exit (1) ; - } ; - - return ; -} /* check_file_hash_or_die */ - -void -print_test_name (const char *test, const char *filename) -{ int count ; - - if (test == NULL) - { printf (__FILE__ ": bad test of filename parameter.\n") ; - exit (1) ; - } ; - - if (filename == NULL || strlen (filename) == 0) - { printf (" %-30s : ", test) ; - count = 25 ; - } - else - { printf (" %-30s : %s ", test, filename) ; - count = 24 - strlen (filename) ; - } ; - - while (count -- > 0) - putchar ('.') ; - putchar (' ') ; - - fflush (stdout) ; -} /* print_test_name */ - -void -dump_data_to_file (const char *filename, const void *data, unsigned int datalen) -{ FILE *file ; - - if ((file = fopen (filename, "wb")) == NULL) - { printf ("\n\nLine %d : could not open file : %s\n\n", __LINE__, filename) ; - exit (1) ; - } ; - - if (fwrite (data, 1, datalen, file) != datalen) - { printf ("\n\nLine %d : fwrite failed.\n\n", __LINE__) ; - exit (1) ; - } ; - - fclose (file) ; - -} /* dump_data_to_file */ - -/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -*/ - -static char octfilename [] = "error.dat" ; - -[+ FOR io_type -+]int -oct_save_[+ (get "io_element") +] (const [+ (get "io_element") +] *a, const [+ (get "io_element") +] *b, int len) -{ FILE *file ; - int k ; - - if (! (file = fopen (octfilename, "w"))) - return 1 ; - - fprintf (file, "# Not created by Octave\n") ; - - fprintf (file, "# name: a\n") ; - fprintf (file, "# type: matrix\n") ; - fprintf (file, "# rows: %d\n", len) ; - fprintf (file, "# columns: 1\n") ; - - for (k = 0 ; k < len ; k++) - fprintf (file, [+ (get "format_str") +] "\n", a [k]) ; - - fprintf (file, "# name: b\n") ; - fprintf (file, "# type: matrix\n") ; - fprintf (file, "# rows: %d\n", len) ; - fprintf (file, "# columns: 1\n") ; - - for (k = 0 ; k < len ; k++) - fprintf (file, [+ (get "format_str") +] "\n", b [k]) ; - - fclose (file) ; - return 0 ; -} /* oct_save_[+ (get "io_element") +] */ -[+ ENDFOR io_type -+] - -void -check_log_buffer_or_die (SNDFILE *file, int line_num) -{ static char buffer [LOG_BUFFER_SIZE] ; - int count ; - - memset (buffer, 0, sizeof (buffer)) ; - - /* Get the log buffer data. */ - count = sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ; - - if (LOG_BUFFER_SIZE - count < 2) - { printf ("\n\nLine %d : Possible long log buffer.\n", line_num) ; - exit (1) ; - } - - /* Look for "Should" */ - if (strstr (buffer, "ould")) - { printf ("\n\nLine %d : Log buffer contains `ould'. Dumping.\n", line_num) ; - puts (buffer) ; - exit (1) ; - } ; - - /* Look for "**" */ - if (strstr (buffer, "*")) - { printf ("\n\nLine %d : Log buffer contains `*'. Dumping.\n", line_num) ; - puts (buffer) ; - exit (1) ; - } ; - - /* Look for "Should" */ - if (strstr (buffer, "nknown marker")) - { printf ("\n\nLine %d : Log buffer contains `nknown marker'. Dumping.\n", line_num) ; - puts (buffer) ; - exit (1) ; - } ; - - return ; -} /* check_log_buffer_or_die */ - -int -string_in_log_buffer (SNDFILE *file, const char *s) -{ static char buffer [LOG_BUFFER_SIZE] ; - int count ; - - memset (buffer, 0, sizeof (buffer)) ; - - /* Get the log buffer data. */ - count = sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ; - - if (LOG_BUFFER_SIZE - count < 2) - { printf ("Possible long log buffer.\n") ; - exit (1) ; - } - - /* Look for string */ - return strstr (buffer, s) ? SF_TRUE : SF_FALSE ; -} /* string_in_log_buffer */ - -void -hexdump_file (const char * filename, sf_count_t offset, sf_count_t length) -{ - FILE * file ; - char buffer [16] ; - int k, m, ch, readcount ; - - if (length > 1000000) - { printf ("\n\nError : length (%" PRId64 ") too long.\n\n", offset) ; - exit (1) ; - } ; - - if ((file = fopen (filename, "r")) == NULL) - { printf ("\n\nError : hexdump_file (%s) could not open file for read.\n\n", filename) ; - exit (1) ; - } ; - - if (fseek (file, offset, SEEK_SET) != 0) - { printf ("\n\nError : fseek(file, %" PRId64 ", SEEK_SET) failed : %s\n\n", offset, strerror (errno)) ; - exit (1) ; - } ; - - puts ("\n\n") ; - - for (k = 0 ; k < length ; k+= sizeof (buffer)) - { readcount = fread (buffer, 1, sizeof (buffer), file) ; - - printf ("%08" PRIx64 " : ", offset + k) ; - - for (m = 0 ; m < readcount ; m++) - printf ("%02x ", buffer [m] & 0xFF) ; - - for (m = readcount ; m < SIGNED_SIZEOF (buffer) ; m++) - printf (" ") ; - - printf (" ") ; - for (m = 0 ; m < readcount ; m++) - { ch = isprint (buffer [m]) ? buffer [m] : '.' ; - putchar (ch) ; - } ; - - if (readcount < SIGNED_SIZEOF (buffer)) - break ; - - putchar ('\n') ; - } ; - - puts ("\n") ; - - fclose (file) ; -} /* hexdump_file */ - -void -dump_log_buffer (SNDFILE *file) -{ static char buffer [LOG_BUFFER_SIZE] ; - - memset (buffer, 0, sizeof (buffer)) ; - - /* Get the log buffer data. */ - sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ; - - if (strlen (buffer) < 1) - puts ("Log buffer empty.\n") ; - else - puts (buffer) ; - - return ; -} /* dump_log_buffer */ - -SNDFILE * -test_open_file_or_die (const char *filename, int mode, SF_INFO *sfinfo, int allow_fd, int line_num) -{ static int count = 0 ; - - SNDFILE *file ; - const char *modestr, *func_name ; - int oflags = 0, omode = 0, err ; - - /* - ** Need to test both sf_open() and sf_open_fd(). - ** Do so alternately. - */ - switch (mode) - { case SFM_READ : - modestr = "SFM_READ" ; - oflags = O_RDONLY | O_BINARY ; - omode = 0 ; - break ; - - case SFM_WRITE : - modestr = "SFM_WRITE" ; - oflags = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ; - omode = S_IRUSR | S_IWUSR | S_IRGRP ; - break ; - - case SFM_RDWR : - modestr = "SFM_RDWR" ; - oflags = O_RDWR | O_CREAT | O_BINARY ; - omode = S_IRUSR | S_IWUSR | S_IRGRP ; - break ; - default : - printf ("\n\nLine %d: Bad mode.\n", line_num) ; - fflush (stdout) ; - exit (1) ; - } ; - - if (OS_IS_WIN32) - { /* Windows does not understand and ignores the S_IRGRP flag, but Wine - ** gives a run time warning message, so just clear it. - */ - omode &= ~S_IRGRP ; - } ; - - if (allow_fd && ((++count) & 1) == 1) - { int fd ; - - /* Only use the three argument open() function if omode != 0. */ - fd = (omode == 0) ? open (filename, oflags) : open (filename, oflags, omode) ; - - if (fd < 0) - { printf ("\n\n%s : open failed : %s\n", __func__, strerror (errno)) ; - exit (1) ; - } ; - - func_name = "sf_open_fd" ; - file = sf_open_fd (fd, mode, sfinfo, SF_TRUE) ; - } - else - { func_name = "sf_open" ; - file = sf_open (filename, mode, sfinfo) ; - } ; - - if (file == NULL) - { printf ("\n\nLine %d: %s (%s) failed : %s\n\n", line_num, func_name, modestr, sf_strerror (NULL)) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - err = sf_error (file) ; - if (err != SF_ERR_NO_ERROR) - { printf ("\n\nLine %d : sf_error : %s\n\n", line_num, sf_error_number (err)) ; - dump_log_buffer (file) ; - exit (1) ; - } ; - - return file ; -} /* test_open_file_or_die */ - -void -test_read_write_position_or_die (SNDFILE *file, int line_num, int pass, sf_count_t read_pos, sf_count_t write_pos) -{ sf_count_t pos ; - - /* Check the current read position. */ - if (read_pos >= 0 && (pos = sf_seek (file, 0, SEEK_CUR | SFM_READ)) != read_pos) - { printf ("\n\nLine %d ", line_num) ; - if (pass > 0) - printf ("(pass %d): ", pass) ; - printf ("Read position (%" PRId64 ") should be %" PRId64 ".\n", pos, read_pos) ; - exit (1) ; - } ; - - /* Check the current write position. */ - if (write_pos >= 0 && (pos = sf_seek (file, 0, SEEK_CUR | SFM_WRITE)) != write_pos) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : Write position (%" PRId64 ") should be %" PRId64 ".\n", pos, write_pos) ; - exit (1) ; - } ; - - return ; -} /* test_read_write_position */ - -void -test_seek_or_die (SNDFILE *file, sf_count_t offset, int whence, sf_count_t new_pos, int channels, int line_num) -{ sf_count_t position ; - const char *channel_name, *whence_name ; - - switch (whence) - { case SEEK_SET : - whence_name = "SEEK_SET" ; - break ; - case SEEK_CUR : - whence_name = "SEEK_CUR" ; - break ; - case SEEK_END : - whence_name = "SEEK_END" ; - break ; - - /* SFM_READ */ - case SEEK_SET | SFM_READ : - whence_name = "SFM_READ | SEEK_SET" ; - break ; - case SEEK_CUR | SFM_READ : - whence_name = "SFM_READ | SEEK_CUR" ; - break ; - case SEEK_END | SFM_READ : - whence_name = "SFM_READ | SEEK_END" ; - break ; - - /* SFM_WRITE */ - case SEEK_SET | SFM_WRITE : - whence_name = "SFM_WRITE | SEEK_SET" ; - break ; - case SEEK_CUR | SFM_WRITE : - whence_name = "SFM_WRITE | SEEK_CUR" ; - break ; - case SEEK_END | SFM_WRITE : - whence_name = "SFM_WRITE | SEEK_END" ; - break ; - - default : - printf ("\n\nLine %d: bad whence parameter.\n", line_num) ; - exit (1) ; - } ; - - channel_name = (channels == 1) ? "Mono" : "Stereo" ; - - if ((position = sf_seek (file, offset, whence)) != new_pos) - { printf ("\n\nLine %d : %s : sf_seek (file, %" PRId64 ", %s) returned %" PRId64 " (should be %" PRId64 ").\n\n", - line_num, channel_name, offset, whence_name, position, new_pos) ; - exit (1) ; - } ; - -} /* test_seek_or_die */ - -[+ FOR read_op +] -[+ FOR io_type +] -void -test_[+ (get "op_element") +]_[+ (get "io_element") +]_or_die (SNDFILE *file, int pass, [+ (get "io_element") +] *test, sf_count_t [+ (get "count_name") +], int line_num) -{ sf_count_t count ; - - if ((count = sf_[+ (get "op_element") +]_[+ (get "io_element") +] (file, test, [+ (get "count_name") +])) != [+ (get "count_name") +]) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_[+ (get "op_element") +]_[+ (get "io_element") +] failed with short [+ (get "op_element") +] (%" PRId64 " => %" PRId64 ").\n", - [+ (get "count_name") +], count) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_[+ (get "op_element") +]_[+ (get "io_element") +]_or_die */ -[+ ENDFOR io_type +][+ ENDFOR read_op +] - -void -test_read_raw_or_die (SNDFILE *file, int pass, void *test, sf_count_t items, int line_num) -{ sf_count_t count ; - - if ((count = sf_read_raw (file, test, items)) != items) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_read_raw failed with short read (%" PRId64 " => %" PRId64 ").\n", items, count) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_read_raw_or_die */ - -[+ FOR write_op +] -[+ FOR io_type +] -void -test_[+ (get "op_element") +]_[+ (get "io_element") +]_or_die (SNDFILE *file, int pass, const [+ (get "io_element") +] *test, sf_count_t [+ (get "count_name") +], int line_num) -{ sf_count_t count ; - - if ((count = sf_[+ (get "op_element") +]_[+ (get "io_element") +] (file, test, [+ (get "count_name") +])) != [+ (get "count_name") +]) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_[+ (get "op_element") +]_[+ (get "io_element") +] failed with short [+ (get "op_element") +] (%" PRId64 " => %" PRId64 ").\n", - [+ (get "count_name") +], count) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_[+ (get "op_element") +]_[+ (get "io_element") +]_or_die */ -[+ ENDFOR io_type +][+ ENDFOR write_op +] - -void -test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t items, int line_num) -{ sf_count_t count ; - - if ((count = sf_write_raw (file, test, items)) != items) - { printf ("\n\nLine %d", line_num) ; - if (pass > 0) - printf (" (pass %d)", pass) ; - printf (" : sf_write_raw failed with short write (%" PRId64 " => %" PRId64 ").\n", items, count) ; - fflush (stdout) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - return ; -} /* test_write_raw_or_die */ - - -[+ FOR io_type -+]void -compare_[+ (get "io_element") +]_or_die (const [+ (get "io_element") +] *expected, const [+ (get "io_element") +] *actual, unsigned count, int line_num) -{ - unsigned k ; - - for (k = 0 ; k < count ; k++) - if (expected [k] != actual [k]) - { printf ("\n\nLine %d : Error at index %d, got " [+ (get "format_str") +] ", should be " [+ (get "format_str") +] ".\n\n", line_num, k, actual [k], expected [k]) ; - exit (1) ; - } ; - - return ; -} /* compare_[+ (get "io_element") +]_or_die */ -[+ ENDFOR io_type +] - - -void -delete_file (int format, const char *filename) -{ char rsrc_name [512], *fname ; - - unlink (filename) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_SD2) - return ; - - /* - ** Now try for a resource fork stored as a separate file. - ** Grab the un-adulterated filename again. - */ - snprintf (rsrc_name, sizeof (rsrc_name), "%s", filename) ; - - if ((fname = strrchr (rsrc_name, '/')) != NULL) - fname ++ ; - else if ((fname = strrchr (rsrc_name, '\\')) != NULL) - fname ++ ; - else - fname = rsrc_name ; - - memmove (fname + 2, fname, strlen (fname) + 1) ; - fname [0] = '.' ; - fname [1] = '_' ; - - unlink (rsrc_name) ; -} /* delete_file */ - -static int allowed_open_files = -1 ; - -void -count_open_files (void) -{ -#if OS_IS_WIN32 - return ; -#else - int k, count = 0 ; - struct stat statbuf ; - - if (allowed_open_files > 0) - return ; - - for (k = 0 ; k < 1024 ; k++) - if (fstat (k, &statbuf) == 0) - count ++ ; - - allowed_open_files = count ; -#endif -} /* count_open_files */ - -void -increment_open_file_count (void) -{ allowed_open_files ++ ; -} /* increment_open_file_count */ - -void -check_open_file_count_or_die (int lineno) -{ -#if OS_IS_WIN32 - (void) lineno ; - return ; -#else - int k, count = 0 ; - struct stat statbuf ; - - if (allowed_open_files < 0) - count_open_files () ; - - for (k = 0 ; k < 1024 ; k++) - if (fstat (k, &statbuf) == 0) - count ++ ; - - if (count > allowed_open_files) - { printf ("\nLine %d : number of open files (%d) > allowed (%d).\n\n", lineno, count, allowed_open_files) ; - exit (1) ; - } ; -#endif -} /* check_open_file_count_or_die */ - -void -write_mono_file (const char * filename, int format, int srate, float * output, int len) -{ SNDFILE * file ; - SF_INFO sfinfo ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - sfinfo.samplerate = srate ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) - { printf ("sf_open (%s) : %s\n", filename, sf_strerror (NULL)) ; - exit (1) ; - } ; - - sf_write_float (file, output, len) ; - - sf_close (file) ; -} /* write_mono_file */ - -void -gen_lowpass_signal_float (float *data, int len) -{ int32_t value = 0x1243456 ; - double sample, last_val = 0.0 ; - int k ; - - for (k = 0 ; k < len ; k++) - { /* Not a crypto quality RNG. */ - value = 11117 * value + 211231 ; - value = 11117 * value + 211231 ; - value = 11117 * value + 211231 ; - - sample = value / (0x7fffffff * 1.000001) ; - sample = 0.2 * sample - 0.9 * last_val ; - - last_val = sample ; - - data [k] = 0.5 * (sample + sin (2.0 * k * M_PI * 1.0 / 32.0)) ; - } ; - -} /* gen_lowpass_signal_float */ - - -/* -** Windows is fucked. -** If a file is opened R/W and data is written to it, then fstat will return -** the correct file length, but stat will return zero. -*/ - -sf_count_t -file_length (const char * fname) -{ struct stat data ; - - if (stat (fname, &data) != 0) - return 0 ; - - return (sf_count_t) data.st_size ; -} /* file_length */ - -sf_count_t -file_length_fd (int fd) -{ struct stat data ; - - memset (&data, 0, sizeof (data)) ; - if (fstat (fd, &data) != 0) - return 0 ; - - return (sf_count_t) data.st_size ; -} /* file_length_fd */ - - -[+ ESAC +] - diff --git a/libs/libsndfile/tests/virtual_io_test.c b/libs/libsndfile/tests/virtual_io_test.c deleted file mode 100644 index 1aae063df8..0000000000 --- a/libs/libsndfile/tests/virtual_io_test.c +++ /dev/null @@ -1,237 +0,0 @@ -/* -** Copyright (C) 1999-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include "utils.h" - -static void vio_test (const char *fname, int format) ; - -int -main (void) -{ - vio_test ("vio_pcm16.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - vio_test ("vio_pcm24.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_24) ; - vio_test ("vio_float.au", SF_FORMAT_AU | SF_FORMAT_FLOAT) ; - vio_test ("vio_pcm24.paf", SF_FORMAT_PAF | SF_FORMAT_PCM_24) ; - - return 0 ; -} /* main */ - -/*============================================================================== -*/ - -typedef struct -{ sf_count_t offset, length ; - unsigned char data [16 * 1024] ; -} VIO_DATA ; - -static sf_count_t -vfget_filelen (void *user_data) -{ VIO_DATA *vf = (VIO_DATA *) user_data ; - - return vf->length ; -} /* vfget_filelen */ - -static sf_count_t -vfseek (sf_count_t offset, int whence, void *user_data) -{ VIO_DATA *vf = (VIO_DATA *) user_data ; - - switch (whence) - { case SEEK_SET : - vf->offset = offset ; - break ; - - case SEEK_CUR : - vf->offset = vf->offset + offset ; - break ; - - case SEEK_END : - vf->offset = vf->length + offset ; - break ; - default : - break ; - } ; - - return vf->offset ; -} /* vfseek */ - -static sf_count_t -vfread (void *ptr, sf_count_t count, void *user_data) -{ VIO_DATA *vf = (VIO_DATA *) user_data ; - - /* - ** This will brack badly for files over 2Gig in length, but - ** is sufficient for testing. - */ - if (vf->offset + count > vf->length) - count = vf->length - vf->offset ; - - memcpy (ptr, vf->data + vf->offset, count) ; - vf->offset += count ; - - return count ; -} /* vfread */ - -static sf_count_t -vfwrite (const void *ptr, sf_count_t count, void *user_data) -{ VIO_DATA *vf = (VIO_DATA *) user_data ; - - /* - ** This will break badly for files over 2Gig in length, but - ** is sufficient for testing. - */ - if (vf->offset >= SIGNED_SIZEOF (vf->data)) - return 0 ; - - if (vf->offset + count > SIGNED_SIZEOF (vf->data)) - count = sizeof (vf->data) - vf->offset ; - - memcpy (vf->data + vf->offset, ptr, (size_t) count) ; - vf->offset += count ; - - if (vf->offset > vf->length) - vf->length = vf->offset ; - - return count ; -} /* vfwrite */ - -static sf_count_t -vftell (void *user_data) -{ VIO_DATA *vf = (VIO_DATA *) user_data ; - - return vf->offset ; -} /* vftell */ - - -/*============================================================================== -*/ - -static void -gen_short_data (short * data, int len, int start) -{ int k ; - - for (k = 0 ; k < len ; k++) - data [k] = start + k ; -} /* gen_short_data */ - - -static void -check_short_data (short * data, int len, int start, int line) -{ int k ; - - for (k = 0 ; k < len ; k++) - if (data [k] != start + k) - { printf ("\n\nLine %d : data [%d] = %d (should be %d).\n\n", line, k, data [k], start + k) ; - exit (1) ; - } ; -} /* gen_short_data */ - -/*------------------------------------------------------------------------------ -*/ - -static void -vio_test (const char *fname, int format) -{ static VIO_DATA vio_data ; - static short data [256] ; - - SF_VIRTUAL_IO vio ; - SNDFILE * file ; - SF_INFO sfinfo ; - - print_test_name ("virtual i/o test", fname) ; - - /* Set up pointers to the locally defined functions. */ - vio.get_filelen = vfget_filelen ; - vio.seek = vfseek ; - vio.read = vfread ; - vio.write = vfwrite ; - vio.tell = vftell ; - - /* Set virtual file offset and length to zero. */ - vio_data.offset = 0 ; - vio_data.length = 0 ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.format = format ; - sfinfo.channels = 2 ; - sfinfo.samplerate = 44100 ; - - if ((file = sf_open_virtual (&vio, SFM_WRITE, &sfinfo, &vio_data)) == NULL) - { printf ("\n\nLine %d : sf_open_write failed with error : ", __LINE__) ; - fflush (stdout) ; - puts (sf_strerror (NULL)) ; - exit (1) ; - } ; - - if (vfget_filelen (&vio_data) < 0) - { printf ("\n\nLine %d : vfget_filelen returned negative length.\n\n", __LINE__) ; - exit (1) ; - } ; - - gen_short_data (data, ARRAY_LEN (data), 0) ; - sf_write_short (file, data, ARRAY_LEN (data)) ; - - gen_short_data (data, ARRAY_LEN (data), 1) ; - sf_write_short (file, data, ARRAY_LEN (data)) ; - - gen_short_data (data, ARRAY_LEN (data), 2) ; - sf_write_short (file, data, ARRAY_LEN (data)) ; - - sf_close (file) ; - - /* Now test read. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - vio_data.offset = 0 ; - - if ((file = sf_open_virtual (&vio, SFM_READ, &sfinfo, &vio_data)) == NULL) - { printf ("\n\nLine %d : sf_open_write failed with error : ", __LINE__) ; - fflush (stdout) ; - puts (sf_strerror (NULL)) ; - - dump_data_to_file (fname, vio_data.data, vio_data.length) ; - exit (1) ; - } ; - - - sf_read_short (file, data, ARRAY_LEN (data)) ; - check_short_data (data, ARRAY_LEN (data), 0, __LINE__) ; - - sf_read_short (file, data, ARRAY_LEN (data)) ; - check_short_data (data, ARRAY_LEN (data), 1, __LINE__) ; - - sf_read_short (file, data, ARRAY_LEN (data)) ; - check_short_data (data, ARRAY_LEN (data), 2, __LINE__) ; - - sf_close (file) ; - - puts ("ok") ; -} /* vio_test */ - diff --git a/libs/libsndfile/tests/vorbis_test.c b/libs/libsndfile/tests/vorbis_test.c deleted file mode 100644 index 9f5797fde9..0000000000 --- a/libs/libsndfile/tests/vorbis_test.c +++ /dev/null @@ -1,176 +0,0 @@ -/* -** Copyright (C) 2007-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include - -#include - -#include - -#include "utils.h" -#include "dft_cmp.h" - -#define SAMPLE_RATE 16000 -#define DATA_LENGTH (SAMPLE_RATE / 8) - -static float data_out [DATA_LENGTH] ; - -static inline float -max_float (float a, float b) -{ return a > b ? a : b ; -} /* max_float */ - -static void -vorbis_test (void) -{ static float float_data [DFT_DATA_LENGTH] ; - const char * filename = "vorbis_test.oga" ; - SNDFILE * file ; - SF_INFO sfinfo ; - float max_abs = 0.0 ; - unsigned k ; - - print_test_name ("vorbis_test", filename) ; - - /* Generate float data. */ - gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 1.0) ; - - /* Set up output file type. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; - sfinfo.channels = 1 ; - sfinfo.samplerate = SAMPLE_RATE ; - - /* Write the output file. */ - - /* The Vorbis encoder has a bug on PowerPC and X86-64 with sample rates - ** <= 22050. Increasing the sample rate to 32000 avoids triggering it. - ** See https://trac.xiph.org/ticket/1229 - */ - if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) - { const char * errstr ; - - errstr = sf_strerror (NULL) ; - if (strstr (errstr, "Sample rate chosen is known to trigger a Vorbis") == NULL) - { printf ("Line %d: sf_open (SFM_WRITE) failed : %s\n", __LINE__, errstr) ; - dump_log_buffer (NULL) ; - exit (1) ; - } ; - - printf ("\n Sample rate -> 32kHz ") ; - sfinfo.samplerate = 32000 ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; - } ; - - test_write_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ; - sf_close (file) ; - - memset (float_data, 0, sizeof (float_data)) ; - - /* Read the file back in again. */ - memset (&sfinfo, 0, sizeof (sfinfo)) ; - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; - test_read_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ; - sf_close (file) ; - - for (k = 0 ; k < ARRAY_LEN (float_data) ; k ++) - max_abs = max_float (max_abs, fabs (float_data [k])) ; - - if (max_abs > 1.021) - { printf ("\n\n Error : max_abs %f should be < 1.021.\n\n", max_abs) ; - exit (1) ; - } ; - - puts ("ok") ; - unlink (filename) ; -} /* vorbis_test */ - -static void -vorbis_quality_test (void) -{ /* - ** Encode two files, one at quality 0.3 and one at quality 0.5 and then - ** make sure that the quality 0.3 files is the smaller of the two. - */ - const char * q3_fname = "q3_vorbis.oga" ; - const char * q5_fname = "q5_vorbis.oga" ; - - SNDFILE *q3_file, *q5_file ; - SF_INFO sfinfo ; - int q3_size, q5_size ; - double quality ; - int k ; - - print_test_name (__func__, "q[35]_vorbis.oga") ; - - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - /* Set up output file type. */ - sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; - sfinfo.channels = 1 ; - sfinfo.samplerate = SAMPLE_RATE ; - - /* Write the output file. */ - q3_file = test_open_file_or_die (q3_fname, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - q5_file = test_open_file_or_die (q5_fname, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; - - quality = 0.3 ; - sf_command (q3_file, SFC_SET_VBR_ENCODING_QUALITY, &quality, sizeof (quality)) ; - quality = 0.5 ; - sf_command (q5_file, SFC_SET_VBR_ENCODING_QUALITY, &quality, sizeof (quality)) ; - - for (k = 0 ; k < 5 ; k++) - { gen_lowpass_noise_float (data_out, ARRAY_LEN (data_out)) ; - test_write_float_or_die (q3_file, 0, data_out, ARRAY_LEN (data_out), __LINE__) ; - test_write_float_or_die (q5_file, 0, data_out, ARRAY_LEN (data_out), __LINE__) ; - } ; - - sf_close (q3_file) ; - sf_close (q5_file) ; - - q3_size = file_length (q3_fname) ; - q5_size = file_length (q5_fname) ; - - if (q3_size >= q5_size) - { printf ("\n\nLine %d : q3 size (%d) >= q5 size (%d)\n\n", __LINE__, q3_size, q5_size) ; - exit (1) ; - } ; - - puts ("ok") ; - unlink (q3_fname) ; - unlink (q5_fname) ; -} /* vorbis_quality_test */ - - - -int -main (void) -{ - if (HAVE_EXTERNAL_LIBS) - { vorbis_test () ; - vorbis_quality_test () ; - } - else - puts (" No Ogg/Vorbis tests because Ogg/Vorbis support was not compiled in.") ; - - return 0 ; -} /* main */ diff --git a/libs/libsndfile/tests/win32_ordinal_test.c b/libs/libsndfile/tests/win32_ordinal_test.c deleted file mode 100644 index 5324a2ed57..0000000000 --- a/libs/libsndfile/tests/win32_ordinal_test.c +++ /dev/null @@ -1,145 +0,0 @@ -/* -** Copyright (C) 2006-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if (HAVE_DECL_S_IRGRP == 0) -#include -#endif - -#include -#include -#include - -#include "utils.h" - -#if (defined (WIN32) || defined (_WIN32) || defined (__CYGWIN__)) -#define TEST_WIN32 1 -#else -#define TEST_WIN32 0 -#endif - -#if TEST_WIN32 -#include - - -static const char * locations [] = -{ ".", "../src/", "src/", "../src/.libs/", "src/.libs/", - NULL -} ; /* locations. */ - -static int -test_ordinal (HMODULE hmod, const char * func_name, int ordinal) -{ char *lpmsg ; - void *name, *ord ; - - print_test_name ("win32_ordinal_test", func_name) ; - -#if SIZEOF_VOIDP == 8 -#define LPCSTR_OF_ORDINAL(x) ((LPCSTR) ((int64_t) (x))) -#else -#define LPCSTR_OF_ORDINAL(x) ((LPCSTR) (x)) -#endif - - ord = GetProcAddress (hmod, LPCSTR_OF_ORDINAL (ordinal)) ; - if ((name = GetProcAddress (hmod, func_name)) == NULL) - { FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError (), - MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpmsg, 0, NULL) ; - /*-puts (lpmsg) ;-*/ - } ; - - if (name != NULL && ord != NULL && name == ord) - { puts ("ok") ; - return 0 ; - } ; - - puts ("fail") ; - return 1 ; -} /* test_ordinal */ - -static void -win32_ordinal_test (void) -{ static char buffer [1024] ; - static char func_name [1024] ; - HMODULE hmod = NULL ; - FILE * file = NULL ; - int k, ordinal, errors = 0 ; - - for (k = 0 ; locations [k] != NULL ; k++) - { snprintf (buffer, sizeof (buffer), "%s/libsndfile-1.def", locations [k]) ; - if ((file = fopen (buffer, "r")) != NULL) - break ; - } ; - - if (file == NULL) - { puts ("\n\nError : cannot open DEF file.\n") ; - exit (1) ; - } ; - - for (k = 0 ; locations [k] != NULL ; k++) - { snprintf (buffer, sizeof (buffer), "%s/libsndfile-1.dll", locations [k]) ; - if ((hmod = (HMODULE) LoadLibrary (buffer)) != NULL) - break ; - } ; - - if (hmod == NULL) - { puts ("\n\nError : cannot load DLL.\n") ; - exit (1) ; - } ; - - while (fgets (buffer, sizeof (buffer), file) != NULL) - { func_name [0] = 0 ; - ordinal = 0 ; - - if (sscanf (buffer, "%s @%d", func_name, &ordinal) != 2) - continue ; - - errors += test_ordinal (hmod, func_name, ordinal) ; - } ; - - FreeLibrary (hmod) ; - - fclose (file) ; - - if (errors > 0) - { printf ("\n\nErrors : %d\n\n", errors) ; - exit (1) ; - } ; - - return ; -} /* win32_ordinal_test */ - -#endif - -int -main (void) -{ -#if (TEST_WIN32 && WIN32_TARGET_DLL) - win32_ordinal_test () ; -#endif - - return 0 ; -} /* main */ - diff --git a/libs/libsndfile/tests/win32_test.c b/libs/libsndfile/tests/win32_test.c deleted file mode 100644 index d0dc6d8ea4..0000000000 --- a/libs/libsndfile/tests/win32_test.c +++ /dev/null @@ -1,318 +0,0 @@ -/* -** Copyright (C) 2001-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" -#include "sndfile.h" - -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#if (HAVE_DECL_S_IRGRP == 0) -#include -#endif - -#include -#include -#include -#include -#include - -#define SIGNED_SIZEOF(x) ((int) sizeof (x)) - -/* EMX is OS/2. */ -#if defined (__CYGWIN__) || defined (__EMX__) - - #define LSEEK lseek - #define FSTAT fstat - - typedef struct stat STATBUF ; - typedef off_t INT64 ; - - static char dir_cmd [] = "ls -l" ; - -#elif (defined (WIN32) || defined (_WIN32)) - - #define LSEEK _lseeki64 - #define FSTAT _fstati64 - - typedef struct _stati64 STATBUF ; - typedef __int64 INT64 ; - - static char dir_cmd [] = "dir" ; - -#else - - #define LSEEK lseek - #define FSTAT fstat - - typedef struct stat STATBUF ; - typedef sf_count_t INT64 ; - - #define O_BINARY 0 - static char dir_cmd [] = "ls -l" ; - -#endif - -static void show_fstat_error (void) ; -static void show_lseek_error (void) ; -static void show_stat_fstat_error (void) ; -static void write_to_closed_file (void) ; - -int -main (void) -{ - puts ("\n\n\n\n" - "This program shows up errors in the Win32 implementation of\n" - "a couple of POSIX API functions on some versions of windoze.\n" - "It can also be compiled on Linux (which works correctly) and\n" - "other OSes just to provide a sanity check.\n" - ) ; - - show_fstat_error () ; - show_lseek_error () ; - show_stat_fstat_error () ; - write_to_closed_file () ; - - puts ("\n\n") ; - - return 0 ; -} /* main */ - -static void -show_fstat_error (void) -{ static const char *filename = "fstat.dat" ; - static char data [256] ; - - STATBUF statbuf ; - int fd, mode, flags ; - - if (sizeof (statbuf.st_size) != sizeof (INT64)) - { printf ("\n\nLine %d: Error, sizeof (statbuf.st_size) != 8.\n\n", __LINE__) ; - return ; - } ; - - puts ("\n64 bit fstat() test.\n--------------------") ; - - printf ("0) Create a file, write %d bytes and close it.\n", SIGNED_SIZEOF (data)) ; - mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ; - flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ; - if ((fd = open (filename, mode, flags)) < 0) - { printf ("\n\nLine %d: open() failed : %s\n\n", __LINE__, strerror (errno)) ; - return ; - } ; - assert (write (fd, data, sizeof (data)) > 0) ; - close (fd) ; - - printf ("1) Re-open file in read/write mode and write another %d bytes at the end.\n", SIGNED_SIZEOF (data)) ; - mode = O_RDWR | O_BINARY ; - flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ; - if ((fd = open (filename, mode, flags)) < 0) - { printf ("\n\nLine %d: open() failed : %s\n\n", __LINE__, strerror (errno)) ; - return ; - } ; - LSEEK (fd, 0, SEEK_END) ; - assert (write (fd, data, sizeof (data)) > 0) ; - - printf ("2) Now use system (\"%s %s\") to show the file length.\n\n", dir_cmd, filename) ; - - /* Would use snprintf, but thats not really available on windows. */ - memset (data, 0, sizeof (data)) ; - strncpy (data, dir_cmd, sizeof (data) - 1) ; - strncat (data, " ", sizeof (data) - 1 - strlen (data)) ; - strncat (data, filename, sizeof (data) - 1 - strlen (data)) ; - - assert (system (data) >= 0) ; - puts ("") ; - - printf ("3) Now use fstat() to get the file length.\n") ; - if (FSTAT (fd, &statbuf) != 0) - { printf ("\n\nLine %d: fstat() returned error : %s\n", __LINE__, strerror (errno)) ; - return ; - } ; - - printf ("4) According to fstat(), the file length is %ld, ", (long) statbuf.st_size) ; - - close (fd) ; - - if (statbuf.st_size != 2 * sizeof (data)) - printf ("but thats just plain ***WRONG***.\n\n") ; - else - { printf ("which is correct.\n\n") ; - unlink (filename) ; - } ; - -} /* show_fstat_error */ - -static void -show_lseek_error (void) -{ static const char *filename = "fstat.dat" ; - static char data [256] ; - - INT64 retval ; - int fd, mode, flags ; - - puts ("\n64 bit lseek() test.\n--------------------") ; - - printf ("0) Create a file, write %d bytes and close it.\n", SIGNED_SIZEOF (data)) ; - mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ; - flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ; - if ((fd = open (filename, mode, flags)) < 0) - { printf ("\n\nLine %d: open() failed : %s\n\n", __LINE__, strerror (errno)) ; - return ; - } ; - assert (write (fd, data, sizeof (data)) > 0) ; - close (fd) ; - - printf ("1) Re-open file in read/write mode and write another %d bytes at the end.\n", SIGNED_SIZEOF (data)) ; - mode = O_RDWR | O_BINARY ; - flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ; - if ((fd = open (filename, mode, flags)) < 0) - { printf ("\n\nLine %d: open() failed : %s\n\n", __LINE__, strerror (errno)) ; - return ; - } ; - - LSEEK (fd, 0, SEEK_END) ; - assert (write (fd, data, sizeof (data)) > 0) ; - - printf ("2) Now use system (\"%s %s\") to show the file length.\n\n", dir_cmd, filename) ; - - /* Would use snprintf, but thats not really available on windows. */ - memset (data, 0, sizeof (data)) ; - strncpy (data, dir_cmd, sizeof (data) - 1) ; - strncat (data, " ", sizeof (data) - 1 - strlen (data)) ; - strncat (data, filename, sizeof (data) - 1 - strlen (data)) ; - - assert (system (data) >= 0) ; - puts ("") ; - - printf ("3) Now use lseek() to go to the end of the file.\n") ; - retval = LSEEK (fd, 0, SEEK_END) ; - - printf ("4) We are now at position %ld, ", (long) retval) ; - - close (fd) ; - - if (retval != 2 * sizeof (data)) - printf ("but thats just plain ***WRONG***.\n\n") ; - else - { printf ("which is correct.\n\n") ; - unlink (filename) ; - } ; - -} /* show_lseek_error */ - -static void -show_stat_fstat_error (void) -{ static const char *filename = "stat_fstat.dat" ; - static char data [256] ; - - int fd, mode, flags ; - int stat_size, fstat_size ; - struct stat buf ; - - /* Known to fail on WinXP. */ - puts ("\nstat/fstat test.\n----------------") ; - - printf ("0) Create a file and write %d bytes.\n", SIGNED_SIZEOF (data)) ; - - mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ; - flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ; - if ((fd = open (filename, mode, flags)) < 0) - { printf ("\n\nLine %d: open() failed : %s\n\n", __LINE__, strerror (errno)) ; - return ; - } ; - - assert (write (fd, data, sizeof (data)) > 0) ; - - printf ("1) Now call stat and fstat on the file and retreive the file lengths.\n") ; - - if (stat (filename, &buf) != 0) - { printf ("\n\nLine %d: stat() failed : %s\n\n", __LINE__, strerror (errno)) ; - goto error_exit ; - } ; - stat_size = buf.st_size ; - - if (fstat (fd, &buf) != 0) - { printf ("\n\nLine %d: fstat() failed : %s\n\n", __LINE__, strerror (errno)) ; - goto error_exit ; - } ; - fstat_size = buf.st_size ; - - printf ("2) Size returned by stat and fstat is %d and %d, ", stat_size, fstat_size) ; - - - if (stat_size == 0 || stat_size != fstat_size) - printf ("but thats just plain ***WRONG***.\n\n") ; - else - printf ("which is correct.\n\n") ; - -error_exit : - - close (fd) ; - unlink (filename) ; - - return ; -} /* show_stat_fstat_error */ - - -static void -write_to_closed_file (void) -{ const char * filename = "closed_write_test.txt" ; - struct stat buf ; - FILE * file ; - int fd ; - - puts ("\nWrite to closed file test.\n--------------------------") ; - - printf ("0) First we open file for write using fopen().\n") ; - if ((file = fopen (filename, "w")) == NULL) - { printf ("\n\nLine %d: fopen() failed : %s\n\n", __LINE__, strerror (errno)) ; - return ; - } ; - - printf ("1) Now we grab the file descriptor fileno().\n") ; - fd = fileno (file) ; - - printf ("2) Write some text via the file descriptor.\n") ; - assert (write (fd, "a\n", 2) > 0) ; - - printf ("3) Now we close the file using fclose().\n") ; - fclose (file) ; - - stat (filename, &buf) ; - printf (" File size is %d bytes.\n", (int) buf.st_size) ; - - printf ("4) Now write more data to the file descriptor which should fail.\n") ; - if (write (fd, "b\n", 2) < 0) - printf ("5) Good, write returned an error code as it should have.\n") ; - else - { printf ("5) Attempting to write to a closed file should have failed but didn't! *** WRONG ***\n") ; - - stat (filename, &buf) ; - printf (" File size is %d bytes.\n", (int) buf.st_size) ; - } ; - - unlink (filename) ; - - return ; -} /* write_to_closed_file */ diff --git a/libs/libsndfile/tests/write_read_test.c b/libs/libsndfile/tests/write_read_test.c deleted file mode 100644 index 9f8a8f538b..0000000000 --- a/libs/libsndfile/tests/write_read_test.c +++ /dev/null @@ -1,3731 +0,0 @@ -/* -** Copyright (C) 1999-2011 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#if (defined (WIN32) || defined (_WIN32)) -#include -static int truncate (const char *filename, int ignored) ; -#endif - -#include - -#include "utils.h" -#include "generate.h" - -#define SAMPLE_RATE 11025 -#define DATA_LENGTH (1<<12) - -#define SILLY_WRITE_COUNT (234) - -static void pcm_test_char (const char *str, int format, int long_file_okz) ; -static void pcm_test_short (const char *str, int format, int long_file_okz) ; -static void pcm_test_24bit (const char *str, int format, int long_file_okz) ; -static void pcm_test_int (const char *str, int format, int long_file_okz) ; -static void pcm_test_float (const char *str, int format, int long_file_okz) ; -static void pcm_test_double (const char *str, int format, int long_file_okz) ; - -static void empty_file_test (const char *filename, int format) ; - -typedef union -{ double d [DATA_LENGTH] ; - float f [DATA_LENGTH] ; - int i [DATA_LENGTH] ; - short s [DATA_LENGTH] ; - char c [DATA_LENGTH] ; -} BUFFER ; - -static BUFFER orig_data ; -static BUFFER test_data ; - -int -main (int argc, char **argv) -{ int do_all = 0 ; - int test_count = 0 ; - - count_open_files () ; - - if (argc != 2) - { printf ("Usage : %s \n", argv [0]) ; - printf (" Where is one of the following:\n") ; - printf (" wav - test WAV file functions (little endian)\n") ; - printf (" aiff - test AIFF file functions (big endian)\n") ; - printf (" au - test AU file functions\n") ; - printf (" avr - test AVR file functions\n") ; - printf (" caf - test CAF file functions\n") ; - printf (" raw - test RAW header-less PCM file functions\n") ; - printf (" paf - test PAF file functions\n") ; - printf (" svx - test 8SVX/16SV file functions\n") ; - printf (" nist - test NIST Sphere file functions\n") ; - printf (" ircam - test IRCAM file functions\n") ; - printf (" voc - Create Voice file functions\n") ; - printf (" w64 - Sonic Foundry's W64 file functions\n") ; - printf (" flac - test FLAC file functions\n") ; - printf (" mpc2k - test MPC 2000 file functions\n") ; - printf (" rf64 - test RF64 file functions\n") ; - printf (" all - perform all tests\n") ; - exit (1) ; - } ; - - do_all = !strcmp (argv [1], "all") ; - - if (do_all || ! strcmp (argv [1], "wav")) - { pcm_test_char ("char.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_short ("short.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_32, SF_FALSE) ; - - pcm_test_char ("char.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_short ("short.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_32, SF_FALSE) ; - - pcm_test_24bit ("24bit.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_PCM_32, SF_FALSE) ; - - /* Lite remove start */ - pcm_test_float ("float.wav" , SF_FORMAT_WAV | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.wav" , SF_FORMAT_WAV | SF_FORMAT_DOUBLE, SF_FALSE) ; - - pcm_test_float ("float.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_DOUBLE, SF_FALSE) ; - - pcm_test_float ("float.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - - empty_file_test ("empty_char.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8) ; - empty_file_test ("empty_short.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - empty_file_test ("empty_float.wav", SF_FORMAT_WAV | SF_FORMAT_FLOAT) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "aiff")) - { pcm_test_char ("char_u8.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_char ("char_s8.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ; - - pcm_test_short ("short_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ; - - pcm_test_short ("short_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ; - - /* Lite remove start */ - pcm_test_short ("dwvw16.aifc", SF_FORMAT_AIFF | SF_FORMAT_DWVW_16, SF_TRUE) ; - pcm_test_24bit ("dwvw24.aifc", SF_FORMAT_AIFF | SF_FORMAT_DWVW_24, SF_TRUE) ; - - pcm_test_float ("float.aifc" , SF_FORMAT_AIFF | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.aifc" , SF_FORMAT_AIFF | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - - empty_file_test ("empty_char.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_U8) ; - empty_file_test ("empty_short.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ; - empty_file_test ("empty_float.aiff", SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "au")) - { pcm_test_char ("char.au" , SF_FORMAT_AU | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short.au" , SF_FORMAT_AU | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.au" , SF_FORMAT_AU | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.au" , SF_FORMAT_AU | SF_FORMAT_PCM_32, SF_FALSE) ; - /* Lite remove start */ - pcm_test_float ("float.au" , SF_FORMAT_AU | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.au", SF_FORMAT_AU | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - - pcm_test_char ("char_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_32, SF_FALSE) ; - /* Lite remove start */ - pcm_test_float ("float_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "caf")) - { pcm_test_char ("char.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_32, SF_FALSE) ; - /* Lite remove start */ - pcm_test_float ("float.caf" , SF_FORMAT_CAF | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.caf" , SF_FORMAT_CAF | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - - pcm_test_short ("short_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_32, SF_FALSE) ; - /* Lite remove start */ - pcm_test_float ("float_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double_le.caf", SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "raw")) - { pcm_test_char ("char_s8.raw" , SF_FORMAT_RAW | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_char ("char_u8.raw" , SF_FORMAT_RAW | SF_FORMAT_PCM_U8, SF_FALSE) ; - - pcm_test_short ("short_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_short ("short_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_24bit ("24bit_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_int ("int_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, SF_FALSE) ; - - /* Lite remove start */ - pcm_test_float ("float_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_float ("float_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT , SF_FALSE) ; - - pcm_test_double ("double_le.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, SF_FALSE) ; - pcm_test_double ("double_be.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - test_count++ ; - } ; - - /* Lite remove start */ - if (do_all || ! strcmp (argv [1], "paf")) - { pcm_test_char ("char_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_char ("char_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_short ("short_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_24, SF_TRUE) ; - pcm_test_24bit ("24bit_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_24, SF_TRUE) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "svx")) - { pcm_test_char ("char.svx" , SF_FORMAT_SVX | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16, SF_FALSE) ; - - empty_file_test ("empty_char.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_S8) ; - empty_file_test ("empty_short.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "nist")) - { pcm_test_short ("short_le.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_short ("short_be.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit_le.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_24bit ("24bit_be.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int_le.nist" , SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_int ("int_be.nist" , SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_32, SF_FALSE) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "ircam")) - { pcm_test_short ("short_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_short ("short_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_int ("int_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_int ("int_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_float ("float_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_float ("float_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_FLOAT , SF_FALSE) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "voc")) - { pcm_test_char ("char.voc" , SF_FORMAT_VOC | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_short ("short.voc", SF_FORMAT_VOC | SF_FORMAT_PCM_16, SF_FALSE) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat4")) - { pcm_test_short ("short_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_short ("short_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_int ("int_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_int ("int_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_float ("float_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_float ("float_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_DOUBLE, SF_FALSE) ; - pcm_test_double ("double_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_DOUBLE, SF_FALSE) ; - - empty_file_test ("empty_short.mat4", SF_FORMAT_MAT4 | SF_FORMAT_PCM_16) ; - empty_file_test ("empty_float.mat4", SF_FORMAT_MAT4 | SF_FORMAT_FLOAT) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat5")) - { pcm_test_char ("char_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_char ("char_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_short ("short_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_short ("short_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_int ("int_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_int ("int_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_float ("float_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_float ("float_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_DOUBLE, SF_FALSE) ; - pcm_test_double ("double_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_DOUBLE, SF_FALSE) ; - - increment_open_file_count () ; - - empty_file_test ("empty_char.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8) ; - empty_file_test ("empty_short.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_16) ; - empty_file_test ("empty_float.mat5", SF_FORMAT_MAT5 | SF_FORMAT_FLOAT) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "pvf")) - { pcm_test_char ("char.pvf" , SF_FORMAT_PVF | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short.pvf", SF_FORMAT_PVF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_int ("int.pvf" , SF_FORMAT_PVF | SF_FORMAT_PCM_32, SF_FALSE) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "htk")) - { pcm_test_short ("short.htk", SF_FORMAT_HTK | SF_FORMAT_PCM_16, SF_FALSE) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mpc2k")) - { pcm_test_short ("short.mpc", SF_FORMAT_MPC2K | SF_FORMAT_PCM_16, SF_FALSE) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "avr")) - { pcm_test_char ("char_u8.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_char ("char_s8.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_16, SF_FALSE) ; - test_count++ ; - } ; - /* Lite remove end */ - - if (do_all || ! strcmp (argv [1], "w64")) - { pcm_test_char ("char.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_short ("short.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_32, SF_FALSE) ; - /* Lite remove start */ - pcm_test_float ("float.w64" , SF_FORMAT_W64 | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.w64" , SF_FORMAT_W64 | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - - empty_file_test ("empty_char.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_U8) ; - empty_file_test ("empty_short.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_16) ; - empty_file_test ("empty_float.w64", SF_FORMAT_W64 | SF_FORMAT_FLOAT) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "sds")) - { pcm_test_char ("char.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_24, SF_FALSE) ; - - empty_file_test ("empty_char.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_S8) ; - empty_file_test ("empty_short.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_16) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "sd2")) - { pcm_test_char ("char.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_S8, SF_TRUE) ; - pcm_test_short ("short.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_16, SF_TRUE) ; - pcm_test_24bit ("24bit.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_24, SF_TRUE) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "flac")) - { if (HAVE_EXTERNAL_LIBS) - { pcm_test_char ("char.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, SF_TRUE) ; - pcm_test_short ("short.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_16, SF_TRUE) ; - pcm_test_24bit ("24bit.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_24, SF_TRUE) ; - } - else - puts (" No FLAC tests because FLAC support was not compiled in.") ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "rf64")) - { pcm_test_char ("char.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_short ("short.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_32, SF_FALSE) ; - - /* Lite remove start */ - pcm_test_float ("float.rf64" , SF_FORMAT_RF64 | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.rf64" , SF_FORMAT_RF64 | SF_FORMAT_DOUBLE, SF_FALSE) ; - empty_file_test ("empty_char.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_U8) ; - empty_file_test ("empty_short.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; - empty_file_test ("empty_float.rf64", SF_FORMAT_RF64 | SF_FORMAT_FLOAT) ; - /* Lite remove end */ - - test_count++ ; - } ; - - if (test_count == 0) - { printf ("Mono : ************************************\n") ; - printf ("Mono : * No '%s' test defined.\n", argv [1]) ; - printf ("Mono : ************************************\n") ; - return 1 ; - } ; - - /* Only open file descriptors should be stdin, stdout and stderr. */ - check_open_file_count_or_die (__LINE__) ; - - return 0 ; -} /* main */ - -/*============================================================================================ -** Helper functions and macros. -*/ - -static void create_short_file (const char *filename) ; - -#define CHAR_ERROR(x,y) (abs ((x) - (y)) > 255) -#define INT_ERROR(x,y) (((x) - (y)) != 0) -#define TRIBYTE_ERROR(x,y) (abs ((x) - (y)) > 255) -#define FLOAT_ERROR(x,y) (fabs ((x) - (y)) > 1e-5) - -#define CONVERT_DATA(k,len,new,orig) \ - { for ((k) = 0 ; (k) < (len) ; (k) ++) \ - (new) [k] = (orig) [k] ; \ - } - - -/*====================================================================================== -*/ - -static void mono_char_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void stereo_char_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void mono_rdwr_char_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void new_rdwr_char_test (const char *filename, int format, int allow_fd) ; -static void multi_seek_test (const char * filename, int format) ; -static void write_seek_extend_test (const char * filename, int format) ; - -static void -pcm_test_char (const char *filename, int format, int long_file_ok) -{ SF_INFO sfinfo ; - short *orig ; - int k, allow_fd ; - - /* Sd2 files cannot be opened from an existing file descriptor. */ - allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; - - print_test_name ("pcm_test_char", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = format ; - - gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ; - - orig = orig_data.s ; - - /* Make this a macro so gdb steps over it in one go. */ - CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; - - /* Some test broken out here. */ - - mono_char_test (filename, format, long_file_ok, allow_fd) ; - - /* Sub format DWVW does not allow seeking. */ - if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || - (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) - { unlink (filename) ; - printf ("no seek : ok\n") ; - return ; - } ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC) - mono_rdwr_char_test (filename, format, long_file_ok, allow_fd) ; - - /* If the format doesn't support stereo we're done. */ - sfinfo.channels = 2 ; - if (sf_format_check (&sfinfo) == 0) - { unlink (filename) ; - puts ("no stereo : ok") ; - return ; - } ; - - stereo_char_test (filename, format, long_file_ok, allow_fd) ; - - /* New read/write test. Not sure if this is needed yet. */ - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF && - (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC && - (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC) - new_rdwr_char_test (filename, format, allow_fd) ; - - delete_file (format, filename) ; - - puts ("ok") ; - return ; -} /* pcm_test_char */ - -static void -mono_char_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - short *orig, *test ; - sf_count_t count ; - int k, items ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = format ; - - orig = orig_data.s ; - test = test_data.s ; - - items = DATA_LENGTH ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - sf_set_string (file, SF_STR_ARTIST, "Your name here") ; - - test_write_short_or_die (file, 0, orig, items, __LINE__) ; - sf_write_sync (file) ; - test_write_short_or_die (file, 0, orig, items, __LINE__) ; - sf_write_sync (file) ; - - /* Add non-audio data after the audio. */ - sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; - - sf_close (file) ; - - memset (test, 0, items * sizeof (short)) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < 2 * items) - { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ; - exit (1) ; - } ; - - if (! long_file_ok && sfinfo.frames > 2 * items) - { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_short_or_die (file, 0, test, items, __LINE__) ; - for (k = 0 ; k < items ; k++) - if (CHAR_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - oct_save_short (orig, test, items) ; - exit (1) ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_read_short_or_die (file, 0, test, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - if (CHAR_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || - (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) - { sf_close (file) ; - unlink (filename) ; - printf ("no seek : ") ; - return ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; - - test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - if (CHAR_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; - - test_read_short_or_die (file, 0, test + 20, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (CHAR_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - if (CHAR_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - count = 0 ; - while (count < sfinfo.frames) - count += sf_read_short (file, test, 311) ; - - /* Check that no error has occurred. */ - if (sf_error (file)) - { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - /* Check that we haven't read beyond EOF. */ - if (count > sfinfo.frames) - { printf ("\n\nLines %d : read past end of file (%ld should be %ld)\n", __LINE__, (long) count, (long) sfinfo.frames) ; - exit (1) ; - } ; - - test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; - - sf_close (file) ; - - multi_seek_test (filename, format) ; - write_seek_extend_test (filename, format) ; - -} /* mono_char_test */ - -static void -stereo_char_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - short *orig, *test ; - int k, items, frames ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 2 ; - sfinfo.format = format ; - - gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ; - - orig = orig_data.s ; - test = test_data.s ; - - /* Make this a macro so gdb steps over it in one go. */ - CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; - - items = DATA_LENGTH ; - frames = items / sfinfo.channels ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - sf_set_string (file, SF_STR_ARTIST, "Your name here") ; - - test_writef_short_or_die (file, 0, orig, frames, __LINE__) ; - - sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; - - sf_close (file) ; - - memset (test, 0, items * sizeof (short)) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", - __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < frames) - { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%ld should be %d)\n", - __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ; - exit (1) ; - } ; - - if (! long_file_ok && sfinfo.frames > frames) - { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%ld should be %d)\n", - __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 2) - { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_readf_short_or_die (file, 0, test, frames, __LINE__) ; - for (k = 0 ; k < items ; k++) - if (CHAR_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_readf_short_or_die (file, 0, test, 2, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - if (CHAR_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - /* Check for errors here. */ - if (sf_error (file)) - { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - if (sf_read_short (file, test, 1) > 0) - { printf ("Line %d: Should return 0.\n", __LINE__) ; - exit (1) ; - } ; - - if (! sf_error (file)) - { printf ("Line %d: Should return an error.\n", __LINE__) ; - exit (1) ; - } ; - /*-----------------------*/ - - test_readf_short_or_die (file, 0, test + 10, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (CHAR_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ; - for (k = 40 ; k < 44 ; k++) - if (CHAR_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (CHAR_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - sf_close (file) ; -} /* stereo_char_test */ - -static void -mono_rdwr_char_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - short *orig, *test ; - int k, pass ; - - orig = orig_data.s ; - test = test_data.s ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW - || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU - || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) - unlink (filename) ; - else - { /* Create a short file. */ - create_short_file (filename) ; - - /* Opening a already existing short file (ie invalid header) RDWR is disallowed. - ** If this returns a valif pointer sf_open() screwed up. - */ - if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) - { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; - exit (1) ; - } ; - - /* Truncate the file to zero bytes. */ - if (truncate (filename, 0) < 0) - { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ; - perror (NULL) ; - exit (1) ; - } ; - } ; - - /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain - ** all the usual data required when opening the file in WRITE mode. - */ - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - - /* Do 3 writes followed by reads. After each, check the data and the current - ** read and write offsets. - */ - for (pass = 1 ; pass <= 3 ; pass ++) - { orig [20] = pass * 2 ; - - /* Write some data. */ - test_write_short_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; - - test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; - - /* Read what we just wrote. */ - test_read_short_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; - - /* Check the data. */ - for (k = 0 ; k < DATA_LENGTH ; k++) - if (CHAR_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; - oct_save_short (orig, test, DATA_LENGTH) ; - exit (1) ; - } ; - - test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; - } ; /* for (pass ...) */ - - sf_close (file) ; - - /* Open the file again to check the data. */ - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < 3 * DATA_LENGTH) - { printf ("\n\nLine %d : Not enough frames in file. (%ld < %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ; - exit (1) ; - } - - if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) - { printf ("\n\nLine %d : Incorrect number of frames in file. (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - if (! long_file_ok) - test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; - else - test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; - - for (pass = 1 ; pass <= 3 ; pass ++) - { orig [20] = pass * 2 ; - - test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; - - /* Read what we just wrote. */ - test_read_short_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; - - /* Check the data. */ - for (k = 0 ; k < DATA_LENGTH ; k++) - if (CHAR_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; - oct_save_short (orig, test, DATA_LENGTH) ; - exit (1) ; - } ; - - } ; /* for (pass ...) */ - - sf_close (file) ; -} /* mono_rdwr_short_test */ - -static void -new_rdwr_char_test (const char *filename, int format, int allow_fd) -{ SNDFILE *wfile, *rwfile ; - SF_INFO sfinfo ; - short *orig, *test ; - int items, frames ; - - orig = orig_data.s ; - test = test_data.s ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 2 ; - sfinfo.format = format ; - - items = DATA_LENGTH ; - frames = items / sfinfo.channels ; - - wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; - test_writef_short_or_die (wfile, 1, orig, frames, __LINE__) ; - sf_write_sync (wfile) ; - test_writef_short_or_die (wfile, 2, orig, frames, __LINE__) ; - sf_write_sync (wfile) ; - - rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - if (sfinfo.frames != 2 * frames) - { printf ("\n\nLine %d : incorrect number of frames in file (%ld should be %d)\n\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * frames) ; - exit (1) ; - } ; - - test_writef_short_or_die (wfile, 3, orig, frames, __LINE__) ; - - test_readf_short_or_die (rwfile, 1, test, frames, __LINE__) ; - test_readf_short_or_die (rwfile, 2, test, frames, __LINE__) ; - - sf_close (wfile) ; - sf_close (rwfile) ; -} /* new_rdwr_char_test */ - - -/*====================================================================================== -*/ - -static void mono_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void stereo_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void mono_rdwr_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void new_rdwr_short_test (const char *filename, int format, int allow_fd) ; -static void multi_seek_test (const char * filename, int format) ; -static void write_seek_extend_test (const char * filename, int format) ; - -static void -pcm_test_short (const char *filename, int format, int long_file_ok) -{ SF_INFO sfinfo ; - short *orig ; - int k, allow_fd ; - - /* Sd2 files cannot be opened from an existing file descriptor. */ - allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; - - print_test_name ("pcm_test_short", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = format ; - - gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ; - - orig = orig_data.s ; - - /* Make this a macro so gdb steps over it in one go. */ - CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; - - /* Some test broken out here. */ - - mono_short_test (filename, format, long_file_ok, allow_fd) ; - - /* Sub format DWVW does not allow seeking. */ - if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || - (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) - { unlink (filename) ; - printf ("no seek : ok\n") ; - return ; - } ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC) - mono_rdwr_short_test (filename, format, long_file_ok, allow_fd) ; - - /* If the format doesn't support stereo we're done. */ - sfinfo.channels = 2 ; - if (sf_format_check (&sfinfo) == 0) - { unlink (filename) ; - puts ("no stereo : ok") ; - return ; - } ; - - stereo_short_test (filename, format, long_file_ok, allow_fd) ; - - /* New read/write test. Not sure if this is needed yet. */ - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF && - (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC && - (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC) - new_rdwr_short_test (filename, format, allow_fd) ; - - delete_file (format, filename) ; - - puts ("ok") ; - return ; -} /* pcm_test_short */ - -static void -mono_short_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - short *orig, *test ; - sf_count_t count ; - int k, items ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = format ; - - orig = orig_data.s ; - test = test_data.s ; - - items = DATA_LENGTH ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - sf_set_string (file, SF_STR_ARTIST, "Your name here") ; - - test_write_short_or_die (file, 0, orig, items, __LINE__) ; - sf_write_sync (file) ; - test_write_short_or_die (file, 0, orig, items, __LINE__) ; - sf_write_sync (file) ; - - /* Add non-audio data after the audio. */ - sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; - - sf_close (file) ; - - memset (test, 0, items * sizeof (short)) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < 2 * items) - { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ; - exit (1) ; - } ; - - if (! long_file_ok && sfinfo.frames > 2 * items) - { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_short_or_die (file, 0, test, items, __LINE__) ; - for (k = 0 ; k < items ; k++) - if (INT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - oct_save_short (orig, test, items) ; - exit (1) ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_read_short_or_die (file, 0, test, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - if (INT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || - (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) - { sf_close (file) ; - unlink (filename) ; - printf ("no seek : ") ; - return ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; - - test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - if (INT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; - - test_read_short_or_die (file, 0, test + 20, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (INT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - if (INT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - count = 0 ; - while (count < sfinfo.frames) - count += sf_read_short (file, test, 311) ; - - /* Check that no error has occurred. */ - if (sf_error (file)) - { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - /* Check that we haven't read beyond EOF. */ - if (count > sfinfo.frames) - { printf ("\n\nLines %d : read past end of file (%ld should be %ld)\n", __LINE__, (long) count, (long) sfinfo.frames) ; - exit (1) ; - } ; - - test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; - - sf_close (file) ; - - multi_seek_test (filename, format) ; - write_seek_extend_test (filename, format) ; - -} /* mono_short_test */ - -static void -stereo_short_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - short *orig, *test ; - int k, items, frames ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 2 ; - sfinfo.format = format ; - - gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ; - - orig = orig_data.s ; - test = test_data.s ; - - /* Make this a macro so gdb steps over it in one go. */ - CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; - - items = DATA_LENGTH ; - frames = items / sfinfo.channels ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - sf_set_string (file, SF_STR_ARTIST, "Your name here") ; - - test_writef_short_or_die (file, 0, orig, frames, __LINE__) ; - - sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; - - sf_close (file) ; - - memset (test, 0, items * sizeof (short)) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", - __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < frames) - { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%ld should be %d)\n", - __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ; - exit (1) ; - } ; - - if (! long_file_ok && sfinfo.frames > frames) - { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%ld should be %d)\n", - __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 2) - { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_readf_short_or_die (file, 0, test, frames, __LINE__) ; - for (k = 0 ; k < items ; k++) - if (INT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_readf_short_or_die (file, 0, test, 2, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - if (INT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - /* Check for errors here. */ - if (sf_error (file)) - { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - if (sf_read_short (file, test, 1) > 0) - { printf ("Line %d: Should return 0.\n", __LINE__) ; - exit (1) ; - } ; - - if (! sf_error (file)) - { printf ("Line %d: Should return an error.\n", __LINE__) ; - exit (1) ; - } ; - /*-----------------------*/ - - test_readf_short_or_die (file, 0, test + 10, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (INT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ; - for (k = 40 ; k < 44 ; k++) - if (INT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (INT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - sf_close (file) ; -} /* stereo_short_test */ - -static void -mono_rdwr_short_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - short *orig, *test ; - int k, pass ; - - orig = orig_data.s ; - test = test_data.s ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW - || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU - || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) - unlink (filename) ; - else - { /* Create a short file. */ - create_short_file (filename) ; - - /* Opening a already existing short file (ie invalid header) RDWR is disallowed. - ** If this returns a valif pointer sf_open() screwed up. - */ - if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) - { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; - exit (1) ; - } ; - - /* Truncate the file to zero bytes. */ - if (truncate (filename, 0) < 0) - { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ; - perror (NULL) ; - exit (1) ; - } ; - } ; - - /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain - ** all the usual data required when opening the file in WRITE mode. - */ - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - - /* Do 3 writes followed by reads. After each, check the data and the current - ** read and write offsets. - */ - for (pass = 1 ; pass <= 3 ; pass ++) - { orig [20] = pass * 2 ; - - /* Write some data. */ - test_write_short_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; - - test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; - - /* Read what we just wrote. */ - test_read_short_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; - - /* Check the data. */ - for (k = 0 ; k < DATA_LENGTH ; k++) - if (INT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; - oct_save_short (orig, test, DATA_LENGTH) ; - exit (1) ; - } ; - - test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; - } ; /* for (pass ...) */ - - sf_close (file) ; - - /* Open the file again to check the data. */ - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < 3 * DATA_LENGTH) - { printf ("\n\nLine %d : Not enough frames in file. (%ld < %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ; - exit (1) ; - } - - if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) - { printf ("\n\nLine %d : Incorrect number of frames in file. (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - if (! long_file_ok) - test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; - else - test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; - - for (pass = 1 ; pass <= 3 ; pass ++) - { orig [20] = pass * 2 ; - - test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; - - /* Read what we just wrote. */ - test_read_short_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; - - /* Check the data. */ - for (k = 0 ; k < DATA_LENGTH ; k++) - if (INT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; - oct_save_short (orig, test, DATA_LENGTH) ; - exit (1) ; - } ; - - } ; /* for (pass ...) */ - - sf_close (file) ; -} /* mono_rdwr_short_test */ - -static void -new_rdwr_short_test (const char *filename, int format, int allow_fd) -{ SNDFILE *wfile, *rwfile ; - SF_INFO sfinfo ; - short *orig, *test ; - int items, frames ; - - orig = orig_data.s ; - test = test_data.s ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 2 ; - sfinfo.format = format ; - - items = DATA_LENGTH ; - frames = items / sfinfo.channels ; - - wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; - test_writef_short_or_die (wfile, 1, orig, frames, __LINE__) ; - sf_write_sync (wfile) ; - test_writef_short_or_die (wfile, 2, orig, frames, __LINE__) ; - sf_write_sync (wfile) ; - - rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - if (sfinfo.frames != 2 * frames) - { printf ("\n\nLine %d : incorrect number of frames in file (%ld should be %d)\n\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * frames) ; - exit (1) ; - } ; - - test_writef_short_or_die (wfile, 3, orig, frames, __LINE__) ; - - test_readf_short_or_die (rwfile, 1, test, frames, __LINE__) ; - test_readf_short_or_die (rwfile, 2, test, frames, __LINE__) ; - - sf_close (wfile) ; - sf_close (rwfile) ; -} /* new_rdwr_short_test */ - - -/*====================================================================================== -*/ - -static void mono_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void stereo_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void mono_rdwr_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void new_rdwr_24bit_test (const char *filename, int format, int allow_fd) ; -static void multi_seek_test (const char * filename, int format) ; -static void write_seek_extend_test (const char * filename, int format) ; - -static void -pcm_test_24bit (const char *filename, int format, int long_file_ok) -{ SF_INFO sfinfo ; - int *orig ; - int k, allow_fd ; - - /* Sd2 files cannot be opened from an existing file descriptor. */ - allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; - - print_test_name ("pcm_test_24bit", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = format ; - - gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F000000)) ; - - orig = orig_data.i ; - - /* Make this a macro so gdb steps over it in one go. */ - CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; - - /* Some test broken out here. */ - - mono_24bit_test (filename, format, long_file_ok, allow_fd) ; - - /* Sub format DWVW does not allow seeking. */ - if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || - (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) - { unlink (filename) ; - printf ("no seek : ok\n") ; - return ; - } ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC) - mono_rdwr_24bit_test (filename, format, long_file_ok, allow_fd) ; - - /* If the format doesn't support stereo we're done. */ - sfinfo.channels = 2 ; - if (sf_format_check (&sfinfo) == 0) - { unlink (filename) ; - puts ("no stereo : ok") ; - return ; - } ; - - stereo_24bit_test (filename, format, long_file_ok, allow_fd) ; - - /* New read/write test. Not sure if this is needed yet. */ - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF && - (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC && - (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC) - new_rdwr_24bit_test (filename, format, allow_fd) ; - - delete_file (format, filename) ; - - puts ("ok") ; - return ; -} /* pcm_test_24bit */ - -static void -mono_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int *orig, *test ; - sf_count_t count ; - int k, items ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = format ; - - orig = orig_data.i ; - test = test_data.i ; - - items = DATA_LENGTH ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - sf_set_string (file, SF_STR_ARTIST, "Your name here") ; - - test_write_int_or_die (file, 0, orig, items, __LINE__) ; - sf_write_sync (file) ; - test_write_int_or_die (file, 0, orig, items, __LINE__) ; - sf_write_sync (file) ; - - /* Add non-audio data after the audio. */ - sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; - - sf_close (file) ; - - memset (test, 0, items * sizeof (int)) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < 2 * items) - { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ; - exit (1) ; - } ; - - if (! long_file_ok && sfinfo.frames > 2 * items) - { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_int_or_die (file, 0, test, items, __LINE__) ; - for (k = 0 ; k < items ; k++) - if (TRIBYTE_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - oct_save_int (orig, test, items) ; - exit (1) ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_read_int_or_die (file, 0, test, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - if (TRIBYTE_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || - (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) - { sf_close (file) ; - unlink (filename) ; - printf ("no seek : ") ; - return ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; - - test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - if (TRIBYTE_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; - - test_read_int_or_die (file, 0, test + 20, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (TRIBYTE_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - if (TRIBYTE_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - count = 0 ; - while (count < sfinfo.frames) - count += sf_read_int (file, test, 311) ; - - /* Check that no error has occurred. */ - if (sf_error (file)) - { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - /* Check that we haven't read beyond EOF. */ - if (count > sfinfo.frames) - { printf ("\n\nLines %d : read past end of file (%ld should be %ld)\n", __LINE__, (long) count, (long) sfinfo.frames) ; - exit (1) ; - } ; - - test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; - - sf_close (file) ; - - multi_seek_test (filename, format) ; - write_seek_extend_test (filename, format) ; - -} /* mono_24bit_test */ - -static void -stereo_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int *orig, *test ; - int k, items, frames ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 2 ; - sfinfo.format = format ; - - gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F000000)) ; - - orig = orig_data.i ; - test = test_data.i ; - - /* Make this a macro so gdb steps over it in one go. */ - CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; - - items = DATA_LENGTH ; - frames = items / sfinfo.channels ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - sf_set_string (file, SF_STR_ARTIST, "Your name here") ; - - test_writef_int_or_die (file, 0, orig, frames, __LINE__) ; - - sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; - - sf_close (file) ; - - memset (test, 0, items * sizeof (int)) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", - __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < frames) - { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%ld should be %d)\n", - __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ; - exit (1) ; - } ; - - if (! long_file_ok && sfinfo.frames > frames) - { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%ld should be %d)\n", - __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 2) - { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_readf_int_or_die (file, 0, test, frames, __LINE__) ; - for (k = 0 ; k < items ; k++) - if (TRIBYTE_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_readf_int_or_die (file, 0, test, 2, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - if (TRIBYTE_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - /* Check for errors here. */ - if (sf_error (file)) - { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - if (sf_read_int (file, test, 1) > 0) - { printf ("Line %d: Should return 0.\n", __LINE__) ; - exit (1) ; - } ; - - if (! sf_error (file)) - { printf ("Line %d: Should return an error.\n", __LINE__) ; - exit (1) ; - } ; - /*-----------------------*/ - - test_readf_int_or_die (file, 0, test + 10, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (TRIBYTE_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ; - for (k = 40 ; k < 44 ; k++) - if (TRIBYTE_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (TRIBYTE_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - sf_close (file) ; -} /* stereo_24bit_test */ - -static void -mono_rdwr_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int *orig, *test ; - int k, pass ; - - orig = orig_data.i ; - test = test_data.i ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW - || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU - || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) - unlink (filename) ; - else - { /* Create a short file. */ - create_short_file (filename) ; - - /* Opening a already existing short file (ie invalid header) RDWR is disallowed. - ** If this returns a valif pointer sf_open() screwed up. - */ - if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) - { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; - exit (1) ; - } ; - - /* Truncate the file to zero bytes. */ - if (truncate (filename, 0) < 0) - { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ; - perror (NULL) ; - exit (1) ; - } ; - } ; - - /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain - ** all the usual data required when opening the file in WRITE mode. - */ - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - - /* Do 3 writes followed by reads. After each, check the data and the current - ** read and write offsets. - */ - for (pass = 1 ; pass <= 3 ; pass ++) - { orig [20] = pass * 2 ; - - /* Write some data. */ - test_write_int_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; - - test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; - - /* Read what we just wrote. */ - test_read_int_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; - - /* Check the data. */ - for (k = 0 ; k < DATA_LENGTH ; k++) - if (TRIBYTE_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; - oct_save_int (orig, test, DATA_LENGTH) ; - exit (1) ; - } ; - - test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; - } ; /* for (pass ...) */ - - sf_close (file) ; - - /* Open the file again to check the data. */ - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < 3 * DATA_LENGTH) - { printf ("\n\nLine %d : Not enough frames in file. (%ld < %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ; - exit (1) ; - } - - if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) - { printf ("\n\nLine %d : Incorrect number of frames in file. (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - if (! long_file_ok) - test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; - else - test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; - - for (pass = 1 ; pass <= 3 ; pass ++) - { orig [20] = pass * 2 ; - - test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; - - /* Read what we just wrote. */ - test_read_int_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; - - /* Check the data. */ - for (k = 0 ; k < DATA_LENGTH ; k++) - if (TRIBYTE_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; - oct_save_int (orig, test, DATA_LENGTH) ; - exit (1) ; - } ; - - } ; /* for (pass ...) */ - - sf_close (file) ; -} /* mono_rdwr_int_test */ - -static void -new_rdwr_24bit_test (const char *filename, int format, int allow_fd) -{ SNDFILE *wfile, *rwfile ; - SF_INFO sfinfo ; - int *orig, *test ; - int items, frames ; - - orig = orig_data.i ; - test = test_data.i ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 2 ; - sfinfo.format = format ; - - items = DATA_LENGTH ; - frames = items / sfinfo.channels ; - - wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; - test_writef_int_or_die (wfile, 1, orig, frames, __LINE__) ; - sf_write_sync (wfile) ; - test_writef_int_or_die (wfile, 2, orig, frames, __LINE__) ; - sf_write_sync (wfile) ; - - rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - if (sfinfo.frames != 2 * frames) - { printf ("\n\nLine %d : incorrect number of frames in file (%ld should be %d)\n\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * frames) ; - exit (1) ; - } ; - - test_writef_int_or_die (wfile, 3, orig, frames, __LINE__) ; - - test_readf_int_or_die (rwfile, 1, test, frames, __LINE__) ; - test_readf_int_or_die (rwfile, 2, test, frames, __LINE__) ; - - sf_close (wfile) ; - sf_close (rwfile) ; -} /* new_rdwr_24bit_test */ - - -/*====================================================================================== -*/ - -static void mono_int_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void stereo_int_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void mono_rdwr_int_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void new_rdwr_int_test (const char *filename, int format, int allow_fd) ; -static void multi_seek_test (const char * filename, int format) ; -static void write_seek_extend_test (const char * filename, int format) ; - -static void -pcm_test_int (const char *filename, int format, int long_file_ok) -{ SF_INFO sfinfo ; - int *orig ; - int k, allow_fd ; - - /* Sd2 files cannot be opened from an existing file descriptor. */ - allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; - - print_test_name ("pcm_test_int", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = format ; - - gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F000000)) ; - - orig = orig_data.i ; - - /* Make this a macro so gdb steps over it in one go. */ - CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; - - /* Some test broken out here. */ - - mono_int_test (filename, format, long_file_ok, allow_fd) ; - - /* Sub format DWVW does not allow seeking. */ - if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || - (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) - { unlink (filename) ; - printf ("no seek : ok\n") ; - return ; - } ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC) - mono_rdwr_int_test (filename, format, long_file_ok, allow_fd) ; - - /* If the format doesn't support stereo we're done. */ - sfinfo.channels = 2 ; - if (sf_format_check (&sfinfo) == 0) - { unlink (filename) ; - puts ("no stereo : ok") ; - return ; - } ; - - stereo_int_test (filename, format, long_file_ok, allow_fd) ; - - /* New read/write test. Not sure if this is needed yet. */ - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF && - (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC && - (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC) - new_rdwr_int_test (filename, format, allow_fd) ; - - delete_file (format, filename) ; - - puts ("ok") ; - return ; -} /* pcm_test_int */ - -static void -mono_int_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int *orig, *test ; - sf_count_t count ; - int k, items ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = format ; - - orig = orig_data.i ; - test = test_data.i ; - - items = DATA_LENGTH ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - sf_set_string (file, SF_STR_ARTIST, "Your name here") ; - - test_write_int_or_die (file, 0, orig, items, __LINE__) ; - sf_write_sync (file) ; - test_write_int_or_die (file, 0, orig, items, __LINE__) ; - sf_write_sync (file) ; - - /* Add non-audio data after the audio. */ - sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; - - sf_close (file) ; - - memset (test, 0, items * sizeof (int)) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < 2 * items) - { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ; - exit (1) ; - } ; - - if (! long_file_ok && sfinfo.frames > 2 * items) - { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_int_or_die (file, 0, test, items, __LINE__) ; - for (k = 0 ; k < items ; k++) - if (INT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - oct_save_int (orig, test, items) ; - exit (1) ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_read_int_or_die (file, 0, test, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - if (INT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || - (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) - { sf_close (file) ; - unlink (filename) ; - printf ("no seek : ") ; - return ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; - - test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - if (INT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; - - test_read_int_or_die (file, 0, test + 20, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (INT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - if (INT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - count = 0 ; - while (count < sfinfo.frames) - count += sf_read_int (file, test, 311) ; - - /* Check that no error has occurred. */ - if (sf_error (file)) - { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - /* Check that we haven't read beyond EOF. */ - if (count > sfinfo.frames) - { printf ("\n\nLines %d : read past end of file (%ld should be %ld)\n", __LINE__, (long) count, (long) sfinfo.frames) ; - exit (1) ; - } ; - - test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; - - sf_close (file) ; - - multi_seek_test (filename, format) ; - write_seek_extend_test (filename, format) ; - -} /* mono_int_test */ - -static void -stereo_int_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int *orig, *test ; - int k, items, frames ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 2 ; - sfinfo.format = format ; - - gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F000000)) ; - - orig = orig_data.i ; - test = test_data.i ; - - /* Make this a macro so gdb steps over it in one go. */ - CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; - - items = DATA_LENGTH ; - frames = items / sfinfo.channels ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - sf_set_string (file, SF_STR_ARTIST, "Your name here") ; - - test_writef_int_or_die (file, 0, orig, frames, __LINE__) ; - - sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; - - sf_close (file) ; - - memset (test, 0, items * sizeof (int)) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", - __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < frames) - { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%ld should be %d)\n", - __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ; - exit (1) ; - } ; - - if (! long_file_ok && sfinfo.frames > frames) - { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%ld should be %d)\n", - __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 2) - { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_readf_int_or_die (file, 0, test, frames, __LINE__) ; - for (k = 0 ; k < items ; k++) - if (INT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_readf_int_or_die (file, 0, test, 2, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - if (INT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - /* Check for errors here. */ - if (sf_error (file)) - { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - if (sf_read_int (file, test, 1) > 0) - { printf ("Line %d: Should return 0.\n", __LINE__) ; - exit (1) ; - } ; - - if (! sf_error (file)) - { printf ("Line %d: Should return an error.\n", __LINE__) ; - exit (1) ; - } ; - /*-----------------------*/ - - test_readf_int_or_die (file, 0, test + 10, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (INT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ; - for (k = 40 ; k < 44 ; k++) - if (INT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (INT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - sf_close (file) ; -} /* stereo_int_test */ - -static void -mono_rdwr_int_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - int *orig, *test ; - int k, pass ; - - orig = orig_data.i ; - test = test_data.i ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW - || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU - || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) - unlink (filename) ; - else - { /* Create a short file. */ - create_short_file (filename) ; - - /* Opening a already existing short file (ie invalid header) RDWR is disallowed. - ** If this returns a valif pointer sf_open() screwed up. - */ - if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) - { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; - exit (1) ; - } ; - - /* Truncate the file to zero bytes. */ - if (truncate (filename, 0) < 0) - { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ; - perror (NULL) ; - exit (1) ; - } ; - } ; - - /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain - ** all the usual data required when opening the file in WRITE mode. - */ - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - - /* Do 3 writes followed by reads. After each, check the data and the current - ** read and write offsets. - */ - for (pass = 1 ; pass <= 3 ; pass ++) - { orig [20] = pass * 2 ; - - /* Write some data. */ - test_write_int_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; - - test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; - - /* Read what we just wrote. */ - test_read_int_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; - - /* Check the data. */ - for (k = 0 ; k < DATA_LENGTH ; k++) - if (INT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; - oct_save_int (orig, test, DATA_LENGTH) ; - exit (1) ; - } ; - - test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; - } ; /* for (pass ...) */ - - sf_close (file) ; - - /* Open the file again to check the data. */ - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < 3 * DATA_LENGTH) - { printf ("\n\nLine %d : Not enough frames in file. (%ld < %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ; - exit (1) ; - } - - if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) - { printf ("\n\nLine %d : Incorrect number of frames in file. (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - if (! long_file_ok) - test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; - else - test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; - - for (pass = 1 ; pass <= 3 ; pass ++) - { orig [20] = pass * 2 ; - - test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; - - /* Read what we just wrote. */ - test_read_int_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; - - /* Check the data. */ - for (k = 0 ; k < DATA_LENGTH ; k++) - if (INT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; - oct_save_int (orig, test, DATA_LENGTH) ; - exit (1) ; - } ; - - } ; /* for (pass ...) */ - - sf_close (file) ; -} /* mono_rdwr_int_test */ - -static void -new_rdwr_int_test (const char *filename, int format, int allow_fd) -{ SNDFILE *wfile, *rwfile ; - SF_INFO sfinfo ; - int *orig, *test ; - int items, frames ; - - orig = orig_data.i ; - test = test_data.i ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 2 ; - sfinfo.format = format ; - - items = DATA_LENGTH ; - frames = items / sfinfo.channels ; - - wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; - test_writef_int_or_die (wfile, 1, orig, frames, __LINE__) ; - sf_write_sync (wfile) ; - test_writef_int_or_die (wfile, 2, orig, frames, __LINE__) ; - sf_write_sync (wfile) ; - - rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - if (sfinfo.frames != 2 * frames) - { printf ("\n\nLine %d : incorrect number of frames in file (%ld should be %d)\n\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * frames) ; - exit (1) ; - } ; - - test_writef_int_or_die (wfile, 3, orig, frames, __LINE__) ; - - test_readf_int_or_die (rwfile, 1, test, frames, __LINE__) ; - test_readf_int_or_die (rwfile, 2, test, frames, __LINE__) ; - - sf_close (wfile) ; - sf_close (rwfile) ; -} /* new_rdwr_int_test */ - - -/*====================================================================================== -*/ - -static void mono_float_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void stereo_float_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void mono_rdwr_float_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void new_rdwr_float_test (const char *filename, int format, int allow_fd) ; -static void multi_seek_test (const char * filename, int format) ; -static void write_seek_extend_test (const char * filename, int format) ; - -static void -pcm_test_float (const char *filename, int format, int long_file_ok) -{ SF_INFO sfinfo ; - float *orig ; - int k, allow_fd ; - - /* Sd2 files cannot be opened from an existing file descriptor. */ - allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; - - print_test_name ("pcm_test_float", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = format ; - - gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 1.0) ; - - orig = orig_data.f ; - - /* Make this a macro so gdb steps over it in one go. */ - CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; - - /* Some test broken out here. */ - - mono_float_test (filename, format, long_file_ok, allow_fd) ; - - /* Sub format DWVW does not allow seeking. */ - if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || - (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) - { unlink (filename) ; - printf ("no seek : ok\n") ; - return ; - } ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC) - mono_rdwr_float_test (filename, format, long_file_ok, allow_fd) ; - - /* If the format doesn't support stereo we're done. */ - sfinfo.channels = 2 ; - if (sf_format_check (&sfinfo) == 0) - { unlink (filename) ; - puts ("no stereo : ok") ; - return ; - } ; - - stereo_float_test (filename, format, long_file_ok, allow_fd) ; - - /* New read/write test. Not sure if this is needed yet. */ - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF && - (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC && - (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC) - new_rdwr_float_test (filename, format, allow_fd) ; - - delete_file (format, filename) ; - - puts ("ok") ; - return ; -} /* pcm_test_float */ - -static void -mono_float_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - float *orig, *test ; - sf_count_t count ; - int k, items ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = format ; - - orig = orig_data.f ; - test = test_data.f ; - - items = DATA_LENGTH ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - sf_set_string (file, SF_STR_ARTIST, "Your name here") ; - - test_write_float_or_die (file, 0, orig, items, __LINE__) ; - sf_write_sync (file) ; - test_write_float_or_die (file, 0, orig, items, __LINE__) ; - sf_write_sync (file) ; - - /* Add non-audio data after the audio. */ - sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; - - sf_close (file) ; - - memset (test, 0, items * sizeof (float)) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < 2 * items) - { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ; - exit (1) ; - } ; - - if (! long_file_ok && sfinfo.frames > 2 * items) - { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_float_or_die (file, 0, test, items, __LINE__) ; - for (k = 0 ; k < items ; k++) - if (FLOAT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; - oct_save_float (orig, test, items) ; - exit (1) ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_read_float_or_die (file, 0, test, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - if (FLOAT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || - (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) - { sf_close (file) ; - unlink (filename) ; - printf ("no seek : ") ; - return ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; - - test_read_float_or_die (file, 0, test + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - if (FLOAT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; - - test_read_float_or_die (file, 0, test + 20, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (FLOAT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_read_float_or_die (file, 0, test + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - if (FLOAT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - count = 0 ; - while (count < sfinfo.frames) - count += sf_read_float (file, test, 311) ; - - /* Check that no error has occurred. */ - if (sf_error (file)) - { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - /* Check that we haven't read beyond EOF. */ - if (count > sfinfo.frames) - { printf ("\n\nLines %d : read past end of file (%ld should be %ld)\n", __LINE__, (long) count, (long) sfinfo.frames) ; - exit (1) ; - } ; - - test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; - - sf_close (file) ; - - multi_seek_test (filename, format) ; - write_seek_extend_test (filename, format) ; - -} /* mono_float_test */ - -static void -stereo_float_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - float *orig, *test ; - int k, items, frames ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 2 ; - sfinfo.format = format ; - - gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 1.0) ; - - orig = orig_data.f ; - test = test_data.f ; - - /* Make this a macro so gdb steps over it in one go. */ - CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; - - items = DATA_LENGTH ; - frames = items / sfinfo.channels ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - sf_set_string (file, SF_STR_ARTIST, "Your name here") ; - - test_writef_float_or_die (file, 0, orig, frames, __LINE__) ; - - sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; - - sf_close (file) ; - - memset (test, 0, items * sizeof (float)) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", - __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < frames) - { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%ld should be %d)\n", - __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ; - exit (1) ; - } ; - - if (! long_file_ok && sfinfo.frames > frames) - { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%ld should be %d)\n", - __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 2) - { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_readf_float_or_die (file, 0, test, frames, __LINE__) ; - for (k = 0 ; k < items ; k++) - if (FLOAT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_readf_float_or_die (file, 0, test, 2, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - if (FLOAT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - /* Check for errors here. */ - if (sf_error (file)) - { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - if (sf_read_float (file, test, 1) > 0) - { printf ("Line %d: Should return 0.\n", __LINE__) ; - exit (1) ; - } ; - - if (! sf_error (file)) - { printf ("Line %d: Should return an error.\n", __LINE__) ; - exit (1) ; - } ; - /*-----------------------*/ - - test_readf_float_or_die (file, 0, test + 10, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (FLOAT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_readf_float_or_die (file, 0, test + 20, 2, __LINE__) ; - for (k = 40 ; k < 44 ; k++) - if (FLOAT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_readf_float_or_die (file, 0, test + 20, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (FLOAT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - sf_close (file) ; -} /* stereo_float_test */ - -static void -mono_rdwr_float_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - float *orig, *test ; - int k, pass ; - - orig = orig_data.f ; - test = test_data.f ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW - || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU - || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) - unlink (filename) ; - else - { /* Create a short file. */ - create_short_file (filename) ; - - /* Opening a already existing short file (ie invalid header) RDWR is disallowed. - ** If this returns a valif pointer sf_open() screwed up. - */ - if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) - { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; - exit (1) ; - } ; - - /* Truncate the file to zero bytes. */ - if (truncate (filename, 0) < 0) - { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ; - perror (NULL) ; - exit (1) ; - } ; - } ; - - /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain - ** all the usual data required when opening the file in WRITE mode. - */ - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - - /* Do 3 writes followed by reads. After each, check the data and the current - ** read and write offsets. - */ - for (pass = 1 ; pass <= 3 ; pass ++) - { orig [20] = pass * 2 ; - - /* Write some data. */ - test_write_float_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; - - test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; - - /* Read what we just wrote. */ - test_read_float_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; - - /* Check the data. */ - for (k = 0 ; k < DATA_LENGTH ; k++) - if (FLOAT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d (pass %d) A : Error at sample %d (%g => %g).\n", __LINE__, pass, k, orig [k], test [k]) ; - oct_save_float (orig, test, DATA_LENGTH) ; - exit (1) ; - } ; - - test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; - } ; /* for (pass ...) */ - - sf_close (file) ; - - /* Open the file again to check the data. */ - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < 3 * DATA_LENGTH) - { printf ("\n\nLine %d : Not enough frames in file. (%ld < %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ; - exit (1) ; - } - - if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) - { printf ("\n\nLine %d : Incorrect number of frames in file. (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - if (! long_file_ok) - test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; - else - test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; - - for (pass = 1 ; pass <= 3 ; pass ++) - { orig [20] = pass * 2 ; - - test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; - - /* Read what we just wrote. */ - test_read_float_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; - - /* Check the data. */ - for (k = 0 ; k < DATA_LENGTH ; k++) - if (FLOAT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d (pass %d) B : Error at sample %d (%g => %g).\n", __LINE__, pass, k, orig [k], test [k]) ; - oct_save_float (orig, test, DATA_LENGTH) ; - exit (1) ; - } ; - - } ; /* for (pass ...) */ - - sf_close (file) ; -} /* mono_rdwr_float_test */ - -static void -new_rdwr_float_test (const char *filename, int format, int allow_fd) -{ SNDFILE *wfile, *rwfile ; - SF_INFO sfinfo ; - float *orig, *test ; - int items, frames ; - - orig = orig_data.f ; - test = test_data.f ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 2 ; - sfinfo.format = format ; - - items = DATA_LENGTH ; - frames = items / sfinfo.channels ; - - wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; - test_writef_float_or_die (wfile, 1, orig, frames, __LINE__) ; - sf_write_sync (wfile) ; - test_writef_float_or_die (wfile, 2, orig, frames, __LINE__) ; - sf_write_sync (wfile) ; - - rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - if (sfinfo.frames != 2 * frames) - { printf ("\n\nLine %d : incorrect number of frames in file (%ld should be %d)\n\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * frames) ; - exit (1) ; - } ; - - test_writef_float_or_die (wfile, 3, orig, frames, __LINE__) ; - - test_readf_float_or_die (rwfile, 1, test, frames, __LINE__) ; - test_readf_float_or_die (rwfile, 2, test, frames, __LINE__) ; - - sf_close (wfile) ; - sf_close (rwfile) ; -} /* new_rdwr_float_test */ - - -/*====================================================================================== -*/ - -static void mono_double_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void stereo_double_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void mono_rdwr_double_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void new_rdwr_double_test (const char *filename, int format, int allow_fd) ; -static void multi_seek_test (const char * filename, int format) ; -static void write_seek_extend_test (const char * filename, int format) ; - -static void -pcm_test_double (const char *filename, int format, int long_file_ok) -{ SF_INFO sfinfo ; - double *orig ; - int k, allow_fd ; - - /* Sd2 files cannot be opened from an existing file descriptor. */ - allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; - - print_test_name ("pcm_test_double", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = format ; - - gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 1.0) ; - - orig = orig_data.d ; - - /* Make this a macro so gdb steps over it in one go. */ - CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; - - /* Some test broken out here. */ - - mono_double_test (filename, format, long_file_ok, allow_fd) ; - - /* Sub format DWVW does not allow seeking. */ - if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || - (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) - { unlink (filename) ; - printf ("no seek : ok\n") ; - return ; - } ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC) - mono_rdwr_double_test (filename, format, long_file_ok, allow_fd) ; - - /* If the format doesn't support stereo we're done. */ - sfinfo.channels = 2 ; - if (sf_format_check (&sfinfo) == 0) - { unlink (filename) ; - puts ("no stereo : ok") ; - return ; - } ; - - stereo_double_test (filename, format, long_file_ok, allow_fd) ; - - /* New read/write test. Not sure if this is needed yet. */ - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF && - (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC && - (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC) - new_rdwr_double_test (filename, format, allow_fd) ; - - delete_file (format, filename) ; - - puts ("ok") ; - return ; -} /* pcm_test_double */ - -static void -mono_double_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - double *orig, *test ; - sf_count_t count ; - int k, items ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = format ; - - orig = orig_data.d ; - test = test_data.d ; - - items = DATA_LENGTH ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - sf_set_string (file, SF_STR_ARTIST, "Your name here") ; - - test_write_double_or_die (file, 0, orig, items, __LINE__) ; - sf_write_sync (file) ; - test_write_double_or_die (file, 0, orig, items, __LINE__) ; - sf_write_sync (file) ; - - /* Add non-audio data after the audio. */ - sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; - - sf_close (file) ; - - memset (test, 0, items * sizeof (double)) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < 2 * items) - { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ; - exit (1) ; - } ; - - if (! long_file_ok && sfinfo.frames > 2 * items) - { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_double_or_die (file, 0, test, items, __LINE__) ; - for (k = 0 ; k < items ; k++) - if (FLOAT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; - oct_save_double (orig, test, items) ; - exit (1) ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, test, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - if (FLOAT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || - (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) - { sf_close (file) ; - unlink (filename) ; - printf ("no seek : ") ; - return ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, test + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - if (FLOAT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, test + 20, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (FLOAT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_read_double_or_die (file, 0, test + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - if (FLOAT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - count = 0 ; - while (count < sfinfo.frames) - count += sf_read_double (file, test, 311) ; - - /* Check that no error has occurred. */ - if (sf_error (file)) - { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - /* Check that we haven't read beyond EOF. */ - if (count > sfinfo.frames) - { printf ("\n\nLines %d : read past end of file (%ld should be %ld)\n", __LINE__, (long) count, (long) sfinfo.frames) ; - exit (1) ; - } ; - - test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; - - sf_close (file) ; - - multi_seek_test (filename, format) ; - write_seek_extend_test (filename, format) ; - -} /* mono_double_test */ - -static void -stereo_double_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - double *orig, *test ; - int k, items, frames ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 2 ; - sfinfo.format = format ; - - gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 1.0) ; - - orig = orig_data.d ; - test = test_data.d ; - - /* Make this a macro so gdb steps over it in one go. */ - CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; - - items = DATA_LENGTH ; - frames = items / sfinfo.channels ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - sf_set_string (file, SF_STR_ARTIST, "Your name here") ; - - test_writef_double_or_die (file, 0, orig, frames, __LINE__) ; - - sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; - - sf_close (file) ; - - memset (test, 0, items * sizeof (double)) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", - __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < frames) - { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%ld should be %d)\n", - __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ; - exit (1) ; - } ; - - if (! long_file_ok && sfinfo.frames > frames) - { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%ld should be %d)\n", - __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 2) - { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_readf_double_or_die (file, 0, test, frames, __LINE__) ; - for (k = 0 ; k < items ; k++) - if (FLOAT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, test, 2, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - if (FLOAT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - /* Check for errors here. */ - if (sf_error (file)) - { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - if (sf_read_double (file, test, 1) > 0) - { printf ("Line %d: Should return 0.\n", __LINE__) ; - exit (1) ; - } ; - - if (! sf_error (file)) - { printf ("Line %d: Should return an error.\n", __LINE__) ; - exit (1) ; - } ; - /*-----------------------*/ - - test_readf_double_or_die (file, 0, test + 10, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (FLOAT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, test + 20, 2, __LINE__) ; - for (k = 40 ; k < 44 ; k++) - if (FLOAT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_readf_double_or_die (file, 0, test + 20, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if (FLOAT_ERROR (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - sf_close (file) ; -} /* stereo_double_test */ - -static void -mono_rdwr_double_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - double *orig, *test ; - int k, pass ; - - orig = orig_data.d ; - test = test_data.d ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW - || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU - || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) - unlink (filename) ; - else - { /* Create a short file. */ - create_short_file (filename) ; - - /* Opening a already existing short file (ie invalid header) RDWR is disallowed. - ** If this returns a valif pointer sf_open() screwed up. - */ - if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) - { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; - exit (1) ; - } ; - - /* Truncate the file to zero bytes. */ - if (truncate (filename, 0) < 0) - { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ; - perror (NULL) ; - exit (1) ; - } ; - } ; - - /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain - ** all the usual data required when opening the file in WRITE mode. - */ - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - - /* Do 3 writes followed by reads. After each, check the data and the current - ** read and write offsets. - */ - for (pass = 1 ; pass <= 3 ; pass ++) - { orig [20] = pass * 2 ; - - /* Write some data. */ - test_write_double_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; - - test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; - - /* Read what we just wrote. */ - test_read_double_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; - - /* Check the data. */ - for (k = 0 ; k < DATA_LENGTH ; k++) - if (FLOAT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d (pass %d) A : Error at sample %d (%g => %g).\n", __LINE__, pass, k, orig [k], test [k]) ; - oct_save_double (orig, test, DATA_LENGTH) ; - exit (1) ; - } ; - - test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; - } ; /* for (pass ...) */ - - sf_close (file) ; - - /* Open the file again to check the data. */ - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < 3 * DATA_LENGTH) - { printf ("\n\nLine %d : Not enough frames in file. (%ld < %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ; - exit (1) ; - } - - if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) - { printf ("\n\nLine %d : Incorrect number of frames in file. (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - if (! long_file_ok) - test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; - else - test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; - - for (pass = 1 ; pass <= 3 ; pass ++) - { orig [20] = pass * 2 ; - - test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; - - /* Read what we just wrote. */ - test_read_double_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; - - /* Check the data. */ - for (k = 0 ; k < DATA_LENGTH ; k++) - if (FLOAT_ERROR (orig [k], test [k])) - { printf ("\n\nLine %d (pass %d) B : Error at sample %d (%g => %g).\n", __LINE__, pass, k, orig [k], test [k]) ; - oct_save_double (orig, test, DATA_LENGTH) ; - exit (1) ; - } ; - - } ; /* for (pass ...) */ - - sf_close (file) ; -} /* mono_rdwr_double_test */ - -static void -new_rdwr_double_test (const char *filename, int format, int allow_fd) -{ SNDFILE *wfile, *rwfile ; - SF_INFO sfinfo ; - double *orig, *test ; - int items, frames ; - - orig = orig_data.d ; - test = test_data.d ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 2 ; - sfinfo.format = format ; - - items = DATA_LENGTH ; - frames = items / sfinfo.channels ; - - wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; - test_writef_double_or_die (wfile, 1, orig, frames, __LINE__) ; - sf_write_sync (wfile) ; - test_writef_double_or_die (wfile, 2, orig, frames, __LINE__) ; - sf_write_sync (wfile) ; - - rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - if (sfinfo.frames != 2 * frames) - { printf ("\n\nLine %d : incorrect number of frames in file (%ld should be %d)\n\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * frames) ; - exit (1) ; - } ; - - test_writef_double_or_die (wfile, 3, orig, frames, __LINE__) ; - - test_readf_double_or_die (rwfile, 1, test, frames, __LINE__) ; - test_readf_double_or_die (rwfile, 2, test, frames, __LINE__) ; - - sf_close (wfile) ; - sf_close (rwfile) ; -} /* new_rdwr_double_test */ - - - -/*---------------------------------------------------------------------------------------- -*/ - -static void -empty_file_test (const char *filename, int format) -{ SNDFILE *file ; - SF_INFO info ; - int allow_fd ; - - /* Sd2 files cannot be opened from an existing file descriptor. */ - allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; - - print_test_name ("empty_file_test", filename) ; - - unlink (filename) ; - - info.samplerate = 48000 ; - info.channels = 2 ; - info.format = format ; - - if (sf_format_check (&info) == SF_FALSE) - { info.channels = 1 ; - if (sf_format_check (&info) == SF_FALSE) - { puts ("invalid file format") ; - return ; - } ; - } ; - - /* Create an empty file. */ - file = test_open_file_or_die (filename, SFM_WRITE, &info, allow_fd, __LINE__) ; - sf_close (file) ; - - /* Open for read and check the length. */ - file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ; - - if (SF_COUNT_TO_LONG (info.frames) != 0) - { printf ("\n\nError : frame count (%ld) should be zero.\n", SF_COUNT_TO_LONG (info.frames)) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* Open for read/write and check the length. */ - file = test_open_file_or_die (filename, SFM_RDWR, &info, allow_fd, __LINE__) ; - - if (SF_COUNT_TO_LONG (info.frames) != 0) - { printf ("\n\nError : frame count (%ld) should be zero.\n", SF_COUNT_TO_LONG (info.frames)) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* Open for read and check the length. */ - file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ; - - if (SF_COUNT_TO_LONG (info.frames) != 0) - { printf ("\n\nError : frame count (%ld) should be zero.\n", SF_COUNT_TO_LONG (info.frames)) ; - exit (1) ; - } ; - - sf_close (file) ; - - check_open_file_count_or_die (__LINE__) ; - - unlink (filename) ; - puts ("ok") ; - - return ; -} /* empty_file_test */ - - -/*---------------------------------------------------------------------------------------- -*/ - -static void -create_short_file (const char *filename) -{ FILE *file ; - - if (! (file = fopen (filename, "w"))) - { printf ("create_short_file : fopen (%s, \"w\") failed.", filename) ; - fflush (stdout) ; - perror (NULL) ; - exit (1) ; - } ; - - fprintf (file, "This is the file data.\n") ; - - fclose (file) ; -} /* create_short_file */ - -#if (defined (WIN32) || defined (__WIN32)) - -/* Win32 does not have truncate (nor does it have the POSIX function ftruncate). -** Hack somethng up here to over come this. This function can only truncate to a -** length of zero. -*/ - -static int -truncate (const char *filename, int ignored) -{ int fd ; - - ignored = 0 ; - - if ((fd = open (filename, O_RDWR | O_TRUNC | O_BINARY)) < 0) - return 0 ; - - close (fd) ; - - return 0 ; -} /* truncate */ - -#endif - -static void -multi_seek_test (const char * filename, int format) -{ SNDFILE * file ; - SF_INFO info ; - sf_count_t pos ; - int k ; - - /* This test doesn't work on the following. */ - switch (format & SF_FORMAT_TYPEMASK) - { case SF_FORMAT_RAW : - return ; - - default : - break ; - } ; - - memset (&info, 0, sizeof (info)) ; - - generate_file (filename, format, 88200) ; - - file = test_open_file_or_die (filename, SFM_READ, &info, SF_FALSE, __LINE__) ; - - for (k = 0 ; k < 10 ; k++) - { pos = info.frames / (k + 2) ; - test_seek_or_die (file, pos, SEEK_SET, pos, info.channels, __LINE__) ; - } ; - - sf_close (file) ; -} /* multi_seek_test */ - -static void -write_seek_extend_test (const char * filename, int format) -{ SNDFILE * file ; - SF_INFO info ; - short *orig, *test ; - unsigned items, k ; - - /* This test doesn't work on the following. */ - switch (format & SF_FORMAT_TYPEMASK) - { case SF_FORMAT_FLAC : - case SF_FORMAT_HTK : - case SF_FORMAT_PAF : - case SF_FORMAT_SDS : - case SF_FORMAT_SVX : - return ; - - default : - break ; - } ; - - memset (&info, 0, sizeof (info)) ; - - info.samplerate = 48000 ; - info.channels = 1 ; - info.format = format ; - - items = 512 ; - exit_if_true (items > ARRAY_LEN (orig_data.s), "Line %d : Bad assumption.\n", __LINE__) ; - - orig = orig_data.s ; - test = test_data.s ; - - for (k = 0 ; k < ARRAY_LEN (orig_data.s) ; k++) - orig [k] = 0x3fff ; - - file = test_open_file_or_die (filename, SFM_WRITE, &info, SF_FALSE, __LINE__) ; - test_write_short_or_die (file, 0, orig, items, __LINE__) ; - - /* Extend the file using a seek. */ - test_seek_or_die (file, 2 * items, SEEK_SET, 2 * items, info.channels, __LINE__) ; - - test_writef_short_or_die (file, 0, orig, items, __LINE__) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &info, SF_FALSE, __LINE__) ; - test_read_short_or_die (file, 0, test, 3 * items, __LINE__) ; - sf_close (file) ; - - /* Can't do these formats due to scaling. */ - switch (format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_PCM_S8 : - case SF_FORMAT_PCM_U8 : - return ; - default : - break ; - } ; - - for (k = 0 ; k < items ; k++) - { exit_if_true (test [k] != 0x3fff, "Line %d : test [%d] == %d, should be 0x3fff.\n", __LINE__, k, test [k]) ; - exit_if_true (test [items + k] != 0, "Line %d : test [%d] == %d, should be 0.\n", __LINE__, items + k, test [items + k]) ; - exit_if_true (test [2 * items + k] != 0x3fff, "Line %d : test [%d] == %d, should be 0x3fff.\n", __LINE__, 2 * items + k, test [2 * items + k]) ; - } ; - - return ; -} /* write_seek_extend_test */ - - diff --git a/libs/libsndfile/tests/write_read_test.def b/libs/libsndfile/tests/write_read_test.def deleted file mode 100644 index 3316aec577..0000000000 --- a/libs/libsndfile/tests/write_read_test.def +++ /dev/null @@ -1,75 +0,0 @@ -autogen definitions write_read_test.tpl; - -data_type = { - type_name = char ; - data_type = short ; - data_field = s ; - error_func = CHAR_ERROR ; - format_char = "0x%X" ; - max_val = "32000.0" ; - max_error = "255" ; - } ; - -data_type = { - type_name = short ; - data_type = short ; - data_field = s ; - error_func = INT_ERROR ; - format_char = "0x%X" ; - max_val = "32000.0" ; - max_error = "0" ; - } ; - -data_type = { - type_name = "20bit" ; - data_type = int ; - data_field = i ; - error_func = BIT_20_ERROR ; - format_char = "0x%X" ; - max_val = "(1.0 * 0x7F00000)" ; - max_error = "4096" ; - } ; - -data_type = { - type_name = "24bit" ; - data_type = int ; - data_field = i ; - error_func = TRIBYTE_ERROR ; - format_char = "0x%X" ; - max_val = "(1.0 * 0x7F000000)" ; - max_error = "256" ; - } ; - -data_type = { - type_name = int ; - data_type = int ; - data_field = i ; - error_func = INT_ERROR ; - format_char = "0x%X" ; - max_val = "(1.0 * 0x7F000000)" ; - max_error = "0" ; - } ; - -/* Lite remove start */ - -data_type = { - type_name = float ; - data_type = float ; - data_field = f ; - error_func = FLOAT_ERROR ; - format_char = "%g" ; - max_val = "1.0" ; - max_error = "0" ; - } ; - -data_type = { - type_name = double ; - data_type = double ; - data_field = d ; - error_func = FLOAT_ERROR ; - format_char = "%g" ; - max_val = "1.0" ; - max_error = "0" ; - } ; - -/* Lite remove end */ diff --git a/libs/libsndfile/tests/write_read_test.tpl b/libs/libsndfile/tests/write_read_test.tpl deleted file mode 100644 index 55bf1db173..0000000000 --- a/libs/libsndfile/tests/write_read_test.tpl +++ /dev/null @@ -1,1184 +0,0 @@ -[+ AutoGen5 template c +] -/* -** Copyright (C) 1999-2012 Erik de Castro Lopo -** -** 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. -*/ - -#include "sfconfig.h" - -#include -#include -#include -#include -#include - - -#if HAVE_UNISTD_H -#include -#endif - -#include - -#include "utils.h" -#include "generate.h" - -#define SAMPLE_RATE 11025 -#define DATA_LENGTH (1 << 12) - -#define SILLY_WRITE_COUNT (234) - -[+ FOR data_type -+]static void pcm_test_[+ (get "type_name") +] (const char *str, int format, int long_file_okz) ; -[+ ENDFOR data_type -+] -static void empty_file_test (const char *filename, int format) ; - -typedef union -{ double d [DATA_LENGTH] ; - float f [DATA_LENGTH] ; - int i [DATA_LENGTH] ; - short s [DATA_LENGTH] ; - char c [DATA_LENGTH] ; -} BUFFER ; - -static BUFFER orig_data ; -static BUFFER test_data ; - -int -main (int argc, char **argv) -{ int do_all = 0 ; - int test_count = 0 ; - - count_open_files () ; - - if (argc != 2) - { printf ("Usage : %s \n", argv [0]) ; - printf (" Where is one of the following:\n") ; - printf (" wav - test WAV file functions (little endian)\n") ; - printf (" aiff - test AIFF file functions (big endian)\n") ; - printf (" au - test AU file functions\n") ; - printf (" avr - test AVR file functions\n") ; - printf (" caf - test CAF file functions\n") ; - printf (" raw - test RAW header-less PCM file functions\n") ; - printf (" paf - test PAF file functions\n") ; - printf (" svx - test 8SVX/16SV file functions\n") ; - printf (" nist - test NIST Sphere file functions\n") ; - printf (" ircam - test IRCAM file functions\n") ; - printf (" voc - Create Voice file functions\n") ; - printf (" w64 - Sonic Foundry's W64 file functions\n") ; - printf (" flac - test FLAC file functions\n") ; - printf (" mpc2k - test MPC 2000 file functions\n") ; - printf (" rf64 - test RF64 file functions\n") ; - printf (" all - perform all tests\n") ; - exit (1) ; - } ; - - do_all = !strcmp (argv [1], "all") ; - - if (do_all || ! strcmp (argv [1], "wav")) - { pcm_test_char ("char.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_short ("short.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_32, SF_FALSE) ; - - pcm_test_char ("char.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_short ("short.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_32, SF_FALSE) ; - - pcm_test_24bit ("24bit.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_PCM_32, SF_FALSE) ; - - /* Lite remove start */ - pcm_test_float ("float.wav" , SF_FORMAT_WAV | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.wav" , SF_FORMAT_WAV | SF_FORMAT_DOUBLE, SF_FALSE) ; - - pcm_test_float ("float.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_DOUBLE, SF_FALSE) ; - - pcm_test_float ("float.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - - empty_file_test ("empty_char.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8) ; - empty_file_test ("empty_short.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; - empty_file_test ("empty_float.wav", SF_FORMAT_WAV | SF_FORMAT_FLOAT) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "aiff")) - { pcm_test_char ("char_u8.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_char ("char_s8.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ; - - pcm_test_short ("short_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ; - - pcm_test_short ("short_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ; - - /* Lite remove start */ - pcm_test_short ("dwvw16.aifc", SF_FORMAT_AIFF | SF_FORMAT_DWVW_16, SF_TRUE) ; - pcm_test_24bit ("dwvw24.aifc", SF_FORMAT_AIFF | SF_FORMAT_DWVW_24, SF_TRUE) ; - - pcm_test_float ("float.aifc" , SF_FORMAT_AIFF | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.aifc" , SF_FORMAT_AIFF | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - - empty_file_test ("empty_char.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_U8) ; - empty_file_test ("empty_short.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ; - empty_file_test ("empty_float.aiff", SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "au")) - { pcm_test_char ("char.au" , SF_FORMAT_AU | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short.au" , SF_FORMAT_AU | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.au" , SF_FORMAT_AU | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.au" , SF_FORMAT_AU | SF_FORMAT_PCM_32, SF_FALSE) ; - /* Lite remove start */ - pcm_test_float ("float.au" , SF_FORMAT_AU | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.au", SF_FORMAT_AU | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - - pcm_test_char ("char_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_32, SF_FALSE) ; - /* Lite remove start */ - pcm_test_float ("float_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "caf")) - { pcm_test_char ("char.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_32, SF_FALSE) ; - /* Lite remove start */ - pcm_test_float ("float.caf" , SF_FORMAT_CAF | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.caf" , SF_FORMAT_CAF | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - - pcm_test_short ("short_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_32, SF_FALSE) ; - /* Lite remove start */ - pcm_test_float ("float_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double_le.caf", SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_DOUBLE, SF_FALSE) ; - - pcm_test_short ("alac16.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_16, SF_FALSE) ; - pcm_test_20bit ("alac20.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_20, SF_FALSE) ; - pcm_test_24bit ("alac24.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_24, SF_FALSE) ; - pcm_test_int ("alac32.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_32, SF_FALSE) ; - - /* Lite remove end */ - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "raw")) - { pcm_test_char ("char_s8.raw" , SF_FORMAT_RAW | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_char ("char_u8.raw" , SF_FORMAT_RAW | SF_FORMAT_PCM_U8, SF_FALSE) ; - - pcm_test_short ("short_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_short ("short_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_24bit ("24bit_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_int ("int_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, SF_FALSE) ; - - /* Lite remove start */ - pcm_test_float ("float_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_float ("float_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT , SF_FALSE) ; - - pcm_test_double ("double_le.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, SF_FALSE) ; - pcm_test_double ("double_be.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - test_count++ ; - } ; - - /* Lite remove start */ - if (do_all || ! strcmp (argv [1], "paf")) - { pcm_test_char ("char_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_char ("char_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_short ("short_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_24, SF_TRUE) ; - pcm_test_24bit ("24bit_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_24, SF_TRUE) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "svx")) - { pcm_test_char ("char.svx" , SF_FORMAT_SVX | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16, SF_FALSE) ; - - empty_file_test ("empty_char.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_S8) ; - empty_file_test ("empty_short.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "nist")) - { pcm_test_short ("short_le.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_short ("short_be.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit_le.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_24bit ("24bit_be.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int_le.nist" , SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_int ("int_be.nist" , SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_32, SF_FALSE) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "ircam")) - { pcm_test_short ("short_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_short ("short_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_int ("int_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_int ("int_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_float ("float_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_float ("float_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_FLOAT , SF_FALSE) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "voc")) - { pcm_test_char ("char.voc" , SF_FORMAT_VOC | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_short ("short.voc", SF_FORMAT_VOC | SF_FORMAT_PCM_16, SF_FALSE) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat4")) - { pcm_test_short ("short_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_short ("short_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_int ("int_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_int ("int_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_float ("float_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_float ("float_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_DOUBLE, SF_FALSE) ; - pcm_test_double ("double_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_DOUBLE, SF_FALSE) ; - - empty_file_test ("empty_short.mat4", SF_FORMAT_MAT4 | SF_FORMAT_PCM_16) ; - empty_file_test ("empty_float.mat4", SF_FORMAT_MAT4 | SF_FORMAT_FLOAT) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mat5")) - { pcm_test_char ("char_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_char ("char_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_short ("short_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_short ("short_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_int ("int_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_int ("int_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_32, SF_FALSE) ; - pcm_test_float ("float_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_float ("float_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_DOUBLE, SF_FALSE) ; - pcm_test_double ("double_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_DOUBLE, SF_FALSE) ; - - increment_open_file_count () ; - - empty_file_test ("empty_char.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8) ; - empty_file_test ("empty_short.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_16) ; - empty_file_test ("empty_float.mat5", SF_FORMAT_MAT5 | SF_FORMAT_FLOAT) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "pvf")) - { pcm_test_char ("char.pvf" , SF_FORMAT_PVF | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short.pvf", SF_FORMAT_PVF | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_int ("int.pvf" , SF_FORMAT_PVF | SF_FORMAT_PCM_32, SF_FALSE) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "htk")) - { pcm_test_short ("short.htk", SF_FORMAT_HTK | SF_FORMAT_PCM_16, SF_FALSE) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "mpc2k")) - { pcm_test_short ("short.mpc", SF_FORMAT_MPC2K | SF_FORMAT_PCM_16, SF_FALSE) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "avr")) - { pcm_test_char ("char_u8.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_char ("char_s8.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_16, SF_FALSE) ; - test_count++ ; - } ; - /* Lite remove end */ - - if (do_all || ! strcmp (argv [1], "w64")) - { pcm_test_char ("char.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_short ("short.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_32, SF_FALSE) ; - /* Lite remove start */ - pcm_test_float ("float.w64" , SF_FORMAT_W64 | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.w64" , SF_FORMAT_W64 | SF_FORMAT_DOUBLE, SF_FALSE) ; - /* Lite remove end */ - - empty_file_test ("empty_char.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_U8) ; - empty_file_test ("empty_short.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_16) ; - empty_file_test ("empty_float.w64", SF_FORMAT_W64 | SF_FORMAT_FLOAT) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "sds")) - { pcm_test_char ("char.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_S8, SF_FALSE) ; - pcm_test_short ("short.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_24, SF_FALSE) ; - - empty_file_test ("empty_char.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_S8) ; - empty_file_test ("empty_short.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_16) ; - - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "sd2")) - { pcm_test_char ("char.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_S8, SF_TRUE) ; - pcm_test_short ("short.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_16, SF_TRUE) ; - pcm_test_24bit ("24bit.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_24, SF_TRUE) ; - pcm_test_int ("32bit.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_32, SF_TRUE) ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "flac")) - { if (HAVE_EXTERNAL_LIBS) - { pcm_test_char ("char.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, SF_TRUE) ; - pcm_test_short ("short.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_16, SF_TRUE) ; - pcm_test_24bit ("24bit.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_24, SF_TRUE) ; - } - else - puts (" No FLAC tests because FLAC support was not compiled in.") ; - test_count++ ; - } ; - - if (do_all || ! strcmp (argv [1], "rf64")) - { pcm_test_char ("char.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_U8, SF_FALSE) ; - pcm_test_short ("short.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_16, SF_FALSE) ; - pcm_test_24bit ("24bit.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_24, SF_FALSE) ; - pcm_test_int ("int.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_32, SF_FALSE) ; - - /* Lite remove start */ - pcm_test_float ("float.rf64" , SF_FORMAT_RF64 | SF_FORMAT_FLOAT , SF_FALSE) ; - pcm_test_double ("double.rf64" , SF_FORMAT_RF64 | SF_FORMAT_DOUBLE, SF_FALSE) ; - empty_file_test ("empty_char.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_U8) ; - empty_file_test ("empty_short.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; - empty_file_test ("empty_float.rf64", SF_FORMAT_RF64 | SF_FORMAT_FLOAT) ; - /* Lite remove end */ - - test_count++ ; - } ; - - if (test_count == 0) - { printf ("Mono : ************************************\n") ; - printf ("Mono : * No '%s' test defined.\n", argv [1]) ; - printf ("Mono : ************************************\n") ; - return 1 ; - } ; - - /* Only open file descriptors should be stdin, stdout and stderr. */ - check_open_file_count_or_die (__LINE__) ; - - return 0 ; -} /* main */ - -/*============================================================================================ -** Helper functions and macros. -*/ - -static void create_short_file (const char *filename) ; - -#define CHAR_ERROR(x, y) (abs ((x) - (y)) > 255) -#define INT_ERROR(x, y) (((x) - (y)) != 0) -#define BIT_20_ERROR(x, y) (abs ((x) - (y)) > 4095) -#define TRIBYTE_ERROR(x, y) (abs ((x) - (y)) > 255) -#define FLOAT_ERROR(x, y) (fabs ((x) - (y)) > 1e-5) - -#define CONVERT_DATA(k, len, new, orig) \ - { for ((k) = 0 ; (k) < (len) ; (k) ++) \ - (new) [k] = (orig) [k] ; \ - } - -[+ FOR data_type -+] -/*====================================================================================== -*/ - -static void mono_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void stereo_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void mono_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) ; -static void new_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int allow_fd) ; -static void multi_seek_test (const char * filename, int format) ; -static void write_seek_extend_test (const char * filename, int format) ; - -static void -pcm_test_[+ (get "type_name") +] (const char *filename, int format, int long_file_ok) -{ SF_INFO sfinfo ; - [+ (get "data_type") +] *orig ; - int k, allow_fd ; - - /* Sd2 files cannot be opened from an existing file descriptor. */ - allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; - - print_test_name ("pcm_test_[+ (get "type_name") +]", filename) ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = format ; - - gen_windowed_sine_double (orig_data.d, DATA_LENGTH, [+ (get "max_val") +]) ; - - orig = orig_data.[+ (get "data_field") +] ; - - /* Make this a macro so gdb steps over it in one go. */ - CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; - - /* Some test broken out here. */ - - mono_[+ (get "type_name") +]_test (filename, format, long_file_ok, allow_fd) ; - - /* Sub format DWVW does not allow seeking. */ - if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || - (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) - { unlink (filename) ; - printf ("no seek : ok\n") ; - return ; - } ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC - && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 - && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 - && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 - && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 - ) - mono_rdwr_[+ (get "type_name") +]_test (filename, format, long_file_ok, allow_fd) ; - - /* If the format doesn't support stereo we're done. */ - sfinfo.channels = 2 ; - if (sf_format_check (&sfinfo) == 0) - { unlink (filename) ; - puts ("no stereo : ok") ; - return ; - } ; - - stereo_[+ (get "type_name") +]_test (filename, format, long_file_ok, allow_fd) ; - - /* New read/write test. Not sure if this is needed yet. */ - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF - && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC - && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC - && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 - && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 - && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 - && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 - ) - new_rdwr_[+ (get "type_name") +]_test (filename, format, allow_fd) ; - - delete_file (format, filename) ; - - puts ("ok") ; - return ; -} /* pcm_test_[+ (get "type_name") +] */ - -static void -mono_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - [+ (get "data_type") +] *orig, *test ; - sf_count_t count ; - int k, items, total ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 1 ; - sfinfo.format = format ; - - orig = orig_data.[+ (get "data_field") +] ; - test = test_data.[+ (get "data_field") +] ; - - items = DATA_LENGTH ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - sf_set_string (file, SF_STR_ARTIST, "Your name here") ; - - test_write_[+ (get "data_type") +]_or_die (file, 0, orig, items, __LINE__) ; - sf_write_sync (file) ; - test_write_[+ (get "data_type") +]_or_die (file, 0, orig, items, __LINE__) ; - sf_write_sync (file) ; - - /* Add non-audio data after the audio. */ - sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; - - sf_close (file) ; - - memset (test, 0, items * sizeof ([+ (get "data_type") +])) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < 2 * items) - { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; - exit (1) ; - } ; - - if (! long_file_ok && sfinfo.frames > 2 * items) - { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_read_[+ (get "data_type") +]_or_die (file, 0, test, items, __LINE__) ; - for (k = 0 ; k < items ; k++) - if ([+ (get "error_func") +] (orig [k], test [k])) - { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; - oct_save_[+ (get "data_type") +] (orig, test, items) ; - exit (1) ; - } ; - - /* Test multiple short reads. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - total = 0 ; - for (k = 1 ; k <= 32 ; k++) - { int ik ; - - test_read_[+ (get "data_type") +]_or_die (file, 0, test + total, k, __LINE__) ; - total += k ; - - for (ik = 0 ; ik < total ; ik++) - if ([+ (get "error_func") +] (orig [ik], test [ik])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, ik, orig [ik], test [ik]) ; - exit (1) ; - } ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_read_[+ (get "data_type") +]_or_die (file, 0, test, 4, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - if ([+ (get "error_func") +] (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* For some codecs we can't go past here. */ - if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || - (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) - { sf_close (file) ; - unlink (filename) ; - printf ("no seek : ") ; - return ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; - - test_read_[+ (get "data_type") +]_or_die (file, 0, test + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - if ([+ (get "error_func") +] (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; - - test_read_[+ (get "data_type") +]_or_die (file, 0, test + 20, 4, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if ([+ (get "error_func") +] (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_read_[+ (get "data_type") +]_or_die (file, 0, test + 10, 4, __LINE__) ; - for (k = 10 ; k < 14 ; k++) - if ([+ (get "error_func") +] (orig [k], test [k])) - { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, test [k], orig [k]) ; - exit (1) ; - } ; - - /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - count = 0 ; - while (count < sfinfo.frames) - count += sf_read_[+ (get "data_type") +] (file, test, 311) ; - - /* Check that no error has occurred. */ - if (sf_error (file)) - { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - /* Check that we haven't read beyond EOF. */ - if (count > sfinfo.frames) - { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ; - exit (1) ; - } ; - - test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; - - sf_close (file) ; - - multi_seek_test (filename, format) ; - write_seek_extend_test (filename, format) ; - -} /* mono_[+ (get "type_name") +]_test */ - -static void -stereo_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - [+ (get "data_type") +] *orig, *test ; - int k, items, frames ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 2 ; - sfinfo.format = format ; - - gen_windowed_sine_double (orig_data.d, DATA_LENGTH, [+ (get "max_val") +]) ; - - orig = orig_data.[+ (get "data_field") +] ; - test = test_data.[+ (get "data_field") +] ; - - /* Make this a macro so gdb steps over it in one go. */ - CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; - - items = DATA_LENGTH ; - frames = items / sfinfo.channels ; - - file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - - sf_set_string (file, SF_STR_ARTIST, "Your name here") ; - - test_writef_[+ (get "data_type") +]_or_die (file, 0, orig, frames, __LINE__) ; - - sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; - - sf_close (file) ; - - memset (test, 0, items * sizeof ([+ (get "data_type") +])) ; - - if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) - memset (&sfinfo, 0, sizeof (sfinfo)) ; - - file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", - __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < frames) - { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", - __LINE__, sfinfo.frames, frames) ; - exit (1) ; - } ; - - if (! long_file_ok && sfinfo.frames > frames) - { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", - __LINE__, sfinfo.frames, frames) ; - exit (1) ; - } ; - - if (sfinfo.channels != 2) - { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - check_log_buffer_or_die (file, __LINE__) ; - - test_readf_[+ (get "data_type") +]_or_die (file, 0, test, frames, __LINE__) ; - for (k = 0 ; k < items ; k++) - if ([+ (get "error_func") +] (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to start of file. */ - test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; - - test_readf_[+ (get "data_type") +]_or_die (file, 0, test, 2, __LINE__) ; - for (k = 0 ; k < 4 ; k++) - if ([+ (get "error_func") +] (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from start of file. */ - test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; - - /* Check for errors here. */ - if (sf_error (file)) - { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; - puts (sf_strerror (file)) ; - exit (1) ; - } ; - - if (sf_read_[+ (get "data_type") +] (file, test, 1) > 0) - { printf ("Line %d: Should return 0.\n", __LINE__) ; - exit (1) ; - } ; - - if (! sf_error (file)) - { printf ("Line %d: Should return an error.\n", __LINE__) ; - exit (1) ; - } ; - /*-----------------------*/ - - test_readf_[+ (get "data_type") +]_or_die (file, 0, test + 10, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if ([+ (get "error_func") +] (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from current position. */ - test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; - - test_readf_[+ (get "data_type") +]_or_die (file, 0, test + 20, 2, __LINE__) ; - for (k = 40 ; k < 44 ; k++) - if ([+ (get "error_func") +] (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - /* Seek to offset from end of file. */ - test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; - - test_readf_[+ (get "data_type") +]_or_die (file, 0, test + 20, 2, __LINE__) ; - for (k = 20 ; k < 24 ; k++) - if ([+ (get "error_func") +] (test [k], orig [k])) - { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; - exit (1) ; - } ; - - sf_close (file) ; -} /* stereo_[+ (get "type_name") +]_test */ - -static void -mono_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) -{ SNDFILE *file ; - SF_INFO sfinfo ; - [+ (get "data_type") +] *orig, *test ; - int k, pass ; - - switch (format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_ALAC_16 : - case SF_FORMAT_ALAC_20 : - case SF_FORMAT_ALAC_24 : - case SF_FORMAT_ALAC_32 : - allow_fd = 0 ; - break ; - - default : - break ; - } ; - - orig = orig_data.[+ (get "data_field") +] ; - test = test_data.[+ (get "data_field") +] ; - - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW - || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU - || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) - unlink (filename) ; - else - { /* Create a short file. */ - create_short_file (filename) ; - - /* Opening a already existing short file (ie invalid header) RDWR is disallowed. - ** If this returns a valif pointer sf_open() screwed up. - */ - if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) - { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; - exit (1) ; - } ; - - /* Truncate the file to zero bytes. */ - if (truncate (filename, 0) < 0) - { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ; - perror (NULL) ; - exit (1) ; - } ; - } ; - - /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain - ** all the usual data required when opening the file in WRITE mode. - */ - sfinfo.samplerate = SAMPLE_RATE ; - sfinfo.frames = DATA_LENGTH ; - sfinfo.channels = 1 ; - sfinfo.format = format ; - - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - - /* Do 3 writes followed by reads. After each, check the data and the current - ** read and write offsets. - */ - for (pass = 1 ; pass <= 3 ; pass ++) - { orig [20] = pass * 2 ; - - /* Write some data. */ - test_write_[+ (get "data_type") +]_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; - - test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; - - /* Read what we just wrote. */ - test_read_[+ (get "data_type") +]_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; - - /* Check the data. */ - for (k = 0 ; k < DATA_LENGTH ; k++) - if ([+ (get "error_func") +] (orig [k], test [k])) - { printf ("\n\nLine %d (pass %d) A : Error at sample %d ([+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, pass, k, orig [k], test [k]) ; - oct_save_[+ (get "data_type") +] (orig, test, DATA_LENGTH) ; - exit (1) ; - } ; - - test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; - } ; /* for (pass ...) */ - - sf_close (file) ; - - /* Open the file again to check the data. */ - file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - - if (sfinfo.format != format) - { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; - exit (1) ; - } ; - - if (sfinfo.frames < 3 * DATA_LENGTH) - { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; - exit (1) ; - } - - if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) - { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; - exit (1) ; - } ; - - if (sfinfo.channels != 1) - { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; - exit (1) ; - } ; - - if (! long_file_ok) - test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; - else - test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; - - for (pass = 1 ; pass <= 3 ; pass ++) - { orig [20] = pass * 2 ; - - test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; - - /* Read what we just wrote. */ - test_read_[+ (get "data_type") +]_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; - - /* Check the data. */ - for (k = 0 ; k < DATA_LENGTH ; k++) - if ([+ (get "error_func") +] (orig [k], test [k])) - { printf ("\n\nLine %d (pass %d) B : Error at sample %d ([+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, pass, k, orig [k], test [k]) ; - oct_save_[+ (get "data_type") +] (orig, test, DATA_LENGTH) ; - exit (1) ; - } ; - - } ; /* for (pass ...) */ - - sf_close (file) ; -} /* mono_rdwr_[+ (get "data_type") +]_test */ - -static void -new_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int allow_fd) -{ SNDFILE *wfile, *rwfile ; - SF_INFO sfinfo ; - [+ (get "data_type") +] *orig, *test ; - int items, frames ; - - orig = orig_data.[+ (get "data_field") +] ; - test = test_data.[+ (get "data_field") +] ; - - sfinfo.samplerate = 44100 ; - sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ - sfinfo.channels = 2 ; - sfinfo.format = format ; - - items = DATA_LENGTH ; - frames = items / sfinfo.channels ; - - wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; - sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; - test_writef_[+ (get "data_type") +]_or_die (wfile, 1, orig, frames, __LINE__) ; - sf_write_sync (wfile) ; - test_writef_[+ (get "data_type") +]_or_die (wfile, 2, orig, frames, __LINE__) ; - sf_write_sync (wfile) ; - - rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; - if (sfinfo.frames != 2 * frames) - { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ; - exit (1) ; - } ; - - test_writef_[+ (get "data_type") +]_or_die (wfile, 3, orig, frames, __LINE__) ; - - test_readf_[+ (get "data_type") +]_or_die (rwfile, 1, test, frames, __LINE__) ; - test_readf_[+ (get "data_type") +]_or_die (rwfile, 2, test, frames, __LINE__) ; - - sf_close (wfile) ; - sf_close (rwfile) ; -} /* new_rdwr_[+ (get "type_name") +]_test */ - -[+ ENDFOR data_type +] - -/*---------------------------------------------------------------------------------------- -*/ - -static void -empty_file_test (const char *filename, int format) -{ SNDFILE *file ; - SF_INFO info ; - int allow_fd ; - - /* Sd2 files cannot be opened from an existing file descriptor. */ - allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; - - print_test_name ("empty_file_test", filename) ; - - unlink (filename) ; - - info.samplerate = 48000 ; - info.channels = 2 ; - info.format = format ; - - if (sf_format_check (&info) == SF_FALSE) - { info.channels = 1 ; - if (sf_format_check (&info) == SF_FALSE) - { puts ("invalid file format") ; - return ; - } ; - } ; - - /* Create an empty file. */ - file = test_open_file_or_die (filename, SFM_WRITE, &info, allow_fd, __LINE__) ; - sf_close (file) ; - - /* Open for read and check the length. */ - file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ; - - if (info.frames != 0) - { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* Open for read/write and check the length. */ - file = test_open_file_or_die (filename, SFM_RDWR, &info, allow_fd, __LINE__) ; - - if (info.frames != 0) - { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ; - exit (1) ; - } ; - - sf_close (file) ; - - /* Open for read and check the length. */ - file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ; - - if (info.frames != 0) - { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ; - exit (1) ; - } ; - - sf_close (file) ; - - check_open_file_count_or_die (__LINE__) ; - - unlink (filename) ; - puts ("ok") ; - - return ; -} /* empty_file_test */ - - -/*---------------------------------------------------------------------------------------- -*/ - -static void -create_short_file (const char *filename) -{ FILE *file ; - - if (! (file = fopen (filename, "w"))) - { printf ("create_short_file : fopen (%s, \"w\") failed.", filename) ; - fflush (stdout) ; - perror (NULL) ; - exit (1) ; - } ; - - fprintf (file, "This is the file data.\n") ; - - fclose (file) ; -} /* create_short_file */ - - -static void -multi_seek_test (const char * filename, int format) -{ SNDFILE * file ; - SF_INFO info ; - sf_count_t pos ; - int k ; - - /* This test doesn't work on the following. */ - switch (format & SF_FORMAT_TYPEMASK) - { case SF_FORMAT_RAW : - return ; - - default : - break ; - } ; - - memset (&info, 0, sizeof (info)) ; - - generate_file (filename, format, 88200) ; - - file = test_open_file_or_die (filename, SFM_READ, &info, SF_FALSE, __LINE__) ; - - for (k = 0 ; k < 10 ; k++) - { pos = info.frames / (k + 2) ; - test_seek_or_die (file, pos, SEEK_SET, pos, info.channels, __LINE__) ; - } ; - - sf_close (file) ; -} /* multi_seek_test */ - -static void -write_seek_extend_test (const char * filename, int format) -{ SNDFILE * file ; - SF_INFO info ; - short *orig, *test ; - unsigned items, k ; - - /* This test doesn't work on the following container formats. */ - switch (format & SF_FORMAT_TYPEMASK) - { case SF_FORMAT_FLAC : - case SF_FORMAT_HTK : - case SF_FORMAT_PAF : - case SF_FORMAT_SDS : - case SF_FORMAT_SVX : - return ; - - default : - break ; - } ; - - /* This test doesn't work on the following codec formats. */ - switch (format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_ALAC_16 : - case SF_FORMAT_ALAC_20 : - case SF_FORMAT_ALAC_24 : - case SF_FORMAT_ALAC_32 : - return ; - - default : - break ; - } ; - - memset (&info, 0, sizeof (info)) ; - - info.samplerate = 48000 ; - info.channels = 1 ; - info.format = format ; - - items = 512 ; - exit_if_true (items > ARRAY_LEN (orig_data.s), "Line %d : Bad assumption.\n", __LINE__) ; - - orig = orig_data.s ; - test = test_data.s ; - - for (k = 0 ; k < ARRAY_LEN (orig_data.s) ; k++) - orig [k] = 0x3fff ; - - file = test_open_file_or_die (filename, SFM_WRITE, &info, SF_FALSE, __LINE__) ; - test_write_short_or_die (file, 0, orig, items, __LINE__) ; - - /* Extend the file using a seek. */ - test_seek_or_die (file, 2 * items, SEEK_SET, 2 * items, info.channels, __LINE__) ; - - test_writef_short_or_die (file, 0, orig, items, __LINE__) ; - sf_close (file) ; - - file = test_open_file_or_die (filename, SFM_READ, &info, SF_FALSE, __LINE__) ; - test_read_short_or_die (file, 0, test, 3 * items, __LINE__) ; - sf_close (file) ; - - /* Can't do these formats due to scaling. */ - switch (format & SF_FORMAT_SUBMASK) - { case SF_FORMAT_PCM_S8 : - case SF_FORMAT_PCM_U8 : - return ; - default : - break ; - } ; - - for (k = 0 ; k < items ; k++) - { exit_if_true (test [k] != 0x3fff, "Line %d : test [%d] == %d, should be 0x3fff.\n", __LINE__, k, test [k]) ; - exit_if_true (test [items + k] != 0, "Line %d : test [%d] == %d, should be 0.\n", __LINE__, items + k, test [items + k]) ; - exit_if_true (test [2 * items + k] != 0x3fff, "Line %d : test [%d] == %d, should be 0x3fff.\n", __LINE__, 2 * items + k, test [2 * items + k]) ; - } ; - - return ; -} /* write_seek_extend_test */ - - diff --git a/libs/win32/libsndfile/cleancount b/libs/win32/libsndfile/cleancount deleted file mode 100644 index 56a6051ca2..0000000000 --- a/libs/win32/libsndfile/cleancount +++ /dev/null @@ -1 +0,0 @@ -1 \ No newline at end of file diff --git a/libs/win32/libsndfile/config.h b/libs/win32/libsndfile/config.h deleted file mode 100644 index d32301d30c..0000000000 --- a/libs/win32/libsndfile/config.h +++ /dev/null @@ -1,294 +0,0 @@ -/* -** Copyright (C) 2002-2004 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* -** This is the Win32 version of the file config.h which is autogenerated -** on Unix systems. -*/ - -#pragma warning (disable : 4244) -#pragma warning (disable : 4761) - -#include - -/* Set to 1 if the compile is GNU GCC. */ -/* #undef COMPILER_IS_GCC */ - -/* Target processor clips on negative float to int conversion. */ -#define CPU_CLIPS_NEGATIVE 1 - -/* Target processor clips on positive float to int conversion. */ -#define CPU_CLIPS_POSITIVE 0 - -/* Target processor is big endian. */ -#define CPU_IS_BIG_ENDIAN 0 - -/* Target processor is little endian. */ -#define CPU_IS_LITTLE_ENDIAN 1 - -/* Set to 1 to enable experimental code. */ -#define ENABLE_EXPERIMENTAL_CODE 0 - -/* Major version of GCC or 3 otherwise. */ -/* #undef GCC_MAJOR_VERSION */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_ALSA_ASOUNDLIB_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_BYTESWAP_H */ - -/* Define to 1 if you have the `calloc' function. */ -#define HAVE_CALLOC 1 - -/* Define to 1 if you have the `ceil' function. */ -#define HAVE_CEIL 1 - -/* Set to 1 if S_IRGRP is defined. */ -#define HAVE_DECL_S_IRGRP 0 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_DLFCN_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_ENDIAN_H */ - -/* Define to 1 if you have the `fdatasync' function. */ - -/* #undef HAVE_FDATASYNC */ - -/* Define to 1 if you have libflac 1.1.1 */ -/* #undef HAVE_FLAC_1_1_1 1 */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_FLAC_ALL_H 1 */ - -/* Set to 1 if the compile supports the struct hack. */ -#define HAVE_FLEXIBLE_ARRAY 1 - -/* Define to 1 if you have the `floor' function. */ -#define HAVE_FLOOR 1 - -/* Define to 1 if you have the `fmod' function. */ -#define HAVE_FMOD 1 - -/* Define to 1 if you have the `free' function. */ -#define HAVE_FREE 1 - -/* Define to 1 if you have the `fstat' function. */ -#define HAVE_FSTAT 1 - -/* Define to 1 if you have the `fsync' function. */ -/* #undef HAVE_FSYNC */ - -/* Define to 1 if you have the `ftruncate' function. */ -/* #undef HAVE_FTRUNCATE */ - -/* Define to 1 if you have the `getpagesize' function. */ -#define HAVE_GETPAGESIZE 1 - -/* Define to 1 if you have the `gmtime' function. */ -#define HAVE_GMTIME 1 - -/* Define to 1 if you have the `gmtime_r' function. */ -/* #undef HAVE_GMTIME_R */ - -/* Define to 1 if you have the header file. */ -/* #define HAVE_INTTYPES_H */ - -/* Define to 1 if you have the `m' library (-lm). */ -#define HAVE_LIBM 1 - -/* Define if you have C99's lrint function. */ -/* #undef HAVE_LRINT */ - -/* Define if you have C99's lrintf function. */ -/* #undef HAVE_LRINTF */ - -/* Define to 1 if you have the `lseek' function. */ -#define HAVE_LSEEK 1 - -/* Define to 1 if you have the `malloc' function. */ -#define HAVE_MALLOC 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the `mmap' function. */ -/* #undef HAVE_MMAP */ - -/* Define to 1 if you have the `open' function. */ -#define HAVE_OPEN 1 - -/* Define to 1 if you have the `pread' function. */ -/* #undef HAVE_PREAD */ - -/* Define to 1 if you have the `pwrite' function. */ -/* #undef HAVE_PWRITE */ - -/* Define to 1 if you have the `read' function. */ -#define HAVE_READ 1 - -/* Define to 1 if you have the `realloc' function. */ -#define HAVE_REALLOC 1 - -/* Define to 1 if you have the `snprintf' function. */ -#define HAVE_SNPRINTF 1 - -/* Set to 1 if you have libsqlite3. */ -/* #undef HAVE_SQLITE3 */ - -/* Define to 1 if the system has the type `ssize_t'. */ -/* #undef HAVE_SSIZE_T */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_STDINT_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* 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_UNISTD_H */ - -/* Define to 1 if you have the `vsnprintf' function. */ -#define HAVE_VSNPRINTF 1 - -/* Define to 1 if you have the `write' function. */ -#define HAVE_WRITE 1 - -/* Set to 1 if compiling for MacOSX */ -#define OS_IS_MACOSX 0 - -/* Set to 1 if compiling for Win32 */ -#define OS_IS_WIN32 1 - -/* Name of package */ -#define PACKAGE "libsndfile" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "erikd@mega-nerd.com" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "libsndfile" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "libsndfile 1.0.26pre5" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "libsndfile" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "1.0.26pre5" - -/* Set to maximum allowed value of sf_count_t type. */ -//#define SF_COUNT_MAX 0x7FFFFFFFFFFFFFFFi64 - -/* The size of a `double', as computed by sizeof. */ -#define SIZEOF_DOUBLE 8 - -/* The size of a `float', as computed by sizeof. */ -#define SIZEOF_FLOAT 4 - -/* The size of a `int', as computed by sizeof. */ -#define SIZEOF_INT 4 - -/* The size of a `int64_t', as computed by sizeof. */ -#define SIZEOF_INT64_T 0 - -/* The size of a `loff_t', as computed by sizeof. */ -#define SIZEOF_LOFF_T 0 - -/* The size of a `long', as computed by sizeof. */ -#define SIZEOF_LONG 4 - -/* The size of a `long long', as computed by sizeof. */ -#define SIZEOF_LONG_LONG 0 - -/* The size of a `off64_t', as computed by sizeof. */ -/* #undef SIZEOF_OFF64_T */ - -/* The size of a `off_t', as computed by sizeof. */ -#define SIZEOF_OFF_T 4 - -/* Set to sizeof (long) if unknown. */ -#define SIZEOF_SF_COUNT_T 8 - -/* The size of a `short', as computed by sizeof. */ -#define SIZEOF_SHORT 2 - -/* The size of a `size_t', as computed by sizeof. */ -#define SIZEOF_SIZE_T 4 - -/* The size of a `ssize_t', as computed by sizeof. */ -#define SIZEOF_SSIZE_T 4 - -/* The size of a `void*', as computed by sizeof. */ -#define SIZEOF_VOIDP 4 - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Set to long if unknown. */ -#define TYPEOF_SF_COUNT_T loff_t - -/* Set to 1 to use the native windows API */ -#define USE_WINDOWS_API 1 - -/* Version number of package */ -#define VERSION "1.0.18" - -#define HAVE_STDINT_H 1 - -/* Number of bits in a file offset, on hosts where this is settable. */ -/* #undef _FILE_OFFSET_BITS */ - -/* Define to make fseeko etc. visible, on some hosts. */ -/* #undef _LARGEFILE_SOURCE */ - -/* Define for large files, on AIX-style hosts. */ -/* #undef _LARGE_FILES */ - -#include - -typedef __int32 int32_t; -typedef intptr_t ssize_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int32 uint32_t; -#define PRId64 "I64d" - -#define __func__ __FUNCTION__ -#if _MSC_VER < 1900 -#define snprintf _snprintf -#endif - -#include \ No newline at end of file diff --git a/libs/win32/libsndfile/libsndfile.2010.vcxproj.filters b/libs/win32/libsndfile/libsndfile.2010.vcxproj.filters deleted file mode 100644 index a4335a1522..0000000000 --- a/libs/win32/libsndfile/libsndfile.2010.vcxproj.filters +++ /dev/null @@ -1,285 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {b116d731-aba1-4ebd-928f-51113eb4c45b} - - - {e24785ab-1f78-4bb6-98f3-6c4586e85648} - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - - {f00f84d5-78ae-4996-bee3-00106a731232} - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files\GSM Sources - - - Source Files\GSM Sources - - - Source Files\GSM Sources - - - Source Files\GSM Sources - - - Source Files\GSM Sources - - - Source Files\GSM Sources - - - Source Files\GSM Sources - - - Source Files\GSM Sources - - - Source Files\GSM Sources - - - Source Files\GSM Sources - - - Source Files\GSM Sources - - - Source Files\GSM Sources - - - Source Files\GSM Sources - - - Source Files\GSM Sources - - - Source Files\G72X Sources - - - Source Files\G72X Sources - - - Source Files\G72X Sources - - - Source Files\G72X Sources - - - Source Files\G72X Sources - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files\ALLAC Sources - - - Source Files\ALLAC Sources - - - Source Files\ALLAC Sources - - - Source Files\ALLAC Sources - - - Source Files\ALLAC Sources - - - Source Files\ALLAC Sources - - - Source Files\ALLAC Sources - - - Source Files\ALLAC Sources - - - Source Files\ALLAC Sources - - - - - Source Files - - - Header Files - - - Source Files\ALLAC Sources - - - Source Files\ALLAC Sources - - - \ No newline at end of file diff --git a/libs/win32/libsndfile/libsndfile.2015.vcxproj b/libs/win32/libsndfile/libsndfile.2015.vcxproj deleted file mode 100644 index e6460ef81e..0000000000 --- a/libs/win32/libsndfile/libsndfile.2015.vcxproj +++ /dev/null @@ -1,222 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - libsndfile - {3D0370CA-BED2-4657-A475-32375CBCB6E4} - libsndfile - Win32Proj - - - - StaticLibrary - NotSet - true - v140 - - - StaticLibrary - NotSet - v140 - - - StaticLibrary - NotSet - true - v140 - - - StaticLibrary - NotSet - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - - - - Disabled - ..\..\libsndfile\src;.;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;inline=__inline;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - Level1 - CompileAsC - - - - - X64 - - - Disabled - ..\..\libsndfile\src;.;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;inline=__inline;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - Level1 - CompileAsC - - - - - ..\..\libsndfile\src;.;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;inline=__inline;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) - MultiThreadedDLL - Level1 - CompileAsC - - - - - X64 - - - ..\..\libsndfile\src;.;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;inline=__inline;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) - MultiThreadedDLL - Level1 - CompileAsC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(IntDir)%(Filename)1.obj - $(IntDir)%(Filename)1.xdc - $(IntDir)%(Filename)1.obj - $(IntDir)%(Filename)1.xdc - $(IntDir)%(Filename)1.obj - $(IntDir)%(Filename)1.xdc - $(IntDir)%(Filename)1.obj - $(IntDir)%(Filename)1.xdc - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/libs/win32/libsndfile/sndfile.h b/libs/win32/libsndfile/sndfile.h deleted file mode 100644 index fa11e700e2..0000000000 --- a/libs/win32/libsndfile/sndfile.h +++ /dev/null @@ -1,817 +0,0 @@ -/* -** Copyright (C) 1999-2013 Erik de Castro Lopo -** -** This program 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 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 Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser 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. -*/ - -/* -** sndfile.h -- system-wide definitions -** -** API documentation is in the doc/ directory of the source code tarball -** and at http://www.mega-nerd.com/libsndfile/api.html. -*/ - -#ifndef SNDFILE_H -#define SNDFILE_H - -/* This is the version 1.0.X header file. */ -#define SNDFILE_1 - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* The following file types can be read and written. -** A file type would consist of a major type (ie SF_FORMAT_WAV) bitwise -** ORed with a minor type (ie SF_FORMAT_PCM). SF_FORMAT_TYPEMASK and -** SF_FORMAT_SUBMASK can be used to separate the major and minor file -** types. -*/ - -enum -{ /* Major formats. */ - SF_FORMAT_WAV = 0x010000, /* Microsoft WAV format (little endian default). */ - SF_FORMAT_AIFF = 0x020000, /* Apple/SGI AIFF format (big endian). */ - SF_FORMAT_AU = 0x030000, /* Sun/NeXT AU format (big endian). */ - SF_FORMAT_RAW = 0x040000, /* RAW PCM data. */ - SF_FORMAT_PAF = 0x050000, /* Ensoniq PARIS file format. */ - SF_FORMAT_SVX = 0x060000, /* Amiga IFF / SVX8 / SV16 format. */ - SF_FORMAT_NIST = 0x070000, /* Sphere NIST format. */ - SF_FORMAT_VOC = 0x080000, /* VOC files. */ - SF_FORMAT_IRCAM = 0x0A0000, /* Berkeley/IRCAM/CARL */ - SF_FORMAT_W64 = 0x0B0000, /* Sonic Foundry's 64 bit RIFF/WAV */ - SF_FORMAT_MAT4 = 0x0C0000, /* Matlab (tm) V4.2 / GNU Octave 2.0 */ - SF_FORMAT_MAT5 = 0x0D0000, /* Matlab (tm) V5.0 / GNU Octave 2.1 */ - SF_FORMAT_PVF = 0x0E0000, /* Portable Voice Format */ - SF_FORMAT_XI = 0x0F0000, /* Fasttracker 2 Extended Instrument */ - SF_FORMAT_HTK = 0x100000, /* HMM Tool Kit format */ - SF_FORMAT_SDS = 0x110000, /* Midi Sample Dump Standard */ - SF_FORMAT_AVR = 0x120000, /* Audio Visual Research */ - SF_FORMAT_WAVEX = 0x130000, /* MS WAVE with WAVEFORMATEX */ - SF_FORMAT_SD2 = 0x160000, /* Sound Designer 2 */ - SF_FORMAT_FLAC = 0x170000, /* FLAC lossless file format */ - SF_FORMAT_CAF = 0x180000, /* Core Audio File format */ - SF_FORMAT_WVE = 0x190000, /* Psion WVE format */ - SF_FORMAT_OGG = 0x200000, /* Xiph OGG container */ - SF_FORMAT_MPC2K = 0x210000, /* Akai MPC 2000 sampler */ - SF_FORMAT_RF64 = 0x220000, /* RF64 WAV file */ - - /* Subtypes from here on. */ - - SF_FORMAT_PCM_S8 = 0x0001, /* Signed 8 bit data */ - SF_FORMAT_PCM_16 = 0x0002, /* Signed 16 bit data */ - SF_FORMAT_PCM_24 = 0x0003, /* Signed 24 bit data */ - SF_FORMAT_PCM_32 = 0x0004, /* Signed 32 bit data */ - - SF_FORMAT_PCM_U8 = 0x0005, /* Unsigned 8 bit data (WAV and RAW only) */ - - SF_FORMAT_FLOAT = 0x0006, /* 32 bit float data */ - SF_FORMAT_DOUBLE = 0x0007, /* 64 bit float data */ - - SF_FORMAT_ULAW = 0x0010, /* U-Law encoded. */ - SF_FORMAT_ALAW = 0x0011, /* A-Law encoded. */ - SF_FORMAT_IMA_ADPCM = 0x0012, /* IMA ADPCM. */ - SF_FORMAT_MS_ADPCM = 0x0013, /* Microsoft ADPCM. */ - - SF_FORMAT_GSM610 = 0x0020, /* GSM 6.10 encoding. */ - SF_FORMAT_VOX_ADPCM = 0x0021, /* OKI / Dialogix ADPCM */ - - SF_FORMAT_G721_32 = 0x0030, /* 32kbs G721 ADPCM encoding. */ - SF_FORMAT_G723_24 = 0x0031, /* 24kbs G723 ADPCM encoding. */ - SF_FORMAT_G723_40 = 0x0032, /* 40kbs G723 ADPCM encoding. */ - - SF_FORMAT_DWVW_12 = 0x0040, /* 12 bit Delta Width Variable Word encoding. */ - SF_FORMAT_DWVW_16 = 0x0041, /* 16 bit Delta Width Variable Word encoding. */ - SF_FORMAT_DWVW_24 = 0x0042, /* 24 bit Delta Width Variable Word encoding. */ - SF_FORMAT_DWVW_N = 0x0043, /* N bit Delta Width Variable Word encoding. */ - - SF_FORMAT_DPCM_8 = 0x0050, /* 8 bit differential PCM (XI only) */ - SF_FORMAT_DPCM_16 = 0x0051, /* 16 bit differential PCM (XI only) */ - - SF_FORMAT_VORBIS = 0x0060, /* Xiph Vorbis encoding. */ - - SF_FORMAT_ALAC_16 = 0x0070, /* Apple Lossless Audio Codec (16 bit). */ - SF_FORMAT_ALAC_20 = 0x0071, /* Apple Lossless Audio Codec (20 bit). */ - SF_FORMAT_ALAC_24 = 0x0072, /* Apple Lossless Audio Codec (24 bit). */ - SF_FORMAT_ALAC_32 = 0x0073, /* Apple Lossless Audio Codec (32 bit). */ - - /* Endian-ness options. */ - - SF_ENDIAN_FILE = 0x00000000, /* Default file endian-ness. */ - SF_ENDIAN_LITTLE = 0x10000000, /* Force little endian-ness. */ - SF_ENDIAN_BIG = 0x20000000, /* Force big endian-ness. */ - SF_ENDIAN_CPU = 0x30000000, /* Force CPU endian-ness. */ - - SF_FORMAT_SUBMASK = 0x0000FFFF, - SF_FORMAT_TYPEMASK = 0x0FFF0000, - SF_FORMAT_ENDMASK = 0x30000000 -} ; - -/* -** The following are the valid command numbers for the sf_command() -** interface. The use of these commands is documented in the file -** command.html in the doc directory of the source code distribution. -*/ - -enum -{ SFC_GET_LIB_VERSION = 0x1000, - SFC_GET_LOG_INFO = 0x1001, - SFC_GET_CURRENT_SF_INFO = 0x1002, - - - SFC_GET_NORM_DOUBLE = 0x1010, - SFC_GET_NORM_FLOAT = 0x1011, - SFC_SET_NORM_DOUBLE = 0x1012, - SFC_SET_NORM_FLOAT = 0x1013, - SFC_SET_SCALE_FLOAT_INT_READ = 0x1014, - SFC_SET_SCALE_INT_FLOAT_WRITE = 0x1015, - - SFC_GET_SIMPLE_FORMAT_COUNT = 0x1020, - SFC_GET_SIMPLE_FORMAT = 0x1021, - - SFC_GET_FORMAT_INFO = 0x1028, - - SFC_GET_FORMAT_MAJOR_COUNT = 0x1030, - SFC_GET_FORMAT_MAJOR = 0x1031, - SFC_GET_FORMAT_SUBTYPE_COUNT = 0x1032, - SFC_GET_FORMAT_SUBTYPE = 0x1033, - - SFC_CALC_SIGNAL_MAX = 0x1040, - SFC_CALC_NORM_SIGNAL_MAX = 0x1041, - SFC_CALC_MAX_ALL_CHANNELS = 0x1042, - SFC_CALC_NORM_MAX_ALL_CHANNELS = 0x1043, - SFC_GET_SIGNAL_MAX = 0x1044, - SFC_GET_MAX_ALL_CHANNELS = 0x1045, - - SFC_SET_ADD_PEAK_CHUNK = 0x1050, - SFC_SET_ADD_HEADER_PAD_CHUNK = 0x1051, - - SFC_UPDATE_HEADER_NOW = 0x1060, - SFC_SET_UPDATE_HEADER_AUTO = 0x1061, - - SFC_FILE_TRUNCATE = 0x1080, - - SFC_SET_RAW_START_OFFSET = 0x1090, - - SFC_SET_DITHER_ON_WRITE = 0x10A0, - SFC_SET_DITHER_ON_READ = 0x10A1, - - SFC_GET_DITHER_INFO_COUNT = 0x10A2, - SFC_GET_DITHER_INFO = 0x10A3, - - SFC_GET_EMBED_FILE_INFO = 0x10B0, - - SFC_SET_CLIPPING = 0x10C0, - SFC_GET_CLIPPING = 0x10C1, - - SFC_GET_INSTRUMENT = 0x10D0, - SFC_SET_INSTRUMENT = 0x10D1, - - SFC_GET_LOOP_INFO = 0x10E0, - - SFC_GET_BROADCAST_INFO = 0x10F0, - SFC_SET_BROADCAST_INFO = 0x10F1, - - SFC_GET_CHANNEL_MAP_INFO = 0x1100, - SFC_SET_CHANNEL_MAP_INFO = 0x1101, - - SFC_RAW_DATA_NEEDS_ENDSWAP = 0x1110, - - /* Support for Wavex Ambisonics Format */ - SFC_WAVEX_SET_AMBISONIC = 0x1200, - SFC_WAVEX_GET_AMBISONIC = 0x1201, - - SFC_SET_VBR_ENCODING_QUALITY = 0x1300, - SFC_SET_COMPRESSION_LEVEL = 0x1301, - - /* Cart Chunk support */ - SFC_SET_CART_INFO = 0x1400, - SFC_GET_CART_INFO = 0x1401, - - /* Following commands for testing only. */ - SFC_TEST_IEEE_FLOAT_REPLACE = 0x6001, - - /* - ** SFC_SET_ADD_* values are deprecated and will disappear at some - ** time in the future. They are guaranteed to be here up to and - ** including version 1.0.8 to avoid breakage of existing software. - ** They currently do nothing and will continue to do nothing. - */ - SFC_SET_ADD_DITHER_ON_WRITE = 0x1070, - SFC_SET_ADD_DITHER_ON_READ = 0x1071 -} ; - - -/* -** String types that can be set and read from files. Not all file types -** support this and even the file types which support one, may not support -** all string types. -*/ - -enum -{ SF_STR_TITLE = 0x01, - SF_STR_COPYRIGHT = 0x02, - SF_STR_SOFTWARE = 0x03, - SF_STR_ARTIST = 0x04, - SF_STR_COMMENT = 0x05, - SF_STR_DATE = 0x06, - SF_STR_ALBUM = 0x07, - SF_STR_LICENSE = 0x08, - SF_STR_TRACKNUMBER = 0x09, - SF_STR_GENRE = 0x10 -} ; - -/* -** Use the following as the start and end index when doing metadata -** transcoding. -*/ - -#define SF_STR_FIRST SF_STR_TITLE -#define SF_STR_LAST SF_STR_GENRE - -enum -{ /* True and false */ - SF_FALSE = 0, - SF_TRUE = 1, - - /* Modes for opening files. */ - SFM_READ = 0x10, - SFM_WRITE = 0x20, - SFM_RDWR = 0x30, - - SF_AMBISONIC_NONE = 0x40, - SF_AMBISONIC_B_FORMAT = 0x41 -} ; - -/* Public error values. These are guaranteed to remain unchanged for the duration -** of the library major version number. -** There are also a large number of private error numbers which are internal to -** the library which can change at any time. -*/ - -enum -{ SF_ERR_NO_ERROR = 0, - SF_ERR_UNRECOGNISED_FORMAT = 1, - SF_ERR_SYSTEM = 2, - SF_ERR_MALFORMED_FILE = 3, - SF_ERR_UNSUPPORTED_ENCODING = 4 -} ; - - -/* Channel map values (used with SFC_SET/GET_CHANNEL_MAP). -*/ - -enum -{ SF_CHANNEL_MAP_INVALID = 0, - SF_CHANNEL_MAP_MONO = 1, - SF_CHANNEL_MAP_LEFT, /* Apple calls this 'Left' */ - SF_CHANNEL_MAP_RIGHT, /* Apple calls this 'Right' */ - SF_CHANNEL_MAP_CENTER, /* Apple calls this 'Center' */ - SF_CHANNEL_MAP_FRONT_LEFT, - SF_CHANNEL_MAP_FRONT_RIGHT, - SF_CHANNEL_MAP_FRONT_CENTER, - SF_CHANNEL_MAP_REAR_CENTER, /* Apple calls this 'Center Surround', Msft calls this 'Back Center' */ - SF_CHANNEL_MAP_REAR_LEFT, /* Apple calls this 'Left Surround', Msft calls this 'Back Left' */ - SF_CHANNEL_MAP_REAR_RIGHT, /* Apple calls this 'Right Surround', Msft calls this 'Back Right' */ - SF_CHANNEL_MAP_LFE, /* Apple calls this 'LFEScreen', Msft calls this 'Low Frequency' */ - SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER, /* Apple calls this 'Left Center' */ - SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER, /* Apple calls this 'Right Center */ - SF_CHANNEL_MAP_SIDE_LEFT, /* Apple calls this 'Left Surround Direct' */ - SF_CHANNEL_MAP_SIDE_RIGHT, /* Apple calls this 'Right Surround Direct' */ - SF_CHANNEL_MAP_TOP_CENTER, /* Apple calls this 'Top Center Surround' */ - SF_CHANNEL_MAP_TOP_FRONT_LEFT, /* Apple calls this 'Vertical Height Left' */ - SF_CHANNEL_MAP_TOP_FRONT_RIGHT, /* Apple calls this 'Vertical Height Right' */ - SF_CHANNEL_MAP_TOP_FRONT_CENTER, /* Apple calls this 'Vertical Height Center' */ - SF_CHANNEL_MAP_TOP_REAR_LEFT, /* Apple and MS call this 'Top Back Left' */ - SF_CHANNEL_MAP_TOP_REAR_RIGHT, /* Apple and MS call this 'Top Back Right' */ - SF_CHANNEL_MAP_TOP_REAR_CENTER, /* Apple and MS call this 'Top Back Center' */ - - SF_CHANNEL_MAP_AMBISONIC_B_W, - SF_CHANNEL_MAP_AMBISONIC_B_X, - SF_CHANNEL_MAP_AMBISONIC_B_Y, - SF_CHANNEL_MAP_AMBISONIC_B_Z, - - SF_CHANNEL_MAP_MAX -} ; - - -/* A SNDFILE* pointer can be passed around much like stdio.h's FILE* pointer. */ - -typedef struct SNDFILE_tag SNDFILE ; - -/* The following typedef is system specific and is defined when libsndfile is -** compiled. sf_count_t will be a 64 bit value when the underlying OS allows -** 64 bit file offsets. -** On windows, we need to allow the same header file to be compiler by both GCC -** and the Microsoft compiler. -*/ - -#if (defined (_MSCVER) || defined (_MSC_VER)) -typedef __int64 sf_count_t ; -#define SF_COUNT_MAX 0x7fffffffffffffffi64 -#else -typedef @TYPEOF_SF_COUNT_T@ sf_count_t ; -#define SF_COUNT_MAX @SF_COUNT_MAX@ -#endif - - -/* A pointer to a SF_INFO structure is passed to sf_open () and filled in. -** On write, the SF_INFO structure is filled in by the user and passed into -** sf_open (). -*/ - -struct SF_INFO -{ sf_count_t frames ; /* Used to be called samples. Changed to avoid confusion. */ - int samplerate ; - int channels ; - int format ; - int sections ; - int seekable ; -} ; - -typedef struct SF_INFO SF_INFO ; - -/* The SF_FORMAT_INFO struct is used to retrieve information about the sound -** file formats libsndfile supports using the sf_command () interface. -** -** Using this interface will allow applications to support new file formats -** and encoding types when libsndfile is upgraded, without requiring -** re-compilation of the application. -** -** Please consult the libsndfile documentation (particularly the information -** on the sf_command () interface) for examples of its use. -*/ - -typedef struct -{ int format ; - const char *name ; - const char *extension ; -} SF_FORMAT_INFO ; - -/* -** Enums and typedefs for adding dither on read and write. -** See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE -** and SFC_SET_DITHER_ON_READ. -*/ - -enum -{ SFD_DEFAULT_LEVEL = 0, - SFD_CUSTOM_LEVEL = 0x40000000, - - SFD_NO_DITHER = 500, - SFD_WHITE = 501, - SFD_TRIANGULAR_PDF = 502 -} ; - -typedef struct -{ int type ; - double level ; - const char *name ; -} SF_DITHER_INFO ; - -/* Struct used to retrieve information about a file embedded within a -** larger file. See SFC_GET_EMBED_FILE_INFO. -*/ - -typedef struct -{ sf_count_t offset ; - sf_count_t length ; -} SF_EMBED_FILE_INFO ; - -/* -** Structs used to retrieve music sample information from a file. -*/ - -enum -{ /* - ** The loop mode field in SF_INSTRUMENT will be one of the following. - */ - SF_LOOP_NONE = 800, - SF_LOOP_FORWARD, - SF_LOOP_BACKWARD, - SF_LOOP_ALTERNATING -} ; - -typedef struct -{ int gain ; - char basenote, detune ; - char velocity_lo, velocity_hi ; - char key_lo, key_hi ; - int loop_count ; - - struct - { int mode ; - uint32_t start ; - uint32_t end ; - uint32_t count ; - } loops [16] ; /* make variable in a sensible way */ -} SF_INSTRUMENT ; - - - -/* Struct used to retrieve loop information from a file.*/ -typedef struct -{ - short time_sig_num ; /* any positive integer > 0 */ - short time_sig_den ; /* any positive power of 2 > 0 */ - int loop_mode ; /* see SF_LOOP enum */ - - int num_beats ; /* this is NOT the amount of quarter notes !!!*/ - /* a full bar of 4/4 is 4 beats */ - /* a full bar of 7/8 is 7 beats */ - - float bpm ; /* suggestion, as it can be calculated using other fields:*/ - /* file's length, file's sampleRate and our time_sig_den*/ - /* -> bpms are always the amount of _quarter notes_ per minute */ - - int root_key ; /* MIDI note, or -1 for None */ - int future [6] ; -} SF_LOOP_INFO ; - - -/* Struct used to retrieve broadcast (EBU) information from a file. -** Strongly (!) based on EBU "bext" chunk format used in Broadcast WAVE. -*/ -#define SF_BROADCAST_INFO_VAR(coding_hist_size) \ - struct \ - { char description [256] ; \ - char originator [32] ; \ - char originator_reference [32] ; \ - char origination_date [10] ; \ - char origination_time [8] ; \ - uint32_t time_reference_low ; \ - uint32_t time_reference_high ; \ - short version ; \ - char umid [64] ; \ - char reserved [190] ; \ - uint32_t coding_history_size ; \ - char coding_history [coding_hist_size] ; \ - } - -/* SF_BROADCAST_INFO is the above struct with coding_history field of 256 bytes. */ -typedef SF_BROADCAST_INFO_VAR (256) SF_BROADCAST_INFO ; - -struct SF_CART_TIMER -{ char usage[4] ; - int32_t value ; -} ; - -typedef struct SF_CART_TIMER SF_CART_TIMER ; - -#define SF_CART_INFO_VAR(p_tag_text_size) \ - struct \ - { char version [4] ; \ - char title [64] ; \ - char artist [64] ; \ - char cut_id [64] ; \ - char client_id [64] ; \ - char category [64] ; \ - char classification [64] ; \ - char out_cue [64] ; \ - char start_date [10] ; \ - char start_time [8] ; \ - char end_date [10] ; \ - char end_time [8] ; \ - char producer_app_id [64] ; \ - char producer_app_version [64] ; \ - char user_def [64] ; \ - int32_t level_reference ; \ - SF_CART_TIMER post_timers [8] ; \ - char reserved [276] ; \ - char url [1024] ; \ - uint32_t tag_text_size ; \ - char tag_text[p_tag_text_size] ; \ - } - -typedef SF_CART_INFO_VAR (256) SF_CART_INFO ; - -/* Virtual I/O functionality. */ - -typedef sf_count_t (*sf_vio_get_filelen) (void *user_data) ; -typedef sf_count_t (*sf_vio_seek) (sf_count_t offset, int whence, void *user_data) ; -typedef sf_count_t (*sf_vio_read) (void *ptr, sf_count_t count, void *user_data) ; -typedef sf_count_t (*sf_vio_write) (const void *ptr, sf_count_t count, void *user_data) ; -typedef sf_count_t (*sf_vio_tell) (void *user_data) ; - -struct SF_VIRTUAL_IO -{ sf_vio_get_filelen get_filelen ; - sf_vio_seek seek ; - sf_vio_read read ; - sf_vio_write write ; - sf_vio_tell tell ; -} ; - -typedef struct SF_VIRTUAL_IO SF_VIRTUAL_IO ; - - -/* Open the specified file for read, write or both. On error, this will -** return a NULL pointer. To find the error number, pass a NULL SNDFILE -** to sf_strerror (). -** All calls to sf_open() should be matched with a call to sf_close(). -*/ - -SNDFILE* sf_open (const char *path, int mode, SF_INFO *sfinfo) ; - - -/* Use the existing file descriptor to create a SNDFILE object. If close_desc -** is TRUE, the file descriptor will be closed when sf_close() is called. If -** it is FALSE, the descritor will not be closed. -** When passed a descriptor like this, the library will assume that the start -** of file header is at the current file offset. This allows sound files within -** larger container files to be read and/or written. -** On error, this will return a NULL pointer. To find the error number, pass a -** NULL SNDFILE to sf_strerror (). -** All calls to sf_open_fd() should be matched with a call to sf_close(). - -*/ - -SNDFILE* sf_open_fd (int fd, int mode, SF_INFO *sfinfo, int close_desc) ; - -SNDFILE* sf_open_virtual (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ; - - -/* sf_error () returns a error number which can be translated to a text -** string using sf_error_number(). -*/ - -int sf_error (SNDFILE *sndfile) ; - - -/* sf_strerror () returns to the caller a pointer to the current error message for -** the given SNDFILE. -*/ - -const char* sf_strerror (SNDFILE *sndfile) ; - - -/* sf_error_number () allows the retrieval of the error string for each internal -** error number. -** -*/ - -const char* sf_error_number (int errnum) ; - - -/* The following two error functions are deprecated but they will remain in the -** library for the forseeable future. The function sf_strerror() should be used -** in their place. -*/ - -int sf_perror (SNDFILE *sndfile) ; -int sf_error_str (SNDFILE *sndfile, char* str, size_t len) ; - - -/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */ - -int sf_command (SNDFILE *sndfile, int command, void *data, int datasize) ; - - -/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */ - -int sf_format_check (const SF_INFO *info) ; - - -/* Seek within the waveform data chunk of the SNDFILE. sf_seek () uses -** the same values for whence (SEEK_SET, SEEK_CUR and SEEK_END) as -** stdio.h function fseek (). -** An offset of zero with whence set to SEEK_SET will position the -** read / write pointer to the first data sample. -** On success sf_seek returns the current position in (multi-channel) -** samples from the start of the file. -** Please see the libsndfile documentation for moving the read pointer -** separately from the write pointer on files open in mode SFM_RDWR. -** On error all of these functions return -1. -*/ - -sf_count_t sf_seek (SNDFILE *sndfile, sf_count_t frames, int whence) ; - - -/* Functions for retrieving and setting string data within sound files. -** Not all file types support this features; AIFF and WAV do. For both -** functions, the str_type parameter must be one of the SF_STR_* values -** defined above. -** On error, sf_set_string() returns non-zero while sf_get_string() -** returns NULL. -*/ - -int sf_set_string (SNDFILE *sndfile, int str_type, const char* str) ; - -const char* sf_get_string (SNDFILE *sndfile, int str_type) ; - - -/* Return the library version string. */ - -const char * sf_version_string (void) ; - -/* Return the current byterate at this point in the file. The byte rate in this -** case is the number of bytes per second of audio data. For instance, for a -** stereo, 18 bit PCM encoded file with an 16kHz sample rate, the byte rate -** would be 2 (stereo) * 2 (two bytes per sample) * 16000 => 64000 bytes/sec. -** For some file formats the returned value will be accurate and exact, for some -** it will be a close approximation, for some it will be the average bitrate for -** the whole file and for some it will be a time varying value that was accurate -** when the file was most recently read or written. -** To get the bitrate, multiple this value by 8. -** Returns -1 for unknown. -*/ -int sf_current_byterate (SNDFILE *sndfile) ; - -/* Functions for reading/writing the waveform data of a sound file. -*/ - -sf_count_t sf_read_raw (SNDFILE *sndfile, void *ptr, sf_count_t bytes) ; -sf_count_t sf_write_raw (SNDFILE *sndfile, const void *ptr, sf_count_t bytes) ; - - -/* Functions for reading and writing the data chunk in terms of frames. -** The number of items actually read/written = frames * number of channels. -** sf_xxxx_raw read/writes the raw data bytes from/to the file -** sf_xxxx_short passes data in the native short format -** sf_xxxx_int passes data in the native int format -** sf_xxxx_float passes data in the native float format -** sf_xxxx_double passes data in the native double format -** All of these read/write function return number of frames read/written. -*/ - -sf_count_t sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) ; -sf_count_t sf_writef_short (SNDFILE *sndfile, const short *ptr, sf_count_t frames) ; - -sf_count_t sf_readf_int (SNDFILE *sndfile, int *ptr, sf_count_t frames) ; -sf_count_t sf_writef_int (SNDFILE *sndfile, const int *ptr, sf_count_t frames) ; - -sf_count_t sf_readf_float (SNDFILE *sndfile, float *ptr, sf_count_t frames) ; -sf_count_t sf_writef_float (SNDFILE *sndfile, const float *ptr, sf_count_t frames) ; - -sf_count_t sf_readf_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) ; -sf_count_t sf_writef_double (SNDFILE *sndfile, const double *ptr, sf_count_t frames) ; - - -/* Functions for reading and writing the data chunk in terms of items. -** Otherwise similar to above. -** All of these read/write function return number of items read/written. -*/ - -sf_count_t sf_read_short (SNDFILE *sndfile, short *ptr, sf_count_t items) ; -sf_count_t sf_write_short (SNDFILE *sndfile, const short *ptr, sf_count_t items) ; - -sf_count_t sf_read_int (SNDFILE *sndfile, int *ptr, sf_count_t items) ; -sf_count_t sf_write_int (SNDFILE *sndfile, const int *ptr, sf_count_t items) ; - -sf_count_t sf_read_float (SNDFILE *sndfile, float *ptr, sf_count_t items) ; -sf_count_t sf_write_float (SNDFILE *sndfile, const float *ptr, sf_count_t items) ; - -sf_count_t sf_read_double (SNDFILE *sndfile, double *ptr, sf_count_t items) ; -sf_count_t sf_write_double (SNDFILE *sndfile, const double *ptr, sf_count_t items) ; - - -/* Close the SNDFILE and clean up all memory allocations associated with this -** file. -** Returns 0 on success, or an error number. -*/ - -int sf_close (SNDFILE *sndfile) ; - - -/* If the file is opened SFM_WRITE or SFM_RDWR, call fsync() on the file -** to force the writing of data to disk. If the file is opened SFM_READ -** no action is taken. -*/ - -void sf_write_sync (SNDFILE *sndfile) ; - - - -/* The function sf_wchar_open() is Windows Only! -** Open a file passing in a Windows Unicode filename. Otherwise, this is -** the same as sf_open(). -** -** In order for this to work, you need to do the following: -** -** #include -** #define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 -** #including -*/ - -#if (defined (ENABLE_SNDFILE_WINDOWS_PROTOTYPES) && ENABLE_SNDFILE_WINDOWS_PROTOTYPES) -SNDFILE* sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) ; -#endif - - - - -/* Getting and setting of chunks from within a sound file. -** -** These functions allow the getting and setting of chunks within a sound file -** (for those formats which allow it). -** -** These functions fail safely. Specifically, they will not allow you to overwrite -** existing chunks or add extra versions of format specific reserved chunks but -** should allow you to retrieve any and all chunks (may not be implemented for -** all chunks or all file formats). -*/ - -struct SF_CHUNK_INFO -{ char id [64] ; /* The chunk identifier. */ - unsigned id_size ; /* The size of the chunk identifier. */ - unsigned datalen ; /* The size of that data. */ - void *data ; /* Pointer to the data. */ -} ; - -typedef struct SF_CHUNK_INFO SF_CHUNK_INFO ; - -/* Set the specified chunk info (must be done before any audio data is written -** to the file). This will fail for format specific reserved chunks. -** The chunk_info->data pointer must be valid until the file is closed. -** Returns SF_ERR_NO_ERROR on success or non-zero on failure. -*/ -int sf_set_chunk (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) ; - -/* -** An opaque structure to an iterator over the all chunks of a given id -*/ -typedef struct SF_CHUNK_ITERATOR SF_CHUNK_ITERATOR ; - -/* Get an iterator for all chunks matching chunk_info. -** The iterator will point to the first chunk matching chunk_info. -** Chunks are matching, if (chunk_info->id) matches the first -** (chunk_info->id_size) bytes of a chunk found in the SNDFILE* handle. -** If chunk_info is NULL, an iterator to all chunks in the SNDFILE* handle -** is returned. -** The values of chunk_info->datalen and chunk_info->data are ignored. -** If no matching chunks are found in the sndfile, NULL is returned. -** The returned iterator will stay valid until one of the following occurs: -** a) The sndfile is closed. -** b) A new chunk is added using sf_set_chunk(). -** c) Another chunk iterator function is called on the same SNDFILE* handle -** that causes the iterator to be modified. -** The memory for the iterator belongs to the SNDFILE* handle and is freed when -** sf_close() is called. -*/ -SF_CHUNK_ITERATOR * -sf_get_chunk_iterator (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) ; - -/* Iterate through chunks by incrementing the iterator. -** Increments the iterator and returns a handle to the new one. -** After this call, iterator will no longer be valid, and you must use the -** newly returned handle from now on. -** The returned handle can be used to access the next chunk matching -** the criteria as defined in sf_get_chunk_iterator(). -** If iterator points to the last chunk, this will free all resources -** associated with iterator and return NULL. -** The returned iterator will stay valid until sf_get_chunk_iterator_next -** is called again, the sndfile is closed or a new chunk us added. -*/ -SF_CHUNK_ITERATOR * -sf_next_chunk_iterator (SF_CHUNK_ITERATOR * iterator) ; - - -/* Get the size of the specified chunk. -** If the specified chunk exists, the size will be returned in the -** datalen field of the SF_CHUNK_INFO struct. -** Additionally, the id of the chunk will be copied to the id -** field of the SF_CHUNK_INFO struct and it's id_size field will -** be updated accordingly. -** If the chunk doesn't exist chunk_info->datalen will be zero, and the -** id and id_size fields will be undefined. -** The function will return SF_ERR_NO_ERROR on success or non-zero on -** failure. -*/ -int -sf_get_chunk_size (const SF_CHUNK_ITERATOR * it, SF_CHUNK_INFO * chunk_info) ; - -/* Get the specified chunk data. -** If the specified chunk exists, up to chunk_info->datalen bytes of -** the chunk data will be copied into the chunk_info->data buffer -** (allocated by the caller) and the chunk_info->datalen field -** updated to reflect the size of the data. The id and id_size -** field will be updated according to the retrieved chunk -** If the chunk doesn't exist chunk_info->datalen will be zero, and the -** id and id_size fields will be undefined. -** The function will return SF_ERR_NO_ERROR on success or non-zero on -** failure. -*/ -int -sf_get_chunk_data (const SF_CHUNK_ITERATOR * it, SF_CHUNK_INFO * chunk_info) ; - - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* SNDFILE_H */ - diff --git a/src/mod/formats/mod_sndfile/mod_sndfile.2015.vcxproj b/src/mod/formats/mod_sndfile/mod_sndfile.2015.vcxproj index e182fd0a60..59415f74ab 100644 --- a/src/mod/formats/mod_sndfile/mod_sndfile.2015.vcxproj +++ b/src/mod/formats/mod_sndfile/mod_sndfile.2015.vcxproj @@ -46,6 +46,7 @@ v140 + @@ -70,13 +71,11 @@ - %(RootDir)%(Directory)..\..\..\..\libs\win32\libsndfile\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS;%(PreprocessorDefinitions) - ..\..\..\..\libs\libsndfile\Win32\$(OutDir);%(AdditionalLibraryDirectories) false @@ -87,13 +86,11 @@ X64 - %(RootDir)%(Directory)..\..\..\..\libs\win32\libsndfile\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS;%(PreprocessorDefinitions) - ..\..\..\..\libs\libsndfile\Win32\$(OutDir);%(AdditionalLibraryDirectories) false @@ -102,12 +99,10 @@ - %(RootDir)%(Directory)..\..\..\..\libs\win32\libsndfile\;%(AdditionalIncludeDirectories) - ..\..\..\..\libs\libsndfile\Win32\$(OutDir);%(AdditionalLibraryDirectories) false @@ -118,12 +113,10 @@ X64 - %(RootDir)%(Directory)..\..\..\..\libs\win32\libsndfile\;%(AdditionalIncludeDirectories) - ..\..\..\..\libs\libsndfile\Win32\$(OutDir);%(AdditionalLibraryDirectories) false @@ -138,10 +131,6 @@ {f6c55d93-b927-4483-bb69-15aef3dd2dff} false - - {3d0370ca-bed2-4657-a475-32375cbcb6e4} - false - {202d7a4e-760d-4d0e-afa1-d7459ced30ff} false diff --git a/w32/libsndfile-version.props b/w32/libsndfile-version.props new file mode 100644 index 0000000000..c30e080fef --- /dev/null +++ b/w32/libsndfile-version.props @@ -0,0 +1,19 @@ + + + + + + + 1.0.28.1.fda9c8d + + + true + + + + + + $(libsndfileVersion) + + + diff --git a/w32/libsndfile.props b/w32/libsndfile.props new file mode 100644 index 0000000000..03dbd5a9bd --- /dev/null +++ b/w32/libsndfile.props @@ -0,0 +1,78 @@ + + + + true + + + + + + + + Debug + Release + + + + $(BaseDir)libs\libsndfile-$(libsndfileVersion) + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)libs\libsndfile-$(libsndfileVersion)\include;%(AdditionalIncludeDirectories) + + + $(SolutionDir)libs\libsndfile-$(libsndfileVersion)\binaries\$(Platform)\$(LibraryConfiguration)\lib;%(AdditionalLibraryDirectories) + libsndfile-1.lib;%(AdditionalDependencies) + + + \ No newline at end of file