mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 01:01:33 +00:00
musicplus-libopenmpt 2.2 -> 2.1 backport
This commit is contained in:
parent
66283ce36a
commit
4d89beb105
38 changed files with 5998 additions and 16 deletions
|
@ -44,17 +44,17 @@ jobs:
|
|||
- checkout
|
||||
- run:
|
||||
name: Clean build
|
||||
command: make -C src LINUX=1 clean
|
||||
command: make -C src LINUX=1 NOOPENMPT=1 clean
|
||||
- restore_cache:
|
||||
keys:
|
||||
- v1-SRB2-{{ .Branch }}-{{ checksum "objs/Linux/SDL/Release/depend.dep" }}
|
||||
- run:
|
||||
name: Compile
|
||||
command: make -C src LINUX=1 ERRORMODE=1 -k
|
||||
command: make -C src LINUX=1 ERRORMODE=1 NOOPENMPT=1 -k
|
||||
- store_artifacts:
|
||||
path: /root/SRB2/bin/Linux/Release/
|
||||
destination: bin
|
||||
- save_cache:
|
||||
key: v1-SRB2-{{ .Branch }}-{{ checksum "objs/Linux/SDL/Release/depend.dep" }}
|
||||
paths:
|
||||
- /root/.ccache
|
||||
- /root/.ccache
|
13
.travis.yml
13
.travis.yml
|
@ -12,6 +12,7 @@ matrix:
|
|||
- libpng-dev
|
||||
- libgl1-mesa-dev
|
||||
- libgme-dev
|
||||
- libopenmpt-dev
|
||||
- p7zip-full
|
||||
- gcc-4.4
|
||||
compiler: gcc-4.4
|
||||
|
@ -24,6 +25,7 @@ matrix:
|
|||
- libpng-dev
|
||||
- libgl1-mesa-dev
|
||||
- libgme-dev
|
||||
- libopenmpt-dev
|
||||
- p7zip-full
|
||||
- gcc-4.6
|
||||
compiler: gcc-4.6
|
||||
|
@ -36,6 +38,7 @@ matrix:
|
|||
- libpng-dev
|
||||
- libgl1-mesa-dev
|
||||
- libgme-dev
|
||||
- libopenmpt-dev
|
||||
- p7zip-full
|
||||
- gcc-4.7
|
||||
compiler: gcc-4.7
|
||||
|
@ -53,6 +56,7 @@ matrix:
|
|||
- libpng-dev
|
||||
- libgl1-mesa-dev
|
||||
- libgme-dev
|
||||
- libopenmpt-dev
|
||||
- p7zip-full
|
||||
- gcc-4.8
|
||||
compiler: gcc-4.8
|
||||
|
@ -67,6 +71,7 @@ matrix:
|
|||
- libpng-dev
|
||||
- libgl1-mesa-dev
|
||||
- libgme-dev
|
||||
- libopenmpt-dev
|
||||
- p7zip-full
|
||||
- gcc-7
|
||||
compiler: gcc-7
|
||||
|
@ -85,6 +90,7 @@ matrix:
|
|||
- libpng-dev
|
||||
- libgl1-mesa-dev
|
||||
- libgme-dev
|
||||
- libopenmpt-dev
|
||||
- p7zip-full
|
||||
- clang-3.5
|
||||
compiler: clang-3.5
|
||||
|
@ -100,6 +106,7 @@ matrix:
|
|||
- libpng-dev
|
||||
- libgl1-mesa-dev
|
||||
- libgme-dev
|
||||
- libopenmpt-dev
|
||||
- p7zip-full
|
||||
- clang-3.6
|
||||
compiler: clang-3.6
|
||||
|
@ -115,6 +122,7 @@ matrix:
|
|||
- libpng-dev
|
||||
- libgl1-mesa-dev
|
||||
- libgme-dev
|
||||
- libopenmpt-dev
|
||||
- p7zip-full
|
||||
- clang-3.7
|
||||
compiler: clang-3.7
|
||||
|
@ -130,6 +138,7 @@ matrix:
|
|||
- libpng-dev
|
||||
- libgl1-mesa-dev
|
||||
- libgme-dev
|
||||
- libopenmpt-dev
|
||||
- p7zip-full
|
||||
- clang-3.8
|
||||
compiler: clang-3.8
|
||||
|
@ -145,6 +154,7 @@ matrix:
|
|||
- libpng-dev
|
||||
- libgl1-mesa-dev
|
||||
- libgme-dev
|
||||
- libopenmpt-dev
|
||||
- p7zip-full
|
||||
- clang-3.9
|
||||
compiler: clang-3.9
|
||||
|
@ -160,6 +170,7 @@ matrix:
|
|||
# - libpng-dev
|
||||
# - libgl1-mesa-dev
|
||||
# - libgme-dev
|
||||
# - libopenmpt-dev
|
||||
# - p7zip-full
|
||||
# - clang-4.0
|
||||
# compiler: clang-4.0
|
||||
|
@ -175,6 +186,7 @@ matrix:
|
|||
# - libpng-dev
|
||||
# - libgl1-mesa-dev
|
||||
# - libgme-dev
|
||||
# - libopenmpt-dev
|
||||
# - p7zip-full
|
||||
# - clang-5.0
|
||||
# compiler: clang-5.0
|
||||
|
@ -226,6 +238,7 @@ addons:
|
|||
- libpng-dev
|
||||
- libgl1-mesa-dev
|
||||
- libgme-dev
|
||||
- libopenmpt-dev
|
||||
- p7zip-full
|
||||
|
||||
before_script:
|
||||
|
|
27
libs/libopenmpt/LICENSE.txt
Normal file
27
libs/libopenmpt/LICENSE.txt
Normal file
|
@ -0,0 +1,27 @@
|
|||
The OpenMPT code is licensed under the BSD license.
|
||||
|
||||
Copyright (c) 2004-2018, OpenMPT contributors
|
||||
Copyright (c) 1997-2003, Olivier Lapicque
|
||||
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 name of the OpenMPT project 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 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 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.
|
28
libs/libopenmpt/Licenses/License.Vorbis.txt
Normal file
28
libs/libopenmpt/Licenses/License.Vorbis.txt
Normal file
|
@ -0,0 +1,28 @@
|
|||
Copyright (c) 2002-2018 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.
|
175
libs/libopenmpt/Licenses/License.mpg123.Authors.txt
Normal file
175
libs/libopenmpt/Licenses/License.mpg123.Authors.txt
Normal file
|
@ -0,0 +1,175 @@
|
|||
This is an attempt to give credit to the people who contributed in some way to the mpg123 project.
|
||||
There are names and email addresses listed. Please use these addresses only to contact contributors with some question about their mpg123 contribution.
|
||||
You are explicitly not allowed to send them unwanted business offers or to question the quality of their sex life.
|
||||
--------------------
|
||||
|
||||
Being on the list of contributing authors not necessarily means that there
|
||||
is significant copyright in parts of the source code. There are obviously
|
||||
contributions of differing complexity. I try to mention people who motivated
|
||||
changes at least by suggesting some definite code changes, even if their
|
||||
code did not enter the mpg123 source verbatim. Trivial changes like pointing
|
||||
out ovbious syntax errors that make compilers cry do not land here.
|
||||
|
||||
--------------------
|
||||
|
||||
Current maintainers with various sorts of contributions:
|
||||
Thomas Orgis <thomas@orgis.org>
|
||||
Patrick Dehne <patrick@steidle.net>
|
||||
Jonathan Yong <10walls@gmail.com>
|
||||
Taihei Momma <tmkk@mac.com>
|
||||
|
||||
Co-initiator of the revived mpg123 project, but not that involved anymore:
|
||||
Nicholas J Humfrey <njh@ecs.soton.ac.uk>
|
||||
|
||||
Special thanks go to Taihei, the person who keeps the assembly optimisations alive
|
||||
and takes care of portability to OSX/iOS platforms.
|
||||
|
||||
Generic address pointing to the current maintainer (hopefully still works in future in case maintainership will change again): <maintainer@mpg123.org>
|
||||
|
||||
The creator: Michael Hipp (email: hippm@informatik.uni-tuebingen.de - please bother maintainers first)
|
||||
|
||||
Contributions/ideas Thomas Orgis era (includes backports from mhipp trunk):
|
||||
|
||||
Won-Kyu Park <wkpark@gmail.com>: patch to get rid of asm textrels (x86 PIC)
|
||||
Michael Weiser <michaelweiser@users.sf.net>: update of coreaudio output to AudioComponents API
|
||||
Bent Bisballe Nyeng <bbn@dynastrom.com>: patch for MPG123_NO_PEEK_END and MPG123_FORCE_SEEKABLE
|
||||
Eric S. Raymond <esr@thyrsus.com>: man page fixes
|
||||
Tobias Weber <tobiw@suprafluid.com>: patch for --disable-equalizer
|
||||
Hans de Goede <j.w.r.degoede@gmail.com>: patch to skip APE tags
|
||||
Stephan Vedder <stephan.vedder@gmail.com>: MSVC++ 2013 port update
|
||||
Rajeev V. Pillai <rajeevvp@users.sf.net>: pointing out/patching issues in HTTP code and behaviour of mpg123 remote/terminal control
|
||||
Jarno Lehtinen <lehtinen@sci.fi>: tinyalsa output
|
||||
Anthony Wells <borgboyone@yahoo.com>: initial version of ID3v2 APIC patch
|
||||
David Wohlferd <limegreensocks@yahoo.com>: Win32 WaveOut buffer destructor fix.
|
||||
Mike Gorchak <mike.gorchak.qnx@gmail.com>: QNX native audio output (QSA)
|
||||
Dan McGee <dpmcgee@gmail.com>: various patches (also for test suite)
|
||||
Jonathan Yong (jon_y) <10walls@gmail.com>: win32 hacking, win32 wasapi audio.
|
||||
Malcolm Boczek <MBoczek@terraindustries.com>: Common language runtime wrapper
|
||||
Elbert Pol (TeLLie) <elbert.pol@gmail.com>: OS/2 port fixup
|
||||
Jeroen Valkonet <jvalkon@xs4all.nl>: motivate pitch control, suggestive patch for pitch command in generic control interface
|
||||
Andy Hefner <ahefner@gmail.com>: patch for that second UTF16 issue
|
||||
Taihei Monma <tmkk@mac.com>: A whole lot of new/improved assembler code, including Altivec!
|
||||
Christian Weisgerber <naddy@openbsd.org>, Brad Smith: sndio output
|
||||
Patrick Dehne (P4tr3ck) <patrick@steidle.net>: more MSVC++ porting, patch to handle missing bit reservoirs
|
||||
Thorsten Glaser <tg@mirbsd.de>: icy2utf8, suggest utf8 locale stuff
|
||||
Dan Smith <dan@algenta.com>: ABI fixes for ensuring stack alignment (esp. for MinGW-built DLL with MSVC)
|
||||
Michael Ryzhykh <mclroy@gmail.com>: mpg123.spec.in
|
||||
Stefan Lenselink <Stefan@lenselink.org>: initial aRts output
|
||||
Sergej Kvachonok <ravenexp@gmail.com>: win32 audio rewrite
|
||||
Winston: SunOS-4.1.4/gcc-2.7.0 testing and suggestions for fixes (legacy Makefile, integer type headers)
|
||||
Mika Tiainen: pointing out the fix for the UTF to ASCII filtering of tags to actually work
|
||||
Nick Kurshev <nickols_k@mail.ru>: extended 3dnow (from mplayer)
|
||||
Zuxy Meng <zuxy.meng@gmail.com>: SSE (from mplayer)
|
||||
Honza <cundrak@quick.cz>: idea and prototype patch for ICY meta data support
|
||||
Petr Baudis <pasky@ucw.cz>: patches: term sigcont, id3 display unicode fallback and condensed output
|
||||
Petr Salinger <Petr.Salinger@seznam.cz>: i486 enhancement
|
||||
mpdavig@users.sourceforge.net: linux-ppc-nas Makefile.legacy entry
|
||||
Adrian Bacon <adrian.bacon@xs4all.nl>: patched decode_i586_dither (noise shaped float/int rounding)
|
||||
Cool Feet Audio project <nutcase@dtfm.org>: realtime equalizer control
|
||||
Steve Grundell <www@grundell.u-net.com>: clean stdout in control mode with stdout decoding
|
||||
Romain Dolbeau <romain@dolbeau.org>: Altivec support (taken from mplayer)
|
||||
higway <higway@mednet.md>: MMX Patch
|
||||
Clemens Ladisch <clemens@ladisch.de>: ALSA 0.9/1.0 support
|
||||
|
||||
Debian Daniel Kobras <kobras@debian.org> era:
|
||||
|
||||
Steve Kemp <skx@debian.org>
|
||||
Dan Olson <theoddone33@icculus.org>
|
||||
Syuuhei Kashiyama <squash@mb.kcom.ne.jp>
|
||||
Rupert Levene <rupert.debian@hotpop.com>
|
||||
Andreas Dilger <adilger@turbolinux.com>
|
||||
Erik B. Andersen <andersee@debian.org>
|
||||
Chris Butler <chrisb@debian.org>
|
||||
Martin Sjogren <md9ms@mdstud.chalmers.se>
|
||||
Chet Hosey <chosey@budapress.com>
|
||||
Roland Rosenfeld <roland@spinnaker.de>
|
||||
|
||||
|
||||
Debian Colin Watson <cjwatson@debian.org> era:
|
||||
|
||||
Helge Deller <deller@gmx.de>
|
||||
Chet Hosey <chosey@budapress.com>
|
||||
Christopher C. Chimelis <chris@debian.org>
|
||||
Roland Rosenfeld <roland@spinnaker.de>
|
||||
Marcelo E. Magallon <mmagallo@debian.org>
|
||||
|
||||
|
||||
Initial Debianers:
|
||||
|
||||
Tommi Virtanen <tv@debian.org>
|
||||
Paul Haggart <phaggart@debian.org>
|
||||
|
||||
|
||||
Contributions/ideas Michael Hipp era:
|
||||
|
||||
Mikko Tommila: DCT9
|
||||
Oliver Fromme <oliver.fromme@heim3.tu-clausthal.de>
|
||||
MPEG Software Simulation Group: reference decoder package
|
||||
Tobias Bading: idea for DCT64 in subband synthesis from maplay package
|
||||
Jeff Tsay and Mikko Tommila: MDCT36 from maplay package
|
||||
Philipp Knirsch <phil@mpik-tueb.mpg.de>: DCT36/manual unroll idea
|
||||
Thomas Woerner: SGI Audio
|
||||
Damien Clermonte: HP-UX audio fixes
|
||||
Niclas Lindstrom <nil@wineasy.se>: OS2 port
|
||||
Stefan Bieschewski <stb@acm.org>: Pentium optimizations, decode_i586.s
|
||||
Martin Denn <mdenn@unix-ag.uni-kl.de>: NAS port
|
||||
Niklas Beisert <nbeisert@physik.tu-muenchen.de>: MPEG 2.5 tables
|
||||
<mycroft@NetBSD.ORG> and <augustss@cs.chalmers.se>: NetBSD Patch(es)
|
||||
Kevin Brintnall <kbrint@visi.com>: BSD patch
|
||||
Tony Million: win32 port
|
||||
Steven Tiger Lang: advanced shuffle
|
||||
Eric B. Mitchell: esd port
|
||||
Ryan R. Prosser <prosser@geocities.com>: esd port for Solaris
|
||||
Andreas Neuhaus: initial generic control interface
|
||||
|
||||
(additionally fetched from changelog:)
|
||||
|
||||
Ralf Hildebrandt <R.Hildebrandt@TU-BS.DE>: audio_alib changes
|
||||
<sms@moe.2bsd.com>: BSDOS 4.0 with gcc added to Makefile
|
||||
Bertrand Petit <elrond@phoe.netdev.net>: frontend changes
|
||||
Erik Mouw <J.A.K.Mouw@its.tudelft.nl>: SGI audio fix for non RAD machines
|
||||
Daniel O'Connor <darius@guppy.dons.net.au>: freebsd-esd make-entry
|
||||
D. Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>: enhanced head_check
|
||||
Wilson, Jeff D <jeff.wilson@wilcom.com>: xterm-title
|
||||
Robert Bihlmeyer <robbe@orcus.priv.at>: esd changes
|
||||
Hannu Napari's <Hannu.Napari@hut.fi>: SGI audio patches
|
||||
<Juergen.Schoew@unix-ag.uni-siegen.de>: native AIX support
|
||||
<psst@euskalnet.net>: playlist patch
|
||||
Gilles Zunino <Gilles.Zunino@hei.fupl.asso.fr>: SGI audio patches
|
||||
Matthew Parslow <roy@alpha.alphalink.com.au>: esdserver patch
|
||||
<dlux@dlux.sch.bme.hu>: equalizer patch (equalfile setting)
|
||||
Ducroquet Erwan <ducroque@ufr-info-p7.ibp.fr>: HPUX/ALib support
|
||||
Shane Wegner <shane@CM.NU>: genrepatch
|
||||
Samuel Audet <guardia@step.polymtl.ca>: wav-File patch
|
||||
"J. Dean Brederson" <jdb@cs.utah.edu>: SGI-RAD support
|
||||
Chou Ye-chi <is84002@cis.nctu.edu.tw>: sajberplay/FreeBSD patch
|
||||
Fabrice Bellard <bellard@email.enst.fr>: 486 optimizations
|
||||
A. Hermansen <ahermans@vf.telia.no> and J. Kysela <perex@jcu.cz>: ALSA output
|
||||
KIMURA Takuhiro <kim@hannah.ipc.miyakyo-u.ac.jp>: K6-3DNow
|
||||
Petr Stehlik <stehlik@cas3.zlin.vutbr.cz>: MINT
|
||||
Andy <andy@snoogie.demon.co.uk>: float2int speed up proposal
|
||||
Brian Foutz <foutz@anise.ee.cornell.edu>: TK3Play
|
||||
Thomas Niederreiter <tn@tarantel.rz.fh-muenchen.de>: RIFF header fix
|
||||
Stefan Gybas <cab@studbox.uni-stuttgart.de>: m68k patch
|
||||
Grant Erickson <eric0139@tc.umn.edu>: Linux PPC patch
|
||||
Peter Berger <peterb@hoopoe.psc.edu>: BSDi patch
|
||||
Henrik P Johnson <king@one.se>: HTTP auth
|
||||
Steven Tiger Lang <tiger@tyger.org>: advanced shuffle
|
||||
"Brian J. Swetland" <swetland@uiuc.edu>: front-end (remote) patch
|
||||
<leo@zycad.com>
|
||||
Tillmann Steinbrecher <tst@gmx.de>: shuffle patch
|
||||
M.Stekelenburg <m.stekelenburg@student.utwente.nl>: i386-getbits
|
||||
Antti Andreimann <anttix@cyberix.edu.ee>: outburst patch
|
||||
Hur TaeSung <saturn@arari.snu.ac.kr>: 'http accept' patch
|
||||
|
||||
(from post-0.59 changes that yet have to go into new trunk:)
|
||||
|
||||
Hans Schwengeler <schweng@astro.unibas.ch>: audio_dec additions
|
||||
Wojciech Barañski's Mp3Play (check the tools folder): Mp3Play frontend
|
||||
Daniel Koukola: audio_oss.c patch
|
||||
Munechika SUMIKAWA <sumikawa@ebina.hitachi.co.jp>: IPv6
|
||||
TEMNOTA <temnota@kmv.ru>: HTTP,FTP patch/playlist fix
|
||||
Peter Surda <shurdeek@panorama.sth.ac.at>: VBR patch
|
||||
Ben <ben@blaukopf.com>: ARM startup time improvements
|
||||
Dave MacKenzie <djm@pix.net>: init_output() patch
|
||||
pasky's <pasky@ju.cz>: close-on-stop patch
|
772
libs/libopenmpt/Licenses/License.mpg123.txt
Normal file
772
libs/libopenmpt/Licenses/License.mpg123.txt
Normal file
|
@ -0,0 +1,772 @@
|
|||
This is the file that contains the terms of use, copying, etc. for the mpg123 distribution package.
|
||||
|
||||
Main message, to include in "About ..." boxes, etc:
|
||||
|
||||
Copyright (c) 1995-2013 by Michael Hipp and others,
|
||||
free software under the terms of the LGPL v2.1
|
||||
|
||||
There is an attempt to cover the actual list of authors in the AUTHORS file.
|
||||
Project maintainer since 2006 is Thomas Orgis and many people have contributed
|
||||
since the Michael Hipp era, but he stays the initial source and it would
|
||||
be impractical to count them all individually, so it's "and others".
|
||||
Source files contain the phrase "the mpg123 project" to the same effect
|
||||
in their license boilerplate; especially those that were added after
|
||||
maintainership changed. The person mainly responsible for the first version
|
||||
is usually named in the phrase "initially written by ...".
|
||||
|
||||
All files in the distribution that don't carry a license note on their own are
|
||||
licensed under the terms of the LGPL 2.1; exceptions may apply, especially to
|
||||
files not in the official distribution but in the revision control repository.
|
||||
|
||||
The formal license text follows.
|
||||
|
||||
=======================
|
||||
1. The LGPL version 2.1
|
||||
=======================
|
||||
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
|
||||
====================
|
||||
2. The GPL version 2
|
||||
====================
|
||||
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
28
libs/libopenmpt/Licenses/License.ogg.txt
Normal file
28
libs/libopenmpt/Licenses/License.ogg.txt
Normal file
|
@ -0,0 +1,28 @@
|
|||
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.
|
115
libs/libopenmpt/Licenses/License.zlib.txt
Normal file
115
libs/libopenmpt/Licenses/License.zlib.txt
Normal file
|
@ -0,0 +1,115 @@
|
|||
ZLIB DATA COMPRESSION LIBRARY
|
||||
|
||||
zlib 1.2.11 is a general purpose data compression library. All the code is
|
||||
thread safe. The data format used by the zlib library is described by RFCs
|
||||
(Request for Comments) 1950 to 1952 in the files
|
||||
http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
|
||||
rfc1952 (gzip format).
|
||||
|
||||
All functions of the compression library are documented in the file zlib.h
|
||||
(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example
|
||||
of the library is given in the file test/example.c which also tests that
|
||||
the library is working correctly. Another example is given in the file
|
||||
test/minigzip.c. The compression library itself is composed of all source
|
||||
files in the root directory.
|
||||
|
||||
To compile all files and run the test program, follow the instructions given at
|
||||
the top of Makefile.in. In short "./configure; make test", and if that goes
|
||||
well, "make install" should work for most flavors of Unix. For Windows, use
|
||||
one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use
|
||||
make_vms.com.
|
||||
|
||||
Questions about zlib should be sent to <zlib@gzip.org>, or to Gilles Vollant
|
||||
<info@winimage.com> for the Windows DLL version. The zlib home page is
|
||||
http://zlib.net/ . Before reporting a problem, please check this site to
|
||||
verify that you have the latest version of zlib; otherwise get the latest
|
||||
version and check whether the problem still exists or not.
|
||||
|
||||
PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help.
|
||||
|
||||
Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
|
||||
issue of Dr. Dobb's Journal; a copy of the article is available at
|
||||
http://marknelson.us/1997/01/01/zlib-engine/ .
|
||||
|
||||
The changes made in version 1.2.11 are documented in the file ChangeLog.
|
||||
|
||||
Unsupported third party contributions are provided in directory contrib/ .
|
||||
|
||||
zlib is available in Java using the java.util.zip package, documented at
|
||||
http://java.sun.com/developer/technicalArticles/Programming/compression/ .
|
||||
|
||||
A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is available
|
||||
at CPAN (Comprehensive Perl Archive Network) sites, including
|
||||
http://search.cpan.org/~pmqs/IO-Compress-Zlib/ .
|
||||
|
||||
A Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is
|
||||
available in Python 1.5 and later versions, see
|
||||
http://docs.python.org/library/zlib.html .
|
||||
|
||||
zlib is built into tcl: http://wiki.tcl.tk/4610 .
|
||||
|
||||
An experimental package to read and write files in .zip format, written on top
|
||||
of zlib by Gilles Vollant <info@winimage.com>, is available in the
|
||||
contrib/minizip directory of zlib.
|
||||
|
||||
|
||||
Notes for some targets:
|
||||
|
||||
- For Windows DLL versions, please see win32/DLL_FAQ.txt
|
||||
|
||||
- For 64-bit Irix, deflate.c must be compiled without any optimization. With
|
||||
-O, one libpng test fails. The test works in 32 bit mode (with the -n32
|
||||
compiler flag). The compiler bug has been reported to SGI.
|
||||
|
||||
- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works
|
||||
when compiled with cc.
|
||||
|
||||
- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is
|
||||
necessary to get gzprintf working correctly. This is done by configure.
|
||||
|
||||
- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with
|
||||
other compilers. Use "make test" to check your compiler.
|
||||
|
||||
- gzdopen is not supported on RISCOS or BEOS.
|
||||
|
||||
- For PalmOs, see http://palmzlib.sourceforge.net/
|
||||
|
||||
|
||||
Acknowledgments:
|
||||
|
||||
The deflate format used by zlib was defined by Phil Katz. The deflate and
|
||||
zlib specifications were written by L. Peter Deutsch. Thanks to all the
|
||||
people who reported problems and suggested various improvements in zlib; they
|
||||
are too numerous to cite here.
|
||||
|
||||
Copyright notice:
|
||||
|
||||
(C) 1995-2017 Jean-loup Gailly and Mark Adler
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
Jean-loup Gailly Mark Adler
|
||||
jloup@gzip.org madler@alumni.caltech.edu
|
||||
|
||||
If you use the zlib library in a product, we would appreciate *not* receiving
|
||||
lengthy legal documents to sign. The sources are provided for free but without
|
||||
warranty of any kind. The library has been entirely written by Jean-loup
|
||||
Gailly and Mark Adler; it does not include third-party code.
|
||||
|
||||
If you redistribute modified sources, we would appreciate that you include in
|
||||
the file ChangeLog history information documenting your changes. Please read
|
||||
the FAQ for more information on the distribution of modified source versions.
|
BIN
libs/libopenmpt/bin/x86/libopenmpt.dll
Normal file
BIN
libs/libopenmpt/bin/x86/libopenmpt.dll
Normal file
Binary file not shown.
BIN
libs/libopenmpt/bin/x86/openmpt-mpg123.dll
Normal file
BIN
libs/libopenmpt/bin/x86/openmpt-mpg123.dll
Normal file
Binary file not shown.
BIN
libs/libopenmpt/bin/x86/openmpt-ogg.dll
Normal file
BIN
libs/libopenmpt/bin/x86/openmpt-ogg.dll
Normal file
Binary file not shown.
BIN
libs/libopenmpt/bin/x86/openmpt-vorbis.dll
Normal file
BIN
libs/libopenmpt/bin/x86/openmpt-vorbis.dll
Normal file
Binary file not shown.
BIN
libs/libopenmpt/bin/x86/openmpt-zlib.dll
Normal file
BIN
libs/libopenmpt/bin/x86/openmpt-zlib.dll
Normal file
Binary file not shown.
BIN
libs/libopenmpt/bin/x86_64/libopenmpt.dll
Normal file
BIN
libs/libopenmpt/bin/x86_64/libopenmpt.dll
Normal file
Binary file not shown.
BIN
libs/libopenmpt/bin/x86_64/openmpt-mpg123.dll
Normal file
BIN
libs/libopenmpt/bin/x86_64/openmpt-mpg123.dll
Normal file
Binary file not shown.
BIN
libs/libopenmpt/bin/x86_64/openmpt-ogg.dll
Normal file
BIN
libs/libopenmpt/bin/x86_64/openmpt-ogg.dll
Normal file
Binary file not shown.
BIN
libs/libopenmpt/bin/x86_64/openmpt-vorbis.dll
Normal file
BIN
libs/libopenmpt/bin/x86_64/openmpt-vorbis.dll
Normal file
Binary file not shown.
BIN
libs/libopenmpt/bin/x86_64/openmpt-zlib.dll
Normal file
BIN
libs/libopenmpt/bin/x86_64/openmpt-zlib.dll
Normal file
Binary file not shown.
743
libs/libopenmpt/changelog.md
Normal file
743
libs/libopenmpt/changelog.md
Normal file
|
@ -0,0 +1,743 @@
|
|||
|
||||
Changelog {#changelog}
|
||||
=========
|
||||
|
||||
For fully detailed change log, please see the source repository directly. This
|
||||
is just a high-level summary.
|
||||
|
||||
### libopenmpt 0.3.11 (2018-07-28)
|
||||
|
||||
* [**Sec**] Crash with some malformed custom tunings in MPTM files (r10615).
|
||||
|
||||
* Channels whose volume envelope was playing at volume 0 while being moved to
|
||||
a NNA background channel were cut off completely since libopenmpt 0.3.8.
|
||||
* AMF (ASYLUM): Convert 7-bit panning to 8-bit panning for playback.
|
||||
|
||||
### libopenmpt 0.3.10 (2018-06-17)
|
||||
|
||||
* [**Bug**] Internal mixer state was not initialized properly when initially
|
||||
rendering in 44100kHz stereo format.
|
||||
* [**Bug**] AMF: Undefined behaviour in loader code could lead to files
|
||||
playing silent.
|
||||
|
||||
* Switching between instruments with portamento did not update the NNA
|
||||
settings for the new instrument.
|
||||
* FAR: Properly import volume commands.
|
||||
|
||||
### libopenmpt 0.3.9 (2018-04-29)
|
||||
|
||||
* [**Sec**] Possible write near address 0 in out-of-memory situations when
|
||||
reading AMS files (r10149).
|
||||
|
||||
* [**Bug**] openmpt123: Fixed build failure in C++17 due to use of removed
|
||||
feature `std::random_shuffle`.
|
||||
|
||||
* STM: Having both Bxx and Cxx commands in a pattern imported the Bxx command
|
||||
incorrectly.
|
||||
* STM: Last character of sample name was missing.
|
||||
* Speed up reading of truncated ULT files.
|
||||
* ULT: Portamento import was sometimes broken.
|
||||
* The resonant filter was sometimes unstable when combining low-volume
|
||||
samples, low cutoff and high mixing rates.
|
||||
|
||||
### libopenmpt 0.3.8 (2018-04-08)
|
||||
|
||||
* [**Sec**] Possible out-of-bounds memory read with IT and MO3 files
|
||||
containing many nested pattern loops (r10028).
|
||||
|
||||
* Keep track of active SFx macro during seeking.
|
||||
* The "note cut" duplicate note action did not volume-ramp the previously
|
||||
playing sample.
|
||||
* A song starting with non-existing patterns could not be played.
|
||||
* DSM: Support restart position and 16-bit samples.
|
||||
* DTM: Import global volume.
|
||||
|
||||
### libopenmpt 0.3.7 (2018-03-11)
|
||||
|
||||
* [**Bug**] libopenmpt did not build with NDK r13b on armeabi due to missing
|
||||
`-latomic`.
|
||||
* [**Bug**] xmp-openmpt: Sample rate and number of output channels were not
|
||||
applied correctly when using per-file settings.
|
||||
|
||||
* [**Change**] foo_openmpt: foo_openmpt is now packaged as a fb2k-component
|
||||
package for easier installation.
|
||||
|
||||
* IT: More accurate song length calculation for pattern loops that have no
|
||||
start command and are following another pattern loop.
|
||||
* IMF: Filter cutoff was upside down and the cutoff range was too small.
|
||||
* MED: Correctly import patterns with less channels than the maximum used
|
||||
amount. Import "STP" note stop command.
|
||||
* DBM: Key Off and Set Envelope Position were imported incorrectly.
|
||||
High sample offset (E7x) is now supported.
|
||||
* DIGI / DBM: Arpeggio should not return to base note at end of row.
|
||||
* Some filter changes through MIDI macros were not applied if the note volume
|
||||
was set to 0 on the same row.
|
||||
|
||||
### libopenmpt 0.3.6 (2018-02-03)
|
||||
|
||||
* [**Sec**] Possible out-of-bounds memory read with malformed STP files.
|
||||
(r9576)
|
||||
|
||||
* [**Bug**] Small memory leak with malformed STP files.
|
||||
|
||||
* STM: Accurate emulation of Scream Tracker 2 tempo mode.
|
||||
* STM: Better support for early format revisions (no such files have been
|
||||
found in the wild, though).
|
||||
* Fine volume slides are now supported when seeking with seek.sync_samples=1
|
||||
enabled.
|
||||
|
||||
### libopenmpt 0.3.5 (2018-01-28)
|
||||
|
||||
* [**New**] Support MOD files from the Inconexia demo by Iguana.
|
||||
* [**Bug**] xmp-openmpt: Saved settings were not applied instantly.
|
||||
|
||||
* XM E60 loop bug was not considered in song length calucation.
|
||||
* Tighten M15 and MOD file rejection heuristics.
|
||||
* J2B: Ignore frequency limits from file header. Fixes Medivo.j2b, broken
|
||||
since libopenmpt-0.2.6401-beta17.
|
||||
* ParamEq plugin center frequency was not limited correctly.
|
||||
* libopenmpt_ext C API was not included in the documentation.
|
||||
|
||||
### libopenmpt 0.3.4 (2017-12-17)
|
||||
|
||||
* IT: Fix broken volume envelopes with negative values as found in breakdwn.it
|
||||
by Elysis.
|
||||
|
||||
### libopenmpt 0.3.3 (2017-11-19)
|
||||
|
||||
* [**New**] foo_openmpt: foo_openmpt now also works on Windows XP.
|
||||
|
||||
* [**Bug**] All VS2015 and VS2017 project files targetting Windows XP did not
|
||||
set compiler option `/Zc:threadSafeInit-` which caused at least the player
|
||||
plugins `in_openmpt` and `xmp-openmpt` to fail to load.
|
||||
|
||||
### libopenmpt 0.3.2 (2017-11-04)
|
||||
|
||||
* [**New**] Autotools `configure` and plain `Makefile` now honor the variable
|
||||
`CXXSTDLIB_PCLIBSPRIVATE` which serves the sole purpose of listing the
|
||||
standard library (or libraries) required for static linking. The contents of
|
||||
this variable will be put in `libopenmpt.pc` `Libs.private` and used for
|
||||
nothing else. See \ref libopenmpt_c_staticlinking .
|
||||
|
||||
* [**Change**] Windows bin and dev release packages now use zip archives
|
||||
instead of 7z archives as it had originally been intended for the 0.3.0
|
||||
release.
|
||||
* [**Change**] openmpt123: The following combinations of options are now
|
||||
deprecated because they made no real sense in the first place:
|
||||
`--render --output`, `--ui --output-type`, `--batch --output-type`
|
||||
|
||||
* [**Bug**] libopenmpt did not build on Android NDK 15c (and possibly
|
||||
other versions between 12b and 15c as well).
|
||||
|
||||
* IT: In Compatible Gxx mode, allow sample changes next to a tone portamento
|
||||
effect if a previous sample has already stopped playing.
|
||||
* MOD: Slides and delayed notes are executed on every repetition of a row with
|
||||
row delay (fixes "ode to protracker").
|
||||
|
||||
### libopenmpt 0.3.1 (2017-09-28)
|
||||
|
||||
* [**Bug**] Windows: libopenmpt resource did not compile for release versions.
|
||||
|
||||
### libopenmpt 0.3.0 (2017-09-27, not released)
|
||||
|
||||
* [**New**] New error handling functionality in the C API, which in particular
|
||||
allows distinguishing potentially transient out-of-memory errors from parse
|
||||
errors during module loading.
|
||||
* [**New**] New API `openmpt::module::get_selected_subsong()` (C++) and
|
||||
`openmpt_module_get_selected_subsong()` (C).
|
||||
* [**New**] Faster file header probing API `openmpt::probe_file_header()` and
|
||||
`openmpt::probe_file_header_get_recommended_size` (C++), and
|
||||
`openmpt_probe_file_header()`,
|
||||
`openmpt_probe_file_header_without_filesize()`,
|
||||
`openmpt_probe_file_header_from_stream()` and
|
||||
`openmpt_probe_file_header_get_recommended_size()` (C).
|
||||
* [**New**] New API `openmpt::could_open_probability()` (C++) and
|
||||
`openmpt_could_open_probability()` (C). This fixes a spelling error in the
|
||||
old 0.2 API.
|
||||
* [**New**] openmpt123: openmpt123 can now open M3U, M3U8, M3UEXT, M3U8EXT and
|
||||
PLSv2 playlists via the `--playlist` option.
|
||||
* [**New**] openmpt123: openmpt123 now supports very fast file header probing
|
||||
via the `--probe` option.
|
||||
* [**New**] Libopenmpt now supports building for Windows 10 Universal (Windows
|
||||
Store 8.2) APIs with MSVC, and also for the older Windows Runtime APIs with
|
||||
MinGW-w64.
|
||||
* [**New**] New API header `libopenmpt_ext.h` which implements the libopenmpt
|
||||
extension APIs also for the C interface.
|
||||
* [**New**] The Reverb effect (S99 in S3M/IT/MPTM, and X99 in XM) is now
|
||||
implemented in libopenmpt.
|
||||
* [**New**] For Amiga modules, a new resampler based on the Amiga's sound
|
||||
characteristics has been added. It can be activated by passing the
|
||||
`render.resampler.emulate_amiga` ctl with a value of `1`. Non-Amiga modules
|
||||
are not affected by this, and setting the ctl overrides the resampler choice
|
||||
specified by `OPENMPT_MODULE_RENDER_INTERPOLATIONFILTER_LENGTH` or
|
||||
`openmpt::module::RENDER_INTERPOLATIONFILTER_LENGTH`. Support for the MOD
|
||||
command E0x (Set LED Filter) is also available when the Amiga resampler is
|
||||
enabled.
|
||||
|
||||
* [**Change**] libopenmpt versioning changed and follows the more conventional
|
||||
major.minor.patch as well as the recommendations of the
|
||||
[SemVer](http://semver.org/) scheme now. In addition to the SemVer
|
||||
requirements, pre-1.0.0 versions will also honor API and ABI stability in
|
||||
libopenmpt (i.e. libopenmpt ignores SemVer Clause 4).
|
||||
* [**Change**] The output directories of the MSVC build system were changed to
|
||||
`bin/vs2015-shared/x86-64-win7/` (and similar) layout which allows building
|
||||
in the same tree with different compiler versions without overwriting other
|
||||
outputs.
|
||||
* [**Change**] The emscripten build now exports libopenmpt as 'libopenmpt'
|
||||
instead of the default 'Module'.
|
||||
* [**Change**] Android: The build system changed. The various Android.mk files
|
||||
have been merged into a single one which can be controlled using command
|
||||
line options.
|
||||
* [**Change**] The `Makefile` build system now passes `std=c++11` to the
|
||||
compiler by default. Older compilers may still work if you pass
|
||||
`STDCXX=c++0x` to the `make` invocation.
|
||||
* [**Change**] The `Makefile` option `ANCIENT=1` is gone.
|
||||
* [**Change**] The optional dependencies on `libltdl` or `libdl` are gone.
|
||||
They are no longer needed for any functionality.
|
||||
|
||||
* [**Regression**] Compiling client code using the C++ API now requires a
|
||||
compiler running in C++11 mode.
|
||||
* [**Regression**] Support for GCC 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7 has been
|
||||
removed.
|
||||
* [**Regression**] Support for Clang 3.0, 3.1, 3.2, 3.3 has been removed.
|
||||
* [**Regression**] Support for Emscripten versions older than 1.31.0 has been
|
||||
removed.
|
||||
* [**Regression**] Support for Android NDK versions older than 11 has been
|
||||
removed.
|
||||
* [**Regression**] Visual Studio 2008, 2010, 2012, 2013 support has been
|
||||
removed.
|
||||
* [**Regression**] Dynamic run-time loading of libmpg123 is no longer
|
||||
supported. Libmpg123 must be linked at link-time now.
|
||||
* [**Regression**] xmp-openmpt: xmp-openmpt now requires XMPlay 3.8 or later
|
||||
and compiling xmp-openmpt requires an appropriate XMPlay SDK with
|
||||
`XMPIN_FACE` >= `4`.
|
||||
* [**Regression**] Support for libmpg123 older than 1.13.0 has been removed.
|
||||
* [**Regression**] Un4seen unmo3 support has been removed.
|
||||
|
||||
* [**Bug**] C++ API: `openmpt::exception` did not define copy and move
|
||||
constructors or copy and move assignment operators in libopenmpt 0.2. The
|
||||
compiler-generated ones were not adequate though. libopenmpt 0.3 adds the
|
||||
appropriate special member functions. This adds the respective symbol names
|
||||
to the exported ABI, which, depending on the compiler, might or might not
|
||||
have been there in libopenmpt 0.2. The possibly resulting possible ODR
|
||||
violation only affects cases that did crash in the libopenmpt 0.2 API anyway
|
||||
due to memory double-free, and does not cause any further problems in
|
||||
practice for all known platforms and compilers.
|
||||
* [**Bug**] The C API could crash instead of failing gracefully in
|
||||
out-of-memory situations.
|
||||
* [**Bug**] The test suite could fail on MacOSX or FreeBSD in non-fatal ways
|
||||
when no locale was active.
|
||||
* [**Bug**] `libopenmpt_stream_callbacks_fd.h` and
|
||||
`libopenmpt_stream_callbacks_file.h` were missing in Windows development
|
||||
packages.
|
||||
* [**Bug**] libopenmpt on Windows did not properly guard against current
|
||||
working directory DLL injection attacks.
|
||||
* [**Bug**] localtime() was used to determine the version of Schism Tracker
|
||||
used to save IT and S3M files. This function is not guaranteed to be
|
||||
thread-safe by the standard and is now no longer used.
|
||||
* [**Bug**] Possible crashes with malformed IT, ITP, AMS, MDL, MED, MPTM, PSM
|
||||
and Startrekker files.
|
||||
* [**Bug**] Possible hangs with malformed DBM, MPTM and PSM files.
|
||||
* [**Bug**] Possible hangs with malformed files containing cyclic plugin
|
||||
routings.
|
||||
* [**Bug**] Excessive loading times with malformed ITP / truncated AMS files.
|
||||
* [**Bug**] Plugins did not work correctly when changing the sample rate
|
||||
between two render calls.
|
||||
* [**Bug**] Possible NULL-pointer dereference read during obscure
|
||||
out-of-memory situations while handling exceptions in the C API.
|
||||
* [**Bug**] libmodplug: `libmodplug.pc` was wrong.
|
||||
* [**Bug**] Cross-compiling libopenmpt with autotools for Windows now properly
|
||||
sets `-municode` and `-mconsole` as well as all required Windows system
|
||||
libraries.
|
||||
* [**Bug**] foo_openmpt: Interpolation filter and volume ramping settings were
|
||||
confused in previous versions. This version resets both to the defaults.
|
||||
* [**Bug**] libmodplug: The CSoundFile::Read function in the emulated
|
||||
libmodplug C++ API returned the wrong value, causing qmmp (and possibly
|
||||
other software) to crash.
|
||||
|
||||
* Support for SoundTracker Pro II (STP) and Digital Tracker (DTM) modules.
|
||||
* Increased accuracy of the sample position and sample rate to drift less when
|
||||
playing very long samples.
|
||||
* Various playback improvements for IT and XM files.
|
||||
* Channel frequency could wrap around after some excessive portamento / down
|
||||
in some formats since libopenmpt 0.2-beta17.
|
||||
* Playback improvements for S3M files made with Impulse Tracker and
|
||||
Schism Tracker.
|
||||
* ParamEq plugin emulation didn't do anything at full gain (+15dB).
|
||||
* All standard DMO effects are now also emulated on non-Windows and non-MSVC
|
||||
systems.
|
||||
* Added `libopenmpt_stream_callbacks_buffer.h` which adds
|
||||
`openmpt_stream_callbacks` support for in-memory buffers, possibly even only
|
||||
using a truncated prefix view into a bigger file which is useful for
|
||||
probing.
|
||||
* Avoid enabling some ProTracker-specific quirks for MOD files most likely
|
||||
created with ScreamTracker 3.
|
||||
* Tremolo effect only had half the intended strength in MOD files.
|
||||
* Pattern loops ending on the last row a pattern were not executed correctly
|
||||
in S3M files.
|
||||
* Work-around for reading MIDI macros and plugin settings in some malformed IT
|
||||
files written by old UNMO3 versions.
|
||||
* Improve tracker detection in IT format.
|
||||
* Playback fixes for 8-channel MED files
|
||||
* Do not set note volume to 0 on out-of-range offset in XM files.
|
||||
* Better import of some slide commands in SFX files.
|
||||
* Sample 15 in "Crew Generation" by Necros requires short loops at the
|
||||
beginning of the sample to not be ignored. Since we need to ignore them in
|
||||
some (non-ProTracker) modules, we heuristically disable the old loop
|
||||
sanitization behaviour based on the module channel count.
|
||||
* Both normal and percentage offset in PLM files were handled as percentage
|
||||
offset.
|
||||
* MT2 files with instruments that had both sample and plugin assignments were
|
||||
not read correctly.
|
||||
* Some valid FAR files were rejected erroneously.
|
||||
* Support for VBlank timing flag and comment field in PT36 files.
|
||||
* Improved accuracy of vibrato command in DIGI / DBM files.
|
||||
* STM: Add support for "WUZAMOD!" magic bytes and allow some slightly
|
||||
malformed STM files to load which were previously rejected.
|
||||
* Detect whether "hidden" patterns in the order list of SoundTracker modules
|
||||
should be taken into account or not.
|
||||
* Tighten heuristics for rejecting invalid 669, M15, MOD and ICE files and
|
||||
loosen them in other places to allow some valid MOD files to load.
|
||||
* Improvements to seeking: Channel panning was not always updated from
|
||||
instruments / samples when seeking, and out-of-range global volume was not
|
||||
applied correctly in some formats.
|
||||
* seek.sync_samples=1 did not apply PTM reverse offset effect and the volume
|
||||
slide part of combined volume slide + vibrato commands.
|
||||
* If the order list was longer than 256 items and there was a pattern break
|
||||
effect without a position jump on the last pattern of the sequence, it did
|
||||
not jump to the correct restart order.
|
||||
* `Makefile` has now explicit support for FreeBSD with no special option or
|
||||
configuration required.
|
||||
* openmpt123: Improved section layout in man page.
|
||||
* libmodplug: Added all missing C++ API symbols that are accessible via the
|
||||
public libmodplug header file.
|
||||
* Autotools build system now has options `--disable-openmpt123`,
|
||||
`--disable-tests` and `--disable-examples` which may be desireable when
|
||||
cross-compiling.
|
||||
* Windows binary packages now ship with libmpg123 included.
|
||||
|
||||
### libopenmpt 0.2-beta20 (2016-08-07)
|
||||
|
||||
* [**Bug**] PSM loader was broken on big-endian platforms since forever.
|
||||
* [**Bug**] `load.skip_samples` ctl did not work for PSM16 modules.
|
||||
|
||||
* There is a new `subsong` ctl, which can return the currently selected
|
||||
subsong.
|
||||
* More accurate ProTracker arpeggio wrap-around emulation.
|
||||
* More accurate sample tuning in PSM16 files.
|
||||
* Samples in DSM files were sometimes detuned and some pattern commands were
|
||||
not imported correctly.
|
||||
* More accurate import of MDL 7-bit panning command.
|
||||
* Only import pattern commands supported by the UltraTracker version that was
|
||||
used to save ULT files. Add support for command 5-C (end loop).
|
||||
* DMF sample loop lengths were off by one.
|
||||
* Unis 669 pan slide effect was too deep.
|
||||
* Several valid (but slightly corrupted possibly due to disk failures or data
|
||||
transfer errors) SoundTracker files were no longer loading since libopenmpt
|
||||
0.2-beta18.
|
||||
|
||||
### libopenmpt 0.2-beta19 (2016-07-23)
|
||||
|
||||
* [**Change**] libopenmpt now uses C++14 `[[deprecated]]` attribute instead
|
||||
of compiler-specific solutions when appropriate.
|
||||
* [**Change**] libopenmpt C++ header now uses C++11 `noexcept` instead of
|
||||
C++98 `throw()` exception specification when supported. `throw()` is
|
||||
deprecated since C++11. This does not change API or ABI as they are
|
||||
equivalent. Use `LIBOPENMPT_ASSUME_CPLUSPLUS_NOEXCEPT` to override the
|
||||
default.
|
||||
* [**Change**] The preprocessor macro `LIBOPENMPT_ANCIENT_COMPILER_STDINT` is
|
||||
gone. Please use `LIBOPENMPT_ASSUME_CPLUSPLUS_CSTDINT instead`.
|
||||
Additionally, the typedefs moved from illegal namespace ::std into somewhat
|
||||
less dangerous namespace ::openmpt::std. You can test
|
||||
`#ifdef LIBOPENMPT_QUIRK_NO_CSTDINT` client-side to check whether
|
||||
`libopenmpt.hpp` used the non-standard types. (Note: Of all supported
|
||||
compilers, this change only affects the 3 compilers with only limited
|
||||
support: MSVC 2008, GCC 4.1, GCC 4.2.)
|
||||
|
||||
* [**Bug**] xmp-openmpt: Crash when viewing sample texts.
|
||||
|
||||
* The public libopenmpt C++ header has auto-detection logic for the used C++
|
||||
standard now. In case your client code compiler misreports the standard
|
||||
version or you want to override it for other reasons,
|
||||
`#define LIBOPENMPT_ASSUME_CPLUSPLUS` to the value of the standard version
|
||||
you desire to be used. There is also a macro for each individual aspect,
|
||||
like `LIBOPENMPT_ASSUME_CPLUSPLUS_CSTDINT`,
|
||||
`LIBOPENMPT_ASSUME_CPLUSPLUS_DEPRECATED`,
|
||||
`LIBOPENMPT_ASSUME_CPLUSPLUS_NOEXCEPT` which take precedence over the
|
||||
general macro.
|
||||
* Portamento with sample swap behaviour was wrong for ProTracker MODs.
|
||||
* Rewritten loader and various playback fixes for MDL files.
|
||||
* libopenmpt 0.2-beta18 broke import of many pattern commands in DBM, DMF and
|
||||
ULT files.
|
||||
* ADPCM samples in MOD files were broken since libopenmpt 0.2-beta17.
|
||||
|
||||
### libopenmpt 0.2-beta18 (2016-07-11)
|
||||
|
||||
* [**Change**] openmpt123: Add PulseAudio output support. Autotools and
|
||||
`Makefile` build systems now depend on `libpulse` and `libpulse-simple` by
|
||||
default. Disable with `--without-pulseaudio` or `NO_PULSEAUDIO=1`
|
||||
respectively. When enabled, PulseAudio will be the default output driver,
|
||||
* [**Change**] xmp-openmpt: Settings are now stored in xmplay.ini like with
|
||||
every other plugin.
|
||||
|
||||
* [**Regression**] openmpt123: Support for FLAC < 1.3.0 has been removed. FLAC
|
||||
before 1.3.0 is broken beyond repair as it provides `assert.h` in the
|
||||
include path.
|
||||
|
||||
* [**Bug**] Generated pkg-config file libopenmpt.pc by both `Makefile` and
|
||||
Autotools build systems was totally broken.
|
||||
* [**Bug**] libopenmpt no longer uses the non-thread-safe global std::rand()
|
||||
function.
|
||||
* [**Bug**] Sample loops in GDM modules did not work when using Emscripten.
|
||||
* [**Bug**] XM and MO3 loaders could crash due to unaligned memory accesses.
|
||||
* [**Bug**] Fixed incorrect handling of custom MPTM tunings on big endian
|
||||
platforms.
|
||||
* [**Bug**] Fixed various problems found with clang 3.8 static analyzer,
|
||||
address sanitizer and undefined behaviour sanitizer.
|
||||
* [**Bug**] File header probing functionality was broken for most formats.
|
||||
* [**Bug**] With non-seekable streams, the entire file was almost always
|
||||
cached even if it was not of any supported module type.
|
||||
|
||||
* Seeking in allsubsongs-mode now works correctly.
|
||||
* openmpt123: Added subsong support.
|
||||
* Various playback fixes for 669, IT, MT2 and MTM files.
|
||||
* Some MOD files with more than 128 patterns (e.g. NIETNU.MOD) were not loaded
|
||||
correctly.
|
||||
* A new example `libopenmpt_example_c_probe` has been added which demonstrates
|
||||
the usage and flexibility of openmpt_could_open_propability() in the C API
|
||||
under various constraints.
|
||||
|
||||
### libopenmpt 0.2-beta17 (2016-05-21)
|
||||
|
||||
* [**Change**] The Makefile and Autotools build systems now require to
|
||||
explicitly specify `NO_LTDL=1` or `--without-ltdl` respectively if no
|
||||
support for dynamic loading of third party libraries via libtool libltdl is
|
||||
desired.
|
||||
* [**Change**] In the Makefile build system option `USE_MO3` and the Autotools
|
||||
build system option `--enable-mo3` are gone. Dynamic loading of un4seen
|
||||
unmo3 is now always enabled when dynamic loading is possible and built-in
|
||||
MO3 support is not possible because either a MP3 or a Vorbis decoder is
|
||||
missing.
|
||||
* [**Change**] The MSVC build system changed. The `libopenmptDLL` project is
|
||||
gone. Use the new `ReleaseShared` configuration of the `libopenmpt` project
|
||||
instead. libopenmpt now links against zlib by default. A separate project
|
||||
with smaller footprint linking against miniz is still available as
|
||||
`libopenmpt-small`.
|
||||
* [**Change**] The constants used to query library information from
|
||||
`openmpt_get_string()` and `openmpt::string::get()` (i.e. OPENMPT_STRING_FOO
|
||||
and openmpt::string::FOO) have been deprecated because having syntactic
|
||||
constants for theses keys makes extending the API in a backwards and
|
||||
forwards compatible way harder than it should be. Please just use the string
|
||||
literals directly.
|
||||
* [**Change**] Deprecated API identifiers will now cause deprecation warnings
|
||||
with MSVC, GCC and clang. `#define LIBOPENMPT_NO_DEPRECATE` to disable the
|
||||
warnings.
|
||||
* [**Change**] openmpt123: `--[no-]shuffle` option has been renamed to
|
||||
`--[no-]randomize`. A new `--[no-]shuffle` option has been added which
|
||||
shuffles randomly through the playlist as opposed to randomizing the
|
||||
playlist upfront.
|
||||
* [**Change**] Support for Un4seen unmo3 has generally been deprecated in
|
||||
favour of the new internal mo3 decoder. Un4seen unmo3 support will be
|
||||
removed on 2018-01-01.
|
||||
|
||||
* [**Bug**] Memory consumption during loading has been reduced by about 1/3 in
|
||||
case a seekable input stream is provided (either via C API callback open
|
||||
functions or via C++ API iostream constructors).
|
||||
* [**Bug**] Some samples in AMS modules were detuned when using Emscripten.
|
||||
* [**Bug**] Possible crash with excessive portamento down in some formats.
|
||||
* [**Bug**] Possible crashes with malformed AMF, AMS, DBM, IT, MDL, MED, MPTM,
|
||||
MT2, PSM and MMCMP-, XPK- and PP20-compressed files.
|
||||
* [**Bug**] `openmpt::module::format_pattern_row_channel` with `width == 0`
|
||||
was returning an empty string instead of an string with unconstrained
|
||||
length.
|
||||
|
||||
* Support for ProTracker 3.6 IFF-style modules and SoundFX / MultiMedia Sound
|
||||
(SFX / MMS) modules.
|
||||
* libopenmpt now has support for DMO plugins on Windows when built with MSVC.
|
||||
Additionally, the DMO Compression, Distortion, Echo, Gargle, ParamEQ and
|
||||
WavesReverb DSPs are emulated on on all other platforms.
|
||||
* libopenmpt now supports the DigiBooster Echo DSP.
|
||||
* To avoid any of the aforementioned plugins to be used, the load.skip_plugins
|
||||
ctl can be passed when loading a module.
|
||||
* libopenmpt got native MO3 support with MP3 decoding either via libmpg123 or
|
||||
MediaFoundation (on Windows 7 and up) and Vorbis decoding via libogg,
|
||||
libvorbis, libvorbisfile or stb_vorbis.
|
||||
* libopenmpt MSVC builds with Visual Studio 2010 or later on Windows 7 or
|
||||
later now use an internal MO3 decoder with libogg, libvorbis, libvorbisfile,
|
||||
and libmpg123 or minimp3 or MediaFoundation suppport by default. Visual
|
||||
Studio 2008 builds still use unmo3.dll by default but also support the
|
||||
built-in decoder in which case libmpg123 is required.
|
||||
* libopenmpt with Makefile or Autotools build system can now also use
|
||||
glibc/libdl instead of libtool/libltdl for dynamic loading of third-party
|
||||
libraries. Options `NO_DL=1` and `--without-dl` have been added
|
||||
respectively.
|
||||
* The `Makefile` build system got 4 new options NO_MPG123, NO_OGG, NO_VORBIS,
|
||||
NO_VORBISFILE. The default is to use the new dependencies automatically.
|
||||
* The `Autotools` build system got 4 new options --without-mpg123,
|
||||
--without-ogg, --without-vorbis, --without-vorbisfile. The default is to use
|
||||
the new dependencies automatically.
|
||||
* Makefile and Android builds got support for using minimp3 instead of
|
||||
libmpg123. For Android, use `Android-minimp3-stbvorbis.mk`, for Makefile use
|
||||
`USE_MINIMP3=1`. You have to download
|
||||
[minimp3](http://keyj.emphy.de/minimp3/) yourself and put its contents into
|
||||
`include/minimp3/`.
|
||||
* `"source_url"`, `"source_date"` and `"build_compiler"` keys have been added
|
||||
to `openmpt_string_get()` and `openmpt::string::get()`.
|
||||
* openmpt123: Add new `--[no-]restart]` option which restarts the playlist
|
||||
when finished.
|
||||
* Improved Ultimate SoundTracker version detection heuristics.
|
||||
* Playing a sample at a sample rate close to the mix rate could lead to small
|
||||
clicks when using vibrato.
|
||||
* More fine-grained internal legacy module compatibility settings to correctly
|
||||
play back modules made with older versions of OpenMPT and a few other
|
||||
trackers.
|
||||
* The tail of compressed MDL samples was slightly off.
|
||||
* Some probably hex-edited XM files (e.g. cybernostra weekend.xm) were not
|
||||
loaded correctly.
|
||||
* Countless other playback fixes for MOD, XM, S3M, IT and MT2 files.
|
||||
|
||||
### libopenmpt 0.2-beta16 (2015-11-22)
|
||||
|
||||
* [**Change**] The Autotools build system does strict checking of all
|
||||
dependencies now. Instead of best effort auto-magic detection of all
|
||||
potentially optional dependencies, the default set of dependencies is now
|
||||
enforced unless each individual dependency gets explicitely disabled via
|
||||
`--without-foo` or `--disable-foo` `./configure` switches. Run
|
||||
`./configure --help` for the full list of options.
|
||||
|
||||
* [**Bug**] Some MOD files were erroneously detected as 669 files.
|
||||
* [**Bug**] Some malformed AMF files could result in very long loading times.
|
||||
* [**Bug**] Fixed crashes in IMF and MT2 loaders.
|
||||
* [**Bug**] MTM files generated by UNMO3 were not loaded properly.
|
||||
|
||||
* Improved MTM playback.
|
||||
* `make CONFIG=haiku` for Haiku has been added.
|
||||
* Language bindings for FreeBASIC have been added (see
|
||||
`libopenmpt/bindings/`).
|
||||
|
||||
### libopenmpt 0.2-beta15 (2015-10-31)
|
||||
|
||||
* [**Change**] openmpt123: SDL2 is now supported and preferred to SDL1 if
|
||||
available with the `Makefile` build system.
|
||||
|
||||
* [**Bug**] Emscripten support for older emscripten versions broke in -beta14.
|
||||
These are now supported again when using `make CONFIG=emscripten-old`.
|
||||
* [**Bug**] Fixed crashes in MED loader.
|
||||
|
||||
* Playback improvements and loader fixes for MOD, MT2 and MED.
|
||||
|
||||
### libopenmpt 0.2-beta14 (2015-09-13)
|
||||
|
||||
* [**Change**] The C++ API example now uses the PortAudio C++ bindings
|
||||
instead of the C API.
|
||||
* [**Change**] Default compiler options for Emscripten have been changed to
|
||||
more closely match the Emscripten recommendations.
|
||||
|
||||
* [**Bug**] Client code compilation with C89 compilers was broken in beta13.
|
||||
* [**Bug**] Test suite failed on certain Emscripten/node.js combinations.
|
||||
* [**Bug**] Fixed various crashes or hangs in DMF, OKT, PLM, IT and MPTM
|
||||
loaders.
|
||||
|
||||
* Implemented error handling in the libopenmpt API examples.
|
||||
* Various playback improvements and fixes for OKT, IT and MOD.
|
||||
|
||||
### libopenmpt 0.2-beta13 (2015-08-16)
|
||||
|
||||
* [**Change**] The MSVC build system has been redone. Solutions are now
|
||||
located in `build/vsVERSION/`.
|
||||
|
||||
* [**Bug**] get_current_channel_vu_left and get_current_channel_vu_right only
|
||||
return the volume of the front left and right channels now.
|
||||
get_current_channel_vu_rear_left and get_current_channel_vu_rear_right
|
||||
do now actually work and return non-zero values.
|
||||
* [**Bug**] Fix crashes and hangs in MED and MDL loaders and with some
|
||||
truncated compressed IT samples.
|
||||
* [**Bug**] Fix crash when playing extremely high-pitched samples.
|
||||
|
||||
* Completed C and C++ documentation
|
||||
* Added new key for openmpt::module::get_metadata, "message_raw", which
|
||||
returns an empty string if there is no song message rather than a list of
|
||||
instrument names.
|
||||
* in_openmpt: Support for compiling with VS2008.
|
||||
* xmp-openmpt: Support for compiling with VS2008.
|
||||
* in_openmpt: Add a more readable file information window.
|
||||
|
||||
### libopenmpt 0.2-beta12 (2015-04-19)
|
||||
|
||||
* Playback fix when row delay effect is used together with offset command.
|
||||
* A couple of fixes for the seek.sync_samples=1 case.
|
||||
* IT compatibility fix for IT note delay.
|
||||
* ProTracker MOD playback compatibility improvement.
|
||||
|
||||
### libopenmpt 0.2-beta11 (2015-04-18)
|
||||
|
||||
* [**Change**] openmpt_stream_seek_func() now gets called with
|
||||
OPENMPT_STREAM_SEEK_SET, OPENMPT_STREAM_SEEK_CUR and
|
||||
OPENMPT_STREAM_SEEK_END whence parameter instead of SEEK_SET, SEEK_CUR and
|
||||
SEEK_END. These are defined to 0, 1 and 2 respectively which corresponds to
|
||||
the definition in all common C libraries. If your C library uses different
|
||||
constants, this theoretically breaks binary compatibility. The old
|
||||
libopenmpt code, however, never actually called the seek function, thus,
|
||||
there will be no problem in practice.
|
||||
* [**Change**] openmpt123: When both SDL1.2 and PortAudio are available,
|
||||
SDL is now the preferred backend because SDL is more widespread and better
|
||||
tested on all kinds of different platforms, and in general, SDL is just
|
||||
more reliable.
|
||||
|
||||
* [**Bug**] libopenmpt now also compiles with GCC 4.3.
|
||||
|
||||
* libopenmpt now supports PLM (Disorder Tracker 2) files.
|
||||
* Various playback improvements and fixes for IT, S3M, XM, MOD, PTM and 669
|
||||
files.
|
||||
|
||||
### libopenmpt 0.2-beta10 (2015-02-17)
|
||||
|
||||
* [**Change**] Makefile configuration filenames changed from
|
||||
`build/make/Makefile.config.*` to `build/make/config-*.mk`.
|
||||
* [**Change**] libopenmpt for Android now supports unmo3 from un4seen. See
|
||||
`build/android_ndk/README.AndroidNDK.txt` for details.
|
||||
|
||||
* [**Bug**] Fix out-of-bounds read in mixer code for ProTracker-compatible
|
||||
MOD files which was introduced back in r4223 / beta6.
|
||||
|
||||
* Vibrato effect was too weak in beta8 and beta9 in IT linear slide mode.
|
||||
* Very small fine portamento was wrong in beta8 and beta9 in IT linear slide
|
||||
mode.
|
||||
* Tiny IT playback compatibility improvements.
|
||||
* STM playback improvements.
|
||||
|
||||
### libopenmpt 0.2-beta9 (2014-12-21)
|
||||
|
||||
* [**Bug**] libopenmpt_ext.hpp was missing from the Windows binary zip files.
|
||||
|
||||
### libopenmpt 0.2-beta8 (2014-12-21)
|
||||
|
||||
* [**Change**] foo_openmpt: Settings are now accessible via foobar2000
|
||||
advanced settings.
|
||||
* [**Change**] Autotools based build now supports libunmo3. Specify
|
||||
--enable-unmo3.
|
||||
* [**Change**] Support for dynamic loading of libunmo3 on MacOS X.
|
||||
* [**Change**] libopenmpt now uses libltld (from libtool) for dynamic loading
|
||||
of libunmo3 on all non-Windows platforms.
|
||||
* [**Change**] Support for older compilers:
|
||||
* GCC 4.1.x to 4.3.x (use `make ANCIENT=1`)
|
||||
* Microsoft Visual Studio 2008 (with latest Service Pack)
|
||||
(see `build/vs2008`)
|
||||
* [**Change**] libopenmpt_ext.hpp is now distributed by default. The API is
|
||||
still considered experimental and not guaranteed to stay API or ABI
|
||||
compatible.
|
||||
* [**Change**] xmp-openmpt / in_openmpt: No more libopenmpt_settings.dll.
|
||||
The settings dialog now uses a statically linked copy of MFC.
|
||||
|
||||
* [**Bug**] The -autotools tarballs were not working at all.
|
||||
|
||||
* Vastly improved MT2 loader.
|
||||
* Improved S3M playback compatibility.
|
||||
* Added openmpt::ext::interactive, an extension which adds a whole bunch of
|
||||
new functionality to change playback in some way or another.
|
||||
* Added possibility to sync sample playback when using
|
||||
openmpt::module::set_position_* by setting the ctl value
|
||||
seek.sync_samples=1
|
||||
* Support for "hidden" subsongs has been added.
|
||||
They are accessible through the same interface as ordinary subsongs, i.e.
|
||||
use openmpt::module::select_subsong to switch between any kind of subsongs.
|
||||
* All subsongs can now be played consecutively by passing -1 as the subsong
|
||||
index in openmpt::module::select_subsong.
|
||||
* Added documentation for a couple of more functions.
|
||||
|
||||
### libopenmpt 0.2-beta7 (2014-09-07)
|
||||
|
||||
* [**Change**] libopenmpt now has an GNU Autotools based build system (in
|
||||
addition to all previously supported ways of building libopenmpt).
|
||||
Autotools support is packaged separately as tarballs ending in
|
||||
`-autotools.tar.gz`.
|
||||
|
||||
* [**Bug**] The distributed windows .zip file did not include pugixml.
|
||||
|
||||
* [**Regression**] openmpt123: Support for writing WavPack (.wv) files has
|
||||
been removed.
|
||||
|
||||
Reasoning:
|
||||
1. WavPack support was incomplete and did not include support for writing
|
||||
WavPack metadata at all.
|
||||
2. openmpt123 already supports libSndFile which can be used to write
|
||||
uncompressed lossless WAV files which can then be encoded to whatever
|
||||
format the user desires with other tools.
|
||||
|
||||
### libopenmpt 0.2-beta6 (2014-09-06)
|
||||
|
||||
* [**Change**] openmpt123: SDL is now also used by default if availble, in
|
||||
addition to PortAudio.
|
||||
* [**Change**] Support for emscripten is no longer experimental.
|
||||
* [**Change**] libopenmpt itself can now also be compiled with VS2008.
|
||||
|
||||
* [**Bug**] Fix all known crashes on platforms that do not support unaligned
|
||||
memory access.
|
||||
* [**Bug**] openmpt123: Effect column was always missing in pattern display.
|
||||
|
||||
### libopenmpt 0.2-beta5 (2014-06-15)
|
||||
|
||||
* [**Change**] Add unmo3 support for non-Windows builds.
|
||||
* [**Change**] Namespace all internal functions in order to allow statically
|
||||
linking against libopenmpt without risking duplicate symbols.
|
||||
* [**Change**] Iconv is now completely optional and only used on Linux
|
||||
systems by default.
|
||||
* [**Change**] Added libopenmpt_example_c_stdout.c, an example without
|
||||
requiring PortAudio.
|
||||
* [**Change**] Add experimental support for building libopenmpt with
|
||||
emscripten.
|
||||
|
||||
* [**Bug**] Fix ping-pong loop behaviour which broke in 0.2-beta3.
|
||||
* [**Bug**] Fix crashes when accessing invalid patterns through libopenmpt
|
||||
API.
|
||||
* [**Bug**] Makefile: Support building with missing optional dependencies
|
||||
without them being stated explicitely.
|
||||
* [**Bug**] openmpt123: Crash when quitting while playback is stopped.
|
||||
* [**Bug**] openmpt123: Crash when writing output to a file in interactive UI
|
||||
mode.
|
||||
* [**Bug**] openmpt123: Wrong FLAC output filename in --render mode.
|
||||
|
||||
* Various smaller playback accuracy improvements.
|
||||
|
||||
### libopenmpt 0.2-beta4 (2014-02-25)
|
||||
|
||||
* [**Bug**] Makefile: Dependency tracking for the test suite did not work.
|
||||
|
||||
### libopenmpt 0.2-beta3 (2014-02-21)
|
||||
|
||||
* [**Change**] The test suite is now built by default with Makefile based
|
||||
builds. Use `TEST=0` to skip building the tests. `make check` runs the test
|
||||
suite.
|
||||
|
||||
* [**Bug**] Crash in MOD and XM loaders on architectures not supporting
|
||||
unaligned memory access.
|
||||
* [**Bug**] MMCMP, PP20 and XPK unpackers should now work on non-x86 hardware
|
||||
and implement proper bounds checking.
|
||||
* [**Bug**] openmpt_module_get_num_samples() returned the wrong value.
|
||||
* [**Bug**] in_openmpt: DSP plugins did not work properly.
|
||||
* [**Bug**] in_openmpt/xmp-openmpt: Setting name for stereo separation was
|
||||
misspelled. This version will revert your stereo separation settings to
|
||||
default.
|
||||
* [**Bug**] Crash when loading some corrupted modules with stereo samples.
|
||||
|
||||
* Support building on Android NDK.
|
||||
* Avoid clicks in sample loops when using interpolation.
|
||||
* IT filters are now done in integer instead of floating point. This improves
|
||||
performance, especially on architectures with no or a slow FPU.
|
||||
* MOD pattern break handling fixes.
|
||||
* Various XM playback improvements.
|
||||
* Improved and switchable dithering when using 16bit integer API.
|
||||
|
||||
### libopenmpt 0.2-beta2 (2014-01-12)
|
||||
|
||||
* [**Bug**] MT2 loader crash.
|
||||
* [**Bug**] Saving settings in in_openmpt and xmp-openmpt did not work.
|
||||
* [**Bug**] Load libopenmpt_settings.dll also from below Plugins directory in
|
||||
Winamp.
|
||||
|
||||
* DBM playback improvements.
|
||||
|
||||
### libopenmpt 0.2-beta1 (2013-12-31)
|
||||
|
||||
* First release.
|
||||
|
1439
libs/libopenmpt/inc/libopenmpt/libopenmpt.h
Normal file
1439
libs/libopenmpt/inc/libopenmpt/libopenmpt.h
Normal file
File diff suppressed because it is too large
Load diff
1008
libs/libopenmpt/inc/libopenmpt/libopenmpt.hpp
Normal file
1008
libs/libopenmpt/inc/libopenmpt/libopenmpt.hpp
Normal file
File diff suppressed because it is too large
Load diff
204
libs/libopenmpt/inc/libopenmpt/libopenmpt_config.h
Normal file
204
libs/libopenmpt/inc/libopenmpt/libopenmpt_config.h
Normal file
|
@ -0,0 +1,204 @@
|
|||
/*
|
||||
* libopenmpt_config.h
|
||||
* -------------------
|
||||
* Purpose: libopenmpt public interface configuration
|
||||
* Notes : (currently none)
|
||||
* Authors: OpenMPT Devs
|
||||
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
||||
*/
|
||||
|
||||
#ifndef LIBOPENMPT_CONFIG_H
|
||||
#define LIBOPENMPT_CONFIG_H
|
||||
|
||||
/*! \defgroup libopenmpt libopenmpt */
|
||||
|
||||
/*! \addtogroup libopenmpt
|
||||
@{
|
||||
*/
|
||||
|
||||
/* provoke warnings if already defined */
|
||||
#define LIBOPENMPT_API
|
||||
#undef LIBOPENMPT_API
|
||||
#define LIBOPENMPT_CXX_API
|
||||
#undef LIBOPENMPT_CXX_API
|
||||
|
||||
/*! \brief Defined if libopenmpt/libopenmpt_stream_callbacks_buffer.h exists. */
|
||||
#define LIBOPENMPT_STREAM_CALLBACKS_BUFFER
|
||||
|
||||
/*! \brief Defined if libopenmpt/libopenmpt_stream_callbacks_fd.h exists.
|
||||
* \since 0.3
|
||||
* \remarks
|
||||
* Use the following to check for availability:
|
||||
* \code
|
||||
* #include <libopenmpt/libopenmpt.h>
|
||||
* #if defined(LIBOPENMPT_STREAM_CALLBACKS_FD) || ((OPENMPT_API_VERSION_MAJOR == 0) && ((OPENMPT_API_VERSION_MINOR == 2) || (OPENMPT_API_VERSION_MINOR == 1)))
|
||||
* #include <libopenmpt/libopenmpt_stream_callbacks_fd.h>
|
||||
* #endif
|
||||
* \endcode
|
||||
*/
|
||||
#define LIBOPENMPT_STREAM_CALLBACKS_FD
|
||||
|
||||
/*! \brief Defined if libopenmpt/libopenmpt_stream_callbacks_file.h exists.
|
||||
* \since 0.3
|
||||
* \remarks
|
||||
* Use the following to check for availability:
|
||||
* \code
|
||||
* #include <libopenmpt/libopenmpt.h>
|
||||
* #if defined(LIBOPENMPT_STREAM_CALLBACKS_FILE) || ((OPENMPT_API_VERSION_MAJOR == 0) && ((OPENMPT_API_VERSION_MINOR == 2) || (OPENMPT_API_VERSION_MINOR == 1)))
|
||||
* #include <libopenmpt/libopenmpt_stream_callbacks_file.h>
|
||||
* #endif
|
||||
* \endcode
|
||||
*/
|
||||
#define LIBOPENMPT_STREAM_CALLBACKS_FILE
|
||||
|
||||
#if defined(__DOXYGEN__)
|
||||
|
||||
#define LIBOPENMPT_API_HELPER_EXPORT
|
||||
#define LIBOPENMPT_API_HELPER_IMPORT
|
||||
#define LIBOPENMPT_API_HELPER_PUBLIC
|
||||
#define LIBOPENMPT_API_HELPER_LOCAL
|
||||
|
||||
#elif defined(_MSC_VER)
|
||||
|
||||
#define LIBOPENMPT_API_HELPER_EXPORT __declspec(dllexport)
|
||||
#define LIBOPENMPT_API_HELPER_IMPORT __declspec(dllimport)
|
||||
#define LIBOPENMPT_API_HELPER_PUBLIC
|
||||
#define LIBOPENMPT_API_HELPER_LOCAL
|
||||
|
||||
#elif defined(__EMSCRIPTEN__)
|
||||
|
||||
#define LIBOPENMPT_API_HELPER_EXPORT __attribute__((visibility("default"))) __attribute__((used))
|
||||
#define LIBOPENMPT_API_HELPER_IMPORT __attribute__((visibility("default"))) __attribute__((used))
|
||||
#define LIBOPENMPT_API_HELPER_PUBLIC __attribute__((visibility("default"))) __attribute__((used))
|
||||
#define LIBOPENMPT_API_HELPER_LOCAL __attribute__((visibility("hidden")))
|
||||
|
||||
#elif (defined(__GNUC__) || defined(__clang__)) && defined(_WIN32)
|
||||
|
||||
#define LIBOPENMPT_API_HELPER_EXPORT __declspec(dllexport)
|
||||
#define LIBOPENMPT_API_HELPER_IMPORT __declspec(dllimport)
|
||||
#define LIBOPENMPT_API_HELPER_PUBLIC __attribute__((visibility("default")))
|
||||
#define LIBOPENMPT_API_HELPER_LOCAL __attribute__((visibility("hidden")))
|
||||
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
|
||||
#define LIBOPENMPT_API_HELPER_EXPORT __attribute__((visibility("default")))
|
||||
#define LIBOPENMPT_API_HELPER_IMPORT __attribute__((visibility("default")))
|
||||
#define LIBOPENMPT_API_HELPER_PUBLIC __attribute__((visibility("default")))
|
||||
#define LIBOPENMPT_API_HELPER_LOCAL __attribute__((visibility("hidden")))
|
||||
|
||||
#elif defined(_WIN32)
|
||||
|
||||
#define LIBOPENMPT_API_HELPER_EXPORT __declspec(dllexport)
|
||||
#define LIBOPENMPT_API_HELPER_IMPORT __declspec(dllimport)
|
||||
#define LIBOPENMPT_API_HELPER_PUBLIC
|
||||
#define LIBOPENMPT_API_HELPER_LOCAL
|
||||
|
||||
#else
|
||||
|
||||
#define LIBOPENMPT_API_HELPER_EXPORT
|
||||
#define LIBOPENMPT_API_HELPER_IMPORT
|
||||
#define LIBOPENMPT_API_HELPER_PUBLIC
|
||||
#define LIBOPENMPT_API_HELPER_LOCAL
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(LIBOPENMPT_BUILD_DLL)
|
||||
#define LIBOPENMPT_API LIBOPENMPT_API_HELPER_EXPORT
|
||||
#elif defined(LIBOPENMPT_USE_DLL)
|
||||
#define LIBOPENMPT_API LIBOPENMPT_API_HELPER_IMPORT
|
||||
#else
|
||||
#define LIBOPENMPT_API LIBOPENMPT_API_HELPER_PUBLIC
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
#define LIBOPENMPT_CXX_API LIBOPENMPT_API
|
||||
|
||||
#if defined(LIBOPENMPT_USE_DLL)
|
||||
#if defined(_MSC_VER) && !defined(_DLL)
|
||||
#error "C++ interface is disabled if libopenmpt is built as a DLL and the runtime is statically linked. This is not supported by microsoft and cannot possibly work. Ever."
|
||||
#undef LIBOPENMPT_CXX_API
|
||||
#define LIBOPENMPT_CXX_API LIBOPENMPT_API_HELPER_LOCAL
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
|
||||
/* Only the C API is supported for emscripten. Disable the C++ API. */
|
||||
#undef LIBOPENMPT_CXX_API
|
||||
#define LIBOPENMPT_CXX_API LIBOPENMPT_API_HELPER_LOCAL
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*!
|
||||
@}
|
||||
*/
|
||||
|
||||
|
||||
/* C */
|
||||
|
||||
#if !defined(LIBOPENMPT_NO_DEPRECATE)
|
||||
#if defined(__clang__)
|
||||
#define LIBOPENMPT_DEPRECATED __attribute__((deprecated))
|
||||
#elif defined(__GNUC__)
|
||||
#define LIBOPENMPT_DEPRECATED __attribute__((deprecated))
|
||||
#elif defined(_MSC_VER)
|
||||
#define LIBOPENMPT_DEPRECATED __declspec(deprecated)
|
||||
#else
|
||||
#define LIBOPENMPT_DEPRECATED
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef __cplusplus
|
||||
#if !defined(LIBOPENMPT_NO_DEPRECATE)
|
||||
LIBOPENMPT_DEPRECATED static const int LIBOPENMPT_DEPRECATED_STRING_CONSTANT = 0;
|
||||
#define LIBOPENMPT_DEPRECATED_STRING( str ) ( LIBOPENMPT_DEPRECATED_STRING_CONSTANT ? ( str ) : ( str ) )
|
||||
#else
|
||||
#define LIBOPENMPT_DEPRECATED_STRING( str ) str
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
/* C++ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
#ifndef LIBOPENMPT_ASSUME_CPLUSPLUS_DEPRECATED
|
||||
/* handle known broken compilers here by defining LIBOPENMPT_ASSUME_CPLUSPLUS_DEPRECATED appropriately */
|
||||
#endif
|
||||
|
||||
#if defined(LIBOPENMPT_ASSUME_CPLUSPLUS)
|
||||
#ifndef LIBOPENMPT_ASSUME_CPLUSPLUS_DEPRECATED
|
||||
#define LIBOPENMPT_ASSUME_CPLUSPLUS_DEPRECATED LIBOPENMPT_ASSUME_CPLUSPLUS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(LIBOPENMPT_NO_DEPRECATE)
|
||||
#if defined(LIBOPENMPT_ASSUME_CPLUSPLUS_DEPRECATED)
|
||||
#if (LIBOPENMPT_ASSUME_CPLUSPLUS_DEPRECATED >= 201402L)
|
||||
#define LIBOPENMPT_ATTR_DEPRECATED [[deprecated]]
|
||||
#undef LIBOPENMPT_DEPRECATED
|
||||
#define LIBOPENMPT_DEPRECATED
|
||||
#else
|
||||
#define LIBOPENMPT_ATTR_DEPRECATED
|
||||
#endif
|
||||
#elif (__cplusplus >= 201402L)
|
||||
#define LIBOPENMPT_ATTR_DEPRECATED [[deprecated]]
|
||||
#undef LIBOPENMPT_DEPRECATED
|
||||
#define LIBOPENMPT_DEPRECATED
|
||||
#else
|
||||
#define LIBOPENMPT_ATTR_DEPRECATED
|
||||
#endif
|
||||
#else
|
||||
#undef LIBOPENMPT_DEPRECATED
|
||||
#define LIBOPENMPT_DEPRECATED
|
||||
#define LIBOPENMPT_ATTR_DEPRECATED
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#include "libopenmpt_version.h"
|
||||
|
||||
#endif /* LIBOPENMPT_CONFIG_H */
|
318
libs/libopenmpt/inc/libopenmpt/libopenmpt_ext.h
Normal file
318
libs/libopenmpt/inc/libopenmpt/libopenmpt_ext.h
Normal file
|
@ -0,0 +1,318 @@
|
|||
/*
|
||||
* libopenmpt_ext.h
|
||||
* ----------------
|
||||
* Purpose: libopenmpt public c interface for libopenmpt extensions
|
||||
* Notes :
|
||||
* Authors: OpenMPT Devs
|
||||
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
||||
*/
|
||||
|
||||
#ifndef LIBOPENMPT_EXT_H
|
||||
#define LIBOPENMPT_EXT_H
|
||||
|
||||
#include "libopenmpt_config.h"
|
||||
#include "libopenmpt.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* \page libopenmpt_ext_c_overview libopenmpt_ext C API
|
||||
*
|
||||
* libopenmpt_ext is included in all builds by default.
|
||||
*
|
||||
* \section libopenmpt-ext-c-detailed Detailed documentation
|
||||
*
|
||||
* \ref libopenmpt_ext_c
|
||||
*
|
||||
*/
|
||||
|
||||
/*! \defgroup libopenmpt_ext_c libopenmpt_ext C */
|
||||
|
||||
/*! \addtogroup libopenmpt_ext_c
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*! \brief Opaque type representing a libopenmpt extension module
|
||||
*/
|
||||
typedef struct openmpt_module_ext openmpt_module_ext;
|
||||
|
||||
/*! \brief Construct an openmpt_module_ext
|
||||
*
|
||||
* \param stream_callbacks Input stream callback operations.
|
||||
* \param stream Input stream to load the module from.
|
||||
* \param logfunc Logging function where warning and errors are written. The logging function may be called throughout the lifetime of openmpt_module_ext. May be NULL.
|
||||
* \param loguser User-defined data associated with this module. This value will be passed to the logging callback function (logfunc)
|
||||
* \param errfunc Error function to define error behaviour. May be NULL.
|
||||
* \param erruser Error function user context. Used to pass any user-defined data associated with this module to the logging function.
|
||||
* \param error Pointer to an integer where an error may get stored. May be NULL.
|
||||
* \param error_message Pointer to a string pointer where an error message may get stored. May be NULL.
|
||||
* \param ctls A map of initial ctl values, see openmpt_module_get_ctls.
|
||||
* \return A pointer to the constructed openmpt_module_ext, or NULL on failure.
|
||||
* \remarks The input data can be discarded after an openmpt_module_ext has been constructed successfully.
|
||||
* \sa openmpt_stream_callbacks
|
||||
* \sa \ref libopenmpt_c_fileio
|
||||
* \since 0.3.0
|
||||
*/
|
||||
LIBOPENMPT_API openmpt_module_ext * openmpt_module_ext_create( openmpt_stream_callbacks stream_callbacks, void * stream, openmpt_log_func logfunc, void * loguser, openmpt_error_func errfunc, void * erruser, int * error, const char * * error_message, const openmpt_module_initial_ctl * ctls );
|
||||
|
||||
/*! \brief Construct an openmpt_module_ext
|
||||
*
|
||||
* \param filedata Data to load the module from.
|
||||
* \param filesize Amount of data available.
|
||||
* \param logfunc Logging function where warning and errors are written. The logging function may be called throughout the lifetime of openmpt_module_ext.
|
||||
* \param loguser User-defined data associated with this module. This value will be passed to the logging callback function (logfunc)
|
||||
* \param errfunc Error function to define error behaviour. May be NULL.
|
||||
* \param erruser Error function user context. Used to pass any user-defined data associated with this module to the logging function.
|
||||
* \param error Pointer to an integer where an error may get stored. May be NULL.
|
||||
* \param error_message Pointer to a string pointer where an error message may get stored. May be NULL.
|
||||
* \param ctls A map of initial ctl values, see openmpt_module_get_ctls.
|
||||
* \return A pointer to the constructed openmpt_module_ext, or NULL on failure.
|
||||
* \remarks The input data can be discarded after an openmpt_module_ext has been constructed successfully.
|
||||
* \sa \ref libopenmpt_c_fileio
|
||||
* \since 0.3.0
|
||||
*/
|
||||
LIBOPENMPT_API openmpt_module_ext * openmpt_module_ext_create_from_memory( const void * filedata, size_t filesize, openmpt_log_func logfunc, void * loguser, openmpt_error_func errfunc, void * erruser, int * error, const char * * error_message, const openmpt_module_initial_ctl * ctls );
|
||||
|
||||
/*! \brief Unload a previously created openmpt_module_ext from memory.
|
||||
*
|
||||
* \param mod_ext The module to unload.
|
||||
*/
|
||||
LIBOPENMPT_API void openmpt_module_ext_destroy( openmpt_module_ext * mod_ext );
|
||||
|
||||
/*! \brief Retrieve the openmpt_module handle from an openmpt_module_ext handle.
|
||||
*
|
||||
* \param mod_ext The extension module handle to convert
|
||||
* \return An equivalent openmpt_module handle to pass to standard libopenmpt functions
|
||||
* \since 0.3.0
|
||||
*/
|
||||
LIBOPENMPT_API openmpt_module * openmpt_module_ext_get_module( openmpt_module_ext * mod_ext );
|
||||
|
||||
/*! Retrieve a libopenmpt extension.
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param interface_id The name of the extension interface to retrieve (e.g. LIBOPENMPT_EXT_C_INTERFACE_PATTERN_VIS).
|
||||
* \param interface Appropriate structure of interface function pointers which is to be filled by this function (e.g. a pointer to a openmpt_module_ext_interface_pattern_vis structure).
|
||||
* \param interface_size Size of the interface's structure of function pointers (e.g. sizeof(openmpt_module_ext_interface_pattern_vis)).
|
||||
* \return 1 on success, 0 if the interface was not found.
|
||||
* \since 0.3.0
|
||||
*/
|
||||
LIBOPENMPT_API int openmpt_module_ext_get_interface( openmpt_module_ext * mod_ext, const char * interface_id, void * interface, size_t interface_size );
|
||||
|
||||
|
||||
|
||||
#ifndef LIBOPENMPT_EXT_C_INTERFACE_PATTERN_VIS
|
||||
#define LIBOPENMPT_EXT_C_INTERFACE_PATTERN_VIS "pattern_vis"
|
||||
#endif
|
||||
|
||||
/*! Pattern command type */
|
||||
#define OPENMPT_MODULE_EXT_INTERFACE_PATTERN_VIS_EFFECT_TYPE_UNKNOWN 0
|
||||
#define OPENMPT_MODULE_EXT_INTERFACE_PATTERN_VIS_EFFECT_TYPE_GENERAL 1
|
||||
#define OPENMPT_MODULE_EXT_INTERFACE_PATTERN_VIS_EFFECT_TYPE_GLOBAL 2
|
||||
#define OPENMPT_MODULE_EXT_INTERFACE_PATTERN_VIS_EFFECT_TYPE_VOLUME 3
|
||||
#define OPENMPT_MODULE_EXT_INTERFACE_PATTERN_VIS_EFFECT_TYPE_PANNING 4
|
||||
#define OPENMPT_MODULE_EXT_INTERFACE_PATTERN_VIS_EFFECT_TYPE_PITCH 5
|
||||
|
||||
typedef struct openmpt_module_ext_interface_pattern_vis {
|
||||
/*! Get pattern command type for pattern highlighting
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param pattern The pattern whose data should be retrieved.
|
||||
* \param row The row from which the data should be retrieved.
|
||||
* \param channel The channel from which the data should be retrieved.
|
||||
* \return The command type in the effect column at the given pattern position (see OPENMPT_MODULE_EXT_INTERFACE_PATTERN_VIS_EFFECT_TYPE_*)
|
||||
* \sa openmpt_module_ext_interface_pattern_vis::get_pattern_row_channel_volume_effect_type
|
||||
*/
|
||||
int ( * get_pattern_row_channel_volume_effect_type ) ( openmpt_module_ext * mod_ext, int32_t pattern, int32_t row, int32_t channel );
|
||||
|
||||
/*! Get pattern command type for pattern highlighting
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param pattern The pattern whose data should be retrieved.
|
||||
* \param row The row from which the data should be retrieved.
|
||||
* \param channel The channel from which the data should be retrieved.
|
||||
* \return The command type in the effect column at the given pattern position (see OPENMPT_MODULE_EXT_INTERFACE_PATTERN_VIS_EFFECT_TYPE_*)
|
||||
* \sa openmpt_module_ext_interface_pattern_vis::get_pattern_row_channel_volume_effect_type
|
||||
*/
|
||||
int ( * get_pattern_row_channel_effect_type ) ( openmpt_module_ext * mod_ext, int32_t pattern, int32_t row, int32_t channel );
|
||||
} openmpt_module_ext_interface_pattern_vis;
|
||||
|
||||
|
||||
|
||||
#ifndef LIBOPENMPT_EXT_C_INTERFACE_INTERACTIVE
|
||||
#define LIBOPENMPT_EXT_C_INTERFACE_INTERACTIVE "interactive"
|
||||
#endif
|
||||
|
||||
typedef struct openmpt_module_ext_interface_interactive {
|
||||
/*! Set the current ticks per row (speed)
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param speed The new tick count in range [1, 65535].
|
||||
* \return 1 on success, 0 on failure.
|
||||
* \remarks The tick count may be reset by pattern commands at any time.
|
||||
* \sa openmpt_module_get_current_speed
|
||||
*/
|
||||
int ( * set_current_speed ) ( openmpt_module_ext * mod_ext, int32_t speed );
|
||||
|
||||
/*! Set the current module tempo
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param tempo The new tempo in range [32, 512]. The exact meaning of the value depends on the tempo mode used by the module.
|
||||
* \return 1 on success, 0 on failure.
|
||||
* \remarks The tempo may be reset by pattern commands at any time. Use openmpt_module_ext_interface_interactive::set_tempo_factor to apply a tempo factor that is independent of pattern commands.
|
||||
* \sa openmpt_module_get_current_tempo
|
||||
*/
|
||||
int ( * set_current_tempo ) ( openmpt_module_ext * mod_ext, int32_t tempo );
|
||||
|
||||
/*! Set the current module tempo factor without affecting playback pitch
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param factor The new tempo factor in range ]0.0, 4.0] - 1.0 means unmodified tempo.
|
||||
* \return 1 on success, 0 on failure.
|
||||
* \remarks Modifying the tempo without applying the same pitch factor using openmpt_module_ext_interface_interactive::set_pitch_factor may cause rhythmic samples (e.g. drum loops) to go out of sync.
|
||||
* \sa openmpt_module_ext_interface_interactive::get_tempo_factor
|
||||
*/
|
||||
int ( * set_tempo_factor ) ( openmpt_module_ext * mod_ext, double factor );
|
||||
|
||||
/*! Gets the current module tempo factor
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \return The current tempo factor.
|
||||
* \sa openmpt_module_ext_interface_interactive::set_tempo_factor
|
||||
*/
|
||||
double ( * get_tempo_factor ) ( openmpt_module_ext * mod_ext );
|
||||
|
||||
/*! Set the current module pitch factor without affecting playback speed
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param factor The new pitch factor in range ]0.0, 4.0] - 1.0 means unmodified pitch.
|
||||
* \return 1 on success, 0 on failure.
|
||||
* \remarks Modifying the pitch without applying the the same tempo factor using openmpt_module_ext_interface_interactive::set_tempo_factor may cause rhythmic samples (e.g. drum loops) to go out of sync.
|
||||
* \remarks To shift the pich by `n` semitones, the parameter can be calculated as follows: `pow( 2.0, n / 12.0 )`
|
||||
* \sa openmpt_module_ext_interface_interactive::get_pitch_factor
|
||||
*/
|
||||
int ( * set_pitch_factor ) ( openmpt_module_ext * mod_ext, double factor );
|
||||
|
||||
/*! Gets the current module pitch factor
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \return The current pitch factor.
|
||||
* \sa openmpt_module_ext_interface_interactive::set_pitch_factor
|
||||
*/
|
||||
double ( * get_pitch_factor ) ( openmpt_module_ext * mod_ext );
|
||||
|
||||
/*! Set the current global volume
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param volume The new global volume in range [0.0, 1.0]
|
||||
* \return 1 on success, 0 on failure.
|
||||
* \remarks The global volume may be reset by pattern commands at any time. Use openmpt_module_set_render_param to apply a global overall volume factor that is independent of pattern commands.
|
||||
* \sa openmpt_module_ext_interface_interactive::get_global_volume
|
||||
*/
|
||||
int ( * set_global_volume ) ( openmpt_module_ext * mod_ext, double volume );
|
||||
|
||||
/*! Get the current global volume
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \return The current global volume in range [0.0, 1.0]
|
||||
* \sa openmpt_module_ext_interface_interactive::set_global_volume
|
||||
*/
|
||||
double ( * get_global_volume ) ( openmpt_module_ext * mod_ext );
|
||||
|
||||
/*! Set the current channel volume for a channel
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param channel The channel whose volume should be set, in range [0, openmpt_module_get_num_channels()[
|
||||
* \param volume The new channel volume in range [0.0, 1.0]
|
||||
* \return 1 on success, 0 on failure (channel out of range).
|
||||
* \remarks The channel volume may be reset by pattern commands at any time.
|
||||
* \sa openmpt_module_ext_interface_interactive::get_channel_volume
|
||||
*/
|
||||
int ( * set_channel_volume ) ( openmpt_module_ext * mod_ext, int32_t channel, double volume );
|
||||
|
||||
/*! Get the current channel volume for a channel
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param channel The channel whose volume should be retrieved, in range [0, openmpt_module_get_num_channels()[
|
||||
* \return The current channel volume in range [0.0, 1.0]
|
||||
* \sa openmpt_module_ext_interface_interactive::set_channel_volume
|
||||
*/
|
||||
double ( * get_channel_volume ) ( openmpt_module_ext * mod_ext, int32_t channel );
|
||||
|
||||
/*! Set the current mute status for a channel
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param channel The channel whose mute status should be set, in range [0, openmpt_module_get_num_channels()[
|
||||
* \param mute The new mute status. true is muted, false is unmuted.
|
||||
* \return 1 on success, 0 on failure (channel out of range).
|
||||
* \sa openmpt_module_ext_interface_interactive::get_channel_mute_status
|
||||
*/
|
||||
int ( * set_channel_mute_status ) ( openmpt_module_ext * mod_ext, int32_t channel, int mute );
|
||||
|
||||
/*! Get the current mute status for a channel
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param channel The channel whose mute status should be retrieved, in range [0, openmpt_module_get_num_channels()[
|
||||
* \return The current channel mute status. 1 is muted, 0 is unmuted, -1 means the instrument was out of range
|
||||
* \sa openmpt_module_ext_interface_interactive::set_channel_mute_status
|
||||
*/
|
||||
int ( * get_channel_mute_status ) ( openmpt_module_ext * mod_ext, int32_t channel );
|
||||
|
||||
/*! Set the current mute status for an instrument
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param instrument The instrument whose mute status should be set, in range [0, openmpt_module_get_num_instruments()[ if openmpt_module_get_num_instruments is not 0, otherwise in [0, openmpt_module_get_num_samples()[
|
||||
* \param mute The new mute status. true is muted, false is unmuted.
|
||||
* \return 1 on success, 0 on failure (instrument out of range).
|
||||
* \sa openmpt_module_ext_interface_interactive::get_instrument_mute_status
|
||||
*/
|
||||
int ( * set_instrument_mute_status ) ( openmpt_module_ext * mod_ext, int32_t instrument, int mute );
|
||||
|
||||
/*! Get the current mute status for an instrument
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param instrument The instrument whose mute status should be retrieved, in range [0, openmpt_module_get_num_instruments()[ if openmpt_module_get_num_instruments is not 0, otherwise in [0, openmpt_module_get_num_samples()[
|
||||
* \return The current instrument mute status. 1 is muted, 0 is unmuted, -1 means the instrument was out of range
|
||||
* \sa openmpt_module_ext_interface_interactive::set_instrument_mute_status
|
||||
*/
|
||||
int ( * get_instrument_mute_status ) ( openmpt_module_ext * mod_ext, int32_t instrument );
|
||||
|
||||
/*! Play a note using the specified instrument
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param instrument The instrument that should be played, in range [0, openmpt_module_get_num_instruments()[ if openmpt_module_get_num_instruments is not 0, otherwise in [0, openmpt_module_get_num_samples()[
|
||||
* \param note The note to play, in rage [0, 119]. 60 is the middle C.
|
||||
* \param volume The volume at which the note should be triggered, in range [0.0, 1.0]
|
||||
* \param panning The panning position at which the note should be triggered, in range [-1.0, 1.0], 0.0 is center.
|
||||
* \return The channel on which the note is played. This can pe be passed to openmpt_module_ext_interface_interactive::stop_note to stop the note. -1 means that no channel could be allocated and the note is not played.
|
||||
* \sa openmpt_module_ext_interface_interactive::stop_note
|
||||
*/
|
||||
int32_t ( * play_note ) ( openmpt_module_ext * mod_ext, int32_t instrument, int32_t note, double volume, double panning );
|
||||
|
||||
/*! Stop the note playing on the specified channel
|
||||
*
|
||||
* \param mod_ext The module handle to work on.
|
||||
* \param channel The channel on which the note should be stopped.
|
||||
* \return 1 on success, 0 on failure (channel out of range).
|
||||
* \sa openmpt_module_ext_interface_interactive::play_note
|
||||
*/
|
||||
int ( * stop_note ) ( openmpt_module_ext * mod_ext, int32_t channel );
|
||||
} openmpt_module_ext_interface_interactive;
|
||||
|
||||
|
||||
|
||||
/* add stuff here */
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif /* LIBOPENMPT_EXT_H */
|
||||
|
306
libs/libopenmpt/inc/libopenmpt/libopenmpt_ext.hpp
Normal file
306
libs/libopenmpt/inc/libopenmpt/libopenmpt_ext.hpp
Normal file
|
@ -0,0 +1,306 @@
|
|||
/*
|
||||
* libopenmpt_ext.hpp
|
||||
* ------------------
|
||||
* Purpose: libopenmpt public c++ interface for libopenmpt extensions
|
||||
* Notes :
|
||||
* Authors: OpenMPT Devs
|
||||
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
||||
*/
|
||||
|
||||
#ifndef LIBOPENMPT_EXT_HPP
|
||||
#define LIBOPENMPT_EXT_HPP
|
||||
|
||||
#include "libopenmpt_config.h"
|
||||
#include "libopenmpt.hpp"
|
||||
|
||||
/*!
|
||||
* \page libopenmpt_ext_cpp_overview libopenmpt_ext C++ API
|
||||
*
|
||||
* libopenmpt_ext is now included in all builds by default.
|
||||
*
|
||||
* \section libopenmpt-ext-cpp-detailed Detailed documentation
|
||||
*
|
||||
* \ref libopenmpt_ext_cpp
|
||||
*
|
||||
*/
|
||||
|
||||
/*! \defgroup libopenmpt_ext_cpp libopenmpt_ext C++ */
|
||||
|
||||
/*! \addtogroup libopenmpt_ext_cpp
|
||||
@{
|
||||
*/
|
||||
|
||||
namespace openmpt {
|
||||
|
||||
class module_ext_impl;
|
||||
|
||||
class LIBOPENMPT_CXX_API module_ext : public module {
|
||||
|
||||
private:
|
||||
module_ext_impl * ext_impl;
|
||||
private:
|
||||
// non-copyable
|
||||
module_ext( const module_ext & );
|
||||
void operator = ( const module_ext & );
|
||||
public:
|
||||
module_ext( std::istream & stream, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() );
|
||||
module_ext( const std::vector<char> & data, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() );
|
||||
module_ext( const char * data, std::size_t size, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() );
|
||||
module_ext( const void * data, std::size_t size, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() );
|
||||
virtual ~module_ext();
|
||||
|
||||
public:
|
||||
|
||||
//! Retrieve a libopenmpt extension.
|
||||
/*! Example: Retrieving the interactive extension to change the tempo of a module:
|
||||
\code{.cpp}
|
||||
openmpt::module_ext *mod = new openmpt::module_ext( stream );
|
||||
#ifdef LIBOPENMPT_EXT_INTERFACE_INTERACTIVE
|
||||
openmpt::ext::interactive *interactive = static_cast<openmpt::ext::interactive *>( self->mod->get_interface( openmpt::ext::interactive_id ) );
|
||||
if ( interactive ) {
|
||||
interactive->set_tempo_factor( 2.0 ); // play module at double speed
|
||||
} else {
|
||||
// interface not available
|
||||
}
|
||||
#else
|
||||
// interfae not available
|
||||
#endif
|
||||
\endcode
|
||||
\param interface_id The name of the extension interface to retrieve.
|
||||
\return The interface object. This may be a nullptr if the extension was not found.
|
||||
*/
|
||||
void * get_interface( const std::string & interface_id );
|
||||
|
||||
}; // class module_ext
|
||||
|
||||
namespace ext {
|
||||
|
||||
#define LIBOPENMPT_DECLARE_EXT_CXX_INTERFACE(name) \
|
||||
static const char name ## _id [] = # name ; \
|
||||
class name; \
|
||||
/**/
|
||||
|
||||
#define LIBOPENMPT_EXT_CXX_INTERFACE(name) \
|
||||
protected: \
|
||||
name () {} \
|
||||
virtual ~ name () {} \
|
||||
public: \
|
||||
/**/
|
||||
|
||||
|
||||
#ifndef LIBOPENMPT_EXT_INTERFACE_PATTERN_VIS
|
||||
#define LIBOPENMPT_EXT_INTERFACE_PATTERN_VIS
|
||||
#endif
|
||||
|
||||
LIBOPENMPT_DECLARE_EXT_CXX_INTERFACE(pattern_vis)
|
||||
|
||||
class pattern_vis {
|
||||
|
||||
LIBOPENMPT_EXT_CXX_INTERFACE(pattern_vis)
|
||||
|
||||
//! Pattern command type
|
||||
enum effect_type {
|
||||
|
||||
effect_unknown = 0,
|
||||
effect_general = 1,
|
||||
effect_global = 2,
|
||||
effect_volume = 3,
|
||||
effect_panning = 4,
|
||||
effect_pitch = 5
|
||||
|
||||
}; // enum effect_type
|
||||
|
||||
//! Get pattern command type for pattern highlighting
|
||||
/*!
|
||||
\param pattern The pattern whose data should be retrieved.
|
||||
\param row The row from which the data should be retrieved.
|
||||
\param channel The channel from which the data should be retrieved.
|
||||
\return The command type in the effect column at the given pattern position (see openmpt::ext::pattern_vis::effect_type)
|
||||
\sa openmpt::ext::pattern_vis::get_pattern_row_channel_effect_type
|
||||
*/
|
||||
virtual effect_type get_pattern_row_channel_volume_effect_type( std::int32_t pattern, std::int32_t row, std::int32_t channel ) const = 0;
|
||||
|
||||
//! Get pattern command type for pattern highlighting
|
||||
/*!
|
||||
\param pattern The pattern whose data should be retrieved.
|
||||
\param row The row from which the data should be retrieved.
|
||||
\param channel The channel from which the data should be retrieved.
|
||||
\return The command type in the volume column at the given pattern position (see openmpt::ext::pattern_vis::effect_type)
|
||||
\sa openmpt::ext::pattern_vis::get_pattern_row_channel_volume_effect_type
|
||||
*/
|
||||
virtual effect_type get_pattern_row_channel_effect_type( std::int32_t pattern, std::int32_t row, std::int32_t channel ) const = 0;
|
||||
|
||||
}; // class pattern_vis
|
||||
|
||||
|
||||
#ifndef LIBOPENMPT_EXT_INTERFACE_INTERACTIVE
|
||||
#define LIBOPENMPT_EXT_INTERFACE_INTERACTIVE
|
||||
#endif
|
||||
|
||||
LIBOPENMPT_DECLARE_EXT_CXX_INTERFACE(interactive)
|
||||
|
||||
class interactive {
|
||||
|
||||
LIBOPENMPT_EXT_CXX_INTERFACE(interactive)
|
||||
|
||||
//! Set the current ticks per row (speed)
|
||||
/*!
|
||||
\param speed The new tick count in range [1, 65535].
|
||||
\throws openmpt::exception Throws an exception derived from openmpt::exception if the speed is outside the specified range.
|
||||
\remarks The tick count may be reset by pattern commands at any time.
|
||||
\sa openmpt::module::get_current_speed
|
||||
*/
|
||||
virtual void set_current_speed( std::int32_t speed ) = 0;
|
||||
|
||||
//! Set the current module tempo
|
||||
/*!
|
||||
\param tempo The new tempo in range [32, 512]. The exact meaning of the value depends on the tempo mode used by the module.
|
||||
\throws openmpt::exception Throws an exception derived from openmpt::exception if the tempo is outside the specified range.
|
||||
\remarks The tempo may be reset by pattern commands at any time. Use openmpt::ext:interactive::set_tempo_factor to apply a tempo factor that is independent of pattern commands.
|
||||
\sa openmpt::module::get_current_tempo
|
||||
*/
|
||||
virtual void set_current_tempo( std::int32_t tempo ) = 0;
|
||||
|
||||
//! Set the current module tempo factor without affecting playback pitch
|
||||
/*!
|
||||
\param factor The new tempo factor in range ]0.0, 4.0] - 1.0 means unmodified tempo.
|
||||
\throws openmpt::exception Throws an exception derived from openmpt::exception if the factor is outside the specified range.
|
||||
\remarks Modifying the tempo without applying the same pitch factor using openmpt::ext::interactive::set_pitch_factor may cause rhythmic samples (e.g. drum loops) to go out of sync.
|
||||
\sa openmpt::ext::interactive::get_tempo_factor
|
||||
*/
|
||||
virtual void set_tempo_factor( double factor ) = 0;
|
||||
|
||||
//! Gets the current module tempo factor
|
||||
/*!
|
||||
\return The current tempo factor.
|
||||
\sa openmpt::ext::interactive::set_tempo_factor
|
||||
*/
|
||||
virtual double get_tempo_factor( ) const = 0;
|
||||
|
||||
//! Set the current module pitch factor without affecting playback speed
|
||||
/*!
|
||||
\param factor The new pitch factor in range ]0.0, 4.0] - 1.0 means unmodified pitch.
|
||||
\throws openmpt::exception Throws an exception derived from openmpt::exception if the factor is outside the specified range.
|
||||
\remarks Modifying the pitch without applying the the same tempo factor using openmpt::ext::interactive::set_tempo_factor may cause rhythmic samples (e.g. drum loops) to go out of sync.
|
||||
\remarks To shift the pich by `n` semitones, the parameter can be calculated as follows: `pow( 2.0, n / 12.0 )`
|
||||
\sa openmpt::ext::interactive::get_pitch_factor
|
||||
*/
|
||||
virtual void set_pitch_factor( double factor ) = 0;
|
||||
|
||||
//! Gets the current module pitch factor
|
||||
/*!
|
||||
\return The current pitch factor.
|
||||
\sa openmpt::ext::interactive::set_pitch_factor
|
||||
*/
|
||||
virtual double get_pitch_factor( ) const = 0;
|
||||
|
||||
//! Set the current global volume
|
||||
/*!
|
||||
\param volume The new global volume in range [0.0, 1.0]
|
||||
\throws openmpt::exception Throws an exception derived from openmpt::exception if the volume is outside the specified range.
|
||||
\remarks The global volume may be reset by pattern commands at any time. Use openmpt::module::set_render_param to apply a global overall volume factor that is independent of pattern commands.
|
||||
\sa openmpt::ext::interactive::get_global_volume
|
||||
*/
|
||||
virtual void set_global_volume( double volume ) = 0;
|
||||
|
||||
//! Get the current global volume
|
||||
/*!
|
||||
\return The current global volume in range [0.0, 1.0]
|
||||
\sa openmpt::ext::interactive::set_global_volume
|
||||
*/
|
||||
virtual double get_global_volume( ) const = 0;
|
||||
|
||||
//! Set the current channel volume for a channel
|
||||
/*!
|
||||
\param channel The channel whose volume should be set, in range [0, openmpt::module::get_num_channels()[
|
||||
\param volume The new channel volume in range [0.0, 1.0]
|
||||
\throws openmpt::exception Throws an exception derived from openmpt::exception if the channel or volume is outside the specified range.
|
||||
\remarks The channel volume may be reset by pattern commands at any time.
|
||||
\sa openmpt::ext::interactive::get_channel_volume
|
||||
*/
|
||||
virtual void set_channel_volume( std::int32_t channel, double volume ) = 0;
|
||||
|
||||
//! Get the current channel volume for a channel
|
||||
/*!
|
||||
\param channel The channel whose volume should be retrieved, in range [0, openmpt::module::get_num_channels()[
|
||||
\return The current channel volume in range [0.0, 1.0]
|
||||
\throws openmpt::exception Throws an exception derived from openmpt::exception if the channel is outside the specified range.
|
||||
\sa openmpt::ext::interactive::set_channel_volume
|
||||
*/
|
||||
virtual double get_channel_volume( std::int32_t channel ) const = 0;
|
||||
|
||||
//! Set the current mute status for a channel
|
||||
/*!
|
||||
\param channel The channel whose mute status should be set, in range [0, openmpt::module::get_num_channels()[
|
||||
\param mute The new mute status. true is muted, false is unmuted.
|
||||
\throws openmpt::exception Throws an exception derived from openmpt::exception if the channel is outside the specified range.
|
||||
\sa openmpt::ext::interactive::get_channel_mute_status
|
||||
*/
|
||||
virtual void set_channel_mute_status( std::int32_t channel, bool mute ) = 0;
|
||||
|
||||
//! Get the current mute status for a channel
|
||||
/*!
|
||||
\param channel The channel whose mute status should be retrieved, in range [0, openmpt::module::get_num_channels()[
|
||||
\return The current channel mute status. true is muted, false is unmuted.
|
||||
\throws openmpt::exception Throws an exception derived from openmpt::exception if the channel is outside the specified range.
|
||||
\sa openmpt::ext::interactive::set_channel_mute_status
|
||||
*/
|
||||
virtual bool get_channel_mute_status( std::int32_t channel ) const = 0;
|
||||
|
||||
//! Set the current mute status for an instrument
|
||||
/*!
|
||||
\param instrument The instrument whose mute status should be set, in range [0, openmpt::module::get_num_instruments()[ if openmpt::module::get_num_instruments is not 0, otherwise in [0, openmpt::module::get_num_samples()[
|
||||
\param mute The new mute status. true is muted, false is unmuted.
|
||||
\throws openmpt::exception Throws an exception derived from openmpt::exception if the instrument is outside the specified range.
|
||||
\sa openmpt::ext::interactive::get_instrument_mute_status
|
||||
*/
|
||||
virtual void set_instrument_mute_status( std::int32_t instrument, bool mute ) = 0;
|
||||
|
||||
//! Get the current mute status for an instrument
|
||||
/*!
|
||||
\param instrument The instrument whose mute status should be retrieved, in range [0, openmpt::module::get_num_instruments()[ if openmpt::module::get_num_instruments is not 0, otherwise in [0, openmpt::module::get_num_samples()[
|
||||
\return The current instrument mute status. true is muted, false is unmuted.
|
||||
\throws openmpt::exception Throws an exception derived from openmpt::exception if the instrument is outside the specified range.
|
||||
\sa openmpt::ext::interactive::set_instrument_mute_status
|
||||
*/
|
||||
virtual bool get_instrument_mute_status( std::int32_t instrument ) const = 0;
|
||||
|
||||
//! Play a note using the specified instrument
|
||||
/*!
|
||||
\param instrument The instrument that should be played, in range [0, openmpt::module::get_num_instruments()[ if openmpt::module::get_num_instruments is not 0, otherwise in [0, openmpt::module::get_num_samples()[
|
||||
\param note The note to play, in rage [0, 119]. 60 is the middle C.
|
||||
\param volume The volume at which the note should be triggered, in range [0.0, 1.0]
|
||||
\param panning The panning position at which the note should be triggered, in range [-1.0, 1.0], 0.0 is center.
|
||||
\return The channel on which the note is played. This can pe be passed to openmpt::ext::interactive::stop_note to stop the note.
|
||||
\throws openmpt::exception Throws an exception derived from openmpt::exception if the instrument or note is outside the specified range.
|
||||
\sa openmpt::ext::interactive::stop_note
|
||||
*/
|
||||
virtual std::int32_t play_note( std::int32_t instrument, std::int32_t note, double volume, double panning ) = 0;
|
||||
|
||||
//! Stop the note playing on the specified channel
|
||||
/*!
|
||||
\param channel The channel on which the note should be stopped.
|
||||
\throws openmpt::exception Throws an exception derived from openmpt::exception if the channel index is invalid.
|
||||
\sa openmpt::ext::interactive::play_note
|
||||
*/
|
||||
virtual void stop_note( std::int32_t channel ) = 0;
|
||||
|
||||
}; // class interactive
|
||||
|
||||
|
||||
/* add stuff here */
|
||||
|
||||
|
||||
|
||||
#undef LIBOPENMPT_DECLARE_EXT_CXX_INTERFACE
|
||||
#undef LIBOPENMPT_EXT_CXX_INTERFACE
|
||||
|
||||
} // namespace ext
|
||||
|
||||
} // namespace openmpt
|
||||
|
||||
/*!
|
||||
@}
|
||||
*/
|
||||
|
||||
#endif // LIBOPENMPT_EXT_HPP
|
|
@ -0,0 +1,179 @@
|
|||
/*
|
||||
* libopenmpt_stream_callbacks_buffer.h
|
||||
* ------------------------------------
|
||||
* Purpose: libopenmpt public c interface
|
||||
* Notes : (currently none)
|
||||
* Authors: OpenMPT Devs
|
||||
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
||||
*/
|
||||
|
||||
#ifndef LIBOPENMPT_STREAM_CALLBACKS_BUFFER_H
|
||||
#define LIBOPENMPT_STREAM_CALLBACKS_BUFFER_H
|
||||
|
||||
#include "libopenmpt.h"
|
||||
|
||||
/* The use of this header requires:
|
||||
|
||||
#include <libopenmpt/libopenmpt.h>
|
||||
#if defined( LIBOPENMPT_STREAM_CALLBACKS_BUFFER )
|
||||
#include <libopenmpt/libopenmpt_stream_callbacks_buffer.h>
|
||||
#else
|
||||
#error "libopenmpt too old."
|
||||
#endif
|
||||
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct openmpt_stream_buffer {
|
||||
const void * file_data; /* or prefix data IFF prefix_size < file_size */
|
||||
int64_t file_size;
|
||||
int64_t file_pos;
|
||||
int64_t prefix_size;
|
||||
int overflow;
|
||||
} openmpt_stream_buffer;
|
||||
|
||||
static size_t openmpt_stream_buffer_read_func( void * stream, void * dst, size_t bytes ) {
|
||||
openmpt_stream_buffer * s = (openmpt_stream_buffer*)stream;
|
||||
int64_t offset = 0;
|
||||
int64_t begpos = 0;
|
||||
int64_t endpos = 0;
|
||||
size_t valid_bytes = 0;
|
||||
if ( !s ) {
|
||||
return 0;
|
||||
}
|
||||
offset = bytes;
|
||||
begpos = s->file_pos;
|
||||
endpos = s->file_pos;
|
||||
valid_bytes = 0;
|
||||
endpos = (uint64_t)endpos + (uint64_t)offset;
|
||||
if ( ( offset > 0 ) && !( (uint64_t)endpos > (uint64_t)begpos ) ) {
|
||||
/* integer wrapped */
|
||||
return 0;
|
||||
}
|
||||
if ( bytes == 0 ) {
|
||||
return 0;
|
||||
}
|
||||
if ( begpos >= s->file_size ) {
|
||||
return 0;
|
||||
}
|
||||
if ( endpos > s->file_size ) {
|
||||
/* clip to eof */
|
||||
bytes = bytes - (size_t)( endpos - s->file_size );
|
||||
endpos = endpos - ( endpos - s->file_size );
|
||||
}
|
||||
memset( dst, 0, bytes );
|
||||
if ( begpos >= s->prefix_size ) {
|
||||
s->overflow = 1;
|
||||
valid_bytes = 0;
|
||||
} else if ( endpos > s->prefix_size ) {
|
||||
s->overflow = 1;
|
||||
valid_bytes = bytes - (size_t)( endpos - s->prefix_size );
|
||||
} else {
|
||||
valid_bytes = bytes;
|
||||
}
|
||||
memcpy( dst, (const char*)s->file_data + s->file_pos, valid_bytes );
|
||||
s->file_pos = s->file_pos + bytes;
|
||||
return bytes;
|
||||
}
|
||||
|
||||
static int openmpt_stream_buffer_seek_func( void * stream, int64_t offset, int whence ) {
|
||||
openmpt_stream_buffer * s = (openmpt_stream_buffer*)stream;
|
||||
int result = -1;
|
||||
if ( !s ) {
|
||||
return -1;
|
||||
}
|
||||
switch ( whence ) {
|
||||
case OPENMPT_STREAM_SEEK_SET:
|
||||
if ( offset < 0 ) {
|
||||
return -1;
|
||||
}
|
||||
if ( offset > s->file_size ) {
|
||||
return -1;
|
||||
}
|
||||
s->file_pos = offset;
|
||||
result = 0;
|
||||
break;
|
||||
case OPENMPT_STREAM_SEEK_CUR:
|
||||
do {
|
||||
int64_t oldpos = s->file_pos;
|
||||
int64_t pos = s->file_pos;
|
||||
pos = (uint64_t)pos + (uint64_t)offset;
|
||||
if ( ( offset > 0 ) && !( (uint64_t)pos > (uint64_t)oldpos ) ) {
|
||||
/* integer wrapped */
|
||||
return -1;
|
||||
}
|
||||
if ( ( offset < 0 ) && !( (uint64_t)pos < (uint64_t)oldpos ) ) {
|
||||
/* integer wrapped */
|
||||
return -1;
|
||||
}
|
||||
s->file_pos = pos;
|
||||
} while(0);
|
||||
result = 0;
|
||||
break;
|
||||
case OPENMPT_STREAM_SEEK_END:
|
||||
if ( offset > 0 ) {
|
||||
return -1;
|
||||
}
|
||||
do {
|
||||
int64_t oldpos = s->file_pos;
|
||||
int64_t pos = s->file_pos;
|
||||
pos = s->file_size;
|
||||
pos = (uint64_t)pos + (uint64_t)offset;
|
||||
if ( ( offset < 0 ) && !( (uint64_t)pos < (uint64_t)oldpos ) ) {
|
||||
/* integer wrapped */
|
||||
return -1;
|
||||
}
|
||||
s->file_pos = pos;
|
||||
} while(0);
|
||||
result = 0;
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static int64_t openmpt_stream_buffer_tell_func( void * stream ) {
|
||||
openmpt_stream_buffer * s = (openmpt_stream_buffer*)stream;
|
||||
if ( !s ) {
|
||||
return -1;
|
||||
}
|
||||
return s->file_pos;
|
||||
}
|
||||
|
||||
static void openmpt_stream_buffer_init( openmpt_stream_buffer * buffer, const void * file_data, int64_t file_size ) {
|
||||
memset( buffer, 0, sizeof( openmpt_stream_buffer ) );
|
||||
buffer->file_data = file_data;
|
||||
buffer->file_size = file_size;
|
||||
buffer->file_pos = 0;
|
||||
buffer->prefix_size = file_size;
|
||||
buffer->overflow = 0;
|
||||
}
|
||||
|
||||
#define openmpt_stream_buffer_init_prefix_only( buffer_, prefix_data_, prefix_size_, file_size_ ) do { \
|
||||
openmpt_stream_buffer_init( (buffer_), (prefix_data_), (file_size_) ); \
|
||||
(buffer_)->prefix_size = (prefix_size_); \
|
||||
} while(0)
|
||||
|
||||
#define openmpt_stream_buffer_overflowed( buffer_ ) ( (buffer_)->overflow )
|
||||
|
||||
static openmpt_stream_callbacks openmpt_stream_get_buffer_callbacks(void) {
|
||||
openmpt_stream_callbacks retval;
|
||||
memset( &retval, 0, sizeof( openmpt_stream_callbacks ) );
|
||||
retval.read = openmpt_stream_buffer_read_func;
|
||||
retval.seek = openmpt_stream_buffer_seek_func;
|
||||
retval.tell = openmpt_stream_buffer_tell_func;
|
||||
return retval;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LIBOPENMPT_STREAM_CALLBACKS_BUFFER_H */
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* libopenmpt_stream_callbacks_fd.h
|
||||
* --------------------------------
|
||||
* Purpose: libopenmpt public c interface
|
||||
* Notes : (currently none)
|
||||
* Authors: OpenMPT Devs
|
||||
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
||||
*/
|
||||
|
||||
#ifndef LIBOPENMPT_STREAM_CALLBACKS_FD_H
|
||||
#define LIBOPENMPT_STREAM_CALLBACKS_FD_H
|
||||
|
||||
#include "libopenmpt.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <io.h>
|
||||
#endif
|
||||
#include <limits.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#ifndef _MSC_VER
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* This stuff has to be in a header file because of possibly different MSVC CRTs which cause problems for fd crossing CRT boundaries. */
|
||||
|
||||
static size_t openmpt_stream_fd_read_func( void * stream, void * dst, size_t bytes ) {
|
||||
int fd = 0;
|
||||
#if defined(_MSC_VER)
|
||||
size_t retval = 0;
|
||||
int to_read = 0;
|
||||
int ret_read = 0;
|
||||
#else
|
||||
ssize_t retval = 0;
|
||||
#endif
|
||||
fd = (int)(uintptr_t)stream;
|
||||
if ( fd < 0 ) {
|
||||
return 0;
|
||||
}
|
||||
#if defined(_MSC_VER)
|
||||
retval = 0;
|
||||
while ( bytes > 0 ) {
|
||||
to_read = 0;
|
||||
if ( bytes < (size_t)INT_MAX ) {
|
||||
to_read = (int)bytes;
|
||||
} else {
|
||||
to_read = INT_MAX;
|
||||
}
|
||||
ret_read = _read( fd, dst, to_read );
|
||||
if ( ret_read <= 0 ) {
|
||||
return retval;
|
||||
}
|
||||
bytes -= ret_read;
|
||||
retval += ret_read;
|
||||
}
|
||||
#else
|
||||
retval = read( fd, dst, bytes );
|
||||
#endif
|
||||
if ( retval <= 0 ) {
|
||||
return 0;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
static openmpt_stream_callbacks openmpt_stream_get_fd_callbacks(void) {
|
||||
openmpt_stream_callbacks retval;
|
||||
memset( &retval, 0, sizeof( openmpt_stream_callbacks ) );
|
||||
retval.read = openmpt_stream_fd_read_func;
|
||||
return retval;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LIBOPENMPT_STREAM_CALLBACKS_FD_H */
|
||||
|
|
@ -0,0 +1,113 @@
|
|||
/*
|
||||
* libopenmpt_stream_callbacks_file.h
|
||||
* ----------------------------------
|
||||
* Purpose: libopenmpt public c interface
|
||||
* Notes : (currently none)
|
||||
* Authors: OpenMPT Devs
|
||||
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
||||
*/
|
||||
|
||||
#ifndef LIBOPENMPT_STREAM_CALLBACKS_FILE_H
|
||||
#define LIBOPENMPT_STREAM_CALLBACKS_FILE_H
|
||||
|
||||
#include "libopenmpt.h"
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#ifdef _MSC_VER
|
||||
#include <wchar.h> /* off_t */
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* This stuff has to be in a header file because of possibly different MSVC CRTs which cause problems for FILE * crossing CRT boundaries. */
|
||||
|
||||
static size_t openmpt_stream_file_read_func( void * stream, void * dst, size_t bytes ) {
|
||||
FILE * f = 0;
|
||||
size_t retval = 0;
|
||||
f = (FILE*)stream;
|
||||
if ( !f ) {
|
||||
return 0;
|
||||
}
|
||||
retval = fread( dst, 1, bytes, f );
|
||||
if ( retval <= 0 ) {
|
||||
return 0;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int openmpt_stream_file_seek_func( void * stream, int64_t offset, int whence ) {
|
||||
FILE * f = 0;
|
||||
int fwhence = 0;
|
||||
f = (FILE*)stream;
|
||||
if ( !f ) {
|
||||
return -1;
|
||||
}
|
||||
switch ( whence ) {
|
||||
#if defined(SEEK_SET)
|
||||
case OPENMPT_STREAM_SEEK_SET:
|
||||
fwhence = SEEK_SET;
|
||||
break;
|
||||
#endif
|
||||
#if defined(SEEK_CUR)
|
||||
case OPENMPT_STREAM_SEEK_CUR:
|
||||
fwhence = SEEK_CUR;
|
||||
break;
|
||||
#endif
|
||||
#if defined(SEEK_END)
|
||||
case OPENMPT_STREAM_SEEK_END:
|
||||
fwhence = SEEK_END;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return -1;
|
||||
break;
|
||||
}
|
||||
#if defined(_MSC_VER)
|
||||
return _fseeki64( f, offset, fwhence ) ? -1 : 0;
|
||||
#elif defined(_POSIX_SOURCE) && (_POSIX_SOURCE == 1)
|
||||
return fseeko( f, offset, fwhence ) ? -1 : 0;
|
||||
#else
|
||||
return fseek( f, offset, fwhence ) ? -1 : 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int64_t openmpt_stream_file_tell_func( void * stream ) {
|
||||
FILE * f = 0;
|
||||
int64_t retval = 0;
|
||||
f = (FILE*)stream;
|
||||
if ( !f ) {
|
||||
return -1;
|
||||
}
|
||||
#if defined(_MSC_VER)
|
||||
retval = _ftelli64( f );
|
||||
#elif defined(_POSIX_SOURCE) && (_POSIX_SOURCE == 1)
|
||||
retval = ftello( f );
|
||||
#else
|
||||
retval = ftell( f );
|
||||
#endif
|
||||
if ( retval < 0 ) {
|
||||
return -1;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
static openmpt_stream_callbacks openmpt_stream_get_file_callbacks(void) {
|
||||
openmpt_stream_callbacks retval;
|
||||
memset( &retval, 0, sizeof( openmpt_stream_callbacks ) );
|
||||
retval.read = openmpt_stream_file_read_func;
|
||||
retval.seek = openmpt_stream_file_seek_func;
|
||||
retval.tell = openmpt_stream_file_tell_func;
|
||||
return retval;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LIBOPENMPT_STREAM_CALLBACKS_FILE_H */
|
||||
|
75
libs/libopenmpt/inc/libopenmpt/libopenmpt_version.h
Normal file
75
libs/libopenmpt/inc/libopenmpt/libopenmpt_version.h
Normal file
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* libopenmpt_version.h
|
||||
* --------------------
|
||||
* Purpose: libopenmpt public interface version
|
||||
* Notes : (currently none)
|
||||
* Authors: OpenMPT Devs
|
||||
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
||||
*/
|
||||
|
||||
#ifndef LIBOPENMPT_VERSION_H
|
||||
#define LIBOPENMPT_VERSION_H
|
||||
|
||||
/*! \addtogroup libopenmpt
|
||||
@{
|
||||
*/
|
||||
|
||||
/*! \brief libopenmpt major version number */
|
||||
#define OPENMPT_API_VERSION_MAJOR 0
|
||||
/*! \brief libopenmpt minor version number */
|
||||
#define OPENMPT_API_VERSION_MINOR 3
|
||||
/*! \brief libopenmpt patch version number */
|
||||
#define OPENMPT_API_VERSION_PATCH 11
|
||||
/*! \brief libopenmpt pre-release tag */
|
||||
#define OPENMPT_API_VERSION_PREREL ""
|
||||
/*! \brief libopenmpt pre-release flag */
|
||||
#define OPENMPT_API_VERSION_IS_PREREL 0
|
||||
|
||||
/*! \brief libopenmpt version number as a single integer value
|
||||
* \since 0.3
|
||||
* \remarks Use the following shim if you need to support earlier libopenmpt versions:
|
||||
* \code
|
||||
* #include <libopenmpt/libopenmpt_version.h>
|
||||
* #if !defined(OPENMPT_API_VERSION_MAKE)
|
||||
* #define OPENMPT_API_VERSION_MAKE(major, minor, patch) (((major)<<24)|((minor)<<16)|((patch)<<0))
|
||||
* #endif
|
||||
* \endcode
|
||||
*/
|
||||
#define OPENMPT_API_VERSION_MAKE(major, minor, patch) (((major)<<24)|((minor)<<16)|((patch)<<0))
|
||||
|
||||
/*! \brief libopenmpt API version number */
|
||||
#define OPENMPT_API_VERSION OPENMPT_API_VERSION_MAKE(OPENMPT_API_VERSION_MAJOR, OPENMPT_API_VERSION_MINOR, OPENMPT_API_VERSION_PATCH)
|
||||
|
||||
/*! \brief Check whether the libopenmpt API is at least the provided version
|
||||
* \since 0.3
|
||||
* \remarks Use the following shim if you need to support earlier libopenmpt versions:
|
||||
* \code
|
||||
* #include <libopenmpt/libopenmpt_version.h>
|
||||
* #if !defined(OPENMPT_API_VERSION_AT_LEAST)
|
||||
* #define OPENMPT_API_VERSION_AT_LEAST(major, minor, patch) (OPENMPT_API_VERSION >= OPENMPT_API_VERSION_MAKE((major), (minor), (patch)))
|
||||
* #endif
|
||||
* \endcode
|
||||
*/
|
||||
#define OPENMPT_API_VERSION_AT_LEAST(major, minor, patch) (OPENMPT_API_VERSION >= OPENMPT_API_VERSION_MAKE((major), (minor), (patch)))
|
||||
|
||||
/*! \brief Check whether the libopenmpt API is before the provided version
|
||||
* \since 0.3
|
||||
* \remarks Use the following shim if you need to support earlier libopenmpt versions:
|
||||
* \code
|
||||
* #include <libopenmpt/libopenmpt_version.h>
|
||||
* #if !defined(OPENMPT_API_VERSION_BEFORE)
|
||||
* #define OPENMPT_API_VERSION_BEFORE(major, minor, patch) (OPENMPT_API_VERSION < OPENMPT_API_VERSION_MAKE((major), (minor), (patch)))
|
||||
* #endif
|
||||
* \endcode
|
||||
*/
|
||||
#define OPENMPT_API_VERSION_BEFORE(major, minor, patch) (OPENMPT_API_VERSION < OPENMPT_API_VERSION_MAKE((major), (minor), (patch)))
|
||||
|
||||
#define OPENMPT_API_VERSION_HELPER_STRINGIZE(x) #x
|
||||
#define OPENMPT_API_VERSION_STRINGIZE(x) OPENMPT_API_VERSION_HELPER_STRINGIZE(x)
|
||||
#define OPENMPT_API_VERSION_STRING OPENMPT_API_VERSION_STRINGIZE(OPENMPT_API_VERSION_MAJOR) "." OPENMPT_API_VERSION_STRINGIZE(OPENMPT_API_VERSION_MINOR) "." OPENMPT_API_VERSION_STRINGIZE(OPENMPT_API_VERSION_PATCH) OPENMPT_API_VERSION_PREREL
|
||||
|
||||
/*!
|
||||
@}
|
||||
*/
|
||||
|
||||
#endif /* LIBOPENMPT_VERSION_H */
|
BIN
libs/libopenmpt/lib/x86/libopenmpt.lib
Normal file
BIN
libs/libopenmpt/lib/x86/libopenmpt.lib
Normal file
Binary file not shown.
BIN
libs/libopenmpt/lib/x86_64/libopenmpt.lib
Normal file
BIN
libs/libopenmpt/lib/x86_64/libopenmpt.lib
Normal file
Binary file not shown.
17
src/Makefile
17
src/Makefile
|
@ -73,6 +73,7 @@
|
|||
# Compile without BSD API, add 'NONET=1'
|
||||
# Compile without IPX/SPX, add 'NOIPX=1'
|
||||
# Compile Mingw/SDL with S_DS3S, add 'DS3D=1'
|
||||
# Compile without libopenmpt, add 'NOOPENMPT=1'
|
||||
# Compile with S_FMOD3D, add 'FMOD=1' (WIP)
|
||||
# Compile with S_OPENAL, add 'OPENAL=1' (WIP)
|
||||
# To link with the whole SDL_Image lib to load Icons, add 'SDL_IMAGE=1' but it isn't not realy needed
|
||||
|
@ -185,6 +186,10 @@ HAVE_LIBGME=1
|
|||
endif
|
||||
endif
|
||||
|
||||
ifndef NOOPENMPT
|
||||
HAVE_OPENMPT=1
|
||||
endif
|
||||
|
||||
ifdef SOLARIS
|
||||
UNIXCOMMON=1
|
||||
endif
|
||||
|
@ -343,6 +348,18 @@ LIBS+=$(LIBGME_LDFLAGS)
|
|||
CFLAGS+=$(LIBGME_CFLAGS)
|
||||
endif
|
||||
|
||||
ifdef HAVE_OPENMPT
|
||||
# make libopenmpt optional
|
||||
OPTS+=-DHAVE_OPENMPT -DOPENMPT_DYNAMIC
|
||||
|
||||
LIBOPENMPT_PKGCONFIG?=libopenmpt
|
||||
LIBOPENMPT_CFLAGS?=$(shell $(PKG_CONFIG) $(LIBOPENMPT_PKGCONFIG) --cflags)
|
||||
LIBOPENMPT_LDFLAGS?=$(shell $(PKG_CONFIG) $(LIBOPENMPT_PKGCONFIG) --libs)
|
||||
|
||||
LIBS+=$(LIBOPENMPT_LDFLAGS)
|
||||
CFLAGS+=$(LIBOPENMPT_CFLAGS)
|
||||
endif
|
||||
|
||||
ifdef STATIC
|
||||
LIBS:=-static $(LIBS)
|
||||
endif
|
||||
|
|
|
@ -671,6 +671,9 @@ void D_RegisterClientCommands(void)
|
|||
COM_AddCommand("tunes", Command_Tunes_f);
|
||||
COM_AddCommand("restartaudio", Command_RestartAudio_f);
|
||||
CV_RegisterVar(&cv_resetmusic);
|
||||
#ifdef HAVE_OPENMPT
|
||||
CV_RegisterVar(&cv_modfilter);
|
||||
#endif
|
||||
|
||||
// FIXME: not to be here.. but needs be done for config loading
|
||||
CV_RegisterVar(&cv_usegamma);
|
||||
|
@ -3931,7 +3934,7 @@ static void Command_Tunes_f(void)
|
|||
CONS_Alert(CONS_NOTICE, M_GetText("Music name too long - truncated to six characters.\n"));
|
||||
|
||||
if (argc > 2)
|
||||
track = (UINT16)atoi(COM_Argv(2))-1;
|
||||
track = (UINT16)atoi(COM_Argv(2));
|
||||
|
||||
if (tunenum)
|
||||
snprintf(mapmusname, 7, "%sM", G_BuildMapName(tunenum));
|
||||
|
|
|
@ -30,7 +30,8 @@ typedef enum {
|
|||
MU_MP3_MAD_UNUSED, // use MU_MP3 instead
|
||||
MU_FLAC,
|
||||
MU_MODPLUG_UNUSED, // use MU_MOD instead
|
||||
MU_GME
|
||||
MU_GME,
|
||||
MU_MOD_EX // libopenmpt
|
||||
} musictype_t;
|
||||
|
||||
/** \brief Sound subsystem runing and waiting
|
||||
|
|
19
src/m_menu.c
19
src/m_menu.c
|
@ -287,6 +287,9 @@ menu_t OP_VideoOptionsDef, OP_VideoModeDef;
|
|||
menu_t OP_OpenGLOptionsDef, OP_OpenGLFogDef, OP_OpenGLColorDef;
|
||||
#endif
|
||||
menu_t OP_SoundOptionsDef;
|
||||
#ifdef HAVE_OPENMPT
|
||||
menu_t OP_SoundAdvancedDef;
|
||||
#endif
|
||||
static void M_ToggleSFX(void);
|
||||
static void M_ToggleDigital(void);
|
||||
static void M_ToggleMIDI(void);
|
||||
|
@ -1230,8 +1233,21 @@ static menuitem_t OP_SoundOptionsMenu[] =
|
|||
{IT_STRING | IT_CALL, NULL, "Toggle SFX" , M_ToggleSFX, 50},
|
||||
{IT_STRING | IT_CALL, NULL, "Toggle Digital Music", M_ToggleDigital, 60},
|
||||
{IT_STRING | IT_CALL, NULL, "Toggle MIDI Music", M_ToggleMIDI, 70},
|
||||
|
||||
#ifdef HAVE_OPENMPT
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Advanced Settings...", &OP_SoundAdvancedDef, 90}
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef HAVE_OPENMPT
|
||||
static menuitem_t OP_SoundAdvancedMenu[] =
|
||||
{
|
||||
{IT_HEADER, NULL, "MOD", NULL, 10},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Instrument Filter", &cv_modfilter, 22}
|
||||
};
|
||||
#endif
|
||||
|
||||
static menuitem_t OP_DataOptionsMenu[] =
|
||||
{
|
||||
{IT_STRING | IT_CALL, NULL, "Screenshot Options...", M_ScreenshotOptions, 10},
|
||||
|
@ -1692,6 +1708,9 @@ menu_t OP_VideoModeDef =
|
|||
NULL
|
||||
};
|
||||
menu_t OP_SoundOptionsDef = DEFAULTMENUSTYLE("M_SOUND", OP_SoundOptionsMenu, &OP_MainDef, 60, 30);
|
||||
#ifdef HAVE_OPENMPT
|
||||
menu_t OP_SoundAdvancedDef = DEFAULTMENUSTYLE("M_SOUND", OP_SoundAdvancedMenu, &OP_SoundOptionsDef, 30, 30);
|
||||
#endif
|
||||
menu_t OP_GameOptionsDef = DEFAULTMENUSTYLE("M_GAME", OP_GameOptionsMenu, &OP_MainDef, 30, 30);
|
||||
menu_t OP_ServerOptionsDef = DEFAULTMENUSTYLE("M_SERVER", OP_ServerOptionsMenu, &OP_MainDef, 30, 30);
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2016 by Sonic Team Junior.
|
||||
// Copyright (C) 1999-2018 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
@ -41,6 +41,10 @@ extern INT32 msg_id;
|
|||
#include "lua_hook.h" // MusicChange hook
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_OPENMPT
|
||||
#include "libopenmpt/libopenmpt.h"
|
||||
#endif
|
||||
|
||||
#ifdef HW3SOUND
|
||||
// 3D Sound Interface
|
||||
#include "hardware/hw3sound.h"
|
||||
|
@ -248,6 +252,10 @@ void S_RegisterSoundStuff(void)
|
|||
CV_RegisterVar(&surround);
|
||||
CV_RegisterVar(&cv_samplerate);
|
||||
|
||||
#ifdef HAVE_OPENMPT
|
||||
CV_RegisterVar(&cv_modfilter);
|
||||
#endif
|
||||
|
||||
#if defined (macintosh) && !defined (HAVE_SDL) // mp3 playlist stuff
|
||||
{
|
||||
INT32 i;
|
||||
|
|
|
@ -27,6 +27,10 @@ extern consvar_t stereoreverse;
|
|||
extern consvar_t cv_soundvolume, cv_digmusicvolume, cv_midimusicvolume;
|
||||
extern consvar_t cv_numChannels;
|
||||
|
||||
#ifdef HAVE_OPENMPT
|
||||
extern consvar_t cv_modfilter;
|
||||
#endif
|
||||
|
||||
#ifdef SNDSERV
|
||||
extern consvar_t sndserver_cmd, sndserver_arg;
|
||||
#endif
|
||||
|
|
|
@ -66,6 +66,19 @@
|
|||
#endif
|
||||
#endif
|
||||
|
||||
static UINT16 BUFFERSIZE = 2048;
|
||||
static UINT16 SAMPLERATE = 44100;
|
||||
|
||||
#ifdef HAVE_OPENMPT
|
||||
#include "libopenmpt/libopenmpt.h"
|
||||
static CV_PossibleValue_t interpolationfilter_cons_t[] = {{0, "Default"}, {1, "None"}, {2, "Linear"}, {4, "Cubic"}, {8, "Windowed sinc"}, {0, NULL}};
|
||||
consvar_t cv_modfilter = {"modfilter", "0", CV_SAVE, interpolationfilter_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
#endif
|
||||
|
||||
/// ------------------------
|
||||
/// Audio Declarations
|
||||
/// ------------------------
|
||||
|
||||
UINT8 sound_started = false;
|
||||
|
||||
static Mix_Music *music;
|
||||
|
@ -87,7 +100,14 @@ static void (*fading_callback)(void);
|
|||
|
||||
#ifdef HAVE_LIBGME
|
||||
static Music_Emu *gme;
|
||||
static INT32 current_track;
|
||||
static UINT16 current_track;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_OPENMPT
|
||||
static openmpt_module *mod = 0;
|
||||
int mod_err = OPENMPT_ERROR_OK;
|
||||
static const char *mod_err_str;
|
||||
static UINT16 current_subsong;
|
||||
#endif
|
||||
|
||||
static void var_cleanup(void)
|
||||
|
@ -108,6 +128,137 @@ static void var_cleanup(void)
|
|||
/// Audio System
|
||||
/// ------------------------
|
||||
|
||||
///
|
||||
/// OpenMPT Loading
|
||||
///
|
||||
|
||||
#ifdef HAVE_OPENMPT
|
||||
|
||||
// Dynamic loading inspired by SDL Mixer
|
||||
// Why: It's hard to compile for Windows without MSVC dependency, see https://trac.videolan.org/vlc/ticket/13055
|
||||
// So let's not force that on the user, and they can download it if they want.
|
||||
//
|
||||
// ADD FUNCTIONS HERE AS YOU USE THEM!!!!!
|
||||
typedef struct {
|
||||
int loaded;
|
||||
void *handle;
|
||||
|
||||
// errors
|
||||
int (*module_error_get_last) ( openmpt_module * mod );
|
||||
const char *(*error_string) ( int error );
|
||||
const char *(*get_string) ( const char * key );
|
||||
|
||||
// module loading
|
||||
void (*module_destroy) ( openmpt_module * mod );
|
||||
openmpt_module *(*module_create_from_memory2) ( const void * filedata, size_t filesize, openmpt_log_func logfunc, void * loguser, openmpt_error_func errfunc, void * erruser, int * error, const char * * error_message, const openmpt_module_initial_ctl * ctls );
|
||||
|
||||
// audio callback
|
||||
size_t (*module_read_interleaved_stereo) ( openmpt_module * mod, int32_t samplerate, size_t count, int16_t * interleaved_stereo );
|
||||
|
||||
// playback settings
|
||||
int (*module_set_render_param) ( openmpt_module * mod, int param, int32_t value );
|
||||
int (*module_set_repeat_count) ( openmpt_module * mod, int32_t repeat_count );
|
||||
int (*module_ctl_set) ( openmpt_module * mod, const char * ctl, const char * value );
|
||||
|
||||
// positioning
|
||||
double (*module_get_duration_seconds) ( openmpt_module * mod );
|
||||
double (*module_get_position_seconds) ( openmpt_module * mod );
|
||||
double (*module_set_position_seconds) ( openmpt_module * mod, double seconds );
|
||||
int32_t (*module_get_num_subsongs) ( openmpt_module * mod );
|
||||
int (*module_select_subsong) ( openmpt_module * mod, int32_t subsong );
|
||||
} openmpt_loader;
|
||||
|
||||
static openmpt_loader openmpt = {
|
||||
0, NULL,
|
||||
NULL, NULL, NULL, // errors
|
||||
NULL, NULL, // module loading
|
||||
NULL, // audio callback
|
||||
NULL, NULL, NULL, // playback settings
|
||||
NULL, NULL, NULL, NULL, NULL // positioning
|
||||
};
|
||||
|
||||
#ifdef OPENMPT_DYNAMIC
|
||||
#define FUNCTION_LOADER(NAME, FUNC, SIG) \
|
||||
openmpt.NAME = (SIG) SDL_LoadFunction(openmpt.handle, #FUNC); \
|
||||
if (openmpt.NAME == NULL) { SDL_UnloadObject(openmpt.handle); openmpt.handle = NULL; return; }
|
||||
#else
|
||||
#define FUNCTION_LOADER(NAME, FUNC, SIG) \
|
||||
openmpt.NAME = FUNC;
|
||||
#endif
|
||||
|
||||
static void load_openmpt(void)
|
||||
{
|
||||
if (openmpt.loaded)
|
||||
return;
|
||||
|
||||
#ifdef OPENMPT_DYNAMIC
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
openmpt.handle = SDL_LoadObject("libopenmpt.dll");
|
||||
#else
|
||||
openmpt.handle = SDL_LoadObject("libopenmpt.so");
|
||||
#endif
|
||||
if (openmpt.handle == NULL)
|
||||
{
|
||||
CONS_Printf("libopenmpt not found, not loading.\n");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
// errors
|
||||
FUNCTION_LOADER(module_error_get_last, openmpt_module_error_get_last, int (*) ( openmpt_module * mod ))
|
||||
FUNCTION_LOADER(error_string, openmpt_error_string, const char *(*) ( int error ))
|
||||
FUNCTION_LOADER(get_string, openmpt_get_string, const char *(*) ( const char * key ))
|
||||
|
||||
// module loading
|
||||
FUNCTION_LOADER(module_destroy, openmpt_module_destroy, void (*) ( openmpt_module * mod ))
|
||||
FUNCTION_LOADER(module_create_from_memory2, openmpt_module_create_from_memory2, openmpt_module *(*) ( const void * filedata, size_t filesize, openmpt_log_func logfunc, void * loguser, openmpt_error_func errfunc, void * erruser, int * error, const char * * error_message, const openmpt_module_initial_ctl * ctls ))
|
||||
|
||||
// audio callback
|
||||
FUNCTION_LOADER(module_read_interleaved_stereo, openmpt_module_read_interleaved_stereo, size_t (*) ( openmpt_module * mod, int32_t samplerate, size_t count, int16_t * interleaved_stereo ))
|
||||
|
||||
// playback settings
|
||||
FUNCTION_LOADER(module_set_render_param, openmpt_module_set_render_param, int (*) ( openmpt_module * mod, int param, int32_t value ))
|
||||
FUNCTION_LOADER(module_set_repeat_count, openmpt_module_set_repeat_count, int (*) ( openmpt_module * mod, int32_t repeat_count ))
|
||||
FUNCTION_LOADER(module_ctl_set, openmpt_module_ctl_set, int (*) ( openmpt_module * mod, const char * ctl, const char * value ))
|
||||
|
||||
// positioning
|
||||
FUNCTION_LOADER(module_get_duration_seconds, openmpt_module_get_duration_seconds, double (*) ( openmpt_module * mod ))
|
||||
FUNCTION_LOADER(module_get_position_seconds, openmpt_module_get_position_seconds, double (*) ( openmpt_module * mod ))
|
||||
FUNCTION_LOADER(module_set_position_seconds, openmpt_module_set_position_seconds, double (*) ( openmpt_module * mod, double seconds ))
|
||||
FUNCTION_LOADER(module_get_num_subsongs, openmpt_module_get_num_subsongs, int32_t (*) ( openmpt_module * mod ))
|
||||
FUNCTION_LOADER(module_select_subsong, openmpt_module_select_subsong, int (*) ( openmpt_module * mod, int32_t subsong ))
|
||||
|
||||
#ifdef OPENMPT_DYNAMIC
|
||||
// this will be unset if a function failed to load
|
||||
if (openmpt.handle == NULL)
|
||||
{
|
||||
CONS_Printf("libopenmpt found but failed to load.\n");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
CONS_Printf("libopenmpt version: %s\n", openmpt.get_string("library_version"));
|
||||
CONS_Printf("libopenmpt build date: %s\n", openmpt.get_string("build"));
|
||||
|
||||
openmpt.loaded = 1;
|
||||
}
|
||||
|
||||
static void unload_openmpt(void)
|
||||
{
|
||||
#ifdef OPENMPT_DYNAMIC
|
||||
if (openmpt.loaded)
|
||||
{
|
||||
SDL_UnloadObject(openmpt.handle);
|
||||
openmpt.handle = NULL;
|
||||
openmpt.loaded = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#undef FUNCTION_LOADER
|
||||
|
||||
#endif
|
||||
|
||||
void I_StartupSound(void)
|
||||
{
|
||||
I_Assert(!sound_started);
|
||||
|
@ -131,16 +282,20 @@ void I_StartupSound(void)
|
|||
music_volume = sfx_volume = 0;
|
||||
|
||||
#if SDL_MIXER_VERSION_ATLEAST(1,2,11)
|
||||
Mix_Init(MIX_INIT_FLAC|MIX_INIT_MOD|MIX_INIT_MP3|MIX_INIT_OGG);
|
||||
Mix_Init(MIX_INIT_FLAC|MIX_INIT_MP3|MIX_INIT_OGG|MIX_INIT_MOD);
|
||||
#endif
|
||||
|
||||
if (Mix_OpenAudio(44100, AUDIO_S16SYS, 2, 2048) < 0)
|
||||
if (Mix_OpenAudio(SAMPLERATE, AUDIO_S16SYS, 2, BUFFERSIZE) < 0)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "Error starting SDL_Mixer: %s\n", Mix_GetError());
|
||||
// call to start audio failed -- we do not have it
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef HAVE_OPENMPT
|
||||
load_openmpt();
|
||||
#endif
|
||||
|
||||
sound_started = true;
|
||||
songpaused = false;
|
||||
Mix_AllocateChannels(256);
|
||||
|
@ -163,6 +318,11 @@ void I_ShutdownSound(void)
|
|||
if (gme)
|
||||
gme_delete(gme);
|
||||
#endif
|
||||
#ifdef HAVE_OPENMPT
|
||||
if (mod)
|
||||
openmpt.module_destroy(mod);
|
||||
unload_openmpt();
|
||||
#endif
|
||||
}
|
||||
|
||||
FUNCMATH void I_UpdateSound(void)
|
||||
|
@ -590,6 +750,26 @@ static void mix_gme(void *udata, Uint8 *stream, int len)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_OPENMPT
|
||||
static void mix_openmpt(void *udata, Uint8 *stream, int len)
|
||||
{
|
||||
int i;
|
||||
short *p;
|
||||
|
||||
if (!mod || songpaused)
|
||||
return;
|
||||
|
||||
(void)udata;
|
||||
|
||||
openmpt.module_set_render_param(mod, OPENMPT_MODULE_RENDER_INTERPOLATIONFILTER_LENGTH, cv_modfilter.value);
|
||||
openmpt.module_set_repeat_count(mod, -1); // Always repeat
|
||||
openmpt.module_read_interleaved_stereo(mod, SAMPLERATE, BUFFERSIZE, (short *)stream);
|
||||
|
||||
// apply volume to stream
|
||||
for (i = 0, p = (short *)stream; i < len/2; i++, p++)
|
||||
*p = ((INT32)*p) * (music_volume*internal_volume/100) / 31;
|
||||
}
|
||||
#endif
|
||||
|
||||
/// ------------------------
|
||||
/// Music System
|
||||
|
@ -614,6 +794,10 @@ musictype_t I_SongType(void)
|
|||
if (gme)
|
||||
return MU_GME;
|
||||
else
|
||||
#endif
|
||||
#ifdef HAVE_OPENMPT
|
||||
if (mod)
|
||||
return MU_MOD_EX;
|
||||
#endif
|
||||
if (!music)
|
||||
return MU_NONE;
|
||||
|
@ -632,6 +816,9 @@ boolean I_SongPlaying(void)
|
|||
return (
|
||||
#ifdef HAVE_LIBGME
|
||||
(I_SongType() == MU_GME && gme) ||
|
||||
#endif
|
||||
#ifdef HAVE_OPENMPT
|
||||
(I_SongType() == MU_MOD_EX && mod) ||
|
||||
#endif
|
||||
(boolean)music
|
||||
);
|
||||
|
@ -658,8 +845,19 @@ boolean I_SetSongSpeed(float speed)
|
|||
SDL_UnlockAudio();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
#ifdef HAVE_OPENMPT
|
||||
if (mod)
|
||||
{
|
||||
char modspd[16];
|
||||
sprintf(modspd, "%g", speed);
|
||||
openmpt.module_ctl_set(mod, "play.tempo_factor", modspd);
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
(void)speed;
|
||||
return false;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
@ -700,6 +898,11 @@ UINT32 I_GetSongLength(void)
|
|||
return max(length, 0);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
#ifdef HAVE_OPENMPT
|
||||
if (mod)
|
||||
return (UINT32)(openmpt.module_get_duration_seconds(mod) * 1000.);
|
||||
else
|
||||
#endif
|
||||
if (!music || I_SongType() == MU_MOD || I_SongType() == MU_MID)
|
||||
return 0;
|
||||
|
@ -785,6 +988,16 @@ boolean I_SetSongPosition(UINT32 position)
|
|||
// return true;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
#ifdef HAVE_OPENMPT
|
||||
if (mod)
|
||||
{
|
||||
// This isn't 100% correct because we don't account for loop points because we can't get them.
|
||||
// But if you seek past end of song, OpenMPT seeks to 0. So adjust the position anyway.
|
||||
openmpt.module_set_position_seconds(mod, (double)get_adjusted_position(position)/1000.); // returns new position
|
||||
return true;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (!music || I_SongType() == MU_MID)
|
||||
return false;
|
||||
|
@ -842,6 +1055,14 @@ UINT32 I_GetSongPosition(void)
|
|||
return max(position, 0);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
#ifdef HAVE_OPENMPT
|
||||
if (mod)
|
||||
// This will be incorrect if we adjust for length because we can't get loop points.
|
||||
// So return unadjusted. See note in SetMusicPosition: we adjust for that.
|
||||
return (UINT32)(openmpt.module_get_position_seconds(mod)*1000.);
|
||||
//return get_adjusted_position((UINT32)(openmpt.module_get_position_seconds(mod)*1000.));
|
||||
else
|
||||
#endif
|
||||
if (!music || I_SongType() == MU_MID)
|
||||
return 0;
|
||||
|
@ -881,6 +1102,9 @@ boolean I_LoadSong(char *data, size_t len)
|
|||
if (music
|
||||
#ifdef HAVE_LIBGME
|
||||
|| gme
|
||||
#endif
|
||||
#ifdef HAVE_OPENMPT
|
||||
|| mod
|
||||
#endif
|
||||
)
|
||||
I_UnloadSong();
|
||||
|
@ -995,6 +1219,43 @@ boolean I_LoadSong(char *data, size_t len)
|
|||
CONS_Debug(DBG_DETAILED, "MP3 songs are unsupported and may crash! Use OGG instead.\n");
|
||||
}
|
||||
|
||||
#ifdef HAVE_OPENMPT
|
||||
switch(Mix_GetMusicType(music))
|
||||
{
|
||||
case MUS_MODPLUG_UNUSED:
|
||||
case MUS_MOD:
|
||||
if (openmpt.loaded)
|
||||
{
|
||||
mod = openmpt.module_create_from_memory2(data, len, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
if (!mod)
|
||||
{
|
||||
mod_err = openmpt.module_error_get_last(mod);
|
||||
mod_err_str = openmpt.error_string(mod_err);
|
||||
CONS_Alert(CONS_ERROR, "openmpt_module_create_from_memory2: %s\n", mod_err_str);
|
||||
Mix_FreeMusic(music);
|
||||
music = NULL;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Mix_FreeMusic(music);
|
||||
music = NULL;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
// else, fall through
|
||||
case MUS_WAV:
|
||||
case MUS_MID:
|
||||
case MUS_OGG:
|
||||
case MUS_MP3:
|
||||
Mix_HookMusic(NULL, NULL);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Find the OGG loop point.
|
||||
loop_point = 0.0f;
|
||||
song_length = 0.0f;
|
||||
|
@ -1092,6 +1353,13 @@ void I_UnloadSong(void)
|
|||
gme_delete(gme);
|
||||
gme = NULL;
|
||||
}
|
||||
#endif
|
||||
#ifdef HAVE_OPENMPT
|
||||
if (mod)
|
||||
{
|
||||
openmpt.module_destroy(mod);
|
||||
mod = NULL;
|
||||
}
|
||||
#endif
|
||||
if (music)
|
||||
{
|
||||
|
@ -1111,6 +1379,16 @@ boolean I_PlaySong(boolean looping)
|
|||
return true;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
#ifdef HAVE_OPENMPT
|
||||
if (mod)
|
||||
{
|
||||
openmpt.module_select_subsong(mod, 0);
|
||||
current_subsong = 0;
|
||||
Mix_HookMusic(mix_openmpt, mod);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (!music)
|
||||
return false;
|
||||
|
@ -1150,6 +1428,13 @@ void I_StopSong(void)
|
|||
Mix_HookMusic(NULL, NULL);
|
||||
current_track = -1;
|
||||
}
|
||||
#endif
|
||||
#ifdef HAVE_OPENMPT
|
||||
if (mod)
|
||||
{
|
||||
Mix_HookMusic(NULL, NULL);
|
||||
current_subsong = -1;
|
||||
}
|
||||
#endif
|
||||
if (music)
|
||||
{
|
||||
|
@ -1211,15 +1496,13 @@ void I_SetMusicVolume(UINT8 volume)
|
|||
boolean I_SetSongTrack(int track)
|
||||
{
|
||||
#ifdef HAVE_LIBGME
|
||||
if (current_track == track)
|
||||
return false;
|
||||
|
||||
// If the specified track is within the number of tracks playing, then change it
|
||||
if (gme)
|
||||
{
|
||||
if (current_track == track)
|
||||
return false;
|
||||
SDL_LockAudio();
|
||||
if (track >= 0
|
||||
&& track < gme_track_count(gme))
|
||||
if (track >= 0 && track < gme_track_count(gme)-1)
|
||||
{
|
||||
gme_err_t gme_e = gme_start_track(gme, track);
|
||||
if (gme_e != NULL)
|
||||
|
@ -1236,8 +1519,24 @@ boolean I_SetSongTrack(int track)
|
|||
}
|
||||
else
|
||||
#endif
|
||||
if (I_SongType() == MU_MOD)
|
||||
return !Mix_SetMusicPosition(track);
|
||||
#ifdef HAVE_OPENMPT
|
||||
if (mod)
|
||||
{
|
||||
if (current_subsong == track)
|
||||
return false;
|
||||
SDL_LockAudio();
|
||||
if (track >= 0 && track < openmpt.module_get_num_subsongs(mod))
|
||||
{
|
||||
openmpt.module_select_subsong(mod, track);
|
||||
current_subsong = track;
|
||||
SDL_UnlockAudio();
|
||||
return true;
|
||||
}
|
||||
SDL_UnlockAudio();
|
||||
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
(void)track;
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -11,10 +11,16 @@ ifdef MINGW64
|
|||
NONX86=1
|
||||
SDL_CFLAGS?=-I../libs/SDL2/x86_64-w64-mingw32/include/SDL2 -I../libs/SDL2_mixer/x86_64-w64-mingw32/include/SDL2 -Dmain=SDL_main
|
||||
SDL_LDFLAGS?=-L../libs/SDL2/x86_64-w64-mingw32/lib -L../libs/SDL2_mixer/x86_64-w64-mingw32/lib -lmingw32 -lSDL2main -lSDL2 -mwindows
|
||||
HAVE_OPENMPT=1
|
||||
LIBOPENMPT_CFLAGS?=-I../libs/libopenmpt/inc
|
||||
LIBOPENMPT_LDFLAGS?=-L../libs/libopenmpt/lib/x86_64 -llibopenmpt
|
||||
else
|
||||
HAVE_LIBGME=1
|
||||
LIBGME_CFLAGS=-I../libs/gme/include
|
||||
LIBGME_LDFLAGS=-L../libs/gme/win32 -lgme
|
||||
HAVE_OPENMPT=1
|
||||
LIBOPENMPT_CFLAGS?=-I../libs/libopenmpt/inc
|
||||
LIBOPENMPT_LDFLAGS?=-L../libs/libopenmpt/lib/x86 -llibopenmpt
|
||||
SDL_CFLAGS?=-I../libs/SDL2/i686-w64-mingw32/include/SDL2 -I../libs/SDL2_mixer/i686-w64-mingw32/include/SDL2 -Dmain=SDL_main
|
||||
SDL_LDFLAGS?=-L../libs/SDL2/i686-w64-mingw32/lib -L../libs/SDL2_mixer/i686-w64-mingw32/lib -lmingw32 -lSDL2main -lSDL2 -mwindows
|
||||
endif
|
||||
|
|
Loading…
Reference in a new issue