diff --git a/third_party/resample/COPYING b/third_party/resample/COPYING
new file mode 100644
index 0000000..4ccd6cc
--- /dev/null
+++ b/third_party/resample/COPYING
@@ -0,0 +1,463 @@
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations
+below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control
+compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply, and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License
+may add an explicit geographical distribution limitation excluding those
+countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
diff --git a/third_party/resample/include/resamplesubs.h b/third_party/resample/include/resamplesubs.h
new file mode 100644
index 0000000..76563b7
--- /dev/null
+++ b/third_party/resample/include/resamplesubs.h
@@ -0,0 +1,18 @@
+#ifndef __RESAMPLESUBS_H__
+#define __RESAMPLESUBS_H__
+
+typedef char           RES_BOOL;
+typedef short          RES_HWORD;
+typedef int            RES_WORD;
+typedef unsigned short RES_UHWORD;
+typedef unsigned int   RES_UWORD;
+
+int res_SrcLinear(const RES_HWORD X[], RES_HWORD Y[], 
+		  double pFactor, RES_UHWORD nx);
+int res_Resample(const RES_HWORD X[], RES_HWORD Y[], double pFactor, 
+	         RES_UHWORD nx, RES_BOOL LargeF, RES_BOOL Interp);
+int res_GetXOFF(double pFactor, RES_BOOL LargeF);
+
+
+#endif
+
diff --git a/third_party/resample/resample.c b/third_party/resample/resample.c
deleted file mode 100644
index 5e2a8aa..0000000
--- a/third_party/resample/resample.c
+++ /dev/null
@@ -1,695 +0,0 @@
-/* $Id$ */
-/*
- * Based on:
- * resample-1.8.tar.gz from the 
- * Digital Audio Resampling Home Page located at
- * http://www-ccrma.stanford.edu/~jos/resample/.
- *
- * SOFTWARE FOR SAMPLING-RATE CONVERSION AND FIR DIGITAL FILTER DESIGN
- *
- * Snippet from the resample.1 man page:
- * 
- * HISTORY
- *
- * The first version of this software was written by Julius O. Smith III
- * <jos@ccrma.stanford.edu> at CCRMA <http://www-ccrma.stanford.edu> in
- * 1981.  It was called SRCONV and was written in SAIL for PDP-10
- * compatible machines.  The algorithm was first published in
- * 
- * Smith, Julius O. and Phil Gossett. ``A Flexible Sampling-Rate
- * Conversion Method,'' Proceedings (2): 19.4.1-19.4.4, IEEE Conference
- * on Acoustics, Speech, and Signal Processing, San Diego, March 1984.
- * 
- * An expanded tutorial based on this paper is available at the Digital
- * Audio Resampling Home Page given above.
- * 
- * Circa 1988, the SRCONV program was translated from SAIL to C by
- * Christopher Lee Fraley working with Roger Dannenberg at CMU.
- * 
- * Since then, the C version has been maintained by jos.
- * 
- * Sndlib support was added 6/99 by John Gibson <jgg9c@virginia.edu>.
- * 
- * The resample program is free software distributed in accordance
- * with the Lesser GNU Public License (LGPL).  There is NO warranty; not
- * even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* PJMEDIA modification:
- *  - remove resample(), just use SrcUp, SrcUD, and SrcLinear directly.
- *  - move FilterUp() and FilterUD() from filterkit.c
- *  - move stddefs.h and resample.h to this file.
- *  - const correctness.
- */
-#include <pjmedia/resample.h>
-#include <pjmedia/errno.h>
-#include <pj/assert.h>
-#include <pj/log.h>
-#include <pj/pool.h>
-
-
-#define THIS_FILE   "resample.c"
-
-
-/*
- * Taken from stddefs.h
- */
-#ifndef PI
-#define PI (3.14159265358979232846)
-#endif
-
-#ifndef PI2
-#define PI2 (6.28318530717958465692)
-#endif
-
-#define D2R (0.01745329348)          /* (2*pi)/360 */
-#define R2D (57.29577951)            /* 360/(2*pi) */
-
-#ifndef MAX
-#define MAX(x,y) ((x)>(y) ?(x):(y))
-#endif
-#ifndef MIN
-#define MIN(x,y) ((x)<(y) ?(x):(y))
-#endif
-
-#ifndef ABS
-#define ABS(x)   ((x)<0   ?(-(x)):(x))
-#endif
-
-#ifndef SGN
-#define SGN(x)   ((x)<0   ?(-1):((x)==0?(0):(1)))
-#endif
-
-typedef char           RES_BOOL;
-typedef short          RES_HWORD;
-typedef int            RES_WORD;
-typedef unsigned short RES_UHWORD;
-typedef unsigned int   RES_UWORD;
-
-#define MAX_HWORD (32767)
-#define MIN_HWORD (-32768)
-
-#ifdef DEBUG
-#define INLINE
-#else
-#define INLINE inline
-#endif
-
-/*
- * Taken from resample.h
- *
- * The configuration constants below govern
- * the number of bits in the input sample and filter coefficients, the 
- * number of bits to the right of the binary-point for fixed-point math, etc.
- *
- */
-
-/* Conversion constants */
-#define Nhc       8
-#define Na        7
-#define Np       (Nhc+Na)
-#define Npc      (1<<Nhc)
-#define Amask    ((1<<Na)-1)
-#define Pmask    ((1<<Np)-1)
-#define Nh       16
-#define Nb       16
-#define Nhxn     14
-#define Nhg      (Nh-Nhxn)
-#define NLpScl   13
-
-/* Description of constants:
- *
- * Npc - is the number of look-up values available for the lowpass filter
- *    between the beginning of its impulse response and the "cutoff time"
- *    of the filter.  The cutoff time is defined as the reciprocal of the
- *    lowpass-filter cut off frequence in Hz.  For example, if the
- *    lowpass filter were a sinc function, Npc would be the index of the
- *    impulse-response lookup-table corresponding to the first zero-
- *    crossing of the sinc function.  (The inverse first zero-crossing
- *    time of a sinc function equals its nominal cutoff frequency in Hz.)
- *    Npc must be a power of 2 due to the details of the current
- *    implementation. The default value of 512 is sufficiently high that
- *    using linear interpolation to fill in between the table entries
- *    gives approximately 16-bit accuracy in filter coefficients.
- *
- * Nhc - is log base 2 of Npc.
- *
- * Na - is the number of bits devoted to linear interpolation of the
- *    filter coefficients.
- *
- * Np - is Na + Nhc, the number of bits to the right of the binary point
- *    in the integer "time" variable. To the left of the point, it indexes
- *    the input array (X), and to the right, it is interpreted as a number
- *    between 0 and 1 sample of the input X.  Np must be less than 16 in
- *    this implementation.
- *
- * Nh - is the number of bits in the filter coefficients. The sum of Nh and
- *    the number of bits in the input data (typically 16) cannot exceed 32.
- *    Thus Nh should be 16.  The largest filter coefficient should nearly
- *    fill 16 bits (32767).
- *
- * Nb - is the number of bits in the input data. The sum of Nb and Nh cannot
- *    exceed 32.
- *
- * Nhxn - is the number of bits to right shift after multiplying each input
- *    sample times a filter coefficient. It can be as great as Nh and as
- *    small as 0. Nhxn = Nh-2 gives 2 guard bits in the multiply-add
- *    accumulation.  If Nhxn=0, the accumulation will soon overflow 32 bits.
- *
- * Nhg - is the number of guard bits in mpy-add accumulation (equal to Nh-Nhxn)
- *
- * NLpScl - is the number of bits allocated to the unity-gain normalization
- *    factor.  The output of the lowpass filter is multiplied by LpScl and
- *    then right-shifted NLpScl bits. To avoid overflow, we must have 
- *    Nb+Nhg+NLpScl < 32.
- */
-
-
-#ifdef _MSC_VER
-#   pragma warning(push, 3)
-//#   pragma warning(disable: 4245)   // Conversion from uint to ushort
-#   pragma warning(disable: 4244)   // Conversion from double to uint
-#   pragma warning(disable: 4146)   // unary minus operator applied to unsigned type, result still unsigned
-#   pragma warning(disable: 4761)   // integral size mismatch in argument; conversion supplied
-#endif
-
-#if defined(PJMEDIA_HAS_SMALL_FILTER) && PJMEDIA_HAS_SMALL_FILTER!=0
-#   include "smallfilter.h"
-#else
-#   define SMALL_FILTER_NMULT	0
-#   define SMALL_FILTER_SCALE	0
-#   define SMALL_FILTER_NWING	0
-#   define SMALL_FILTER_IMP	NULL
-#   define SMALL_FILTER_IMPD	NULL
-#endif
-
-#if defined(PJMEDIA_HAS_LARGE_FILTER) && PJMEDIA_HAS_LARGE_FILTER!=0
-#   include "largefilter.h"
-#else
-#   define LARGE_FILTER_NMULT	0
-#   define LARGE_FILTER_SCALE	0
-#   define LARGE_FILTER_NWING	0
-#   define LARGE_FILTER_IMP	NULL
-#   define LARGE_FILTER_IMPD	NULL
-#endif
-
-
-#undef INLINE
-#define INLINE
-#define HAVE_FILTER 0    
-
-#ifndef NULL
-#   define NULL	0
-#endif
-
-
-static INLINE RES_HWORD WordToHword(RES_WORD v, int scl)
-{
-    RES_HWORD out;
-    RES_WORD llsb = (1<<(scl-1));
-    v += llsb;		/* round */
-    v >>= scl;
-    if (v>MAX_HWORD) {
-	v = MAX_HWORD;
-    } else if (v < MIN_HWORD) {
-	v = MIN_HWORD;
-    }	
-    out = (RES_HWORD) v;
-    return out;
-}
-
-/* Sampling rate conversion using linear interpolation for maximum speed.
- */
-static int 
-  SrcLinear(const RES_HWORD X[], RES_HWORD Y[], double pFactor, RES_UHWORD nx)
-{
-    RES_HWORD iconst;
-    RES_UWORD time = 0;
-    const RES_HWORD *xp;
-    RES_HWORD *Ystart, *Yend;
-    RES_WORD v,x1,x2;
-    
-    double dt;                  /* Step through input signal */ 
-    RES_UWORD dtb;                  /* Fixed-point version of Dt */
-    RES_UWORD endTime;              /* When time reaches EndTime, return to user */
-    
-    dt = 1.0/pFactor;            /* Output sampling period */
-    dtb = dt*(1<<Np) + 0.5;     /* Fixed-point representation */
-    
-    Ystart = Y;
-    Yend = Ystart + (unsigned)(nx * pFactor);
-    endTime = time + (1<<Np)*(RES_WORD)nx;
-    while (time < endTime)
-    {
-	iconst = (time) & Pmask;
-	xp = &X[(time)>>Np];      /* Ptr to current input sample */
-	x1 = *xp++;
-	x2 = *xp;
-	x1 *= ((1<<Np)-iconst);
-	x2 *= iconst;
-	v = x1 + x2;
-	*Y++ = WordToHword(v,Np);   /* Deposit output */
-	time += dtb;		    /* Move to next sample by time increment */
-    }
-    return (Y - Ystart);            /* Return number of output samples */
-}
-
-static RES_WORD FilterUp(const RES_HWORD Imp[], const RES_HWORD ImpD[], 
-		     RES_UHWORD Nwing, RES_BOOL Interp,
-		     const RES_HWORD *Xp, RES_HWORD Ph, RES_HWORD Inc)
-{
-    const RES_HWORD *Hp;
-    const RES_HWORD *Hdp = NULL;
-    const RES_HWORD *End;
-    RES_HWORD a = 0;
-    RES_WORD v, t;
-    
-    v=0;
-    Hp = &Imp[Ph>>Na];
-    End = &Imp[Nwing];
-    if (Interp) {
-	Hdp = &ImpD[Ph>>Na];
-	a = Ph & Amask;
-    }
-    if (Inc == 1)		/* If doing right wing...              */
-    {				/* ...drop extra coeff, so when Ph is  */
-	End--;			/*    0.5, we don't do too many mult's */
-	if (Ph == 0)		/* If the phase is zero...           */
-	{			/* ...then we've already skipped the */
-	    Hp += Npc;		/*    first sample, so we must also  */
-	    Hdp += Npc;		/*    skip ahead in Imp[] and ImpD[] */
-	}
-    }
-    if (Interp)
-      while (Hp < End) {
-	  t = *Hp;		/* Get filter coeff */
-	  t += (((RES_WORD)*Hdp)*a)>>Na; /* t is now interp'd filter coeff */
-	  Hdp += Npc;		/* Filter coeff differences step */
-	  t *= *Xp;		/* Mult coeff by input sample */
-	  if (t & (1<<(Nhxn-1)))  /* Round, if needed */
-	    t += (1<<(Nhxn-1));
-	  t >>= Nhxn;		/* Leave some guard bits, but come back some */
-	  v += t;			/* The filter output */
-	  Hp += Npc;		/* Filter coeff step */
-
-	  Xp += Inc;		/* Input signal step. NO CHECK ON BOUNDS */
-      } 
-    else 
-      while (Hp < End) {
-	  t = *Hp;		/* Get filter coeff */
-	  t *= *Xp;		/* Mult coeff by input sample */
-	  if (t & (1<<(Nhxn-1)))  /* Round, if needed */
-	    t += (1<<(Nhxn-1));
-	  t >>= Nhxn;		/* Leave some guard bits, but come back some */
-	  v += t;			/* The filter output */
-	  Hp += Npc;		/* Filter coeff step */
-	  Xp += Inc;		/* Input signal step. NO CHECK ON BOUNDS */
-      }
-    return(v);
-}
-
-
-static RES_WORD FilterUD(const RES_HWORD Imp[], const RES_HWORD ImpD[],
-		     RES_UHWORD Nwing, RES_BOOL Interp,
-		     const RES_HWORD *Xp, RES_HWORD Ph, RES_HWORD Inc, RES_UHWORD dhb)
-{
-    RES_HWORD a;
-    const RES_HWORD *Hp, *Hdp, *End;
-    RES_WORD v, t;
-    RES_UWORD Ho;
-    
-    v=0;
-    Ho = (Ph*(RES_UWORD)dhb)>>Np;
-    End = &Imp[Nwing];
-    if (Inc == 1)		/* If doing right wing...              */
-    {				/* ...drop extra coeff, so when Ph is  */
-	End--;			/*    0.5, we don't do too many mult's */
-	if (Ph == 0)		/* If the phase is zero...           */
-	  Ho += dhb;		/* ...then we've already skipped the */
-    }				/*    first sample, so we must also  */
-				/*    skip ahead in Imp[] and ImpD[] */
-    if (Interp)
-      while ((Hp = &Imp[Ho>>Na]) < End) {
-	  t = *Hp;		/* Get IR sample */
-	  Hdp = &ImpD[Ho>>Na];  /* get interp (lower Na) bits from diff table*/
-	  a = Ho & Amask;	/* a is logically between 0 and 1 */
-	  t += (((RES_WORD)*Hdp)*a)>>Na; /* t is now interp'd filter coeff */
-	  t *= *Xp;		/* Mult coeff by input sample */
-	  if (t & 1<<(Nhxn-1))	/* Round, if needed */
-	    t += 1<<(Nhxn-1);
-	  t >>= Nhxn;		/* Leave some guard bits, but come back some */
-	  v += t;			/* The filter output */
-	  Ho += dhb;		/* IR step */
-	  Xp += Inc;		/* Input signal step. NO CHECK ON BOUNDS */
-      }
-    else 
-      while ((Hp = &Imp[Ho>>Na]) < End) {
-	  t = *Hp;		/* Get IR sample */
-	  t *= *Xp;		/* Mult coeff by input sample */
-	  if (t & 1<<(Nhxn-1))	/* Round, if needed */
-	    t += 1<<(Nhxn-1);
-	  t >>= Nhxn;		/* Leave some guard bits, but come back some */
-	  v += t;			/* The filter output */
-	  Ho += dhb;		/* IR step */
-	  Xp += Inc;		/* Input signal step. NO CHECK ON BOUNDS */
-      }
-    return(v);
-}
-
-/* Sampling rate up-conversion only subroutine;
- * Slightly faster than down-conversion;
- */
-static int SrcUp(const RES_HWORD X[], RES_HWORD Y[], double pFactor, 
-		 RES_UHWORD nx, RES_UHWORD pNwing, RES_UHWORD pLpScl,
-		 const RES_HWORD pImp[], const RES_HWORD pImpD[], RES_BOOL Interp)
-{
-    const RES_HWORD *xp;
-    RES_HWORD *Ystart, *Yend;
-    RES_WORD v;
-    
-    double dt;                  /* Step through input signal */ 
-    RES_UWORD dtb;                  /* Fixed-point version of Dt */
-    RES_UWORD time = 0;
-    RES_UWORD endTime;              /* When time reaches EndTime, return to user */
-    
-    dt = 1.0/pFactor;            /* Output sampling period */
-    dtb = dt*(1<<Np) + 0.5;     /* Fixed-point representation */
-    
-    Ystart = Y;
-    Yend = Ystart + (unsigned)(nx * pFactor);
-    endTime = time + (1<<Np)*(RES_WORD)nx;
-    while (time < endTime)
-    {
-	xp = &X[time>>Np];      /* Ptr to current input sample */
-	/* Perform left-wing inner product */
-	v = 0;
-	v = FilterUp(pImp, pImpD, pNwing, Interp, xp, (RES_HWORD)(time&Pmask),-1);
-
-	/* Perform right-wing inner product */
-	v += FilterUp(pImp, pImpD, pNwing, Interp, xp+1,  (RES_HWORD)((-time)&Pmask),1);
-
-	v >>= Nhg;		/* Make guard bits */
-	v *= pLpScl;		/* Normalize for unity filter gain */
-	*Y++ = WordToHword(v,NLpScl);   /* strip guard bits, deposit output */
-	time += dtb;		/* Move to next sample by time increment */
-    }
-    return (Y - Ystart);        /* Return the number of output samples */
-}
-
-
-/* Sampling rate conversion subroutine */
-
-static int SrcUD(const RES_HWORD X[], RES_HWORD Y[], double pFactor, 
-		 RES_UHWORD nx, RES_UHWORD pNwing, RES_UHWORD pLpScl,
-		 const RES_HWORD pImp[], const RES_HWORD pImpD[], RES_BOOL Interp)
-{
-    const RES_HWORD *xp;
-    RES_HWORD *Ystart, *Yend;
-    RES_WORD v;
-    
-    double dh;                  /* Step through filter impulse response */
-    double dt;                  /* Step through input signal */
-    RES_UWORD time = 0;
-    RES_UWORD endTime;          /* When time reaches EndTime, return to user */
-    RES_UWORD dhb, dtb;         /* Fixed-point versions of Dh,Dt */
-    
-    dt = 1.0/pFactor;            /* Output sampling period */
-    dtb = dt*(1<<Np) + 0.5;     /* Fixed-point representation */
-    
-    dh = MIN(Npc, pFactor*Npc);  /* Filter sampling period */
-    dhb = dh*(1<<Na) + 0.5;     /* Fixed-point representation */
-    
-    Ystart = Y;
-    Yend = Ystart + (unsigned)(nx * pFactor);
-    endTime = time + (1<<Np)*(RES_WORD)nx;
-    while (time < endTime)
-    {
-	xp = &X[time>>Np];	/* Ptr to current input sample */
-	v = FilterUD(pImp, pImpD, pNwing, Interp, xp, (RES_HWORD)(time&Pmask),
-		     -1, dhb);	/* Perform left-wing inner product */
-	v += FilterUD(pImp, pImpD, pNwing, Interp, xp+1, (RES_HWORD)((-time)&Pmask),
-		      1, dhb);	/* Perform right-wing inner product */
-	v >>= Nhg;		/* Make guard bits */
-	v *= pLpScl;		/* Normalize for unity filter gain */
-	*Y++ = WordToHword(v,NLpScl);   /* strip guard bits, deposit output */
-	time += dtb;		/* Move to next sample by time increment */
-    }
-    return (Y - Ystart);        /* Return the number of output samples */
-}
-
-
-/* ***************************************************************************
- *
- * PJMEDIA RESAMPLE 
- *
- * ***************************************************************************
- */
-
-struct pjmedia_resample
-{
-    double	 factor;	/* Conversion factor = rate_out / rate_in.  */
-    pj_bool_t	 large_filter;	/* Large filter?			    */
-    pj_bool_t	 high_quality;	/* Not fast?				    */
-    unsigned	 xoff;		/* History and lookahead size, in samples   */
-    unsigned	 frame_size;	/* Samples per frame.			    */
-    pj_int16_t	*buffer;	/* Input buffer.			    */
-};
-
-
-PJ_DEF(pj_status_t) pjmedia_resample_create( pj_pool_t *pool,
-					     pj_bool_t high_quality,
-					     pj_bool_t large_filter,
-					     unsigned channel_count,
-					     unsigned rate_in,
-					     unsigned rate_out,
-					     unsigned samples_per_frame,
-					     pjmedia_resample **p_resample)
-{
-    pjmedia_resample *resample;
-
-    PJ_ASSERT_RETURN(pool && p_resample && rate_in &&
-		     rate_out && samples_per_frame, PJ_EINVAL);
-
-    resample = pj_pool_alloc(pool, sizeof(pjmedia_resample));
-    PJ_ASSERT_RETURN(resample, PJ_ENOMEM);
-
-    PJ_UNUSED_ARG(channel_count);
-
-    /*
-     * If we're downsampling, always use the fast algorithm since it seems
-     * to yield the same quality.
-     */
-    if (rate_out < rate_in) {
-	//no this is not a good idea. It sounds pretty good with speech,
-	//but very poor with background noise etc.
-	//high_quality = 0;
-    }
-
-#if !defined(PJMEDIA_HAS_LARGE_FILTER) || PJMEDIA_HAS_LARGE_FILTER==0
-    /*
-     * If large filter is excluded in the build, then prevent application
-     * from using it.
-     */
-    if (high_quality && large_filter) {
-	large_filter = PJ_FALSE;
-	PJ_LOG(5,(THIS_FILE, 
-		  "Resample uses small filter because large filter is "
-		  "disabled"));
-    }
-#endif
-
-#if !defined(PJMEDIA_HAS_SMALL_FILTER) || PJMEDIA_HAS_SMALL_FILTER==0
-    /*
-     * If small filter is excluded in the build and application wants to
-     * use it, then drop to linear conversion.
-     */
-    if (high_quality && large_filter == 0) {
-	high_quality = PJ_FALSE;
-	PJ_LOG(4,(THIS_FILE, 
-		  "Resample uses linear because small filter is disabled"));
-    }
-#endif
-
-    resample->factor = rate_out * 1.0 / rate_in;
-    resample->large_filter = large_filter;
-    resample->high_quality = high_quality;
-    resample->frame_size = samples_per_frame;
-
-    if (high_quality) {
-	unsigned size;
-
-	/* This is a bug in xoff calculation, thanks Stephane Lussier
-	 * of Macadamian dot com.
-	 *   resample->xoff = large_filter ? 32 : 6;
-	 */
-	if (large_filter)
-	    resample->xoff = (LARGE_FILTER_NMULT + 1) / 2.0  *  
-			     MAX(1.0, 1.0/resample->factor);
-	else
-	    resample->xoff = (SMALL_FILTER_NMULT + 1) / 2.0  *  
-			     MAX(1.0, 1.0/resample->factor);
-
-
-	size = (samples_per_frame + 2*resample->xoff) * sizeof(pj_int16_t);
-	resample->buffer = pj_pool_alloc(pool, size);
-	PJ_ASSERT_RETURN(resample->buffer, PJ_ENOMEM);
-
-	pjmedia_zero_samples(resample->buffer, resample->xoff*2);
-
-
-    } else {
-	resample->xoff = 0;
-    }
-
-    *p_resample = resample;
-
-    PJ_LOG(5,(THIS_FILE, "resample created: %s qualiy, %s filter, in/out "
-			  "rate=%d/%d", 
-			  (high_quality?"high":"low"),
-			  (large_filter?"large":"small"),
-			  rate_in, rate_out));
-    return PJ_SUCCESS;
-}
-
-
-
-PJ_DEF(void) pjmedia_resample_run( pjmedia_resample *resample,
-				   const pj_int16_t *input,
-				   pj_int16_t *output )
-{
-    PJ_ASSERT_ON_FAIL(resample, return);
-
-    if (resample->high_quality) {
-	pj_int16_t *dst_buf;
-	const pj_int16_t *src_buf;
-
-	/* Okay chaps, here's how we do resampling.
-	 *
-	 * The original resample algorithm requires xoff samples *before* the
-	 * input buffer as history, and another xoff samples *after* the
-	 * end of the input buffer as lookahead. Since application can only
-	 * supply framesize buffer on each run, PJMEDIA needs to arrange the
-	 * buffer to meet these requirements.
-	 *
-	 * So here comes the trick.
-	 *
-	 * First of all, because of the history and lookahead requirement, 
-	 * resample->buffer need to accomodate framesize+2*xoff samples in its
-	 * buffer. This is done when the buffer is created.
-	 *
-	 * On the first run, the input frame (supplied by application) is
-	 * copied to resample->buffer at 2*xoff position. The first 2*xoff
-	 * samples are initially zeroed (in the initialization). The resample
-	 * algorithm then invoked at resample->buffer+xoff ONLY, thus giving
-	 * it one xoff at the beginning as zero, and one xoff at the end
-	 * as the end of the original input. The resample algorithm will see
-	 * that the first xoff samples in the input as zero.
-	 *
-	 * So here's the layout of resample->buffer on the first run.
-	 *
-	 * run 0 
-	 *     +------+------+--------------+
-	 *     | 0000 | 0000 |  frame0...   |
-	 *     +------+------+--------------+
-	 *     ^      ^      ^              ^
-         *     0    xoff  2*xoff       size+2*xoff 
-         *
-	 * (Note again: resample algorithm is called at resample->buffer+xoff)
-	 *
-	 * At the end of the run, 2*xoff samples from the end of 
-	 * resample->buffer are copied to the beginning of resample->buffer.
-	 * The first xoff part of this will be used as history for the next
-	 * run, and the second xoff part of this is actually the start of
-	 * resampling for the next run.
-	 *
-	 * And the first run completes, the function returns.
-	 *
-	 * 
-	 * On the next run, the input frame supplied by application is again
-	 * copied at 2*xoff position in the resample->buffer, and the 
-	 * resample algorithm is again invoked at resample->buffer+xoff 
-	 * position. So effectively, the resample algorithm will start its
-	 * operation on the last xoff from the previous frame, and gets the
-	 * history from the last 2*xoff of the previous frame, and the look-
-	 * ahead from the last xoff of current frame.
-	 *
-	 * So on this run, the buffer layout is:
-	 *
-	 * run 1
-	 *     +------+------+--------------+
-	 *     | frm0 | frm0 |  frame1...   |
-	 *     +------+------+--------------+
-	 *     ^      ^      ^              ^
-         *     0    xoff  2*xoff       size+2*xoff 
-	 *
-	 * As you can see from above diagram, the resampling algorithm is
-	 * actually called from the last xoff part of previous frame (frm0).
-	 *
-	 * And so on the process continues for the next frame, and the next,
-	 * and the next, ...
-	 *
-	 */
-	dst_buf = resample->buffer + resample->xoff*2;
-	pjmedia_copy_samples(dst_buf, input, resample->frame_size);
-	    
-	if (resample->factor >= 1) {
-
-	    if (resample->large_filter) {
-		SrcUp(resample->buffer + resample->xoff, output,
-		      resample->factor, resample->frame_size,
-		      LARGE_FILTER_NWING, LARGE_FILTER_SCALE,
-		      LARGE_FILTER_IMP, LARGE_FILTER_IMPD,
-		      PJ_TRUE);
-	    } else {
-		SrcUp(resample->buffer + resample->xoff, output,
-		      resample->factor, resample->frame_size,
-		      SMALL_FILTER_NWING, SMALL_FILTER_SCALE,
-		      SMALL_FILTER_IMP, SMALL_FILTER_IMPD,
-		      PJ_TRUE);
-	    }
-
-	} else {
-
-	    if (resample->large_filter) {
-
-		SrcUD( resample->buffer + resample->xoff, output,
-		       resample->factor, resample->frame_size,
-		       LARGE_FILTER_NWING, 
-		       LARGE_FILTER_SCALE * resample->factor + 0.5,
-		       LARGE_FILTER_IMP, LARGE_FILTER_IMPD,
-		       PJ_TRUE);
-
-	    } else {
-
-		SrcUD( resample->buffer + resample->xoff, output,
-		       resample->factor, resample->frame_size,
-		       SMALL_FILTER_NWING, 
-		       SMALL_FILTER_SCALE * resample->factor + 0.5,
-		       SMALL_FILTER_IMP, SMALL_FILTER_IMPD,
-		       PJ_TRUE);
-
-	    }
-
-	}
-
-	dst_buf = resample->buffer;
-	src_buf = input + resample->frame_size - resample->xoff*2;
-	pjmedia_copy_samples(dst_buf, src_buf, resample->xoff * 2);
-
-    } else {
-	SrcLinear( input, output, resample->factor, resample->frame_size);
-    }
-}
-
-PJ_DEF(unsigned) pjmedia_resample_get_input_size(pjmedia_resample *resample)
-{
-    PJ_ASSERT_RETURN(resample != NULL, 0);
-    return resample->frame_size;
-}
-
-PJ_DEF(void) pjmedia_resample_destroy(pjmedia_resample *resample)
-{
-    PJ_UNUSED_ARG(resample);
-}
-
-
diff --git a/third_party/resample/largefilter.h b/third_party/resample/src/largefilter.h
similarity index 100%
rename from third_party/resample/largefilter.h
rename to third_party/resample/src/largefilter.h
diff --git a/third_party/resample/src/resample.h b/third_party/resample/src/resample.h
new file mode 100644
index 0000000..3521251
--- /dev/null
+++ b/third_party/resample/src/resample.h
@@ -0,0 +1,67 @@
+/*
+ * The configuration constants below govern
+ * the number of bits in the input sample and filter coefficients, the 
+ * number of bits to the right of the binary-point for fixed-point math, etc.
+ *
+ */
+
+/* Conversion constants */
+#define Nhc       8
+#define Na        7
+#define Np       (Nhc+Na)
+#define Npc      (1<<Nhc)
+#define Amask    ((1<<Na)-1)
+#define Pmask    ((1<<Np)-1)
+#define Nh       16
+#define Nb       16
+#define Nhxn     14
+#define Nhg      (Nh-Nhxn)
+#define NLpScl   13
+
+/* Description of constants:
+ *
+ * Npc - is the number of look-up values available for the lowpass filter
+ *    between the beginning of its impulse response and the "cutoff time"
+ *    of the filter.  The cutoff time is defined as the reciprocal of the
+ *    lowpass-filter cut off frequence in Hz.  For example, if the
+ *    lowpass filter were a sinc function, Npc would be the index of the
+ *    impulse-response lookup-table corresponding to the first zero-
+ *    crossing of the sinc function.  (The inverse first zero-crossing
+ *    time of a sinc function equals its nominal cutoff frequency in Hz.)
+ *    Npc must be a power of 2 due to the details of the current
+ *    implementation. The default value of 512 is sufficiently high that
+ *    using linear interpolation to fill in between the table entries
+ *    gives approximately 16-bit accuracy in filter coefficients.
+ *
+ * Nhc - is log base 2 of Npc.
+ *
+ * Na - is the number of bits devoted to linear interpolation of the
+ *    filter coefficients.
+ *
+ * Np - is Na + Nhc, the number of bits to the right of the binary point
+ *    in the integer "time" variable. To the left of the point, it indexes
+ *    the input array (X), and to the right, it is interpreted as a number
+ *    between 0 and 1 sample of the input X.  Np must be less than 16 in
+ *    this implementation.
+ *
+ * Nh - is the number of bits in the filter coefficients. The sum of Nh and
+ *    the number of bits in the input data (typically 16) cannot exceed 32.
+ *    Thus Nh should be 16.  The largest filter coefficient should nearly
+ *    fill 16 bits (32767).
+ *
+ * Nb - is the number of bits in the input data. The sum of Nb and Nh cannot
+ *    exceed 32.
+ *
+ * Nhxn - is the number of bits to right shift after multiplying each input
+ *    sample times a filter coefficient. It can be as great as Nh and as
+ *    small as 0. Nhxn = Nh-2 gives 2 guard bits in the multiply-add
+ *    accumulation.  If Nhxn=0, the accumulation will soon overflow 32 bits.
+ *
+ * Nhg - is the number of guard bits in mpy-add accumulation (equal to Nh-Nhxn)
+ *
+ * NLpScl - is the number of bits allocated to the unity-gain normalization
+ *    factor.  The output of the lowpass filter is multiplied by LpScl and
+ *    then right-shifted NLpScl bits. To avoid overflow, we must have 
+ *    Nb+Nhg+NLpScl < 32.
+ */
+
diff --git a/third_party/resample/src/resamplesubs.c b/third_party/resample/src/resamplesubs.c
new file mode 100644
index 0000000..ae78add
--- /dev/null
+++ b/third_party/resample/src/resamplesubs.c
@@ -0,0 +1,365 @@
+/* $Id$ */
+/*
+ * Digital Audio Resampling Home Page located at
+ * http://www-ccrma.stanford.edu/~jos/resample/.
+ *
+ * SOFTWARE FOR SAMPLING-RATE CONVERSION AND FIR DIGITAL FILTER DESIGN
+ *
+ * Snippet from the resample.1 man page:
+ * 
+ * HISTORY
+ *
+ * The first version of this software was written by Julius O. Smith III
+ * <jos@ccrma.stanford.edu> at CCRMA <http://www-ccrma.stanford.edu> in
+ * 1981.  It was called SRCONV and was written in SAIL for PDP-10
+ * compatible machines.  The algorithm was first published in
+ * 
+ * Smith, Julius O. and Phil Gossett. ``A Flexible Sampling-Rate
+ * Conversion Method,'' Proceedings (2): 19.4.1-19.4.4, IEEE Conference
+ * on Acoustics, Speech, and Signal Processing, San Diego, March 1984.
+ * 
+ * An expanded tutorial based on this paper is available at the Digital
+ * Audio Resampling Home Page given above.
+ * 
+ * Circa 1988, the SRCONV program was translated from SAIL to C by
+ * Christopher Lee Fraley working with Roger Dannenberg at CMU.
+ * 
+ * Since then, the C version has been maintained by jos.
+ * 
+ * Sndlib support was added 6/99 by John Gibson <jgg9c@virginia.edu>.
+ * 
+ * The resample program is free software distributed in accordance
+ * with the Lesser GNU Public License (LGPL).  There is NO warranty; not
+ * even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+/* PJMEDIA modification:
+ *  - remove resample(), just use SrcUp, SrcUD, and SrcLinear directly.
+ *  - move FilterUp() and FilterUD() from filterkit.c
+ *  - move stddefs.h and resample.h to this file.
+ *  - const correctness.
+ */
+
+#include <resamplesubs.h>
+#include "config.h"
+#include "stddefs.h"
+#include "resample.h"
+
+
+#ifdef _MSC_VER
+#   pragma warning(push, 3)
+//#   pragma warning(disable: 4245)   // Conversion from uint to ushort
+#   pragma warning(disable: 4244)   // Conversion from double to uint
+#   pragma warning(disable: 4146)   // unary minus operator applied to unsigned type, result still unsigned
+#   pragma warning(disable: 4761)   // integral size mismatch in argument; conversion supplied
+#endif
+
+#if defined(RESAMPLE_HAS_SMALL_FILTER) && RESAMPLE_HAS_SMALL_FILTER!=0
+#   include "smallfilter.h"
+#else
+#   define SMALL_FILTER_NMULT	0
+#   define SMALL_FILTER_SCALE	0
+#   define SMALL_FILTER_NWING	0
+#   define SMALL_FILTER_IMP	NULL
+#   define SMALL_FILTER_IMPD	NULL
+#endif
+
+#if defined(RESAMPLE_HAS_LARGE_FILTER) && RESAMPLE_HAS_LARGE_FILTER!=0
+#   include "largefilter.h"
+#else
+#   define LARGE_FILTER_NMULT	0
+#   define LARGE_FILTER_SCALE	0
+#   define LARGE_FILTER_NWING	0
+#   define LARGE_FILTER_IMP	NULL
+#   define LARGE_FILTER_IMPD	NULL
+#endif
+
+
+#undef INLINE
+#define INLINE
+#define HAVE_FILTER 0    
+
+#ifndef NULL
+#   define NULL	0
+#endif
+
+
+static INLINE RES_HWORD WordToHword(RES_WORD v, int scl)
+{
+    RES_HWORD out;
+    RES_WORD llsb = (1<<(scl-1));
+    v += llsb;		/* round */
+    v >>= scl;
+    if (v>MAX_HWORD) {
+	v = MAX_HWORD;
+    } else if (v < MIN_HWORD) {
+	v = MIN_HWORD;
+    }	
+    out = (RES_HWORD) v;
+    return out;
+}
+
+/* Sampling rate conversion using linear interpolation for maximum speed.
+ */
+static int 
+  SrcLinear(const RES_HWORD X[], RES_HWORD Y[], double pFactor, RES_UHWORD nx)
+{
+    RES_HWORD iconst;
+    RES_UWORD time = 0;
+    const RES_HWORD *xp;
+    RES_HWORD *Ystart, *Yend;
+    RES_WORD v,x1,x2;
+    
+    double dt;                  /* Step through input signal */ 
+    RES_UWORD dtb;                  /* Fixed-point version of Dt */
+    RES_UWORD endTime;              /* When time reaches EndTime, return to user */
+    
+    dt = 1.0/pFactor;            /* Output sampling period */
+    dtb = dt*(1<<Np) + 0.5;     /* Fixed-point representation */
+    
+    Ystart = Y;
+    Yend = Ystart + (unsigned)(nx * pFactor);
+    endTime = time + (1<<Np)*(RES_WORD)nx;
+    while (time < endTime)
+    {
+	iconst = (time) & Pmask;
+	xp = &X[(time)>>Np];      /* Ptr to current input sample */
+	x1 = *xp++;
+	x2 = *xp;
+	x1 *= ((1<<Np)-iconst);
+	x2 *= iconst;
+	v = x1 + x2;
+	*Y++ = WordToHword(v,Np);   /* Deposit output */
+	time += dtb;		    /* Move to next sample by time increment */
+    }
+    return (Y - Ystart);            /* Return number of output samples */
+}
+
+static RES_WORD FilterUp(const RES_HWORD Imp[], const RES_HWORD ImpD[], 
+		     RES_UHWORD Nwing, RES_BOOL Interp,
+		     const RES_HWORD *Xp, RES_HWORD Ph, RES_HWORD Inc)
+{
+    const RES_HWORD *Hp;
+    const RES_HWORD *Hdp = NULL;
+    const RES_HWORD *End;
+    RES_HWORD a = 0;
+    RES_WORD v, t;
+    
+    v=0;
+    Hp = &Imp[Ph>>Na];
+    End = &Imp[Nwing];
+    if (Interp) {
+	Hdp = &ImpD[Ph>>Na];
+	a = Ph & Amask;
+    }
+    if (Inc == 1)		/* If doing right wing...              */
+    {				/* ...drop extra coeff, so when Ph is  */
+	End--;			/*    0.5, we don't do too many mult's */
+	if (Ph == 0)		/* If the phase is zero...           */
+	{			/* ...then we've already skipped the */
+	    Hp += Npc;		/*    first sample, so we must also  */
+	    Hdp += Npc;		/*    skip ahead in Imp[] and ImpD[] */
+	}
+    }
+    if (Interp)
+      while (Hp < End) {
+	  t = *Hp;		/* Get filter coeff */
+	  t += (((RES_WORD)*Hdp)*a)>>Na; /* t is now interp'd filter coeff */
+	  Hdp += Npc;		/* Filter coeff differences step */
+	  t *= *Xp;		/* Mult coeff by input sample */
+	  if (t & (1<<(Nhxn-1)))  /* Round, if needed */
+	    t += (1<<(Nhxn-1));
+	  t >>= Nhxn;		/* Leave some guard bits, but come back some */
+	  v += t;			/* The filter output */
+	  Hp += Npc;		/* Filter coeff step */
+
+	  Xp += Inc;		/* Input signal step. NO CHECK ON BOUNDS */
+      } 
+    else 
+      while (Hp < End) {
+	  t = *Hp;		/* Get filter coeff */
+	  t *= *Xp;		/* Mult coeff by input sample */
+	  if (t & (1<<(Nhxn-1)))  /* Round, if needed */
+	    t += (1<<(Nhxn-1));
+	  t >>= Nhxn;		/* Leave some guard bits, but come back some */
+	  v += t;			/* The filter output */
+	  Hp += Npc;		/* Filter coeff step */
+	  Xp += Inc;		/* Input signal step. NO CHECK ON BOUNDS */
+      }
+    return(v);
+}
+
+
+static RES_WORD FilterUD(const RES_HWORD Imp[], const RES_HWORD ImpD[],
+		     RES_UHWORD Nwing, RES_BOOL Interp,
+		     const RES_HWORD *Xp, RES_HWORD Ph, RES_HWORD Inc, RES_UHWORD dhb)
+{
+    RES_HWORD a;
+    const RES_HWORD *Hp, *Hdp, *End;
+    RES_WORD v, t;
+    RES_UWORD Ho;
+    
+    v=0;
+    Ho = (Ph*(RES_UWORD)dhb)>>Np;
+    End = &Imp[Nwing];
+    if (Inc == 1)		/* If doing right wing...              */
+    {				/* ...drop extra coeff, so when Ph is  */
+	End--;			/*    0.5, we don't do too many mult's */
+	if (Ph == 0)		/* If the phase is zero...           */
+	  Ho += dhb;		/* ...then we've already skipped the */
+    }				/*    first sample, so we must also  */
+				/*    skip ahead in Imp[] and ImpD[] */
+    if (Interp)
+      while ((Hp = &Imp[Ho>>Na]) < End) {
+	  t = *Hp;		/* Get IR sample */
+	  Hdp = &ImpD[Ho>>Na];  /* get interp (lower Na) bits from diff table*/
+	  a = Ho & Amask;	/* a is logically between 0 and 1 */
+	  t += (((RES_WORD)*Hdp)*a)>>Na; /* t is now interp'd filter coeff */
+	  t *= *Xp;		/* Mult coeff by input sample */
+	  if (t & 1<<(Nhxn-1))	/* Round, if needed */
+	    t += 1<<(Nhxn-1);
+	  t >>= Nhxn;		/* Leave some guard bits, but come back some */
+	  v += t;			/* The filter output */
+	  Ho += dhb;		/* IR step */
+	  Xp += Inc;		/* Input signal step. NO CHECK ON BOUNDS */
+      }
+    else 
+      while ((Hp = &Imp[Ho>>Na]) < End) {
+	  t = *Hp;		/* Get IR sample */
+	  t *= *Xp;		/* Mult coeff by input sample */
+	  if (t & 1<<(Nhxn-1))	/* Round, if needed */
+	    t += 1<<(Nhxn-1);
+	  t >>= Nhxn;		/* Leave some guard bits, but come back some */
+	  v += t;			/* The filter output */
+	  Ho += dhb;		/* IR step */
+	  Xp += Inc;		/* Input signal step. NO CHECK ON BOUNDS */
+      }
+    return(v);
+}
+
+/* Sampling rate up-conversion only subroutine;
+ * Slightly faster than down-conversion;
+ */
+static int SrcUp(const RES_HWORD X[], RES_HWORD Y[], double pFactor, 
+		 RES_UHWORD nx, RES_UHWORD pNwing, RES_UHWORD pLpScl,
+		 const RES_HWORD pImp[], const RES_HWORD pImpD[], RES_BOOL Interp)
+{
+    const RES_HWORD *xp;
+    RES_HWORD *Ystart, *Yend;
+    RES_WORD v;
+    
+    double dt;                  /* Step through input signal */ 
+    RES_UWORD dtb;                  /* Fixed-point version of Dt */
+    RES_UWORD time = 0;
+    RES_UWORD endTime;              /* When time reaches EndTime, return to user */
+    
+    dt = 1.0/pFactor;            /* Output sampling period */
+    dtb = dt*(1<<Np) + 0.5;     /* Fixed-point representation */
+    
+    Ystart = Y;
+    Yend = Ystart + (unsigned)(nx * pFactor);
+    endTime = time + (1<<Np)*(RES_WORD)nx;
+    while (time < endTime)
+    {
+	xp = &X[time>>Np];      /* Ptr to current input sample */
+	/* Perform left-wing inner product */
+	v = 0;
+	v = FilterUp(pImp, pImpD, pNwing, Interp, xp, (RES_HWORD)(time&Pmask),-1);
+
+	/* Perform right-wing inner product */
+	v += FilterUp(pImp, pImpD, pNwing, Interp, xp+1,  (RES_HWORD)((-time)&Pmask),1);
+
+	v >>= Nhg;		/* Make guard bits */
+	v *= pLpScl;		/* Normalize for unity filter gain */
+	*Y++ = WordToHword(v,NLpScl);   /* strip guard bits, deposit output */
+	time += dtb;		/* Move to next sample by time increment */
+    }
+    return (Y - Ystart);        /* Return the number of output samples */
+}
+
+
+/* Sampling rate conversion subroutine */
+
+static int SrcUD(const RES_HWORD X[], RES_HWORD Y[], double pFactor, 
+		 RES_UHWORD nx, RES_UHWORD pNwing, RES_UHWORD pLpScl,
+		 const RES_HWORD pImp[], const RES_HWORD pImpD[], RES_BOOL Interp)
+{
+    const RES_HWORD *xp;
+    RES_HWORD *Ystart, *Yend;
+    RES_WORD v;
+    
+    double dh;                  /* Step through filter impulse response */
+    double dt;                  /* Step through input signal */
+    RES_UWORD time = 0;
+    RES_UWORD endTime;          /* When time reaches EndTime, return to user */
+    RES_UWORD dhb, dtb;         /* Fixed-point versions of Dh,Dt */
+    
+    dt = 1.0/pFactor;            /* Output sampling period */
+    dtb = dt*(1<<Np) + 0.5;     /* Fixed-point representation */
+    
+    dh = MIN(Npc, pFactor*Npc);  /* Filter sampling period */
+    dhb = dh*(1<<Na) + 0.5;     /* Fixed-point representation */
+    
+    Ystart = Y;
+    Yend = Ystart + (unsigned)(nx * pFactor);
+    endTime = time + (1<<Np)*(RES_WORD)nx;
+    while (time < endTime)
+    {
+	xp = &X[time>>Np];	/* Ptr to current input sample */
+	v = FilterUD(pImp, pImpD, pNwing, Interp, xp, (RES_HWORD)(time&Pmask),
+		     -1, dhb);	/* Perform left-wing inner product */
+	v += FilterUD(pImp, pImpD, pNwing, Interp, xp+1, (RES_HWORD)((-time)&Pmask),
+		      1, dhb);	/* Perform right-wing inner product */
+	v >>= Nhg;		/* Make guard bits */
+	v *= pLpScl;		/* Normalize for unity filter gain */
+	*Y++ = WordToHword(v,NLpScl);   /* strip guard bits, deposit output */
+	time += dtb;		/* Move to next sample by time increment */
+    }
+    return (Y - Ystart);        /* Return the number of output samples */
+}
+
+
+int res_SrcLinear(const RES_HWORD X[], RES_HWORD Y[], 
+		  double pFactor, RES_UHWORD nx)
+{
+    return SrcLinear(X, Y, pFactor, nx);
+}
+
+int res_Resample(const RES_HWORD X[], RES_HWORD Y[], double pFactor, 
+	         RES_UHWORD nx, RES_BOOL LargeF, RES_BOOL Interp)
+{
+    if (pFactor >= 1) {
+
+	if (LargeF)
+	    return SrcUp(X, Y, pFactor, nx,
+			 LARGE_FILTER_NWING, LARGE_FILTER_SCALE,
+			 LARGE_FILTER_IMP, LARGE_FILTER_IMPD, Interp);
+	else
+	    return SrcUp(X, Y, pFactor, nx,
+			 SMALL_FILTER_NWING, SMALL_FILTER_SCALE,
+			 SMALL_FILTER_IMP, SMALL_FILTER_IMPD, Interp);
+
+    } else {
+
+	if (LargeF)
+	    return SrcUD(X, Y, pFactor, nx, 
+			 LARGE_FILTER_NWING, LARGE_FILTER_SCALE * pFactor + 0.5,
+			 LARGE_FILTER_IMP, LARGE_FILTER_IMPD, Interp);
+	else
+	    return SrcUD(X, Y, pFactor, nx, 
+			 SMALL_FILTER_NWING, SMALL_FILTER_SCALE * pFactor + 0.5,
+			 SMALL_FILTER_IMP, SMALL_FILTER_IMPD, Interp);
+
+    }
+}
+
+int res_GetXOFF(double pFactor, RES_BOOL LargeF)
+{
+    if (LargeF)
+	return (LARGE_FILTER_NMULT + 1) / 2.0  *  
+	        MAX(1.0, 1.0/pFactor);
+    else
+	return (SMALL_FILTER_NMULT + 1) / 2.0  *  
+		MAX(1.0, 1.0/pFactor);
+}
+
diff --git a/third_party/resample/smallfilter.h b/third_party/resample/src/smallfilter.h
similarity index 100%
rename from third_party/resample/smallfilter.h
rename to third_party/resample/src/smallfilter.h
diff --git a/third_party/resample/src/stddefs.h b/third_party/resample/src/stddefs.h
new file mode 100644
index 0000000..8349770
--- /dev/null
+++ b/third_party/resample/src/stddefs.h
@@ -0,0 +1,29 @@
+#ifndef PI
+#define PI (3.14159265358979232846)
+#endif
+
+#ifndef PI2
+#define PI2 (6.28318530717958465692)
+#endif
+
+#define D2R (0.01745329348)          /* (2*pi)/360 */
+#define R2D (57.29577951)            /* 360/(2*pi) */
+
+#ifndef MAX
+#define MAX(x,y) ((x)>(y) ?(x):(y))
+#endif
+#ifndef MIN
+#define MIN(x,y) ((x)<(y) ?(x):(y))
+#endif
+
+#ifndef ABS
+#define ABS(x)   ((x)<0   ?(-(x)):(x))
+#endif
+
+#ifndef SGN
+#define SGN(x)   ((x)<0   ?(-1):((x)==0?(0):(1)))
+#endif
+
+#define MAX_HWORD (32767)
+#define MIN_HWORD (-32768)
+
