diff --git a/MSVC/ring-daemon.vcxproj b/MSVC/ring-daemon.vcxproj
index c0e662bf39abefda906ec3caa40cf1d402859649..413adfed82cb001be491f35615385f4c17ebe6c2 100644
--- a/MSVC/ring-daemon.vcxproj
+++ b/MSVC/ring-daemon.vcxproj
@@ -259,7 +259,7 @@
       <UseFullPaths>false</UseFullPaths>
     </ClCompile>
     <Link>
-      <AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodecd.lib;avdeviced.lib;avfilterd.lib;avformatd.lib;avutild.lib;libpjproject.lib;libsamplerate.lib;libsndfile.lib;libupnp.lib;libyaml-cpp.lib;opendht.lib;pcred.lib;pjlib.lib;pjlib_util.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjmedia.lib;pjmedia_codec.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;portaudio.lib;swresampled.lib;swscaled.lib;lib_json.lib;Strmiids.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodecd.lib;avdeviced.lib;avfilterd.lib;avformatd.lib;avutild.lib;libpjproject.lib;libsamplerate.lib;libupnp.lib;libyaml-cpp.lib;opendht.lib;pcred.lib;pjlib.lib;pjlib_util.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjmedia.lib;pjmedia_codec.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;portaudio.lib;swresampled.lib;swscaled.lib;lib_json.lib;Strmiids.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>..\..\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <AdditionalOptions>/VERBOSE:LIB /NODEFAULTLIB:libcmtd /NODEFAULTLIB:libcmt /OPT:NOLBR /OPT:NOICF /ignore:4099 /ignore:4049 /ignore:4217 /INCREMENTAL /LTCG:OFF /FORCE:MULTIPLE</AdditionalOptions>
       <LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration>
@@ -294,7 +294,7 @@
       <UseFullPaths>false</UseFullPaths>
     </ClCompile>
     <Link>
-      <AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodecd.lib;avdeviced.lib;avfilterd.lib;avformatd.lib;avutild.lib;libpjproject.lib;libsamplerate.lib;libsndfile.lib;libupnp.lib;libyaml-cpp.lib;opendht.lib;pcred.lib;pjlib.lib;pjlib_util.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjmedia.lib;pjmedia_codec.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;portaudio.lib;swresampled.lib;swscaled.lib;lib_json.lib;Strmiids.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodecd.lib;avdeviced.lib;avfilterd.lib;avformatd.lib;avutild.lib;libpjproject.lib;libsamplerate.lib;libupnp.lib;libyaml-cpp.lib;opendht.lib;pcred.lib;pjlib.lib;pjlib_util.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjmedia.lib;pjmedia_codec.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;portaudio.lib;swresampled.lib;swscaled.lib;lib_json.lib;Strmiids.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>..\..\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <AdditionalOptions>/VERBOSE:LIB /NODEFAULTLIB:libcmtd /NODEFAULTLIB:libcmt /OPT:NOLBR /OPT:NOICF /ignore:4099 /ignore:4049 /ignore:4217 /INCREMENTAL /LTCG:OFF /FORCE:MULTIPLE</AdditionalOptions>
       <LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration>
@@ -309,7 +309,7 @@
       </Command>
     </PreBuildEvent>
     <Lib>
-      <AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodecd.lib;avdeviced.lib;avfilterd.lib;avformatd.lib;avutild.lib;ixml.lib;libaacs.lib;libavutil.lib;libbaseclasses.lib;libgcrypt.lib;libgmp.lib;libgpg-error.lib;libgtest.lib;libhogweed.lib;libiconv.lib;libilbccodec.lib;libmilenage.lib;libnettle.lib;libogg.lib;liboggd.lib;libpjproject.lib;libresample.lib;libsamplerate.lib;libsndfile.lib;libspeex.lib;libspeexdsp.lib;libsrtp.lib;libupnp.lib;libuuid.lib;libvorbis.lib;libvpx.lib;libx264.lib;libx265.lib;libx265_10b.lib;libx265_12b.lib;libyaml-cpp.lib;libzlib.lib;msgpack.lib;opendht.lib;opus.lib;pcred.lib;portaudio.lib;pjlib.lib;pjlib_util.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjmedia.lib;pjmedia_codec.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;swresampled.lib;swscaled.lib;lib_json.lib;Strmiids.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodecd.lib;avdeviced.lib;avfilterd.lib;avformatd.lib;avutild.lib;ixml.lib;libaacs.lib;libavutil.lib;libbaseclasses.lib;libgcrypt.lib;libgmp.lib;libgpg-error.lib;libgtest.lib;libhogweed.lib;libiconv.lib;libilbccodec.lib;libmilenage.lib;libnettle.lib;libogg.lib;liboggd.lib;libpjproject.lib;libresample.lib;libsamplerate.lib;libspeex.lib;libspeexdsp.lib;libsrtp.lib;libupnp.lib;libuuid.lib;libvorbis.lib;libvpx.lib;libx264.lib;libx265.lib;libx265_10b.lib;libx265_12b.lib;libyaml-cpp.lib;libzlib.lib;msgpack.lib;opendht.lib;opus.lib;pcred.lib;portaudio.lib;pjlib.lib;pjlib_util.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjmedia.lib;pjmedia_codec.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;swresampled.lib;swscaled.lib;lib_json.lib;Strmiids.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Lib>
     <Lib>
       <AdditionalLibraryDirectories>..\contrib\lib\x86;</AdditionalLibraryDirectories>
@@ -337,7 +337,7 @@
       <UseFullPaths>false</UseFullPaths>
     </ClCompile>
     <Link>
-      <AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodecd.lib;avdeviced.lib;avfilterd.lib;avformatd.lib;avutild.lib;libpjproject.lib;libsamplerate.lib;libsndfile.lib;libupnp.lib;libyaml-cpp.lib;opendht.lib;pcred.lib;pjlib.lib;pjlib_util.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjmedia.lib;pjmedia_codec.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;portaudio.lib;swresampled.lib;swscaled.lib;lib_json.lib;Strmiids.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodecd.lib;avdeviced.lib;avfilterd.lib;avformatd.lib;avutild.lib;libpjproject.lib;libsamplerate.lib;libupnp.lib;libyaml-cpp.lib;opendht.lib;pcred.lib;pjlib.lib;pjlib_util.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjmedia.lib;pjmedia_codec.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;portaudio.lib;swresampled.lib;swscaled.lib;lib_json.lib;Strmiids.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>..\..\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <AdditionalOptions>/VERBOSE:LIB /NODEFAULTLIB:libcmtd /NODEFAULTLIB:libcmt /OPT:NOLBR /OPT:NOICF /ignore:4099 /ignore:4049 /ignore:4217 /INCREMENTAL /LTCG:OFF /FORCE:MULTIPLE</AdditionalOptions>
       <LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration>
@@ -352,7 +352,7 @@
       </Command>
     </PreBuildEvent>
     <Lib>
-      <AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodecd.lib;avdeviced.lib;avfilterd.lib;avformatd.lib;avutild.lib;ixml.lib;libaacs.lib;libavutil.lib;libbaseclasses.lib;libgcrypt.lib;libgmp.lib;libgpg-error.lib;libgsmcodec.lib;libgtest.lib;libhogweed.lib;libiconv.lib;libilbccodec.lib;libmilenage.lib;libnettle.lib;libogg.lib;liboggd.lib;libpjproject.lib;libresample.lib;libsamplerate.lib;libsndfile.lib;libspeex.lib;libspeexdsp.lib;libsrtp.lib;libupnp.lib;libuuid.lib;libvorbis.lib;libvpx.lib;libx264.lib;libx265.lib;libx265_10b.lib;libx265_12b.lib;libyaml-cpp.lib;libzlib.lib;msgpack.lib;opendht.lib;opus.lib;pcred.lib;portaudio.lib;pjlib.lib;pjlib_util.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjmedia.lib;pjmedia_codec.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;swresampled.lib;swscaled.lib;lib_json.lib;Strmiids.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodecd.lib;avdeviced.lib;avfilterd.lib;avformatd.lib;avutild.lib;ixml.lib;libaacs.lib;libavutil.lib;libbaseclasses.lib;libgcrypt.lib;libgmp.lib;libgpg-error.lib;libgsmcodec.lib;libgtest.lib;libhogweed.lib;libiconv.lib;libilbccodec.lib;libmilenage.lib;libnettle.lib;libogg.lib;liboggd.lib;libpjproject.lib;libresample.lib;libsamplerate.lib;libspeex.lib;libspeexdsp.lib;libsrtp.lib;libupnp.lib;libuuid.lib;libvorbis.lib;libvpx.lib;libx264.lib;libx265.lib;libx265_10b.lib;libx265_12b.lib;libyaml-cpp.lib;libzlib.lib;msgpack.lib;opendht.lib;opus.lib;pcred.lib;portaudio.lib;pjlib.lib;pjlib_util.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjmedia.lib;pjmedia_codec.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;swresampled.lib;swscaled.lib;lib_json.lib;Strmiids.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Lib>
     <Lib>
       <AdditionalLibraryDirectories>..\contrib\lib\x86;</AdditionalLibraryDirectories>
@@ -373,7 +373,7 @@
     </ClCompile>
     <Link>
       <AdditionalLibraryDirectories>$(ProjectDir)..\contrib\build\ffmpeg\Build\Windows10\x64\bin;$(ProjectDir)..\contrib\msvc\lib\x64;$(ProjectDir)..\contrib\build\boost\stage\lib;$(ProjectDir)..\contrib\build\pjproject\pjsip\lib;$(ProjectDir)..\contrib\build\pjproject\pjmedia\lib;$(ProjectDir)..\contrib\build\pjproject\pjlib-util\lib;$(ProjectDir)..\contrib\build\pjproject\third_party\lib;$(ProjectDir)..\contrib\build\pjproject\pjlib\lib;$(ProjectDir)..\contrib\build\pjproject\pjnath\lib;$(ProjectDir)..\contrib\build\restbed\build\Release;$(ProjectDir)..\contrib\build\restbed\dependency\openssl\out32dll;$(ProjectDir)..\contrib\build\jsoncpp\makefiles\vs2017\x64\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>ws2_32.lib;Strmiids.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodec.lib;avdevice.lib;avfilter.lib;avformat.lib;avresample.lib;avutil.lib;ixml.lib;libaacsd.lib;libavutil.lib;libavutild.lib;libbaseclasses.lib;libgcryptd.lib;libgmp.lib;libgmpd.lib;libgpg-errord.lib;libgtest.lib;libhogweed.lib;libiconv.lib;libiconvd.lib;libilbccodec.lib;libmilenage.lib;libnettle.lib;libogg.lib;liboggd.lib;libpjproject.lib;libportaudio.lib;libresample.lib;libsamplerate.lib;libsndfile.lib;libspeex.lib;libspeexd.lib;libspeexdsp.lib;libsrtp.lib;libupnp.lib;libuuid.lib;libvorbis.lib;libvorbisd.lib;libvpx.lib;libvpxd.lib;libx264d.lib;libx265d.lib;libx265_10bd.lib;libx265_12bd.lib;libyaml-cppmdd.lib;libzlib.lib;msgpack.lib;opendht.lib;opus.lib;pcred.lib;pjlib-util.lib;pjlib.lib;pjmedia-audiodev.lib;pjmedia-codec.lib;pjmedia-videodev.lib;pjmedia.lib;pjnath.lib;pjsip-core.lib;pjsip-simple.lib;pjsip-ua.lib;pjsua-lib.lib;pjsua2-lib.lib;portaudio_x86.lib;swresample.lib;swscale.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;Strmiids.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodec.lib;avdevice.lib;avfilter.lib;avformat.lib;avresample.lib;avutil.lib;ixml.lib;libaacsd.lib;libavutil.lib;libavutild.lib;libbaseclasses.lib;libgcryptd.lib;libgmp.lib;libgmpd.lib;libgpg-errord.lib;libgtest.lib;libhogweed.lib;libiconv.lib;libiconvd.lib;libilbccodec.lib;libmilenage.lib;libnettle.lib;libogg.lib;liboggd.lib;libpjproject.lib;libportaudio.lib;libresample.lib;libsamplerate.lib;libspeex.lib;libspeexd.lib;libspeexdsp.lib;libsrtp.lib;libupnp.lib;libuuid.lib;libvorbis.lib;libvorbisd.lib;libvpx.lib;libvpxd.lib;libx264d.lib;libx265d.lib;libx265_10bd.lib;libx265_12bd.lib;libyaml-cppmdd.lib;libzlib.lib;msgpack.lib;opendht.lib;opus.lib;pcred.lib;pjlib-util.lib;pjlib.lib;pjmedia-audiodev.lib;pjmedia-codec.lib;pjmedia-videodev.lib;pjmedia.lib;pjnath.lib;pjsip-core.lib;pjsip-simple.lib;pjsip-ua.lib;pjsua-lib.lib;pjsua2-lib.lib;portaudio_x86.lib;swresample.lib;swscale.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalOptions>/VERBOSE:LIB /NODEFAULTLIB:libcmtd /NODEFAULTLIB:libcmt /OPT:NOLBR /OPT:NOICF /ignore:4099 /ignore:4049 /ignore:4217 /INCREMENTAL /LTCG:OFF</AdditionalOptions>
       <TargetMachine>MachineX86</TargetMachine>
       <LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration>
@@ -400,7 +400,7 @@
     </ClCompile>
     <Link>
       <AdditionalLibraryDirectories>..\..\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>ws2_32.lib;Strmiids.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodec.lib;avdevice.lib;avfilter.lib;avformat.lib;avresample.lib;avutil.lib;ixml.lib;libaacsd.lib;libavutil.lib;libavutild.lib;libbaseclasses.lib;libgcryptd.lib;libgmp.lib;libgmpd.lib;libgpg-errord.lib;libgtest.lib;libhogweed.lib;libiconv.lib;libiconvd.lib;libilbccodec.lib;libmilenage.lib;libnettle.lib;libogg.lib;liboggd.lib;libpjproject.lib;libportaudio.lib;libresample.lib;libsamplerate.lib;libsndfile.lib;libspeex.lib;libspeexd.lib;libspeexdsp.lib;libsrtp.lib;libupnp.lib;libuuid.lib;libvorbis.lib;libvorbisd.lib;libvpx.lib;libvpxd.lib;libx264d.lib;libx265d.lib;libx265_10bd.lib;libx265_12bd.lib;libyaml-cppmdd.lib;libzlib.lib;msgpack.lib;opendht.lib;opus.lib;pcred.lib;pjlib-util.lib;pjlib.lib;pjmedia-audiodev.lib;pjmedia-codec.lib;pjmedia-videodev.lib;pjmedia.lib;pjnath.lib;pjsip-core.lib;pjsip-simple.lib;pjsip-ua.lib;pjsua-lib.lib;pjsua2-lib.lib;portaudio_x86.lib;swresample.lib;swscale.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;Strmiids.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodec.lib;avdevice.lib;avfilter.lib;avformat.lib;avresample.lib;avutil.lib;ixml.lib;libaacsd.lib;libavutil.lib;libavutild.lib;libbaseclasses.lib;libgcryptd.lib;libgmp.lib;libgmpd.lib;libgpg-errord.lib;libgtest.lib;libhogweed.lib;libiconv.lib;libiconvd.lib;libilbccodec.lib;libmilenage.lib;libnettle.lib;libogg.lib;liboggd.lib;libpjproject.lib;libportaudio.lib;libresample.lib;libsamplerate.lib;libspeex.lib;libspeexd.lib;libspeexdsp.lib;libsrtp.lib;libupnp.lib;libuuid.lib;libvorbis.lib;libvorbisd.lib;libvpx.lib;libvpxd.lib;libx264d.lib;libx265d.lib;libx265_10bd.lib;libx265_12bd.lib;libyaml-cppmdd.lib;libzlib.lib;msgpack.lib;opendht.lib;opus.lib;pcred.lib;pjlib-util.lib;pjlib.lib;pjmedia-audiodev.lib;pjmedia-codec.lib;pjmedia-videodev.lib;pjmedia.lib;pjnath.lib;pjsip-core.lib;pjsip-simple.lib;pjsip-ua.lib;pjsua-lib.lib;pjsua2-lib.lib;portaudio_x86.lib;swresample.lib;swscale.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalOptions>/VERBOSE:LIB /NODEFAULTLIB:libcmtd /NODEFAULTLIB:libcmt /OPT:NOLBR /OPT:NOICF /ignore:4099 /ignore:4049 /ignore:4217 /INCREMENTAL /LTCG:OFF</AdditionalOptions>
       <TargetMachine>MachineX86</TargetMachine>
       <LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration>
@@ -410,7 +410,7 @@
       <LinkLibraryDependencies>false</LinkLibraryDependencies>
     </ProjectReference>
     <Lib>
-      <AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodecd.lib;avdeviced.lib;avfilterd.lib;avformatd.lib;avutild.lib;ixml.lib;libaacs.lib;libavutil.lib;libbaseclasses.lib;libgcrypt.lib;libgmp.lib;libgpg-error.lib;libgtest.lib;libhogweed.lib;libiconv.lib;libilbccodec.lib;libmilenage.lib;libnettle.lib;libogg.lib;liboggd.lib;libpjproject.lib;libresample.lib;libsamplerate.lib;libsndfile.lib;libspeex.lib;libspeexdsp.lib;libsrtp.lib;libupnp.lib;libuuid.lib;libvorbis.lib;libvpx.lib;libx264.lib;libx265.lib;libx265_10b.lib;libx265_12b.lib;libyaml-cpp.lib;libzlib.lib;msgpack.lib;opendht.lib;opus.lib;pcred.lib;portaudio.lib;pjlib.lib;pjlib_util.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjmedia.lib;pjmedia_codec.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;swresampled.lib;swscaled.lib;lib_json.lib;Strmiids.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodecd.lib;avdeviced.lib;avfilterd.lib;avformatd.lib;avutild.lib;ixml.lib;libaacs.lib;libavutil.lib;libbaseclasses.lib;libgcrypt.lib;libgmp.lib;libgpg-error.lib;libgtest.lib;libhogweed.lib;libiconv.lib;libilbccodec.lib;libmilenage.lib;libnettle.lib;libogg.lib;liboggd.lib;libpjproject.lib;libresample.lib;libsamplerate.lib;libspeex.lib;libspeexdsp.lib;libsrtp.lib;libupnp.lib;libuuid.lib;libvorbis.lib;libvpx.lib;libx264.lib;libx265.lib;libx265_10b.lib;libx265_12b.lib;libyaml-cpp.lib;libzlib.lib;msgpack.lib;opendht.lib;opus.lib;pcred.lib;portaudio.lib;pjlib.lib;pjlib_util.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjmedia.lib;pjmedia_codec.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;swresampled.lib;swscaled.lib;lib_json.lib;Strmiids.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>$(ProjectDir)..\contrib\build\ffmpeg\Build\Windows10\x64\bin;$(ProjectDir)..\contrib\msvc\lib\x64;$(ProjectDir)..\contrib\build\boost\stage\lib;$(ProjectDir)..\contrib\build\pjproject\pjsip\lib;$(ProjectDir)..\contrib\build\pjproject\pjmedia\lib;$(ProjectDir)..\contrib\build\pjproject\pjlib-util\lib;$(ProjectDir)..\contrib\build\pjproject\third_party\lib;$(ProjectDir)..\contrib\build\pjproject\pjlib\lib;$(ProjectDir)..\contrib\build\pjproject\pjnath\lib;$(ProjectDir)..\contrib\build\restbed\build\Release;$(ProjectDir)..\contrib\build\restbed\dependency\openssl\out32dll;$(ProjectDir)..\contrib\build\argon2\vs2015\Argon2Ref\vs2015\build;$(ProjectDir)..\contrib\build\pcre\msvc\Release;$(ProjectDir)..\contrib\build\yaml-cpp\msvc\Release</AdditionalLibraryDirectories>
       <AdditionalOptions>/ignore:4006 /ignore:4221 %(AdditionalOptions)</AdditionalOptions>
     </Lib>
@@ -432,7 +432,7 @@
     </ClCompile>
     <Link>
       <AdditionalLibraryDirectories>..\..\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>ws2_32.lib;Strmiids.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodec.lib;avdevice.lib;avfilter.lib;avformat.lib;avresample.lib;avutil.lib;ixml.lib;libaacsd.lib;libavutil.lib;libavutild.lib;libbaseclasses.lib;libgcryptd.lib;libgmp.lib;libgmpd.lib;libgpg-errord.lib;libgsmcodec.lib;libgtest.lib;libhogweed.lib;libiconv.lib;libiconvd.lib;libilbccodec.lib;libmilenage.lib;libnettle.lib;libogg.lib;liboggd.lib;libpjproject.lib;libportaudio.lib;libresample.lib;libsamplerate.lib;libsndfile.lib;libspeex.lib;libspeexd.lib;libspeexdsp.lib;libsrtp.lib;libupnp.lib;libuuid.lib;libvorbis.lib;libvorbisd.lib;libvpx.lib;libvpxd.lib;libx264d.lib;libx265d.lib;libx265_10bd.lib;libx265_12bd.lib;libyaml-cppmdd.lib;libzlib.lib;msgpack.lib;opendht.lib;opus.lib;pcred.lib;pjlib-util.lib;pjlib.lib;pjmedia-audiodev.lib;pjmedia-codec.lib;pjmedia-videodev.lib;pjmedia.lib;pjnath.lib;pjsip-core.lib;pjsip-simple.lib;pjsip-ua.lib;pjsua-lib.lib;pjsua2-lib.lib;portaudio_x86.lib;swresample.lib;swscale.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;Strmiids.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;avcodec.lib;avdevice.lib;avfilter.lib;avformat.lib;avresample.lib;avutil.lib;ixml.lib;libaacsd.lib;libavutil.lib;libavutild.lib;libbaseclasses.lib;libgcryptd.lib;libgmp.lib;libgmpd.lib;libgpg-errord.lib;libgsmcodec.lib;libgtest.lib;libhogweed.lib;libiconv.lib;libiconvd.lib;libilbccodec.lib;libmilenage.lib;libnettle.lib;libogg.lib;liboggd.lib;libpjproject.lib;libportaudio.lib;libresample.lib;libsamplerate.lib;libspeex.lib;libspeexd.lib;libspeexdsp.lib;libsrtp.lib;libupnp.lib;libuuid.lib;libvorbis.lib;libvorbisd.lib;libvpx.lib;libvpxd.lib;libx264d.lib;libx265d.lib;libx265_10bd.lib;libx265_12bd.lib;libyaml-cppmdd.lib;libzlib.lib;msgpack.lib;opendht.lib;opus.lib;pcred.lib;pjlib-util.lib;pjlib.lib;pjmedia-audiodev.lib;pjmedia-codec.lib;pjmedia-videodev.lib;pjmedia.lib;pjnath.lib;pjsip-core.lib;pjsip-simple.lib;pjsip-ua.lib;pjsua-lib.lib;pjsua2-lib.lib;portaudio_x86.lib;swresample.lib;swscale.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalOptions>/VERBOSE:LIB /NODEFAULTLIB:libcmtd /NODEFAULTLIB:libcmt /OPT:NOLBR /OPT:NOICF /ignore:4099 /ignore:4049 /ignore:4217 /INCREMENTAL /LTCG:OFF</AdditionalOptions>
       <TargetMachine>MachineX86</TargetMachine>
       <LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration>
@@ -473,7 +473,7 @@
     <Link>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;Strmiids.lib;libavcodec.lib;libavdevice.lib;libavfilter.lib;libavformat.lib;libavutil.lib;libswresample.lib;libswscale.lib;libsamplerate.lib;libsndfile.lib;libgnutls.lib;lib_json.lib;opendht.lib;argon.lib;blake.lib;pcre.lib;pjlib.lib;pjlib_util.lib;pjmedia.lib;pjmedia_codec.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;yaml-cpp.lib;libupnp.lib;pthreadVC2.lib;portaudio.lib;libspeex-pj.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;Strmiids.lib;libavcodec.lib;libavdevice.lib;libavfilter.lib;libavformat.lib;libavutil.lib;libswresample.lib;libswscale.lib;libsamplerate.lib;libgnutls.lib;lib_json.lib;opendht.lib;argon.lib;blake.lib;pcre.lib;pjlib.lib;pjlib_util.lib;pjmedia.lib;pjmedia_codec.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;yaml-cpp.lib;libupnp.lib;pthreadVC2.lib;portaudio.lib;libspeex-pj.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>..\..\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <AdditionalOptions>/VERBOSE:LIB /NODEFAULTLIB:libcmtd /NODEFAULTLIB:libcmt /OPT:NOLBR /OPT:NOICF %(AdditionalOptions)</AdditionalOptions>
       <LinkTimeCodeGeneration>UseFastLinkTimeCodeGeneration</LinkTimeCodeGeneration>
@@ -524,7 +524,7 @@
       </Command>
     </PreBuildEvent>
     <Lib>
-      <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;Strmiids.lib;libavcodec.lib;libavdevice.lib;libavfilter.lib;libavformat.lib;libavutil.lib;libswresample.lib;libswscale.lib;libsamplerate.lib;libsndfile.lib;libgnutls.lib;lib_json.lib;opendht.lib;argon.lib;blake.lib;pcre.lib;pjlib.lib;pjlib_util.lib;pjmedia.lib;pjmedia_codec.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;yaml-cpp.lib;libupnp.lib;pthreadVC2.lib;portaudio.lib;libspeex-pj.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;Strmiids.lib;libavcodec.lib;libavdevice.lib;libavfilter.lib;libavformat.lib;libavutil.lib;libswresample.lib;libswscale.lib;libsamplerate.lib;libgnutls.lib;lib_json.lib;opendht.lib;argon.lib;blake.lib;pcre.lib;pjlib.lib;pjlib_util.lib;pjmedia.lib;pjmedia_codec.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;yaml-cpp.lib;libupnp.lib;pthreadVC2.lib;portaudio.lib;libspeex-pj.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>..\contrib\lib\x86;</AdditionalLibraryDirectories>
       <AdditionalOptions>/ignore:4006 /ignore:4221 /VERBOSE:LIB /NODEFAULTLIB:libcmt /LTCG:OFF %(AdditionalOptions)</AdditionalOptions>
     </Lib>
@@ -566,7 +566,7 @@
       </Command>
     </PreBuildEvent>
     <Lib>
-      <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;Strmiids.lib;libavcodec.lib;libavdevice.lib;libavfilter.lib;libavformat.lib;libavutil.lib;libswresample.lib;libswscale.lib;libsamplerate.lib;libsndfile.lib;libgnutls.lib;lib_json.lib;opendht.lib;argon.lib;blake.lib;pcre.lib;pjlib.lib;pjlib_util.lib;pjmedia.lib;pjmedia_codec.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;yaml-cpp.lib;libupnp.lib;pthreadVC2.lib;portaudio.lib;libspeex-pj.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;Strmiids.lib;libavcodec.lib;libavdevice.lib;libavfilter.lib;libavformat.lib;libavutil.lib;libswresample.lib;libswscale.lib;libsamplerate.lib;libgnutls.lib;lib_json.lib;opendht.lib;argon.lib;blake.lib;pcre.lib;pjlib.lib;pjlib_util.lib;pjmedia.lib;pjmedia_codec.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;yaml-cpp.lib;libupnp.lib;pthreadVC2.lib;portaudio.lib;libspeex-pj.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>..\contrib\lib\x86;</AdditionalLibraryDirectories>
       <AdditionalOptions>/ignore:4006 /ignore:4221 /VERBOSE:LIB /NODEFAULTLIB:libcmt /LTCG:OFF %(AdditionalOptions)</AdditionalOptions>
     </Lib>
@@ -592,7 +592,7 @@
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <AdditionalLibraryDirectories>$(ProjectDir)..\contrib\build\ffmpeg\Build\Windows10\x64\bin;$(ProjectDir)..\contrib\msvc\lib\x64;$(ProjectDir)..\contrib\build\boost\stage\lib;$(ProjectDir)..\contrib\build\pjproject\pjsip\lib;$(ProjectDir)..\contrib\build\pjproject\pjmedia\lib;$(ProjectDir)..\contrib\build\pjproject\pjlib-util\lib;$(ProjectDir)..\contrib\build\pjproject\third_party\lib;$(ProjectDir)..\contrib\build\pjproject\pjlib\lib;$(ProjectDir)..\contrib\build\pjproject\pjnath\lib;$(ProjectDir)..\contrib\build\restbed\build\Release;$(ProjectDir)..\contrib\build\restbed\dependency\openssl\out32dll;$(ProjectDir)..\contrib\build\jsoncpp\makefiles\vs2017\x64\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;Strmiids.lib;libavcodec.lib;libavdevice.lib;libavfilter.lib;libavformat.lib;libavutil.lib;libswresample.lib;libswscale.lib;libsamplerate.lib;libsndfile.lib;libgnutls.lib;lib_json.lib;opendht.lib;Argon2Ref.lib;pcre.lib;pjlib.lib;pjlib_util.lib;pjmedia.lib;pjmedia_codec.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;yaml-cpp.lib;libupnp.lib;pthreadVC2.lib;portaudio.lib;libspeex-pj.lib;secp256k1.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;odbc32.lib;odbccp32.lib;Strmiids.lib;libavcodec.lib;libavdevice.lib;libavfilter.lib;libavformat.lib;libavutil.lib;libswresample.lib;libswscale.lib;libsamplerate.lib;libgnutls.lib;lib_json.lib;opendht.lib;Argon2Ref.lib;pcre.lib;pjlib.lib;pjlib_util.lib;pjmedia.lib;pjmedia_codec.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;yaml-cpp.lib;libupnp.lib;pthreadVC2.lib;portaudio.lib;libspeex-pj.lib;secp256k1.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalOptions>/VERBOSE:LIB /NODEFAULTLIB:libcmtd /NODEFAULTLIB:libcmt /OPT:NOLBR /OPT:NOICF /ignore:4006 %(AdditionalOptions)</AdditionalOptions>
       <TargetMachine>MachineX64</TargetMachine>
       <LinkTimeCodeGeneration>UseFastLinkTimeCodeGeneration</LinkTimeCodeGeneration>
@@ -685,7 +685,7 @@
       </Command>
     </PreBuildEvent>
     <Lib>
-      <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;advapi32.lib;avcodec.lib;avdevice.lib;avfilter.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;libsamplerate.lib;libgnutls.lib;lib_json.lib;libopendht.lib;Argon2Ref.lib;pcre.lib;secp256k1.lib;libyaml-cppmd.lib;portaudio.lib;libupnp.lib;pjsip-core-x86_64-x64-vc15-Release.lib;pjsip-simple-x86_64-x64-vc15-Release.lib;pjsua2-lib-x86_64-x64-vc15-Release.lib;pjsua-lib-x86_64-x64-vc15-Release.lib;pjsip-ua-x86_64-x64-vc15-Release.lib;pjmedia-x86_64-x64-vc15-Release.lib;pjlib-util-x86_64-x64-vc15-Release.lib;pjlib-x86_64-x64-vc15-Release.lib;pjnath-x86_64-x64-vc15-Release.lib;restbed.lib;libeay32.lib;ssleay32.lib;libsndfile.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;advapi32.lib;avcodec.lib;avdevice.lib;avfilter.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;libsamplerate.lib;libgnutls.lib;lib_json.lib;libopendht.lib;Argon2Ref.lib;pcre.lib;secp256k1.lib;libyaml-cppmd.lib;portaudio.lib;libupnp.lib;pjsip-core-x86_64-x64-vc15-Release.lib;pjsip-simple-x86_64-x64-vc15-Release.lib;pjsua2-lib-x86_64-x64-vc15-Release.lib;pjsua-lib-x86_64-x64-vc15-Release.lib;pjsip-ua-x86_64-x64-vc15-Release.lib;pjmedia-x86_64-x64-vc15-Release.lib;pjlib-util-x86_64-x64-vc15-Release.lib;pjlib-x86_64-x64-vc15-Release.lib;pjnath-x86_64-x64-vc15-Release.lib;restbed.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>$(ProjectDir)..\contrib\build\ffmpeg\Build\win32\x64\bin;$(ProjectDir)..\contrib\msvc\lib\x64;$(ProjectDir)..\contrib\build\boost\stage\lib;$(ProjectDir)..\contrib\build\pjproject\pjsip\lib;$(ProjectDir)..\contrib\build\pjproject\pjmedia\lib;$(ProjectDir)..\contrib\build\pjproject\pjlib-util\lib;$(ProjectDir)..\contrib\build\pjproject\third_party\lib;$(ProjectDir)..\contrib\build\pjproject\pjlib\lib;$(ProjectDir)..\contrib\build\pjproject\pjnath\lib;$(ProjectDir)..\contrib\build\restbed\build\Release;$(ProjectDir)..\contrib\build\restbed\dependency\openssl\out32dll;$(ProjectDir)..\contrib\build\argon2\vs2015\Argon2Ref\vs2015\build;$(ProjectDir)..\contrib\build\pcre\msvc\Release;$(ProjectDir)..\contrib\build\yaml-cpp\msvc\Release;$(ProjectDir)..\contrib\build\sndfile\msvc\x64\Release</AdditionalLibraryDirectories>
       <AdditionalOptions>/ignore:4006 /ignore:4221 %(AdditionalOptions)</AdditionalOptions>
       <LinkTimeCodeGeneration>true</LinkTimeCodeGeneration>
@@ -721,8 +721,6 @@
     <ClCompile Include="..\src\media\audio\audiobuffer.cpp" />
     <ClCompile Include="..\src\media\audio\audiolayer.cpp" />
     <ClCompile Include="..\src\media\audio\audioloop.cpp" />
-    <ClCompile Include="..\src\media\audio\audiorecord.cpp" />
-    <ClCompile Include="..\src\media\audio\audiorecorder.cpp" />
     <ClCompile Include="..\src\media\audio\audio_rtp_session.cpp" />
     <ClCompile Include="..\src\media\audio\dcblocker.cpp" />
     <ClCompile Include="..\src\media\audio\dsp.cpp">
@@ -876,8 +874,6 @@
     <ClInclude Include="..\src\media\audio\audiobuffer.h" />
     <ClInclude Include="..\src\media\audio\audiolayer.h" />
     <ClInclude Include="..\src\media\audio\audioloop.h" />
-    <ClInclude Include="..\src\media\audio\audiorecord.h" />
-    <ClInclude Include="..\src\media\audio\audiorecorder.h" />
     <ClInclude Include="..\src\media\audio\audio_rtp_session.h" />
     <ClInclude Include="..\src\media\audio\dcblocker.h" />
     <ClInclude Include="..\src\media\audio\dsp.h">
diff --git a/configure.ac b/configure.ac
index 7430c590816a1293eb7ed3fcc1a579f2ad635979..5e6bca434027409290ad216c979847dee5a640c9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -355,9 +355,6 @@ dnl Check for the samplerate development package - name: libsamplerate0-dev
 LIBSAMPLERATE_MIN_VERSION=0.1.2
 PKG_CHECK_MODULES(SAMPLERATE, samplerate >= ${LIBSAMPLERATE_MIN_VERSION},, AC_MSG_ERROR([Missing libsamplerate development files]))
 
-dnl Check for the sndfile development package - name: libsndfile-dev
-PKG_CHECK_MODULES(SNDFILE, sndfile,, AC_MSG_ERROR([Missing sndfile development files]))
-
 dnl Coverage is default-disabled
 AC_ARG_ENABLE([coverage], AS_HELP_STRING([--enable-coverage], [Enable coverage]))
 
diff --git a/contrib/build_all.bat b/contrib/build_all.bat
index 2fb8acd0e17a2b12de4c44536d014eaaedc97664..37f496bf0ffc4daa1895a6cad47c6c7cd75f81a0 100644
--- a/contrib/build_all.bat
+++ b/contrib/build_all.bat
@@ -115,7 +115,6 @@ build\portaudio\msvc\portaudio.vcxproj, ^
 build\yaml-cpp\msvc\yaml-cpp.vcxproj, ^
 build\pcre\msvc\pcre.vcxproj, ^
 build\libsamplerate\msvc\libsamplerate.vcxproj, ^
-build\sndfile\msvc\libsndfile.vcxproj, ^
 )
 goto startBuild
 
diff --git a/contrib/src/fetch_all.bat b/contrib/src/fetch_all.bat
index 1d774a2aff2af92ab0c4f761c2f8365fbfbb0be6..c2e718ef7dac00d884345d9fee3c4b53f30fb38c 100644
--- a/contrib/src/fetch_all.bat
+++ b/contrib/src/fetch_all.bat
@@ -65,7 +65,6 @@ pthreads, ^
 restbed, ^
 samplerate, ^
 secp256k1, ^
-sndfile, ^
 upnp, ^
 vpx, ^
 x264, ^
diff --git a/contrib/src/sndfile/SHA512SUMS b/contrib/src/sndfile/SHA512SUMS
deleted file mode 100644
index ad45e4bd6dd04fbcac5a980ad97ff1163bbf3224..0000000000000000000000000000000000000000
--- a/contrib/src/sndfile/SHA512SUMS
+++ /dev/null
@@ -1 +0,0 @@
-4ca9780ed0a915aca8a10ef91bf4bf48b05ecb85285c2c3fe7eef1d46d3e0747e61416b6bddbef369bd69adf4b796ff5f61380e0bc998906b170a93341ba6f78  libsndfile-1.0.25.tar.gz
diff --git a/contrib/src/sndfile/autotools.patch b/contrib/src/sndfile/autotools.patch
deleted file mode 100644
index ef93ccaeb4ab1b3fd7142b958a88abaa3f091414..0000000000000000000000000000000000000000
--- a/contrib/src/sndfile/autotools.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From ca790066b639ea570067afb3cb2a36c9e3383ae8 Mon Sep 17 00:00:00 2001
-From: Erik de Castro Lopo <erikd@mega-nerd.com>
-Date: Sat, 13 Jul 2013 17:04:45 +1000
-Subject: [PATCH] configure.ac : Fix for current versions of autotools.
-
-Patch from Cristian Rodriguez.
----
- configure.ac | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index bef0c18..3b32cb7 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -20,7 +20,8 @@ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
- 
- AC_LANG([C])
- 
--AC_PROG_CC
-+AC_PROG_CC_STDC
-+AC_USE_SYSTEM_EXTENSIONS
- AM_PROG_CC_C_O
- AC_PROG_CXX
- AC_PROG_SED
-@@ -331,8 +332,8 @@ if test -n "$PKG_CONFIG" ; then
- 		HAVE_EXTERNAL_LIBS=1
- 		enable_external_libs=yes
- 
--		EXTERNAL_CFLAGS="$FLAC_CFLAGS $OGG_CFLAGS $VORBISENC_CFLAGS $SPEEX_CFLAGS"
--		EXTERNAL_LIBS="$FLAC_LIBS $VORBISENC_LIBS $SPEEX_LIBS"
-+		EXTERNAL_CFLAGS="$FLAC_CFLAGS $OGG_CFLAGS $VORBIS_CFLAGS $VORBISENC_CFLAGS $SPEEX_CFLAGS"
-+		EXTERNAL_LIBS="$FLAC_LIBS $OGG_LIBS $VORBIS_LIBS $VORBISENC_LIBS $SPEEX_LIBS "
- 	else
- 		echo
- 		AC_MSG_WARN([[*** One or more of the external libraries (ie libflac, libogg and]])
diff --git a/contrib/src/sndfile/carbon.patch b/contrib/src/sndfile/carbon.patch
deleted file mode 100644
index 22d89bae541c95afc8feb79da094804b8eed8cab..0000000000000000000000000000000000000000
--- a/contrib/src/sndfile/carbon.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- a/programs/sndfile-play.c.orig	2014-06-26 18:33:49.000000000 -0400
-+++ b/programs/sndfile-play.c	2014-06-26 18:33:52.000000000 -0400
-@@ -63,7 +63,6 @@
- 	#include 	<sys/soundcard.h>
- 
- #elif (defined (__MACH__) && defined (__APPLE__))
--	#include <Carbon.h>
- 	#include <CoreAudio/AudioHardware.h>
- 
- #elif defined (HAVE_SNDIO_H)
diff --git a/contrib/src/sndfile/disable_programs.patch b/contrib/src/sndfile/disable_programs.patch
deleted file mode 100644
index ea06b971de2ce2199fb8449c0c95fe3600090356..0000000000000000000000000000000000000000
--- a/contrib/src/sndfile/disable_programs.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- a/Makefile.am	2016-05-30 11:59:21.000000000 -0400
-+++ b/Makefile.am	2016-05-30 11:59:28.000000000 -0400
-@@ -6,8 +6,8 @@
- octave_dir = Octave
- endif
-
--SUBDIRS = M4 man doc Win32 src $(octave_dir) examples regtest tests programs
--DIST_SUBDIRS = M4 man doc Win32 src Octave examples regtest tests programs
-+SUBDIRS = M4 man doc Win32 src $(octave_dir)
-+DIST_SUBDIRS = M4 man doc Win32 src Octave
-
- EXTRA_DIST = libsndfile.spec.in sndfile.pc.in
diff --git a/contrib/src/sndfile/fetch_and_patch.bat b/contrib/src/sndfile/fetch_and_patch.bat
deleted file mode 100644
index e66288095c40f95009cf11d5b68aecb8d768ff8d..0000000000000000000000000000000000000000
--- a/contrib/src/sndfile/fetch_and_patch.bat
+++ /dev/null
@@ -1,22 +0,0 @@
-set BUILD=%SRC%..\build
-
-set SNDFILE_VERSION=1.0.25
-set SNDFILE_URL=http://www.mega-nerd.com/libsndfile/files/libsndfile-%SNDFILE_VERSION%.tar.gz
-
-mkdir %BUILD%
-
-if %USE_CACHE%==1 (
-    copy %CACHE_DIR%\libsndfile-%SNDFILE_URL%.tar.gz %cd%
-) else (
-    %WGET_CMD% %SNDFILE_URL%
-)
-
-7z -y x libsndfile-%SNDFILE_VERSION%.tar.gz && 7z -y x libsndfile-%SNDFILE_VERSION%.tar -o%BUILD%
-del libsndfile-%SNDFILE_VERSION%.tar && del libsndfile-%SNDFILE_VERSION%.tar.gz
-rename %BUILD%\libsndfile-%SNDFILE_VERSION% sndfile
-
-cd %BUILD%\sndfile
-
-%APPLY_CMD% %SRC%\sndfile\sndfile-vs2017.patch
-
-cd %SRC%
\ No newline at end of file
diff --git a/contrib/src/sndfile/rules.mak b/contrib/src/sndfile/rules.mak
deleted file mode 100644
index c92e8a079fd2413d1f316681af7a8a725f3d5261..0000000000000000000000000000000000000000
--- a/contrib/src/sndfile/rules.mak
+++ /dev/null
@@ -1,32 +0,0 @@
-# SNDFILE
-SNDFILE_VERSION := 1.0.25
-SNDFILE_URL := http://www.mega-nerd.com/libsndfile/files/libsndfile-$(SNDFILE_VERSION).tar.gz
-
-PKGS += sndfile
-ifeq ($(call need_pkg,"sndfile"),)
-PKGS_FOUND += sndfile
-endif
-
-DEPS_sndfile = ogg vorbis flac
-
-$(TARBALLS)/libsndfile-$(SNDFILE_VERSION).tar.gz:
-	$(call download,$(SNDFILE_URL))
-
-.sum-sndfile: libsndfile-$(SNDFILE_VERSION).tar.gz
-
-sndfile: libsndfile-$(SNDFILE_VERSION).tar.gz .sum-sndfile
-	$(UNPACK)
-	$(APPLY) $(SRC)/sndfile/soundcard.patch
-	$(APPLY) $(SRC)/sndfile/carbon.patch
-	$(APPLY) $(SRC)/sndfile/autotools.patch
-	$(APPLY) $(SRC)/sndfile/disable_programs.patch
-	$(UPDATE_AUTOCONFIG) && cd $(UNPACK_DIR) && mv config.guess config.sub Cfg && autoreconf -fi
-ifdef HAVE_IOS
-	rm -Rf examples
-endif
-	$(MOVE)
-
-.sndfile: sndfile
-	cd $< && $(HOSTVARS) ./configure $(HOSTCONF)
-	cd $< && $(MAKE) install
-	touch $@
diff --git a/contrib/src/sndfile/sndfile-vs2017.patch b/contrib/src/sndfile/sndfile-vs2017.patch
deleted file mode 100644
index 490f63eab6c28a53ae6f5be2644e71479a783f03..0000000000000000000000000000000000000000
--- a/contrib/src/sndfile/sndfile-vs2017.patch
+++ /dev/null
@@ -1,1346 +0,0 @@
---- /dev/null
-+++ b/msvc/libsndfile.vcxproj
-@@ -0,0 +1,210 @@
-+<?xml version="1.0" encoding="utf-8"?>
-+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-+  <ItemGroup Label="ProjectConfigurations">
-+    <ProjectConfiguration Include="Debug|Win32">
-+      <Configuration>Debug</Configuration>
-+      <Platform>Win32</Platform>
-+    </ProjectConfiguration>
-+    <ProjectConfiguration Include="Release|Win32">
-+      <Configuration>Release</Configuration>
-+      <Platform>Win32</Platform>
-+    </ProjectConfiguration>
-+    <ProjectConfiguration Include="Debug|x64">
-+      <Configuration>Debug</Configuration>
-+      <Platform>x64</Platform>
-+    </ProjectConfiguration>
-+    <ProjectConfiguration Include="Release|x64">
-+      <Configuration>Release</Configuration>
-+      <Platform>x64</Platform>
-+    </ProjectConfiguration>
-+  </ItemGroup>
-+  <PropertyGroup Label="Globals">
-+    <VCProjectVersion>15.0</VCProjectVersion>
-+    <ProjectGuid>{98F6F9C2-48F4-4173-83A2-80550A94CF0D}</ProjectGuid>
-+    <RootNamespace>libsndfile</RootNamespace>
-+    <WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
-+  </PropertyGroup>
-+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-+    <ConfigurationType>Application</ConfigurationType>
-+    <UseDebugLibraries>true</UseDebugLibraries>
-+    <PlatformToolset>v141</PlatformToolset>
-+    <CharacterSet>MultiByte</CharacterSet>
-+  </PropertyGroup>
-+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-+    <ConfigurationType>StaticLibrary</ConfigurationType>
-+    <UseDebugLibraries>false</UseDebugLibraries>
-+    <PlatformToolset>v141</PlatformToolset>
-+    <WholeProgramOptimization>true</WholeProgramOptimization>
-+    <CharacterSet>MultiByte</CharacterSet>
-+  </PropertyGroup>
-+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-+    <ConfigurationType>Application</ConfigurationType>
-+    <UseDebugLibraries>true</UseDebugLibraries>
-+    <PlatformToolset>v141</PlatformToolset>
-+    <CharacterSet>MultiByte</CharacterSet>
-+  </PropertyGroup>
-+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-+    <ConfigurationType>StaticLibrary</ConfigurationType>
-+    <UseDebugLibraries>false</UseDebugLibraries>
-+    <PlatformToolset>v141</PlatformToolset>
-+    <WholeProgramOptimization>true</WholeProgramOptimization>
-+    <CharacterSet>MultiByte</CharacterSet>
-+  </PropertyGroup>
-+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-+  <ImportGroup Label="ExtensionSettings">
-+  </ImportGroup>
-+  <ImportGroup Label="Shared">
-+  </ImportGroup>
-+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+  </ImportGroup>
-+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+  </ImportGroup>
-+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+  </ImportGroup>
-+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+  </ImportGroup>
-+  <PropertyGroup Label="UserMacros" />
-+  <PropertyGroup />
-+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-+    <ClCompile>
-+      <WarningLevel>Level3</WarningLevel>
-+      <Optimization>Disabled</Optimization>
-+      <SDLCheck>true</SDLCheck>
-+      <ConformanceMode>true</ConformanceMode>
-+    </ClCompile>
-+  </ItemDefinitionGroup>
-+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-+    <ClCompile>
-+      <WarningLevel>Level3</WarningLevel>
-+      <Optimization>Disabled</Optimization>
-+      <SDLCheck>true</SDLCheck>
-+      <ConformanceMode>true</ConformanceMode>
-+    </ClCompile>
-+  </ItemDefinitionGroup>
-+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-+    <ClCompile>
-+      <WarningLevel>TurnOffAllWarnings</WarningLevel>
-+      <Optimization>MaxSpeed</Optimization>
-+      <FunctionLevelLinking>true</FunctionLevelLinking>
-+      <IntrinsicFunctions>true</IntrinsicFunctions>
-+      <SDLCheck>true</SDLCheck>
-+      <ConformanceMode>true</ConformanceMode>
-+      <AdditionalIncludeDirectories>$(ProjectDir)../src;$(ProjectDir)../../../../MSVC</AdditionalIncludeDirectories>
-+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-+      <DisableSpecificWarnings>4224;%(DisableSpecificWarnings)</DisableSpecificWarnings>
-+    </ClCompile>
-+    <Link>
-+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-+      <OptimizeReferences>true</OptimizeReferences>
-+    </Link>
-+  </ItemDefinitionGroup>
-+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-+    <ClCompile>
-+      <WarningLevel>TurnOffAllWarnings</WarningLevel>
-+      <Optimization>MaxSpeed</Optimization>
-+      <FunctionLevelLinking>true</FunctionLevelLinking>
-+      <IntrinsicFunctions>true</IntrinsicFunctions>
-+      <SDLCheck>true</SDLCheck>
-+      <ConformanceMode>true</ConformanceMode>
-+      <AdditionalIncludeDirectories>$(ProjectDir)../src;$(ProjectDir)../../../../MSVC</AdditionalIncludeDirectories>
-+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-+      <DisableSpecificWarnings>4224;%(DisableSpecificWarnings)</DisableSpecificWarnings>
-+    </ClCompile>
-+    <Link>
-+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-+      <OptimizeReferences>true</OptimizeReferences>
-+    </Link>
-+  </ItemDefinitionGroup>
-+  <ItemGroup>
-+    <ClCompile Include="..\src\aiff.c" />
-+    <ClCompile Include="..\src\alaw.c" />
-+    <ClCompile Include="..\src\au.c" />
-+    <ClCompile Include="..\src\audio_detect.c" />
-+    <ClCompile Include="..\src\avr.c" />
-+    <ClCompile Include="..\src\broadcast.c" />
-+    <ClCompile Include="..\src\caf.c" />
-+    <ClCompile Include="..\src\chanmap.c" />
-+    <ClCompile Include="..\src\chunk.c" />
-+    <ClCompile Include="..\src\command.c" />
-+    <ClCompile Include="..\src\common.c" />
-+    <ClCompile Include="..\src\dither.c" />
-+    <ClCompile Include="..\src\double64.c" />
-+    <ClCompile Include="..\src\dwd.c" />
-+    <ClCompile Include="..\src\dwvw.c" />
-+    <ClCompile Include="..\src\file_io.c" />
-+    <ClCompile Include="..\src\flac.c" />
-+    <ClCompile Include="..\src\float32.c" />
-+    <ClCompile Include="..\src\htk.c" />
-+    <ClCompile Include="..\src\id3.c" />
-+    <ClCompile Include="..\src\ima_adpcm.c" />
-+    <ClCompile Include="..\src\ima_oki_adpcm.c" />
-+    <ClCompile Include="..\src\interleave.c" />
-+    <ClCompile Include="..\src\ircam.c" />
-+    <ClCompile Include="..\src\macbinary3.c" />
-+    <ClCompile Include="..\src\macos.c" />
-+    <ClCompile Include="..\src\mat4.c" />
-+    <ClCompile Include="..\src\mat5.c" />
-+    <ClCompile Include="..\src\mpc2k.c" />
-+    <ClCompile Include="..\src\ms_adpcm.c" />
-+    <ClCompile Include="..\src\nist.c" />
-+    <ClCompile Include="..\src\ogg.c" />
-+    <ClCompile Include="..\src\ogg_pcm.c" />
-+    <ClCompile Include="..\src\ogg_speex.c" />
-+    <ClCompile Include="..\src\ogg_vorbis.c" />
-+    <ClCompile Include="..\src\paf.c" />
-+    <ClCompile Include="..\src\pcm.c" />
-+    <ClCompile Include="..\src\pvf.c" />
-+    <ClCompile Include="..\src\raw.c" />
-+    <ClCompile Include="..\src\rf64.c" />
-+    <ClCompile Include="..\src\rx2.c" />
-+    <ClCompile Include="..\src\sd2.c" />
-+    <ClCompile Include="..\src\sds.c" />
-+    <ClCompile Include="..\src\sndfile.c" />
-+    <ClCompile Include="..\src\strings.c" />
-+    <ClCompile Include="..\src\svx.c" />
-+    <ClCompile Include="..\src\test_audio_detect.c" />
-+    <ClCompile Include="..\src\test_broadcast_var.c" />
-+    <ClCompile Include="..\src\test_conversions.c" />
-+    <ClCompile Include="..\src\test_endswap.c" />
-+    <ClCompile Include="..\src\test_file_io.c" />
-+    <ClCompile Include="..\src\test_float.c" />
-+    <ClCompile Include="..\src\test_ima_oki_adpcm.c" />
-+    <ClCompile Include="..\src\test_log_printf.c" />
-+    <ClCompile Include="..\src\test_main.c" />
-+    <ClCompile Include="..\src\test_strncpy_crlf.c" />
-+    <ClCompile Include="..\src\txw.c" />
-+    <ClCompile Include="..\src\ulaw.c" />
-+    <ClCompile Include="..\src\voc.c" />
-+    <ClCompile Include="..\src\vox_adpcm.c" />
-+    <ClCompile Include="..\src\w64.c" />
-+    <ClCompile Include="..\src\wav.c" />
-+    <ClCompile Include="..\src\wav_w64.c" />
-+    <ClCompile Include="..\src\windows.c" />
-+    <ClCompile Include="..\src\wve.c" />
-+    <ClCompile Include="..\src\xi.c" />
-+  </ItemGroup>
-+  <ItemGroup>
-+    <None Include="..\src\config.h.in" />
-+    <None Include="..\src\sndfile.h.in" />
-+  </ItemGroup>
-+  <ItemGroup>
-+    <ClInclude Include="..\src\chanmap.h" />
-+    <ClInclude Include="..\src\common.h" />
-+    <ClInclude Include="..\src\ima_oki_adpcm.h" />
-+    <ClInclude Include="..\src\ogg.h" />
-+    <ClInclude Include="..\src\sfconfig.h" />
-+    <ClInclude Include="..\src\sfendian.h" />
-+    <ClInclude Include="..\src\sf_unistd.h" />
-+    <ClInclude Include="..\src\sndfile.hh" />
-+    <ClInclude Include="..\src\test_main.h" />
-+    <ClInclude Include="..\src\wav_w64.h" />
-+  </ItemGroup>
-+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-+  <ImportGroup Label="ExtensionTargets">
-+  </ImportGroup>
-+</Project>
-\ No newline at end of file
---- a/src/common.c
-+++ b/src/common.c
-@@ -23,7 +23,9 @@
- #include	<ctype.h>
- #include	<math.h>
- #include	<time.h>
-+#ifndef _MSC_VER
- #include	<sys/time.h>
-+#endif
- 
- #include	"sndfile.h"
- #include	"sfendian.h"
---- /dev/null
-+++ b/src/config.h
-@@ -0,0 +1,324 @@
-+/* src/config.h.  Generated from config.h.in by configure.  */
-+/* src/config.h.in.  Generated from configure.ac by autoheader.  */
-+
-+/* Set to 1 if the compile is GNU GCC. */
-+#define COMPILER_IS_GCC 0
-+
-+/* Target processor clips on negative float to int conversion. */
-+#define CPU_CLIPS_NEGATIVE 0
-+
-+/* Target processor clips on positive float to int conversion. */
-+#define CPU_CLIPS_POSITIVE 0
-+
-+/* Target processor is big endian. */
-+#define CPU_IS_BIG_ENDIAN 0
-+
-+/* Target processor is little endian. */
-+#define CPU_IS_LITTLE_ENDIAN 1
-+
-+/* Set to 1 to enable experimental code. */
-+#define ENABLE_EXPERIMENTAL_CODE 0
-+
-+/* Define to 1 if you have the <alsa/asoundlib.h> header file. */
-+/* #undef HAVE_ALSA_ASOUNDLIB_H */
-+
-+/* Define to 1 if you have the <byteswap.h> header file. */
-+/* #undef HAVE_BYTESWAP_H */
-+
-+/* Define to 1 if you have the `calloc' function. */
-+#define HAVE_CALLOC 1
-+
-+/* Define to 1 if you have the `ceil' function. */
-+#define HAVE_CEIL 1
-+
-+/* Set to 1 if S_IRGRP is defined. */
-+#define HAVE_DECL_S_IRGRP 1
-+
-+/* Define to 1 if you have the <dlfcn.h> header file. */
-+#define HAVE_DLFCN_H 0
-+
-+/* Define to 1 if you have the <endian.h> header file. */
-+/* #undef HAVE_ENDIAN_H */
-+
-+/* Will be set to 1 if flac, ogg and vorbis are available. */
-+#define HAVE_EXTERNAL_LIBS 0
-+
-+/* Set to 1 if the compile supports the struct hack. */
-+#define HAVE_FLEXIBLE_ARRAY 0
-+
-+/* Define to 1 if you have the `floor' function. */
-+#define HAVE_FLOOR 1
-+
-+/* Define to 1 if you have the `fmod' function. */
-+#define HAVE_FMOD 1
-+
-+/* Define to 1 if you have the `free' function. */
-+#define HAVE_FREE 1
-+
-+/* Define to 1 if you have the `fstat' function. */
-+#define HAVE_FSTAT 1
-+
-+/* Define to 1 if you have the `fsync' function. */
-+#define HAVE_FSYNC 1
-+
-+/* Define to 1 if you have the `ftruncate' function. */
-+#define HAVE_FTRUNCATE 1
-+
-+/* Define to 1 if you have the `getpagesize' function. */
-+#define HAVE_GETPAGESIZE 0
-+
-+/* Define to 1 if you have the `gettimeofday' function. */
-+#define HAVE_GETTIMEOFDAY 0
-+
-+/* Define to 1 if you have the `gmtime' function. */
-+#define HAVE_GMTIME 0
-+
-+/* Define to 1 if you have the `gmtime_r' function. */
-+#undef HAVE_GMTIME_R
-+
-+/* Define to 1 if you have the <inttypes.h> header file. */
-+#define HAVE_INTTYPES_H 1
-+
-+/* Define to 1 if you have the `m' library (-lm). */
-+#define HAVE_LIBM 0
-+
-+/* Define to 1 if you have the <locale.h> header file. */
-+#define HAVE_LOCALE_H 0
-+
-+/* Define to 1 if you have the `localtime' function. */
-+#define HAVE_LOCALTIME 1
-+
-+/* Define to 1 if you have the `localtime_r' function. */
-+#define HAVE_LOCALTIME_R 1
-+
-+/* Define if you have C99's lrint function. */
-+#define HAVE_LRINT 1
-+
-+/* Define if you have C99's lrintf function. */
-+#define HAVE_LRINTF 1
-+
-+/* Define to 1 if you have the `lseek' function. */
-+#define HAVE_LSEEK 1
-+
-+/* Define to 1 if you have the `malloc' function. */
-+#define HAVE_MALLOC 1
-+
-+/* Define to 1 if you have the <memory.h> header file. */
-+#define HAVE_MEMORY_H 1
-+
-+/* Define to 1 if you have the `mmap' function. */
-+#define HAVE_MMAP 1
-+
-+/* Define to 1 if you have the `open' function. */
-+#define HAVE_OPEN 1
-+
-+/* Define to 1 if you have the `pipe' function. */
-+#define HAVE_PIPE 1
-+
-+/* Define to 1 if you have the `pread' function. */
-+#define HAVE_PREAD 1
-+
-+/* Define to 1 if you have the `pwrite' function. */
-+#define HAVE_PWRITE 1
-+
-+/* Define to 1 if you have the `read' function. */
-+#define HAVE_READ 1
-+
-+/* Define to 1 if you have the `realloc' function. */
-+#define HAVE_REALLOC 1
-+
-+/* Define to 1 if you have the `setlocale' function. */
-+#define HAVE_SETLOCALE 1
-+
-+/* Define to 1 if you have the <sndio.h> header file. */
-+/* #undef HAVE_SNDIO_H */
-+
-+/* Define to 1 if you have the `snprintf' function. */
-+#define HAVE_SNPRINTF 1
-+
-+/* Set to 1 if you have libsqlite3. */
-+#define HAVE_SQLITE3 0
-+
-+/* Define to 1 if the system has the type `ssize_t'. */
-+#define HAVE_SSIZE_T 1
-+
-+/* Define to 1 if you have the <stdint.h> header file. */
-+#define HAVE_STDINT_H 1
-+
-+/* Define to 1 if you have the <stdlib.h> header file. */
-+#define HAVE_STDLIB_H 1
-+
-+/* Define to 1 if you have the <strings.h> header file. */
-+#define HAVE_STRINGS_H 1
-+
-+/* Define to 1 if you have the <string.h> header file. */
-+#define HAVE_STRING_H 1
-+
-+/* Define to 1 if you have the <sys/stat.h> header file. */
-+#define HAVE_SYS_STAT_H 1
-+
-+/* Define to 1 if you have the <sys/time.h> header file. */
-+#define HAVE_SYS_TIME_H 1
-+
-+/* Define to 1 if you have the <sys/types.h> header file. */
-+#define HAVE_SYS_TYPES_H 1
-+
-+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
-+#define HAVE_SYS_WAIT_H 1
-+
-+/* Define to 1 if you have the <unistd.h> header file. */
-+#define HAVE_UNISTD_H 1
-+
-+/* Define to 1 if you have the `vsnprintf' function. */
-+#define HAVE_VSNPRINTF 1
-+
-+/* Define to 1 if you have the `waitpid' function. */
-+#define HAVE_WAITPID 1
-+
-+/* Define to 1 if you have the `write' function. */
-+#define HAVE_WRITE 1
-+
-+/* Define to the sub-directory where libtool stores uninstalled libraries. */
-+#define LT_OBJDIR ".libs/"
-+
-+/* Set to 1 if compiling for MacOSX */
-+#define OS_IS_MACOSX 0
-+
-+/* Set to 1 if compiling for Win32 */
-+#define OS_IS_WIN32 1
-+
-+/* Name of package */
-+#define PACKAGE "libsndfile"
-+
-+/* Define to the address where bug reports for this package should be sent. */
-+#define PACKAGE_BUGREPORT "sndfile@mega-nerd.com"
-+
-+/* Define to the full name of this package. */
-+#define PACKAGE_NAME "libsndfile"
-+
-+/* Define to the full name and version of this package. */
-+#define PACKAGE_STRING "libsndfile 1.0.25"
-+
-+/* Define to the one symbol short name of this package. */
-+#define PACKAGE_TARNAME "libsndfile"
-+
-+/* Define to the home page for this package. */
-+#define PACKAGE_URL "http://www.mega-nerd.com/libsndfile/"
-+
-+/* Define to the version of this package. */
-+#define PACKAGE_VERSION "1.0.25"
-+
-+/* Set to maximum allowed value of sf_count_t type. */
-+#define SF_COUNT_MAX 0x7FFFFFFFFFFFFFFFLL
-+
-+/* The size of `double', as computed by sizeof. */
-+#define SIZEOF_DOUBLE 8
-+
-+/* The size of `float', as computed by sizeof. */
-+#define SIZEOF_FLOAT 4
-+
-+/* The size of `int', as computed by sizeof. */
-+#define SIZEOF_INT 4
-+
-+/* The size of `int64_t', as computed by sizeof. */
-+#define SIZEOF_INT64_T 8
-+
-+/* The size of `loff_t', as computed by sizeof. */
-+/* #undef SIZEOF_LOFF_T */
-+
-+/* The size of `long', as computed by sizeof. */
-+#define SIZEOF_LONG 8
-+
-+/* The size of `long long', as computed by sizeof. */
-+#define SIZEOF_LONG_LONG 8
-+
-+/* The size of `off64_t', as computed by sizeof. */
-+/* #undef SIZEOF_OFF64_T */
-+
-+/* The size of `off_t', as computed by sizeof. */
-+#define SIZEOF_OFF_T 8
-+
-+/* Set to sizeof (long) if unknown. */
-+#define SIZEOF_SF_COUNT_T 8
-+
-+/* The size of `short', as computed by sizeof. */
-+#define SIZEOF_SHORT 2
-+
-+/* The size of `size_t', as computed by sizeof. */
-+#define SIZEOF_SIZE_T 8
-+
-+/* The size of `ssize_t', as computed by sizeof. */
-+#define SIZEOF_SSIZE_T 8
-+
-+/* The size of `void*', as computed by sizeof. */
-+#define SIZEOF_VOIDP 8
-+
-+/* The size of `wchar_t', as computed by sizeof. */
-+#define SIZEOF_WCHAR_T 4
-+
-+/* Define to 1 if you have the ANSI C header files. */
-+#define STDC_HEADERS 1
-+
-+/* Set to long if unknown. */
-+#define TYPEOF_SF_COUNT_T int64_t
-+
-+/* Enable extensions on AIX 3, Interix.  */
-+#ifndef _ALL_SOURCE
-+# define _ALL_SOURCE 1
-+#endif
-+/* Enable GNU extensions on systems that have them.  */
-+#ifndef _GNU_SOURCE
-+# define _GNU_SOURCE 1
-+#endif
-+/* Enable threading extensions on Solaris.  */
-+#ifndef _POSIX_PTHREAD_SEMANTICS
-+# define _POSIX_PTHREAD_SEMANTICS 1
-+#endif
-+/* Enable extensions on HP NonStop.  */
-+#ifndef _TANDEM_SOURCE
-+# define _TANDEM_SOURCE 1
-+#endif
-+/* Enable general extensions on Solaris.  */
-+#ifndef __EXTENSIONS__
-+# define __EXTENSIONS__ 1
-+#endif
-+
-+
-+/* Set to 1 to use the native windows API */
-+#define USE_WINDOWS_API 1
-+
-+/* Version number of package */
-+#define VERSION "1.0.25"
-+
-+/* Set to 1 if windows DLL is being built. */
-+#define WIN32_TARGET_DLL 0
-+
-+/* Target processor is big endian. */
-+#define WORDS_BIGENDIAN 0
-+
-+#include <BaseTsd.h>
-+typedef SSIZE_T ssize_t;
-+#define _USE_MATH_DEFINES
-+#include <math.h>
-+
-+/* Number of bits in a file offset, on hosts where this is settable. */
-+/* #undef _FILE_OFFSET_BITS */
-+
-+/* Define to make fseeko etc. visible, on some hosts. */
-+/* #undef _LARGEFILE_SOURCE */
-+
-+/* Define for large files, on AIX-style hosts. */
-+/* #undef _LARGE_FILES */
-+
-+/* Define to 1 if on MINIX. */
-+/* #undef _MINIX */
-+
-+/* Define to 2 if the system does not provide POSIX.1 features except with
-+   this defined. */
-+/* #undef _POSIX_1_SOURCE */
-+
-+/* Define to 1 if you need to in order for `stat' and other things to work. */
-+/* #undef _POSIX_SOURCE */
-+
-+/* Set to 1 to use C99 printf/snprintf in MinGW. */
-+/* #undef __USE_MINGW_ANSI_STDIO */
-\ No newline at end of file
---- /dev/null
-+++ b/src/sndfile.h
-@@ -0,0 +1,666 @@
-+/*
-+** Copyright (C) 1999-2011Erik de Castro Lopo <erikd@mega-nerd.com>
-+**
-+** This program is free software; you can redistribute it and/or modify
-+** it under the terms of the GNU Lesser General Public License as published by
-+** the Free Software Foundation; either version 2.1 of the License, or
-+** (at your option) any later version.
-+**
-+** This program is distributed in the hope that it will be useful,
-+** but WITHOUT ANY WARRANTY; without even the implied warranty of
-+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+** GNU Lesser General Public License for more details.
-+**
-+** You should have received a copy of the GNU Lesser General Public License
-+** along with this program; if not, write to the Free Software
-+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+*/
-+
-+/*
-+** sndfile.h -- system-wide definitions
-+**
-+** API documentation is in the doc/ directory of the source code tarball
-+** and at http://www.mega-nerd.com/libsndfile/api.html.
-+*/
-+
-+#ifndef SNDFILE_H
-+#define SNDFILE_H
-+
-+/* This is the version 1.0.X header file. */
-+#define	SNDFILE_1
-+
-+#include <stdio.h>
-+#include <sys/types.h>
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif	/* __cplusplus */
-+
-+/* The following file types can be read and written.
-+** A file type would consist of a major type (ie SF_FORMAT_WAV) bitwise
-+** ORed with a minor type (ie SF_FORMAT_PCM). SF_FORMAT_TYPEMASK and
-+** SF_FORMAT_SUBMASK can be used to separate the major and minor file
-+** types.
-+*/
-+
-+enum
-+{	/* Major formats. */
-+	SF_FORMAT_WAV			= 0x010000,		/* Microsoft WAV format (little endian default). */
-+	SF_FORMAT_AIFF			= 0x020000,		/* Apple/SGI AIFF format (big endian). */
-+	SF_FORMAT_AU			= 0x030000,		/* Sun/NeXT AU format (big endian). */
-+	SF_FORMAT_RAW			= 0x040000,		/* RAW PCM data. */
-+	SF_FORMAT_PAF			= 0x050000,		/* Ensoniq PARIS file format. */
-+	SF_FORMAT_SVX			= 0x060000,		/* Amiga IFF / SVX8 / SV16 format. */
-+	SF_FORMAT_NIST			= 0x070000,		/* Sphere NIST format. */
-+	SF_FORMAT_VOC			= 0x080000,		/* VOC files. */
-+	SF_FORMAT_IRCAM			= 0x0A0000,		/* Berkeley/IRCAM/CARL */
-+	SF_FORMAT_W64			= 0x0B0000,		/* Sonic Foundry's 64 bit RIFF/WAV */
-+	SF_FORMAT_MAT4			= 0x0C0000,		/* Matlab (tm) V4.2 / GNU Octave 2.0 */
-+	SF_FORMAT_MAT5			= 0x0D0000,		/* Matlab (tm) V5.0 / GNU Octave 2.1 */
-+	SF_FORMAT_PVF			= 0x0E0000,		/* Portable Voice Format */
-+	SF_FORMAT_XI			= 0x0F0000,		/* Fasttracker 2 Extended Instrument */
-+	SF_FORMAT_HTK			= 0x100000,		/* HMM Tool Kit format */
-+	SF_FORMAT_SDS			= 0x110000,		/* Midi Sample Dump Standard */
-+	SF_FORMAT_AVR			= 0x120000,		/* Audio Visual Research */
-+	SF_FORMAT_WAVEX			= 0x130000,		/* MS WAVE with WAVEFORMATEX */
-+	SF_FORMAT_SD2			= 0x160000,		/* Sound Designer 2 */
-+	SF_FORMAT_FLAC			= 0x170000,		/* FLAC lossless file format */
-+	SF_FORMAT_CAF			= 0x180000,		/* Core Audio File format */
-+	SF_FORMAT_WVE			= 0x190000,		/* Psion WVE format */
-+	SF_FORMAT_OGG			= 0x200000,		/* Xiph OGG container */
-+	SF_FORMAT_MPC2K			= 0x210000,		/* Akai MPC 2000 sampler */
-+	SF_FORMAT_RF64			= 0x220000,		/* RF64 WAV file */
-+
-+	/* Subtypes from here on. */
-+
-+	SF_FORMAT_PCM_S8		= 0x0001,		/* Signed 8 bit data */
-+	SF_FORMAT_PCM_16		= 0x0002,		/* Signed 16 bit data */
-+	SF_FORMAT_PCM_24		= 0x0003,		/* Signed 24 bit data */
-+	SF_FORMAT_PCM_32		= 0x0004,		/* Signed 32 bit data */
-+
-+	SF_FORMAT_PCM_U8		= 0x0005,		/* Unsigned 8 bit data (WAV and RAW only) */
-+
-+	SF_FORMAT_FLOAT			= 0x0006,		/* 32 bit float data */
-+	SF_FORMAT_DOUBLE		= 0x0007,		/* 64 bit float data */
-+
-+	SF_FORMAT_ULAW			= 0x0010,		/* U-Law encoded. */
-+	SF_FORMAT_ALAW			= 0x0011,		/* A-Law encoded. */
-+	SF_FORMAT_IMA_ADPCM		= 0x0012,		/* IMA ADPCM. */
-+	SF_FORMAT_MS_ADPCM		= 0x0013,		/* Microsoft ADPCM. */
-+
-+	SF_FORMAT_GSM610		= 0x0020,		/* GSM 6.10 encoding. */
-+	SF_FORMAT_VOX_ADPCM		= 0x0021,		/* OKI / Dialogix ADPCM */
-+
-+	SF_FORMAT_G721_32		= 0x0030,		/* 32kbs G721 ADPCM encoding. */
-+	SF_FORMAT_G723_24		= 0x0031,		/* 24kbs G723 ADPCM encoding. */
-+	SF_FORMAT_G723_40		= 0x0032,		/* 40kbs G723 ADPCM encoding. */
-+
-+	SF_FORMAT_DWVW_12		= 0x0040, 		/* 12 bit Delta Width Variable Word encoding. */
-+	SF_FORMAT_DWVW_16		= 0x0041, 		/* 16 bit Delta Width Variable Word encoding. */
-+	SF_FORMAT_DWVW_24		= 0x0042, 		/* 24 bit Delta Width Variable Word encoding. */
-+	SF_FORMAT_DWVW_N		= 0x0043, 		/* N bit Delta Width Variable Word encoding. */
-+
-+	SF_FORMAT_DPCM_8		= 0x0050,		/* 8 bit differential PCM (XI only) */
-+	SF_FORMAT_DPCM_16		= 0x0051,		/* 16 bit differential PCM (XI only) */
-+
-+	SF_FORMAT_VORBIS		= 0x0060,		/* Xiph Vorbis encoding. */
-+
-+	/* Endian-ness options. */
-+
-+	SF_ENDIAN_FILE			= 0x00000000,	/* Default file endian-ness. */
-+	SF_ENDIAN_LITTLE		= 0x10000000,	/* Force little endian-ness. */
-+	SF_ENDIAN_BIG			= 0x20000000,	/* Force big endian-ness. */
-+	SF_ENDIAN_CPU			= 0x30000000,	/* Force CPU endian-ness. */
-+
-+	SF_FORMAT_SUBMASK		= 0x0000FFFF,
-+	SF_FORMAT_TYPEMASK		= 0x0FFF0000,
-+	SF_FORMAT_ENDMASK		= 0x30000000
-+} ;
-+
-+/*
-+** The following are the valid command numbers for the sf_command()
-+** interface.  The use of these commands is documented in the file
-+** command.html in the doc directory of the source code distribution.
-+*/
-+
-+enum
-+{	SFC_GET_LIB_VERSION				= 0x1000,
-+	SFC_GET_LOG_INFO				= 0x1001,
-+	SFC_GET_CURRENT_SF_INFO			= 0x1002,
-+
-+
-+	SFC_GET_NORM_DOUBLE				= 0x1010,
-+	SFC_GET_NORM_FLOAT				= 0x1011,
-+	SFC_SET_NORM_DOUBLE				= 0x1012,
-+	SFC_SET_NORM_FLOAT				= 0x1013,
-+	SFC_SET_SCALE_FLOAT_INT_READ	= 0x1014,
-+	SFC_SET_SCALE_INT_FLOAT_WRITE	= 0x1015,
-+
-+	SFC_GET_SIMPLE_FORMAT_COUNT		= 0x1020,
-+	SFC_GET_SIMPLE_FORMAT			= 0x1021,
-+
-+	SFC_GET_FORMAT_INFO				= 0x1028,
-+
-+	SFC_GET_FORMAT_MAJOR_COUNT		= 0x1030,
-+	SFC_GET_FORMAT_MAJOR			= 0x1031,
-+	SFC_GET_FORMAT_SUBTYPE_COUNT	= 0x1032,
-+	SFC_GET_FORMAT_SUBTYPE			= 0x1033,
-+
-+	SFC_CALC_SIGNAL_MAX				= 0x1040,
-+	SFC_CALC_NORM_SIGNAL_MAX		= 0x1041,
-+	SFC_CALC_MAX_ALL_CHANNELS		= 0x1042,
-+	SFC_CALC_NORM_MAX_ALL_CHANNELS	= 0x1043,
-+	SFC_GET_SIGNAL_MAX				= 0x1044,
-+	SFC_GET_MAX_ALL_CHANNELS		= 0x1045,
-+
-+	SFC_SET_ADD_PEAK_CHUNK			= 0x1050,
-+	SFC_SET_ADD_HEADER_PAD_CHUNK	= 0x1051,
-+
-+	SFC_UPDATE_HEADER_NOW			= 0x1060,
-+	SFC_SET_UPDATE_HEADER_AUTO		= 0x1061,
-+
-+	SFC_FILE_TRUNCATE				= 0x1080,
-+
-+	SFC_SET_RAW_START_OFFSET		= 0x1090,
-+
-+	SFC_SET_DITHER_ON_WRITE			= 0x10A0,
-+	SFC_SET_DITHER_ON_READ			= 0x10A1,
-+
-+	SFC_GET_DITHER_INFO_COUNT		= 0x10A2,
-+	SFC_GET_DITHER_INFO				= 0x10A3,
-+
-+	SFC_GET_EMBED_FILE_INFO			= 0x10B0,
-+
-+	SFC_SET_CLIPPING				= 0x10C0,
-+	SFC_GET_CLIPPING				= 0x10C1,
-+
-+	SFC_GET_INSTRUMENT				= 0x10D0,
-+	SFC_SET_INSTRUMENT				= 0x10D1,
-+
-+	SFC_GET_LOOP_INFO				= 0x10E0,
-+
-+	SFC_GET_BROADCAST_INFO			= 0x10F0,
-+	SFC_SET_BROADCAST_INFO			= 0x10F1,
-+
-+	SFC_GET_CHANNEL_MAP_INFO		= 0x1100,
-+	SFC_SET_CHANNEL_MAP_INFO		= 0x1101,
-+
-+	SFC_RAW_DATA_NEEDS_ENDSWAP		= 0x1110,
-+
-+	/* Support for Wavex Ambisonics Format */
-+	SFC_WAVEX_SET_AMBISONIC			= 0x1200,
-+	SFC_WAVEX_GET_AMBISONIC			= 0x1201,
-+
-+	SFC_SET_VBR_ENCODING_QUALITY	= 0x1300,
-+
-+	/* Following commands for testing only. */
-+	SFC_TEST_IEEE_FLOAT_REPLACE		= 0x6001,
-+
-+	/*
-+	** SFC_SET_ADD_* values are deprecated and will disappear at some
-+	** time in the future. They are guaranteed to be here up to and
-+	** including version 1.0.8 to avoid breakage of existng software.
-+	** They currently do nothing and will continue to do nothing.
-+	*/
-+	SFC_SET_ADD_DITHER_ON_WRITE		= 0x1070,
-+	SFC_SET_ADD_DITHER_ON_READ		= 0x1071
-+} ;
-+
-+
-+/*
-+** String types that can be set and read from files. Not all file types
-+** support this and even the file types which support one, may not support
-+** all string types.
-+*/
-+
-+enum
-+{	SF_STR_TITLE					= 0x01,
-+	SF_STR_COPYRIGHT				= 0x02,
-+	SF_STR_SOFTWARE					= 0x03,
-+	SF_STR_ARTIST					= 0x04,
-+	SF_STR_COMMENT					= 0x05,
-+	SF_STR_DATE						= 0x06,
-+	SF_STR_ALBUM					= 0x07,
-+	SF_STR_LICENSE					= 0x08,
-+	SF_STR_TRACKNUMBER				= 0x09,
-+	SF_STR_GENRE					= 0x10
-+} ;
-+
-+/*
-+** Use the following as the start and end index when doing metadata
-+** transcoding.
-+*/
-+
-+#define	SF_STR_FIRST	SF_STR_TITLE
-+#define	SF_STR_LAST		SF_STR_GENRE
-+
-+enum
-+{	/* True and false */
-+	SF_FALSE	= 0,
-+	SF_TRUE		= 1,
-+
-+	/* Modes for opening files. */
-+	SFM_READ	= 0x10,
-+	SFM_WRITE	= 0x20,
-+	SFM_RDWR	= 0x30,
-+
-+	SF_AMBISONIC_NONE		= 0x40,
-+	SF_AMBISONIC_B_FORMAT	= 0x41
-+} ;
-+
-+/* Public error values. These are guaranteed to remain unchanged for the duration
-+** of the library major version number.
-+** There are also a large number of private error numbers which are internal to
-+** the library which can change at any time.
-+*/
-+
-+enum
-+{	SF_ERR_NO_ERROR				= 0,
-+	SF_ERR_UNRECOGNISED_FORMAT	= 1,
-+	SF_ERR_SYSTEM				= 2,
-+	SF_ERR_MALFORMED_FILE		= 3,
-+	SF_ERR_UNSUPPORTED_ENCODING	= 4
-+} ;
-+
-+
-+/* Channel map values (used with SFC_SET/GET_CHANNEL_MAP).
-+*/
-+
-+enum
-+{	SF_CHANNEL_MAP_INVALID = 0,
-+	SF_CHANNEL_MAP_MONO = 1,
-+	SF_CHANNEL_MAP_LEFT,					/* Apple calls this 'Left' */
-+	SF_CHANNEL_MAP_RIGHT,					/* Apple calls this 'Right' */
-+	SF_CHANNEL_MAP_CENTER,					/* Apple calls this 'Center' */
-+	SF_CHANNEL_MAP_FRONT_LEFT,
-+	SF_CHANNEL_MAP_FRONT_RIGHT,
-+	SF_CHANNEL_MAP_FRONT_CENTER,
-+	SF_CHANNEL_MAP_REAR_CENTER,				/* Apple calls this 'Center Surround', Msft calls this 'Back Center' */
-+	SF_CHANNEL_MAP_REAR_LEFT,				/* Apple calls this 'Left Surround', Msft calls this 'Back Left' */
-+	SF_CHANNEL_MAP_REAR_RIGHT,				/* Apple calls this 'Right Surround', Msft calls this 'Back Right' */
-+	SF_CHANNEL_MAP_LFE,						/* Apple calls this 'LFEScreen', Msft calls this 'Low Frequency'  */
-+	SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER,	/* Apple calls this 'Left Center' */
-+	SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER,	/* Apple calls this 'Right Center */
-+	SF_CHANNEL_MAP_SIDE_LEFT,				/* Apple calls this 'Left Surround Direct' */
-+	SF_CHANNEL_MAP_SIDE_RIGHT,				/* Apple calls this 'Right Surround Direct' */
-+	SF_CHANNEL_MAP_TOP_CENTER,				/* Apple calls this 'Top Center Surround' */
-+	SF_CHANNEL_MAP_TOP_FRONT_LEFT,			/* Apple calls this 'Vertical Height Left' */
-+	SF_CHANNEL_MAP_TOP_FRONT_RIGHT,			/* Apple calls this 'Vertical Height Right' */
-+	SF_CHANNEL_MAP_TOP_FRONT_CENTER,		/* Apple calls this 'Vertical Height Center' */
-+	SF_CHANNEL_MAP_TOP_REAR_LEFT,			/* Apple and MS call this 'Top Back Left' */
-+	SF_CHANNEL_MAP_TOP_REAR_RIGHT,			/* Apple and MS call this 'Top Back Right' */
-+	SF_CHANNEL_MAP_TOP_REAR_CENTER,			/* Apple and MS call this 'Top Back Center' */
-+
-+	SF_CHANNEL_MAP_AMBISONIC_B_W,
-+	SF_CHANNEL_MAP_AMBISONIC_B_X,
-+	SF_CHANNEL_MAP_AMBISONIC_B_Y,
-+	SF_CHANNEL_MAP_AMBISONIC_B_Z,
-+
-+	SF_CHANNEL_MAP_MAX
-+} ;
-+
-+
-+/* A SNDFILE* pointer can be passed around much like stdio.h's FILE* pointer. */
-+
-+typedef	struct SNDFILE_tag	SNDFILE ;
-+
-+/* The following typedef is system specific and is defined when libsndfile is
-+** compiled. sf_count_t will be a 64 bit value when the underlying OS allows
-+** 64 bit file offsets.
-+** On windows, we need to allow the same header file to be compiler by both GCC
-+** and the Microsoft compiler.
-+*/
-+
-+#if (defined (_MSCVER) || defined (_MSC_VER))
-+typedef __int64		sf_count_t ;
-+#define SF_COUNT_MAX		0x7fffffffffffffffi64
-+#else
-+typedef @TYPEOF_SF_COUNT_T@	sf_count_t ;
-+#define SF_COUNT_MAX		@SF_COUNT_MAX@
-+#endif
-+
-+
-+/* A pointer to a SF_INFO structure is passed to sf_open () and filled in.
-+** On write, the SF_INFO structure is filled in by the user and passed into
-+** sf_open ().
-+*/
-+
-+struct SF_INFO
-+{	sf_count_t	frames ;		/* Used to be called samples.  Changed to avoid confusion. */
-+	int			samplerate ;
-+	int			channels ;
-+	int			format ;
-+	int			sections ;
-+	int			seekable ;
-+} ;
-+
-+typedef	struct SF_INFO SF_INFO ;
-+
-+/* The SF_FORMAT_INFO struct is used to retrieve information about the sound
-+** file formats libsndfile supports using the sf_command () interface.
-+**
-+** Using this interface will allow applications to support new file formats
-+** and encoding types when libsndfile is upgraded, without requiring
-+** re-compilation of the application.
-+**
-+** Please consult the libsndfile documentation (particularly the information
-+** on the sf_command () interface) for examples of its use.
-+*/
-+
-+typedef struct
-+{	int			format ;
-+	const char	*name ;
-+	const char	*extension ;
-+} SF_FORMAT_INFO ;
-+
-+/*
-+** Enums and typedefs for adding dither on read and write.
-+** See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE
-+** and SFC_SET_DITHER_ON_READ.
-+*/
-+
-+enum
-+{	SFD_DEFAULT_LEVEL	= 0,
-+	SFD_CUSTOM_LEVEL	= 0x40000000,
-+
-+	SFD_NO_DITHER		= 500,
-+	SFD_WHITE			= 501,
-+	SFD_TRIANGULAR_PDF	= 502
-+} ;
-+
-+typedef struct
-+{	int			type ;
-+	double		level ;
-+	const char	*name ;
-+} SF_DITHER_INFO ;
-+
-+/* Struct used to retrieve information about a file embedded within a
-+** larger file. See SFC_GET_EMBED_FILE_INFO.
-+*/
-+
-+typedef struct
-+{	sf_count_t	offset ;
-+	sf_count_t	length ;
-+} SF_EMBED_FILE_INFO ;
-+
-+/*
-+**	Structs used to retrieve music sample information from a file.
-+*/
-+
-+enum
-+{	/*
-+	**	The loop mode field in SF_INSTRUMENT will be one of the following.
-+	*/
-+	SF_LOOP_NONE = 800,
-+	SF_LOOP_FORWARD,
-+	SF_LOOP_BACKWARD,
-+	SF_LOOP_ALTERNATING
-+} ;
-+
-+typedef struct
-+{	int gain ;
-+	char basenote, detune ;
-+	char velocity_lo, velocity_hi ;
-+	char key_lo, key_hi ;
-+	int loop_count ;
-+
-+	struct
-+	{	int mode ;
-+		unsigned int start ;
-+		unsigned int end ;
-+		unsigned int count ;
-+	} loops [16] ; /* make variable in a sensible way */
-+} SF_INSTRUMENT ;
-+
-+
-+
-+/* Struct used to retrieve loop information from a file.*/
-+typedef struct
-+{
-+	short	time_sig_num ;	/* any positive integer    > 0  */
-+	short	time_sig_den ;	/* any positive power of 2 > 0  */
-+	int		loop_mode ;		/* see SF_LOOP enum             */
-+
-+	int		num_beats ;		/* this is NOT the amount of quarter notes !!!*/
-+							/* a full bar of 4/4 is 4 beats */
-+							/* a full bar of 7/8 is 7 beats */
-+
-+	float	bpm ;			/* suggestion, as it can be calculated using other fields:*/
-+							/* file's lenght, file's sampleRate and our time_sig_den*/
-+							/* -> bpms are always the amount of _quarter notes_ per minute */
-+
-+	int	root_key ;			/* MIDI note, or -1 for None */
-+	int future [6] ;
-+} SF_LOOP_INFO ;
-+
-+
-+/*	Struct used to retrieve broadcast (EBU) information from a file.
-+**	Strongly (!) based on EBU "bext" chunk format used in Broadcast WAVE.
-+*/
-+#define	SF_BROADCAST_INFO_VAR(coding_hist_size) \
-+			struct \
-+			{	char			description [256] ; \
-+				char			originator [32] ; \
-+				char			originator_reference [32] ; \
-+				char			origination_date [10] ; \
-+				char			origination_time [8] ; \
-+				unsigned int	time_reference_low ; \
-+				unsigned int	time_reference_high ; \
-+				short			version ; \
-+				char			umid [64] ; \
-+				char			reserved [190] ; \
-+				unsigned int	coding_history_size ; \
-+				char			coding_history [coding_hist_size] ; \
-+			}
-+
-+/* SF_BROADCAST_INFO is the above struct with coding_history field of 256 bytes. */
-+typedef SF_BROADCAST_INFO_VAR (256) SF_BROADCAST_INFO ;
-+
-+
-+/*	Virtual I/O functionality. */
-+
-+typedef sf_count_t		(*sf_vio_get_filelen)	(void *user_data) ;
-+typedef sf_count_t		(*sf_vio_seek)		(sf_count_t offset, int whence, void *user_data) ;
-+typedef sf_count_t		(*sf_vio_read)		(void *ptr, sf_count_t count, void *user_data) ;
-+typedef sf_count_t		(*sf_vio_write)		(const void *ptr, sf_count_t count, void *user_data) ;
-+typedef sf_count_t		(*sf_vio_tell)		(void *user_data) ;
-+
-+struct SF_VIRTUAL_IO
-+{	sf_vio_get_filelen	get_filelen ;
-+	sf_vio_seek			seek ;
-+	sf_vio_read			read ;
-+	sf_vio_write		write ;
-+	sf_vio_tell			tell ;
-+} ;
-+
-+typedef	struct SF_VIRTUAL_IO SF_VIRTUAL_IO ;
-+
-+
-+/* Open the specified file for read, write or both. On error, this will
-+** return a NULL pointer. To find the error number, pass a NULL SNDFILE
-+** to sf_strerror ().
-+** All calls to sf_open() should be matched with a call to sf_close().
-+*/
-+
-+SNDFILE* 	sf_open		(const char *path, int mode, SF_INFO *sfinfo) ;
-+
-+
-+/* Use the existing file descriptor to create a SNDFILE object. If close_desc
-+** is TRUE, the file descriptor will be closed when sf_close() is called. If
-+** it is FALSE, the descritor will not be closed.
-+** When passed a descriptor like this, the library will assume that the start
-+** of file header is at the current file offset. This allows sound files within
-+** larger container files to be read and/or written.
-+** On error, this will return a NULL pointer. To find the error number, pass a
-+** NULL SNDFILE to sf_strerror ().
-+** All calls to sf_open_fd() should be matched with a call to sf_close().
-+
-+*/
-+
-+SNDFILE* 	sf_open_fd	(int fd, int mode, SF_INFO *sfinfo, int close_desc) ;
-+
-+SNDFILE* 	sf_open_virtual	(SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ;
-+
-+
-+/* sf_error () returns a error number which can be translated to a text
-+** string using sf_error_number().
-+*/
-+
-+int		sf_error		(SNDFILE *sndfile) ;
-+
-+
-+/* sf_strerror () returns to the caller a pointer to the current error message for
-+** the given SNDFILE.
-+*/
-+
-+const char* sf_strerror (SNDFILE *sndfile) ;
-+
-+
-+/* sf_error_number () allows the retrieval of the error string for each internal
-+** error number.
-+**
-+*/
-+
-+const char*	sf_error_number	(int errnum) ;
-+
-+
-+/* The following two error functions are deprecated but they will remain in the
-+** library for the forseeable future. The function sf_strerror() should be used
-+** in their place.
-+*/
-+
-+int		sf_perror		(SNDFILE *sndfile) ;
-+int		sf_error_str	(SNDFILE *sndfile, char* str, size_t len) ;
-+
-+
-+/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */
-+
-+int		sf_command	(SNDFILE *sndfile, int command, void *data, int datasize) ;
-+
-+
-+/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */
-+
-+int		sf_format_check	(const SF_INFO *info) ;
-+
-+
-+/* Seek within the waveform data chunk of the SNDFILE. sf_seek () uses
-+** the same values for whence (SEEK_SET, SEEK_CUR and SEEK_END) as
-+** stdio.h function fseek ().
-+** An offset of zero with whence set to SEEK_SET will position the
-+** read / write pointer to the first data sample.
-+** On success sf_seek returns the current position in (multi-channel)
-+** samples from the start of the file.
-+** Please see the libsndfile documentation for moving the read pointer
-+** separately from the write pointer on files open in mode SFM_RDWR.
-+** On error all of these functions return -1.
-+*/
-+
-+sf_count_t	sf_seek 		(SNDFILE *sndfile, sf_count_t frames, int whence) ;
-+
-+
-+/* Functions for retrieving and setting string data within sound files.
-+** Not all file types support this features; AIFF and WAV do. For both
-+** functions, the str_type parameter must be one of the SF_STR_* values
-+** defined above.
-+** On error, sf_set_string() returns non-zero while sf_get_string()
-+** returns NULL.
-+*/
-+
-+int sf_set_string (SNDFILE *sndfile, int str_type, const char* str) ;
-+
-+const char* sf_get_string (SNDFILE *sndfile, int str_type) ;
-+
-+
-+/* Return the library version string. */
-+
-+const char * sf_version_string (void) ;
-+
-+
-+/* Functions for reading/writing the waveform data of a sound file.
-+*/
-+
-+sf_count_t	sf_read_raw		(SNDFILE *sndfile, void *ptr, sf_count_t bytes) ;
-+sf_count_t	sf_write_raw 	(SNDFILE *sndfile, const void *ptr, sf_count_t bytes) ;
-+
-+
-+/* Functions for reading and writing the data chunk in terms of frames.
-+** The number of items actually read/written = frames * number of channels.
-+**     sf_xxxx_raw		read/writes the raw data bytes from/to the file
-+**     sf_xxxx_short	passes data in the native short format
-+**     sf_xxxx_int		passes data in the native int format
-+**     sf_xxxx_float	passes data in the native float format
-+**     sf_xxxx_double	passes data in the native double format
-+** All of these read/write function return number of frames read/written.
-+*/
-+
-+sf_count_t	sf_readf_short	(SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
-+sf_count_t	sf_writef_short	(SNDFILE *sndfile, const short *ptr, sf_count_t frames) ;
-+
-+sf_count_t	sf_readf_int	(SNDFILE *sndfile, int *ptr, sf_count_t frames) ;
-+sf_count_t	sf_writef_int 	(SNDFILE *sndfile, const int *ptr, sf_count_t frames) ;
-+
-+sf_count_t	sf_readf_float	(SNDFILE *sndfile, float *ptr, sf_count_t frames) ;
-+sf_count_t	sf_writef_float	(SNDFILE *sndfile, const float *ptr, sf_count_t frames) ;
-+
-+sf_count_t	sf_readf_double		(SNDFILE *sndfile, double *ptr, sf_count_t frames) ;
-+sf_count_t	sf_writef_double	(SNDFILE *sndfile, const double *ptr, sf_count_t frames) ;
-+
-+
-+/* Functions for reading and writing the data chunk in terms of items.
-+** Otherwise similar to above.
-+** All of these read/write function return number of items read/written.
-+*/
-+
-+sf_count_t	sf_read_short	(SNDFILE *sndfile, short *ptr, sf_count_t items) ;
-+sf_count_t	sf_write_short	(SNDFILE *sndfile, const short *ptr, sf_count_t items) ;
-+
-+sf_count_t	sf_read_int		(SNDFILE *sndfile, int *ptr, sf_count_t items) ;
-+sf_count_t	sf_write_int 	(SNDFILE *sndfile, const int *ptr, sf_count_t items) ;
-+
-+sf_count_t	sf_read_float	(SNDFILE *sndfile, float *ptr, sf_count_t items) ;
-+sf_count_t	sf_write_float	(SNDFILE *sndfile, const float *ptr, sf_count_t items) ;
-+
-+sf_count_t	sf_read_double	(SNDFILE *sndfile, double *ptr, sf_count_t items) ;
-+sf_count_t	sf_write_double	(SNDFILE *sndfile, const double *ptr, sf_count_t items) ;
-+
-+
-+/* Close the SNDFILE and clean up all memory allocations associated with this
-+** file.
-+** Returns 0 on success, or an error number.
-+*/
-+
-+int		sf_close		(SNDFILE *sndfile) ;
-+
-+
-+/* If the file is opened SFM_WRITE or SFM_RDWR, call fsync() on the file
-+** to force the writing of data to disk. If the file is opened SFM_READ
-+** no action is taken.
-+*/
-+
-+void	sf_write_sync	(SNDFILE *sndfile) ;
-+
-+
-+
-+/* The function sf_wchar_open() is Windows Only!
-+** Open a file passing in a Windows Unicode filename. Otherwise, this is
-+** the same as sf_open().
-+**
-+** In order for this to work, you need to do the following:
-+**
-+**		#include <windows.h>
-+**		#define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1
-+**		#including <sndfile.h>
-+*/
-+
-+#if (defined (ENABLE_SNDFILE_WINDOWS_PROTOTYPES) && ENABLE_SNDFILE_WINDOWS_PROTOTYPES)
-+SNDFILE* sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) ;
-+#endif
-+
-+
-+
-+#ifdef __cplusplus
-+}		/* extern "C" */
-+#endif	/* __cplusplus */
-+
-+#endif	/* SNDFILE_H */
-+
---- a/src/wav.c
-+++ b/src/wav.c
-@@ -272,14 +272,14 @@ wav_open	 (SF_PRIVATE *psf)
- 					error = wav_w64_msadpcm_init (psf, blockalign, framesperblock) ;
- 					break ;
- 
--		case SF_FORMAT_G721_32 :
-+		/*case SF_FORMAT_G721_32 :
- 					error = g72x_init (psf) ;
--					break ;
-+					break ;*/
- 		/* Lite remove end */
- 
--		case SF_FORMAT_GSM610 :
-+		/*case SF_FORMAT_GSM610 :
- 					error = gsm610_init (psf) ;
--					break ;
-+					break ;*/
- 
- 		default : 	return SFE_UNIMPLEMENTED ;
- 		} ;
---- a/src/aiff.c
-+++ b/src/aiff.c
-@@ -344,9 +344,9 @@ aiff_open (SF_PRIVATE *psf)
- 				break ;
- 		/* Lite remove end */
- 
--		case SF_FORMAT_GSM610 :
-+		/*case SF_FORMAT_GSM610 :
- 				error = gsm610_init (psf) ;
--				break ;
-+				break ;*/
- 
- 		default : return SFE_UNIMPLEMENTED ;
- 		} ;
---- a/src/au.c
-+++ b/src/au.c
-@@ -161,7 +161,7 @@ au_open	(SF_PRIVATE *psf)
- 				error = double64_init (psf) ;
- 				break ;
- 
--		case SF_FORMAT_G721_32 :
-+		/*case SF_FORMAT_G721_32 :
- 				error = g72x_init (psf) ;
- 				psf->sf.seekable = SF_FALSE ;
- 				break ;
-@@ -174,7 +174,7 @@ au_open	(SF_PRIVATE *psf)
- 		case SF_FORMAT_G723_40 :
- 				error = g72x_init (psf) ;
- 				psf->sf.seekable = SF_FALSE ;
--				break ;
-+				break ;*/
- 		/* Lite remove end */
- 
- 		default :	break ;
---- a/src/raw.c
-+++ b/src/raw.c
-@@ -67,9 +67,9 @@ raw_open	(SF_PRIVATE *psf)
- 				error = alaw_init (psf) ;
- 				break ;
- 
--		case SF_FORMAT_GSM610 :
-+		/*case SF_FORMAT_GSM610 :
- 				error = gsm610_init (psf) ;
--				break ;
-+				break ;*/
- 
- 		/* Lite remove start */
- 		case SF_FORMAT_FLOAT :
---- a/src/w64.c
-+++ b/src/w64.c
-@@ -204,9 +204,9 @@ w64_open	(SF_PRIVATE *psf)
- 					break ;
- 		/* Lite remove end */
- 
--		case SF_FORMAT_GSM610 :
-+		/*case SF_FORMAT_GSM610 :
- 					error = gsm610_init (psf) ;
--					break ;
-+					break ;*/
- 
- 		default : 	return SFE_UNIMPLEMENTED ;
- 		} ;
---- a/src/test_file_io.c
-+++ b/src/test_file_io.c
-@@ -64,7 +64,7 @@ file_open_test (const char *filename)
- 	psf = &sf_data ;
- 
- 	/* Ensure that the file doesn't already exist. */
--	if (unlink (filename) != 0 && errno != ENOENT)
-+	if (_unlink (filename) != 0 && errno != ENOENT)
- 	{	printf ("\n\nLine %d: unlink failed (%d) : %s\n\n", __LINE__, errno, strerror (errno)) ;
- 		exit (1) ;
- 		} ;
-@@ -88,7 +88,7 @@ file_open_test (const char *filename)
- 
- 	test_close_or_die (psf, __LINE__) ;
- 
--	unlink (psf->file.path.c) ;
-+    _unlink(psf->file.path.c) ;
- 
- 	/* Test file open in read/write mode for a non-existant file. */
- 	psf->file.mode = SFM_RDWR ;
-@@ -102,7 +102,7 @@ file_open_test (const char *filename)
- 
- 	test_close_or_die (psf, __LINE__) ;
- 
--	unlink (psf->file.path.c) ;
-+    _unlink(psf->file.path.c) ;
- 	puts ("ok") ;
- } /* file_open_test */
- 
-@@ -433,6 +433,6 @@ test_file_io (void)
- 	file_read_write_test	(filename) ;
- 	file_truncate_test (filename) ;
- 
--	unlink (filename) ;
-+    _unlink(filename) ;
- } /* main */
- 
--- 
-2.10.2.windows.1
-
diff --git a/contrib/src/sndfile/soundcard.patch b/contrib/src/sndfile/soundcard.patch
deleted file mode 100644
index 298d0e12bb94e29ce812d0e50265ccff04a73edb..0000000000000000000000000000000000000000
--- a/contrib/src/sndfile/soundcard.patch
+++ /dev/null
@@ -1,16 +0,0 @@
---- a/programs/sndfile-play.c.orig	2014-06-12 16:00:39.348060215 -0400
-+++ b/programs/sndfile-play.c	2014-06-12 16:01:05.660059438 -0400
-@@ -52,7 +52,12 @@
- 	#include <sys/time.h>
- #endif
- 
--#if defined (__linux__) || defined (__FreeBSD_kernel__) || defined (__FreeBSD__)
-+#if defined(__ANDROID__)
-+	#include 	<fcntl.h>
-+	#include 	<sys/ioctl.h>
-+	#include 	<linux/soundcard.h>
-+
-+#elif defined (__linux__) || defined (__FreeBSD_kernel__) || defined (__FreeBSD__)
- 	#include 	<fcntl.h>
- 	#include 	<sys/ioctl.h>
- 	#include 	<sys/soundcard.h>
diff --git a/docker/Dockerfile_ubuntu_16.04 b/docker/Dockerfile_ubuntu_16.04
index fcb1a3bf61a57a42d485d70e85de365e259ec515..488626fa66ea5951e2b2fa994a1cd326e935bd96 100644
--- a/docker/Dockerfile_ubuntu_16.04
+++ b/docker/Dockerfile_ubuntu_16.04
@@ -32,7 +32,6 @@ RUN apt-get update && \
         libpcre3-dev \
         libyaml-cpp-dev \
         libboost-dev \
-        libsndfile1-dev \
         libxext-dev \
         libxfixes-dev \
         libspeex-dev \
diff --git a/src/Makefile.am b/src/Makefile.am
index 4f46170f8ecfcf23f1984aba4aa2e8411c362ddc..82e8c894ea409a3b35dd77e6e688bbdf6a475e6c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -50,7 +50,6 @@ libring_la_LDFLAGS = \
 		@ALSA_LIBS@ \
 		@PULSEAUDIO_LIBS@ \
 		@SAMPLERATE_LIBS@ \
-		@SNDFILE_LIBS@ \
 		@YAMLCPP_LIBS@ \
 		@JSONCPP_LIBS@ \
 		@SPEEXDSP_LIBS@ \
diff --git a/src/call.cpp b/src/call.cpp
index fb6a4f8605d0d0d70c1b096564d4a4435104229e..24e4b0cbb4b95e75d3c9e6d369cd002b993d893c 100644
--- a/src/call.cpp
+++ b/src/call.cpp
@@ -26,7 +26,6 @@
 #include "audio/ringbufferpool.h"
 #include "dring/call_const.h"
 #include "client/ring_signal.h"
-#include "audio/audiorecord.h"
 #include "sip/sip_utils.h"
 #include "ip_utils.h"
 #include "array_size.h"
diff --git a/src/conference.cpp b/src/conference.cpp
index f5d230ae3ad568d7ec3abc0880fd715bdb3410e5..32558eacf31bbfebe071b00fd81978e12d8df0f7 100644
--- a/src/conference.cpp
+++ b/src/conference.cpp
@@ -25,7 +25,6 @@
 #include "manager.h"
 #include "audio/audiolayer.h"
 #include "audio/ringbufferpool.h"
-#include "audio/audiorecord.h"
 
 #ifdef RING_VIDEO
 #include "sip/sipcall.h"
diff --git a/src/media/audio/Makefile.am b/src/media/audio/Makefile.am
index 66161b3184c51127deee958795741d8d88e7d83c..904df3c81dd21b810d216da81cfff1ee435193b9 100644
--- a/src/media/audio/Makefile.am
+++ b/src/media/audio/Makefile.am
@@ -42,8 +42,6 @@ libaudio_la_SOURCES = \
 		audioloop.cpp \
 		ringbuffer.cpp \
 		ringbufferpool.cpp \
-		audiorecord.cpp \
-		audiorecorder.cpp \
 		audiolayer.cpp \
 		resampler.cpp \
 		$(RING_SPEEXDSP_SRC) \
@@ -64,8 +62,6 @@ noinst_HEADERS = \
 		audioloop.h \
 		ringbuffer.h \
 		ringbufferpool.h \
-		audiorecord.h \
-		audiorecorder.h \
 		audiolayer.h \
 		$(RING_SPEEXDSP_HEAD) \
 		dcblocker.h \
diff --git a/src/media/audio/audiobuffer.cpp b/src/media/audio/audiobuffer.cpp
index 9a8ce6d3ffa00149e11cf438db138088870d4f62..778d424230ad1a23eabecf237e9f24421435b7fd 100644
--- a/src/media/audio/audiobuffer.cpp
+++ b/src/media/audio/audiobuffer.cpp
@@ -332,4 +332,26 @@ AudioBuffer::toAVFrame() const
     return frame;
 }
 
+int
+AudioBuffer::append(AVFrame* frame)
+{
+    // FIXME we assume frame is s16 interleaved
+    if (channels() != static_cast<unsigned>(frame->channels)
+        || getSampleRate() != frame->sample_rate) {
+        auto newFormat = AudioFormat{(unsigned)frame->sample_rate, (unsigned)frame->channels};
+        setFormat(newFormat);
+    }
+
+    AudioBuffer toAppend(frame->nb_samples,
+        {(unsigned)frame->sample_rate, (unsigned)frame->channels});
+    toAppend.deinterleave(reinterpret_cast<const AudioSample*>(frame->extended_data[0]),
+        frame->nb_samples, frame->channels);
+
+    for (size_t c = 0; c < samples_.size(); ++c) {
+        samples_[c].insert(samples_[c].end(), toAppend.samples_[c].begin(), toAppend.samples_[c].end());
+    }
+
+    return 0;
+}
+
 } // namespace ring
diff --git a/src/media/audio/audiobuffer.h b/src/media/audio/audiobuffer.h
index 9606b34925e714f8ea267f53f3f9e59e0854bd42..aea0205f52ae8a4a7b419bc28cb374e3aa794ec8 100644
--- a/src/media/audio/audiobuffer.h
+++ b/src/media/audio/audiobuffer.h
@@ -347,6 +347,8 @@ class AudioBuffer {
 
         AVFrame* toAVFrame() const;
 
+        int append(AVFrame* frame);
+
     private:
         int sampleRate_;
 
diff --git a/src/media/audio/audiorecord.cpp b/src/media/audio/audiorecord.cpp
deleted file mode 100644
index 4656b832ab2320780cee3412113d8888f8325af4..0000000000000000000000000000000000000000
--- a/src/media/audio/audiorecord.cpp
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- *  Copyright (C) 2004-2018 Savoir-faire Linux Inc.
- *
- *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
- *  Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "audiorecord.h"
-#include "logger.h"
-#include "fileutils.h"
-#include "manager.h"
-
-#ifndef RING_UWP
-#include <sndfile.hh>
-#endif
-
-#include <algorithm>
-#include <sstream> // for stringstream
-#include <cstdio>
-#include <unistd.h>
-
-namespace ring {
-
-static std::string
-createFilename()
-{
-    time_t rawtime = time(NULL);
-    struct tm * timeinfo = localtime(&rawtime);
-
-    std::stringstream out;
-
-    // DATE
-    out << timeinfo->tm_year + 1900;
-
-    if (timeinfo->tm_mon < 9) // january is 01, not 1
-        out << 0;
-
-    out << timeinfo->tm_mon + 1;
-
-    if (timeinfo->tm_mday < 10) // 01 02 03, not 1 2 3
-        out << 0;
-
-    out << timeinfo->tm_mday;
-
-    out << '-';
-
-    // hour
-    if (timeinfo->tm_hour < 10) // 01 02 03, not 1 2 3
-        out << 0;
-
-    out << timeinfo->tm_hour;
-
-    if (timeinfo->tm_min < 10) // 01 02 03, not 1 2 3
-        out << 0;
-
-    out << timeinfo->tm_min;
-
-    if (timeinfo->tm_sec < 10) // 01 02 03,  not 1 2 3
-        out << 0;
-
-    out << timeinfo->tm_sec;
-    return out.str();
-}
-
-AudioRecord::AudioRecord()
-    : sndFormat_(AudioFormat::MONO())
-    , filename_(createFilename())
-    , savePath_()
-    , recorder_(this, Manager::instance().getRingBufferPool())
-{
-    RING_DBG("Generate filename for this call %s ", filename_.c_str());
-}
-
-AudioRecord::~AudioRecord()
-{
-    closeFile();
-}
-
-void AudioRecord::setSndFormat(AudioFormat format)
-{
-    sndFormat_ = format;
-}
-
-void AudioRecord::setRecordingOptions(AudioFormat format, const std::string &path)
-{
-    std::string filePath;
-
-    // use HOME directory if path is empty, or if path does not exist
-    if (path.empty() or not fileutils::check_dir(path.c_str())) {
-        filePath = fileutils::get_home_dir();
-    } else {
-        filePath = path;
-    }
-
-    sndFormat_ = format;
-    savePath_ = (*filePath.rbegin() == DIR_SEPARATOR_CH) ? filePath : filePath + DIR_SEPARATOR_STR;
-}
-
-static bool
-nonFilenameCharacter(char c)
-{
-    return not(std::isalnum(c) or c == '_' or c == '.');
-}
-
-// Replace any character that is inappropriate for a filename with '_'
-static std::string
-sanitize(std::string s)
-{
-    std::replace_if(s.begin(), s.end(), nonFilenameCharacter, '_');
-    return s;
-}
-
-void AudioRecord::initFilename(const std::string &peerNumber)
-{
-    RING_DBG("Initialize audio record for peer  : %s", peerNumber.c_str());
-    // if savePath_ don't contains filename
-    if (savePath_.find(".wav") == std::string::npos) {
-        filename_ = createFilename();
-        filename_.append("-" + sanitize(peerNumber) + "-" PACKAGE);
-        filename_.append(".wav");
-    } else {
-        filename_ = "";
-    }
-}
-
-std::string AudioRecord::getPath() const
-{
-    return savePath_ + filename_;
-}
-
-bool
-AudioRecord::openFile()
-{
-#ifndef RING_UWP
-    fileHandle_.reset(); // do it before calling fileExists()
-
-    const bool doAppend = fileExists();
-    const int access = doAppend ? SFM_RDWR : SFM_WRITE;
-
-    RING_DBG("Opening file %s with format %s", getPath().c_str(), sndFormat_.toString().c_str());
-    fileHandle_.reset(new SndfileHandle (getPath().c_str(),
-                                         access,
-                                         SF_FORMAT_WAV | SF_FORMAT_PCM_16,
-                                         sndFormat_.nb_channels,
-                                         sndFormat_.sample_rate));
-
-    // check overloaded boolean operator
-    if (!*fileHandle_) {
-        RING_WARN("Could not open WAV file!");
-        fileHandle_.reset();
-        return false;
-    }
-
-    if (doAppend and fileHandle_->seek(0, SEEK_END) < 0)
-        RING_WARN("Couldn't seek to the end of the file ");
-
-    return true;
-#else
-    return false;
-#endif
-}
-
-void
-AudioRecord::closeFile()
-{
-    stopRecording(); // needed as recData accesses to fileHandle_
-    fileHandle_.reset();
-}
-
-bool
-AudioRecord::isOpenFile() const noexcept
-{
-    return static_cast<bool>(fileHandle_);
-}
-
-bool AudioRecord::fileExists() const
-{
-    return access(getPath().c_str(), F_OK) != -1;
-}
-
-bool AudioRecord::isRecording() const
-{
-    return recordingEnabled_;
-}
-
-bool
-AudioRecord::toggleRecording()
-{
-    if (isOpenFile())
-        recordingEnabled_ = !recordingEnabled_;
-    else if (openFile()) {
-        recordingEnabled_ = true;
-        recorder_.start();
-    }
-
-    return recordingEnabled_;
-}
-
-void
-AudioRecord::stopRecording() const noexcept
-{
-    RING_DBG("Stop recording %s", getPath().c_str());
-    recordingEnabled_ = false;
-}
-
-void
-AudioRecord::recData(AudioBuffer& buffer)
-{
-#ifndef _MSC_VER
-    if (not recordingEnabled_)
-        return;
-
-    auto interleaved = buffer.interleave();
-    const int nSamples = interleaved.size();
-    if (fileHandle_->write(interleaved.data(), nSamples) != nSamples) {
-        RING_WARN("Could not record data!");
-    } else {
-        fileHandle_->writeSync();
-    }
-#endif
-}
-
-} // namespace ring
diff --git a/src/media/audio/audiorecord.h b/src/media/audio/audiorecord.h
deleted file mode 100644
index 0d00fa8df470bd5ff29ddd3f7f4f5236af831722..0000000000000000000000000000000000000000
--- a/src/media/audio/audiorecord.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- *  Copyright (C) 2004-2018 Savoir-faire Linux Inc.
- *
- *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
- *  Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#pragma once
-
-#include "audiobuffer.h"
-#include "audiorecorder.h"
-#include "noncopyable.h"
-
-#include <atomic>
-#include <memory>
-#include <string>
-#include <cstdlib>
-
-class SndfileHandle;
-
-namespace ring {
-
-class AudioRecord {
-    public:
-        AudioRecord();
-        ~AudioRecord();
-
-        void setSndFormat(AudioFormat format);
-        void setRecordingOptions(AudioFormat format, const std::string &path);
-
-        /**
-         * Init recording file path
-         */
-        void initFilename(const std::string &peerNumber);
-
-        /**
-         * Return the file path of the recording
-         */
-        std::string getPath() const;
-
-        /**
-         * Check if no other file is opened, then create a new one
-         * @param filename A string containing the file (with/without extension)
-         * @param type     The sound file format (FILE_RAW, FILE_WAVE)
-         * @param format   Internal sound format (INT16 / INT32)
-         * @return bool    True if file was opened
-         */
-        bool openFile();
-
-        /**
-         * Close the opened recording file. If wave: cout the number of byte
-         */
-        void closeFile();
-
-        /**
-         * Check if a file is already opened
-         */
-        bool isOpenFile() const noexcept;
-
-        /**
-         * Check if a file already exists
-         */
-        bool fileExists() const;
-
-        /**
-         * Check recording state
-         */
-        bool isRecording() const;
-
-        /**
-         * Toggle recording state
-         */
-        bool toggleRecording();
-
-        /**
-         * Stop recording flag
-         */
-        void stopRecording() const noexcept;
-
-        /**
-         * Record a chunk of data in an openend file
-         * @param buffer  The data chunk to be recorded
-         * @param nSamples Number of samples (number of bytes) to be recorded
-         */
-        void recData(AudioBuffer& buffer);
-
-        std::string getRecorderID() const {
-            return recorder_.getRecorderID();
-        }
-
-    private:
-        NON_COPYABLE(AudioRecord);
-
-        /**
-         * Open an existing raw file, used when the call is set on hold
-         */
-        bool openExistingRawFile();
-
-        /**
-         * Open an existing wav file, used when the call is set on hold
-         */
-        bool openExistingWavFile();
-
-        /**
-         * Compute the number of byte recorded and close the file
-         */
-        void closeWavFile();
-
-        /**
-         * Pointer to the recorded file
-         */
-        std::shared_ptr<SndfileHandle> fileHandle_;
-
-        /**
-         * Number of channels
-         */
-        AudioFormat sndFormat_;
-
-        /**
-         * Recording flage
-         */
-        mutable std::atomic<bool> recordingEnabled_ {false};
-
-        /**
-         * Filename for this recording
-         */
-        std::string filename_;
-
-        /**
-         * Path for this recording
-         */
-        std::string savePath_;
-
-        /**
-         * Audio recording thread
-         */
-        AudioRecorder recorder_;
-};
-
-} // namespace ring
diff --git a/src/media/audio/audiorecorder.cpp b/src/media/audio/audiorecorder.cpp
deleted file mode 100644
index 80012b85d6cc8e24294b4b2b77a21bfc29c5897e..0000000000000000000000000000000000000000
--- a/src/media/audio/audiorecorder.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright (C) 2004-2018 Savoir-faire Linux Inc.
- *
- *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
- *  Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#include "audiorecorder.h"
-
-#include "audiorecord.h"
-#include "ringbufferpool.h"
-#include "audiobuffer.h"
-
-#include <chrono>
-#include <thread>
-#include <sstream>
-#include <algorithm> // std::min
-
-namespace ring {
-
-static constexpr std::size_t BUFFER_LENGTH {10000};
-static constexpr auto SLEEP_TIME = std::chrono::milliseconds(20);
-
-AudioRecorder::AudioRecorder(AudioRecord* arec, RingBufferPool& rbp)
-    : ringBufferPool_(rbp)
-    , buffer_(new AudioBuffer(BUFFER_LENGTH, AudioFormat::NONE()))
-    , arecord_(arec)
-    , thread_(
-        [] { return true; },
-        [this] { process(); },
-        [] {})
-{
-    std::string id("processd_");
-
-    // convert count into string
-    std::string s;
-    std::ostringstream out;
-    out << nextProcessID();
-    s = out.str();
-
-    recorderId_ = id.append(s);
-}
-
-AudioRecorder::~AudioRecorder()
-{
-    thread_.join();
-}
-
-unsigned
-AudioRecorder::nextProcessID() noexcept
-{
-    static unsigned id = 0;
-    return ++id;
-}
-
-void
-AudioRecorder::start()
-{
-    if (thread_.isRunning())
-        return;
-    buffer_->setFormat(ringBufferPool_.getInternalAudioFormat());
-    thread_.start();
-}
-
-void
-AudioRecorder::process()
-{
-    auto availableSamples = ringBufferPool_.availableForGet(recorderId_);
-    buffer_->resize(std::min(availableSamples, BUFFER_LENGTH));
-    ringBufferPool_.getData(*buffer_, recorderId_);
-
-    if (availableSamples > 0)
-        arecord_->recData(*buffer_);
-
-    std::this_thread::sleep_for(SLEEP_TIME);
-}
-
-} // namespace ring
diff --git a/src/media/audio/audiorecorder.h b/src/media/audio/audiorecorder.h
deleted file mode 100644
index 7c2d1466b10d5e2c07fbc1c284536ae6aa051c79..0000000000000000000000000000000000000000
--- a/src/media/audio/audiorecorder.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (C) 2004-2018 Savoir-faire Linux Inc.
- *
- *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
- *  Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#pragma once
-
-#include "threadloop.h"
-#include "noncopyable.h"
-
-#include <string>
-#include <memory>
-
-namespace ring {
-
-class RingBufferPool;
-class AudioRecord;
-class AudioBuffer;
-
-class AudioRecorder {
-public:
-    AudioRecorder(AudioRecord* arec, RingBufferPool& rbp);
-    ~AudioRecorder();
-
-    std::string getRecorderID() const {
-        return recorderId_;
-    }
-
-    /**
-     * Call to start recording.
-     */
-    void start();
-
-private:
-    NON_COPYABLE(AudioRecorder);
-    static unsigned nextProcessID() noexcept;
-    void process();
-
-    std::string recorderId_;
-    RingBufferPool& ringBufferPool_;
-    std::unique_ptr<AudioBuffer> buffer_;
-    AudioRecord* arecord_;
-    ThreadLoop thread_;
-};
-
-} // namespace ring
diff --git a/src/media/audio/sound/audiofile.cpp b/src/media/audio/sound/audiofile.cpp
index 025dd4f6cc44713fbbf03c3b302bea83a899a10e..34297863701a622390c89f161616534a88181983 100644
--- a/src/media/audio/sound/audiofile.cpp
+++ b/src/media/audio/sound/audiofile.cpp
@@ -27,13 +27,11 @@
 #include <vector>
 #include <climits>
 
-#ifndef RING_UWP
-#include <sndfile.hh>
-#endif
-
+#include "libav_deps.h"
 #include "audiofile.h"
 #include "audio/resampler.h"
 #include "manager.h"
+#include "media_decoder.h"
 #include "client/ring_signal.h"
 
 #include "logger.h"
@@ -62,76 +60,57 @@ AudioFile::onBufferFinish()
 AudioFile::AudioFile(const std::string &fileName, unsigned int sampleRate) :
     AudioLoop(sampleRate), filepath_(fileName), updatePlaybackScale_(0)
 {
-#ifndef RING_UWP
-    int format;
-    bool hasHeader = true;
-
-    if (filepath_.find(".wav") != std::string::npos) {
-        format = SF_FORMAT_WAV;
-    } else if (filepath_.find(".ul") != std::string::npos) {
-        format = SF_FORMAT_RAW | SF_FORMAT_ULAW;
-        hasHeader = false;
-    } else if (filepath_.find(".al") != std::string::npos) {
-        format = SF_FORMAT_RAW | SF_FORMAT_ALAW;
-        hasHeader = false;
-    } else if (filepath_.find(".au") != std::string::npos) {
-        format = SF_FORMAT_AU;
-    } else if (filepath_.find(".flac") != std::string::npos) {
-        format = SF_FORMAT_FLAC;
-    } else if (filepath_.find(".ogg") != std::string::npos) {
-        format = SF_FORMAT_OGG;
-    } else {
-        RING_WARN("No file extension, guessing WAV");
-        format = SF_FORMAT_WAV;
-    }
-
-    SndfileHandle fileHandle(fileName.c_str(), SFM_READ, format, hasHeader ? 0 : 1,
-                             hasHeader ? 0 : 8000);
-
-    if (!fileHandle)
-        throw AudioFileException("File handle " + fileName + " could not be created");
-    if (fileHandle.error()) {
-        RING_ERR("Error fileHandle: %s", fileHandle.strError());
-        throw AudioFileException("File " + fileName + " doesn't exist");
-    }
-
-    switch (fileHandle.channels()) {
-        case 1:
-        case 2:
+    auto decoder = std::make_unique<MediaDecoder>();
+    DeviceParams dev;
+    dev.input = fileName;
+
+    if (decoder->openInput(dev) < 0)
+        throw AudioFileException("File could not be opened: " + fileName);
+
+    if (decoder->setupFromAudioData() < 0)
+        throw AudioFileException("Decoder setup failed: " + fileName);
+
+    const auto& ms = decoder->getStream();
+
+    auto filter = std::make_unique<MediaFilter>();
+    // aformat=sample_fmts=s16:channel_layouts=stereo
+    if (filter->initialize("aformat=sample_fmts=s16:channel_layouts=stereo|mono:sample_rates="
+        + std::to_string(getFormat().sample_rate), ms) < 0)
+        throw AudioFileException("Failed to create resampler");
+
+    auto buf = std::make_unique<AudioBuffer>(0, getFormat());
+    bool done = false;
+    while (!done) {
+        AudioFrame frame;
+        AVFrame* resampled;
+        switch (decoder->decode(frame)) {
+        case MediaDecoder::Status::FrameFinished:
+            // TODO move this code to Resampler class with conditional resampling
+            if (filter->feedInput(frame.pointer()) < 0)
+                throw AudioFileException("Frame could not be resampled");
+            if (!(resampled = filter->readOutput()))
+                throw AudioFileException("Frame could not be resampled");
+            if (buf->append(resampled) < 0) {
+                av_frame_free(&resampled);
+                throw AudioFileException("Error while decoding: " + fileName);
+            } else {
+                av_frame_free(&resampled);
+            }
+            break;
+        case MediaDecoder::Status::DecodeError:
+        case MediaDecoder::Status::ReadError:
+            throw AudioFileException("File cannot be decoded: " + fileName);
+        case MediaDecoder::Status::EOFError:
+            done = true;
             break;
+        case MediaDecoder::Status::Success:
         default:
-            throw AudioFileException("Unsupported number of channels");
+            break;
+        }
     }
 
-    // get # of bytes in file
-    const size_t fileSize = fileHandle.seek(0, SEEK_END);
-    fileHandle.seek(0, SEEK_SET);
-
-    const sf_count_t nbFrames = hasHeader ? fileHandle.frames() : fileSize / fileHandle.channels();
-
-    AudioSample * interleaved = new AudioSample[nbFrames * fileHandle.channels()];
-
-    // get n "items", aka samples (not frames)
-    fileHandle.read(interleaved, nbFrames * fileHandle.channels());
-
-    AudioBuffer * buffer = new AudioBuffer(nbFrames, AudioFormat(fileHandle.samplerate(), fileHandle.channels()));
-    buffer->deinterleave(interleaved, nbFrames, fileHandle.channels());
-    delete [] interleaved;
-
-    const int rate = static_cast<int32_t>(sampleRate);
-
-    if (fileHandle.samplerate() != rate) {
-        Resampler resampler(std::max(fileHandle.samplerate(), rate), fileHandle.channels(), true);
-        AudioBuffer * resampled = new AudioBuffer(nbFrames, AudioFormat(rate, fileHandle.channels()));
-        resampler.resample(*buffer, *resampled);
-        delete buffer;
-        delete buffer_;
-        buffer_ = resampled;
-    } else {
-        delete buffer_;
-        buffer_ = buffer;
-    }
-#endif
+    delete buffer_;
+    buffer_ = buf.release();
 }
 
 } // namespace ring
diff --git a/src/media/recordable.cpp b/src/media/recordable.cpp
index 7bb8d9f26a845b09f81b0516d496fd8a0cf672f8..5fc2569b095e0c9caf5d48325159cc5ca2147001 100644
--- a/src/media/recordable.cpp
+++ b/src/media/recordable.cpp
@@ -20,7 +20,6 @@
  */
 
 #include "recordable.h"
-#include "audio/audiorecord.h"
 #include "audio/ringbufferpool.h"
 #include "manager.h"
 #include "logger.h"