From 6430eee3d5d52e9de30e8e9811033bd412dca052 Mon Sep 17 00:00:00 2001
From: Juan Gutierrez <juan.gutierrez@nxp.com>
Date: Mon, 16 May 2022 16:11:32 -0700
Subject: [PATCH 2/2] dspc third-party headers

Signed-off-by: Juan Gutierrez <juan.gutierrez@nxp.com>
---
 third-party/DSPC-AWELib/README                |  51 +
 third-party/DSPC-AWELib/include/.gitignore    |   2 +
 third-party/DSPC-AWELib/include/TcpIO2.h      | 480 +++++++++
 third-party/DSPC-AWELib/include/awelib.h      | 583 +++++++++++
 third-party/DSPC-AWELib/include/basehelpers.h | 960 ++++++++++++++++++
 .../DSPC-AWELib/include/passthroughSimple.h   | 233 +++++
 third-party/DSPC-AWELib/include/utiltypes.h   | 106 ++
 third-party/DSPC-AWELib/versionInfo.txt       |  37 +
 8 files changed, 2452 insertions(+)
 create mode 100644 third-party/DSPC-AWELib/README
 create mode 100644 third-party/DSPC-AWELib/include/.gitignore
 create mode 100644 third-party/DSPC-AWELib/include/TcpIO2.h
 create mode 100644 third-party/DSPC-AWELib/include/awelib.h
 create mode 100644 third-party/DSPC-AWELib/include/basehelpers.h
 create mode 100644 third-party/DSPC-AWELib/include/passthroughSimple.h
 create mode 100644 third-party/DSPC-AWELib/include/utiltypes.h
 create mode 100644 third-party/DSPC-AWELib/versionInfo.txt

diff --git a/third-party/DSPC-AWELib/README b/third-party/DSPC-AWELib/README
new file mode 100644
index 0000000..0722922
--- /dev/null
+++ b/third-party/DSPC-AWELib/README
@@ -0,0 +1,51 @@
+Contents:
+
+	in_s32_stereo.raw - input test file for simple
+designer/
+	passthrough.awb - test layout for simple
+	passthrough.awd - test layout Designer file
+	passthrough.aws - test layout as text
+docs/ - documentation
+include/ - header files for test build
+lib/
+	AWELib.a - the AWE static library
+	AWELib.so - the AWE shared library
+	UtilLib.a - utliity library for Libtester
+src/
+	libtest.cpp - source for Libtester
+	simple.cpp - source for simple
+build.sh - wrapper for make
+makefile - the make file
+Libtester - test harness binary linked to AWELib.so and UtilLib.a
+simple - simple test binary linked to AWELib.so
+README - this file
+
+
+Tests:
+
+Prior to running any tests, you must do:
+
+	export LD_LIBRARY_PATH=lib
+
+otherwise the loader won't find the AWE shared library.
+
+1. Run ./simple to see a simple demonstration of the library.
+This processes data/in_s32_stereo.raw through a simple layout with gain adjustment writing samples to data/out_s32_stereo.raw.
+During operation, it verifies that the output is within the range of expected values and writes progress messages to stdout.
+For more information, refer to docs/README-simple-example.md
+
+2. Test harness as a server for Designer.
+Run ./Libtester -prof -wait to run the test as a server. This opens a socket and listens for Designer. Point Designer to the IP address of this machine to run tests. Terminate with ^C. Note that if the -prof argument is not provided, you get a server that can't profile its layouts.
+
+3. Test harness as a stand-alone test.
+Prepare an AWB file using Designer for a test layout, and prepare a 16 bit WAV file containing test data. This file must have the same number of channels as the layout input, and be at the layout sample rate.
+Run ./Libtester -load:mylayout.awb -in:mywavfile.wav -out:out.wav
+
+The test harness will process the input WAV file through your layout and write processed samples to the output WAV file. Summary messages are written to stdout.
+
+
+Building:
+
+Run the wrapper script ./build.sh.
+The script assumes the toolchain needed is installed.
+
diff --git a/third-party/DSPC-AWELib/include/.gitignore b/third-party/DSPC-AWELib/include/.gitignore
new file mode 100644
index 0000000..c60b8a5
--- /dev/null
+++ b/third-party/DSPC-AWELib/include/.gitignore
@@ -0,0 +1,2 @@
+# Don't ever commit this file, copied by Linux builds to make AWELib
+Errors.h
\ No newline at end of file
diff --git a/third-party/DSPC-AWELib/include/TcpIO2.h b/third-party/DSPC-AWELib/include/TcpIO2.h
new file mode 100644
index 0000000..66f677e
--- /dev/null
+++ b/third-party/DSPC-AWELib/include/TcpIO2.h
@@ -0,0 +1,480 @@
+/****************************************************************************
+ *
+ *		AudioWeaver Support
+ *		-------------------
+ *
+ ****************************************************************************
+ *	TcpIO2.h
+ ****************************************************************************
+ *
+ *	Description:	TCP I/O API
+ *
+ *	Copyright:		DSP Concepts, 2006-2012, All rights reserved.
+ *	Owner:			DSP Concepts
+ *					568 E. Weddell Drive, Suite 3
+ *					Sunnyvale, CA 94089
+ *
+ ***************************************************************************/
+
+/**
+ * @addtogroup TcpIO
+ * @{
+ */
+
+/**
+ * @file
+ * @brief TCP I/O API
+ */
+
+#ifndef _TCPIO2_H_INCLUDED_
+#define _TCPIO2_H_INCLUDED_
+
+#ifndef _MSC_VER
+#define _MSC_VER 0
+#endif
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+#ifdef WIN32
+#include <afx.h>
+#include <afxwin.h>
+#include <afxmt.h>
+
+#ifndef _WINSOCKAPI_
+#include <winsock2.h>
+#endif
+
+#include <assert.h>
+
+#else
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <netdb.h>
+#include <pthread.h>
+#include <assert.h>
+
+#include "utiltypes.h"
+
+/** Windows type definition for INVALID_SOCKET. */
+#define INVALID_SOCKET	(SOCKET)(~0)
+
+/** Windows type definition for SOCKET_ERROR. */
+#define SOCKET_ERROR	(-1)
+
+/** Windows type definition for LPHOSTENT. */
+typedef struct hostent* LPHOSTENT;
+
+/** Windows type definition for SOCKET. */
+typedef int				SOCKET;
+
+#endif
+
+#include "basehelpers.h"
+
+/** Maximum receive buffer size. */
+#define MAX_RECEIVE_BYTES (1024*1024)
+
+/** Structure for binary messages. */
+struct SReceiveMessage
+{
+	/** Payload data. */
+	vector<BYTE> m_data;
+
+	/**
+	 * @brief Get the length of the data
+	 * @return						its length
+	 */
+	size_t size() const
+	{
+		return m_data.size();
+	}
+
+	/**
+	 * @brief Get a byte from the data
+	 * @param [in] i				index to get
+	 * @return						value at that index
+	 */
+	unsigned char GetByte(size_t i) const
+	{
+		return m_data[i];
+	}
+
+	/**
+	 * @brief Get a pointer to the message
+	 * @return						the pointer
+	 */
+	unsigned char *GetData()
+	{
+		return &m_data[0];
+	}
+};
+
+/** Magic TCP binary message marker. */
+#define TCP_MAGIC		0x07ff0003
+
+#ifdef WIN32
+/** Windows notification message for message receipt. */
+#define WM_TCPIP_MESSAGE			0x7e7e
+
+/** Windows notification message for binary message receipt. */
+#define WM_TCPIP_BINARYMESSAGE		0x7e7f
+#endif
+
+/** TCP I/O class. */
+class CTcpIO2
+{
+	/** Socket used to listen on. */
+	SOCKET m_hServerSocket;
+
+	/** Socket for binary messages. */
+	SOCKET m_hBinaryListenSocket;
+
+	/** Socket currently active for send and receive. */
+	SOCKET m_active_socket;
+
+	/** The socket we'll listen on. */
+	SOCKET m_hListenSock;
+
+	/** True wnen connected. */
+	bool m_connected;
+
+	/** Set to make the listener thread exit. */
+	bool m_bTerminateListenerThread;
+
+	/** True while the listener thread is running. */
+	bool m_listenThreadRunning;
+
+	/** Port to listen on. */
+	WORD m_nProtocolPort;
+
+	LPHOSTENT m_lpHostEnt;
+
+	/** The owner's this pointer for notifications. */
+	void *m_pNotifyData;
+
+	/** The owner's this pointer for connection lost notifications. */
+	void *m_pLoseConnectData;
+
+	/** Message received notification callback. */
+	void (*m_pNotifyFunction)(void *pData, int count);
+
+	/** Connection lost notification callback. */
+	void (*m_pLoseConnectFunction)(void *pData);
+
+	/** The message queue. */
+	string_vector m_queue;
+
+	/** The binary message queue. */
+	vector<SReceiveMessage *> m_BinaryMsgQueue;
+
+#ifdef WIN32
+	/** The window we'll notify. */
+	HWND m_hWindow;
+
+	/** The user message we'll use. */
+	unsigned int m_message;
+
+	/** Protects the queue. */
+	CCriticalSection m_queue_critical_section;
+
+#else
+	/** Protects the queue. */
+	pthread_mutex_t m_queue_critical_section;
+#endif
+
+#ifdef WIN32
+	/** The thread object. */
+	CWinThread *m_pListenerThread;
+#else
+	/** The thread object. */
+	pthread_t m_pListenerThread;
+#endif
+
+#ifdef WIN32
+	/** The binary thread object. */
+	CWinThread *m_pBinaryListenerThread;
+#else
+	/** The binary thread object. */
+	pthread_t m_pBinaryListenerThread;
+#endif
+
+#ifndef WIN32
+	pthread_attr_t m_tuning_attr;
+
+	struct sched_param m_tuning_schedParam;
+#endif
+
+	/** Input read buffer. */
+	char m_read_buffer[MAX_RECEIVE_BYTES];
+
+	/** Binary message header. */
+	SReceiveMessage m_CurrentReplyMsg;
+
+	/** Binary message input buffer. */
+	char m_BinaryReadBuffer[MAX_RECEIVE_BYTES];
+
+	/** Remaining unread characters. */
+	size_t m_in_read_buffer;
+
+	/**
+	 * @brief Set the host name and port
+	 * @param [in] server			host name
+	 * @param [in] port				host port
+	 */
+	void SetHostEnt(const char *server, int port);
+
+	/** Create a send socket. */
+	void MakeSocket();
+
+	/**
+	 * @brief Connect to the server.
+	 * @param [in] nIPAddress		address to connect to
+	 */
+	void ConnectSocket(unsigned int nIPAddress = 0);
+
+	/**
+	 * @brief Spawn the listener thread.
+	 * @param [in] pParam			our this pointer
+	 */
+#ifdef WIN32
+	static unsigned int StartListenThread(void *pParam);
+#else
+	static void *StartListenThread(void *pParam);
+#endif
+
+	/**
+	 * @brief Spawn the binary listener thread.
+	 * @param [in] pParam			our this pointer
+	 */
+#ifdef WIN32
+	static unsigned int StartBinaryListenThread(void *pParam);
+#else
+	static void *StartBinaryListenThread(void *pParam);
+#endif
+
+	/** Listen on a socket for a connection, and handle the connection. */
+	void ListenThread();
+
+	/** Listen on a binary socket for a connection, and handle the connection. */
+	void BinaryListenThread();
+
+	/**
+	 * @brief Handle a connection from a talker.
+	 * @param [in]
+	 */
+	bool OnSocketAccept(const in_addr &, SOCKET sock);
+
+	/** Handle binary message from talker. */
+	bool OnBinarySocketAccept();
+
+	/**
+	 * @brief Translate any type of IP address into the proper structure.
+	 * @param [in] name				URL or dotted IP address
+	 * @return						address object
+	 */
+	static LPHOSTENT TranslateAddress(const char *name);
+
+	/**
+	 * @brief Read a message from a socket
+	 * @param [in] sock				socket to read from
+	 * @return						the message read
+	 */
+	std::string ReadMessage(SOCKET sock);
+
+	/**
+	 * @brief Send a message string
+	 * @param [in] str				string to send
+	 * @return						0 or socket error number
+	 */
+	int SendString(SOCKET sock, const char *str);
+
+public:
+#ifdef WIN32
+	/** Event for message receipt. */
+	HANDLE m_hEvent;
+
+	/** Event for binary message recipt. */
+	HANDLE m_hEvent_Binary;
+#endif
+
+	/** Kill the send socket. */
+	void KillSocket();
+
+	int IsConnected() const
+	{
+		return m_connected;
+	}
+
+	/**
+	 * @brief Get the IP Address of the indicated network card ( 1 - first card, 2 - 2nd card, etc.)
+	 * @param [in] nWhichNetworkCard	network card to get from
+	 * @return						IP address or ""
+	 */
+	std::string GetIPAddress(int nWhichNetworkCard);
+
+	/** Default constructor. */
+	CTcpIO2();
+
+	/** Destructor. */
+	~CTcpIO2();
+
+	/** Kill the listener thread. */
+	void KillListener();
+
+	/** Clear the message queue. */
+	void ClearQueue()
+	{
+		m_queue.clear();
+	}
+
+	/**
+	 * @brief Get the queue size
+	 * @return						the size
+	 */
+	size_t QueueSize() const
+	{
+		return m_queue.size();
+	}
+
+	/**
+	 * @brief Get the first queue item
+	 * @return						the titme
+	 */
+	const char *QueueItem() const
+	{
+		if (m_queue.size())
+		{
+			return m_queue[0].c_str();
+		}
+		return 0;
+	}
+
+	/** Erase the first item. */
+	void EraseFirstItem()
+	{
+		if (m_queue.size())
+		{
+			m_queue.erase(m_queue.begin());
+		}
+	}
+
+#ifdef WIN32
+	/**
+	 * @brief Set the HWND and message we'll notify with on Windows.
+	 * @param [in] hWnd				window to notify
+	 * @param [in] message			message to use
+	 */
+	void SetNotifyWindow(HWND hWnd, DWORD message)
+	{
+		m_hWindow = hWnd;
+		m_message = message;
+	}
+#endif
+
+	/**
+	 * @brief Set a message notification callback function
+	 * @param [in] pData			caller's this pointer
+	 * @param [in] pNotifyFunction	callback
+	 */
+	void SetNotifyFunction(void *pData, void (*pNotifyFunction)(void *pData, int count))
+	{
+		m_pNotifyData = pData;
+		m_pNotifyFunction = pNotifyFunction;
+	}
+
+	/**
+	 * @brief Set a connection lost notification callback function
+	 * @param [in] pData			caller's this pointer
+	 * @param [in] pLoseConnectFunction callback
+	 */
+	void SetConnectLossFunction(void *pData, void (*pLoseConnectFunction)(void *pData))
+	{
+		m_pLoseConnectData = pData;
+		m_pLoseConnectFunction = pLoseConnectFunction;
+	}
+
+	/**
+	 * @brief Create a listener socket.
+	 * @param [in] port				port to listen on
+	 * @return						0 or socket error number
+	 */
+	int CreateListenerSocket(int port);
+
+	/**
+	 * @brief Create a binary listener socket.
+	 * @param [in] port				port to listen on
+	 * @return						0 or socket error number
+	 */
+	int CreateBinaryListenerSocket(int port);
+
+	/**
+	 * @brief Get the top message from the queue.
+	 * @return						the message
+	 */
+	std::string GetMessage();
+
+	/**
+	 * @brief Get a message that might be binary.
+	 * @param [out] textMessage		message value if text
+	 * @param [out] pData			message value if binary
+	 * @param [out] len				message length
+	 * @return						0=test, 1=binary, <0 error
+	 */
+	int GetBinaryMessage(std::string &textMessage, void *&pData, int &len);
+
+	/**
+	 * @brief Get the top binary message from the queue.
+	 * @return						the message object
+	 */
+	SReceiveMessage *BinaryGetMessage();
+
+	/**
+	 * @brief Get the number of waiting messages.
+	 * @return						count of waiting messages
+	 */
+	size_t GetMessageCount();
+
+	/**
+	 * @brief Get the number of waiting binary messages.
+	 * @return						count of waiting binary messages
+	 */
+	size_t GetBinaryMessageCount();
+
+	/**
+	 * @brief Send a message to the given server, does not attempt to wait for a reply.
+	 * @param [in] server			server to send to
+	 * @param [in] port				port to send on
+	 * @param [in] message			message to send
+	 * @return						0 or error code
+	 */
+	int SendTcpMessage(const char *server, int port, const char *message);
+
+	/**
+	 * @brief Send a binary message to the given server, does not attempt to wait for a reply.
+	 * @param [in] server			server to send to
+	 * @param [in] port				port to send on
+	 * @param [in] message			message to send
+	 * @param [in] nMsgLen			length of message
+	 * @return						0 or error code
+	 */
+	int SendBinaryMessage(const char *server, int port, const BYTE *message, int nMsgLen);
+};
+
+
+
+#endif	// _TCPIO2_H_INCLUDED_
+
+/**
+ * @}
+ * End of file
+ */
diff --git a/third-party/DSPC-AWELib/include/awelib.h b/third-party/DSPC-AWELib/include/awelib.h
new file mode 100644
index 0000000..dbff3b0
--- /dev/null
+++ b/third-party/DSPC-AWELib/include/awelib.h
@@ -0,0 +1,583 @@
+/****************************************************************************
+ *
+ *		AWE Library
+ *		-----------
+ *
+ ****************************************************************************
+ *
+ *	Description:	AWE library.
+ *
+ *	Copyright:		DSP Concepts, 2006-2017, All rights reserved.
+ *	Owner:			DSP Concepts
+ *					568 E. Weddell Drive, Suite 3
+ *					Sunnyvale, CA 94089
+ *
+ ***************************************************************************/
+
+/**
+ *	@addtogroup AWELibrary
+ *	@{
+ */
+
+#ifndef __AWELIB_H_INCLUDED__
+#define __AWELIB_H_INCLUDED__
+
+/** Create a virtual address. */
+#define MAKE_ADDRESS(id, idx)				(((id) << 12) | (idx))
+
+#ifndef DOXYGEN
+#define MAKE_WIRE_ADDRESS(id)		MAKE_ADDRESS(id, 3)
+
+#define MAKE_LAYOUT_ADDRESS(id)		MAKE_ADDRESS(id, 0)
+
+#ifndef UINT32
+#define UINT32 unsigned int
+#endif
+
+#ifndef INT32
+#define INT32 int
+#endif
+
+#ifndef UINT64
+#define UINT64 unsigned long long
+#endif
+#endif
+
+#ifndef _FRAMEWORK_H
+#ifndef MAX_COMMAND_BUFFER_LEN
+#define MAX_COMMAND_BUFFER_LEN	(4096 + 9)	//WORDS - space for 4096 samples + header
+#endif
+
+/** Union of all possible sample types. */
+typedef union _Sample
+{
+	INT32 iVal;
+	UINT32 uiVal;
+	float fVal;
+}
+Sample;
+#endif
+
+/**
+ * @class CAWELib
+ * @brief Interface for the AudioWeaver library.
+ *
+ * This is an abstract interface to the AWE library. You construct
+ * an instance by calling AWELibraryFactory().  The constructed instance
+ * is not usable until you call Create() which creates an empty AWE, and
+ * can't be used to process audio until you call LoadAwbFile() to instantiate
+ * audio modules.
+ *
+ * After loading the AWB file, you must call PinProps() to get the layout
+ * properties, and pass the wire IDs to SetLayoutAddresses(). You can then call
+ * PumpAudio() to process blocks of samples.
+ *
+ * The AWB file you load is a binary representation of a Designer layout you
+ * create. The block size and channel counts for input and output are
+ * determined by the layout design, which is why you must call PinProps() to
+ * query those values.
+ *
+ * See provided example code for details of how to do this. 
+ */
+struct CAWELib
+{
+	/**
+	 * @brief Destructor.
+	 */
+	virtual ~CAWELib()
+	{
+	}
+
+	/**
+	 * @brief Get the average cycles used by audio.
+	 * @return						the average cycles
+	 *
+	 * The return value is in units of the sampling clock
+	 * used by your CPU. This should be the same as the value
+	 * you specified when you called Create(). The value is
+	 * determined by hardware. See your processor data sheet.
+	 */
+	virtual double AverageCycles() const = 0;
+
+	/**
+	 * @brief Get the pump count
+	 * @return						the pump count
+	 */
+	virtual UINT64 PumpCount() const = 0;
+
+	/** Clear measure of average cycles. */
+	virtual void ClearMeasure() = 0;
+
+	/**
+	 * @brief Get the library version
+	 * @return						the library version string
+	 */
+	virtual const char *GetLibraryVersion() const = 0;
+
+	/**
+	 * @brief Specify addresses in layout.
+	 * @param [in] inId				ID of input wire
+	 * @param [in] outId			ID of output wire
+	 * @param [in] layoutId			ID of layout default 0
+	 *
+	 * You must set the wire IDs for input and output before you can pump.
+	 * A layout ID of 0 means use the default layout.
+	 */
+	virtual void SetLayoutAddresses(UINT32 inId, UINT32 outId, UINT32 layoutId = 0) = 0;
+	
+	/**
+	 * @brief test if the AWE instance has been created
+	 * @return						true if it has
+	 */
+	virtual bool IsCreated() const = 0;
+
+	/**
+	 * @brief Create the AWE instance.
+	 * @param [in] name				instance name (max 8 chars)
+	 * @param [in] cpu_clock_speed	CPU clock speed in Hz
+	 * @param [in] cpu_cycle_speed	sample clock speed in Hz
+	 * @return						0 or error code
+	 *
+	 * Creates the AWE instance. All other APIs will fail until you call this.
+	 * You must specify a name for this instance (max 8 chars), the CPU clock frequency
+	 * and sample clock frequency (usually the same).
+	 *
+	 * Cycle speed is the clock used for cycle counting. On a number of CPUs this
+	 * is not the same as the CPU clock. The value is used for Matlab profiling to
+	 * compute MIPs. See your processor data sheet.
+	 *
+	 * On many Linux systems and on Windows the profile value should be 10000000 (10MHz).
+	 *
+	 * Possible error returns:
+	 * E_ALREADY_CREATED - Create() has already been called.
+	 * E_ARGUMENT_ERROR - invalid name.
+	 */
+	virtual int Create(const char *name, float cpu_clock_speed, float cpu_cycle_speed) = 0;
+
+	/**
+	 * @brief Destroy the AWE instance.
+	 *
+	 * This destroys the AWE instance. You can later call Create() to create a new
+	 * instance.
+	 */
+	virtual void Destroy() = 0;
+
+	/**
+	 * @brief Write samples, pump, and read samples
+	 * @param [in] in_samples		samples to send to AWE
+	 * @param [out] out_samples		where to write reply samples
+	 * @param [in] in_sample_count	number of input samples
+	 * @param [in] out_sample_count number of output samples
+	 * @return						0 or error code
+	 *
+	 * Processes the input samples through the layout to the output samples
+	 * and keeps track of the cycles used by audio processing. The wire IDs must
+	 * have been specified first, or this call will fail.
+	 * The counts must be block size * channels.
+	 *
+	 * If audio has not been started by the layout, it is safe to call this
+	 * but it will not process samples, just clear the output buffer and
+	 * return E_NO_LAYOUTS or E_AUDIO_NOT_STARTED.
+	 *
+	 * Possible error returns:
+	 * E_NOT_CREATED - Create() must be called before use.
+	 * E_WIRES_NOT_SPECIFIED - wire IDs were not set by SetLayoutAddresses().
+	 * E_NO_LAYOUTS - no layout, use LoadAwbFile().
+	 * E_AUDIO_NOT_STARTED - audio has not yet started, start it with SendCommand() or use LoadAwbFile().
+	 * Others - see Errors.h.
+	 */
+	virtual int PumpAudio(const void *in_samples, void *out_samples,
+		UINT32 in_sample_count, UINT32 out_sample_count) = 0;
+
+	/**
+	 * @brief Query the wire properties
+	 * @param [out] in_samps		input wire samples
+	 * @param [out] in_chans		input wire channels
+	 * @param [out] in_complex		input wire complex
+	 * @param [out] in_ID			ID of input
+	 * @param [out] out_samps		output wire samples
+	 * @param [out] out_chans		output wire channels
+	 * @param [out] out_complex		output wire complex
+	 * @param [out] out_ID			ID of output
+	 * @return						0, 1, or error code
+	 *
+	 * Queries the layout for the input and output details. Wires are almost never
+	 * complex, but if they are there are two values (real, imag) per logical sample.
+	 * Return the block size, channels, complex, and ID of the the wires.
+	 * If there is no layout, returns 0, otherwise returns 1 and these details.
+	 *
+	 * Possible error returns:
+	 * E_NOT_CREATED - Create() must be called before use.
+	 * Others - see Errors.h.
+	 */
+	virtual int PinProps(UINT32 &in_samps, UINT32 &in_chans, UINT32 &in_complex, UINT32 &in_ID,
+		UINT32 &out_samps, UINT32 &out_chans, UINT32 &out_complex, UINT32 &out_ID) = 0;
+
+	/**
+	 * @brief Fetch a 32-bit value from the given address.
+	 * @param [in] address			Address to fetch value from.
+	 * @param [out] retVal			Error reason code.
+	 * @return						Fetched value.
+	 *
+	 * AWE stores array values and scalar values differently use this
+	 * when reading scalar values.
+	 *
+	 * Possible error returns:
+	 * E_NOT_CREATED - Create() must be called before use.
+	 * Others - see Errors.h.
+	 */
+	virtual Sample FetchValue(
+			UINT32 address,
+			int *retVal) = 0;
+
+	/**
+	 * @brief Set a 32-bit value to the given address.
+	 * @param [in] address			Address to set value to
+	 * @param [in] val				value to set
+	 * @return						0 or error code
+	 *
+	 * AWE stores array values and scalar values differently use this
+	 * when writing scalar values.
+	 *
+	 * Possible error returns:
+	 * E_NOT_CREATED - Create() must be called before use.
+	 * Others - see Errors.h.
+	 */
+	virtual int SetValue(
+			UINT32 address,
+			Sample val) = 0;
+
+	/**
+	 * @brief Fetch array values
+	 * @param [in] address			base address
+	 * @param [in] argCount			count of values
+	 * @param [out] args			the output values
+	 * @param [in] offset			offset from base default 0
+	 * @return						0 or error code
+	 *
+	 * AWE stores array values and scalar values differently use this
+	 * when reading array values  even if only one element.
+	 *
+	 * Possible error returns:
+	 * E_NOT_CREATED - Create() must be called before use.
+	 * Others - see Errors.h.
+	 */
+	virtual int FetchValues(
+			UINT32 address,
+			UINT32 argCount,
+			Sample *args,
+			UINT32 offset = 0) = 0;
+
+	/**
+	 * @brief Set array values
+	 * @param [in] address			base address
+	 * @param [in] argCount			count of values
+	 * @param [in] args				the argument values
+	 * @param [in] offset			offset from base default 0
+	 * @return						0 or error code
+	 *
+	 * AWE stores array values and scalar values differently use this
+	 * when writing array values  even if only one element.
+	 *
+	 * Possible error returns:
+	 * E_NOT_CREATED - Create() must be called before use.
+	 * Others - see Errors.h.
+	 */
+	virtual int SetValues(
+			UINT32 address,
+			UINT32 argCount,
+			const Sample *args,
+			UINT32 offset = 0) = 0;
+
+#ifndef NO_LOAD_FILE
+	/**
+	 * @brief Load an AWB file into AWE.
+	 * @param [in] filename			file to load
+	 * @param [out] pPos			if non-NULL, return failing word offset
+	 * @return						0 or error code
+	 *
+	 * Loads a layout file in AWB format. After loading a layout, you
+	 * should call PinProps() to find out the layout input and output details.
+	 *
+	 * Possible error returns:
+	 * E_NOT_CREATED - Create() must be called before use.
+	 * E_ARGUMENT_ERROR - filename is not valid.
+	 * Others - see Errors.h.
+	 *
+	 * On error, if pPos is given, the word offset of the failing
+	 * command is returned.
+	 */
+	virtual int LoadAwbFile(const char *filename, UINT32 *pPos = 0) = 0;
+#endif
+
+	/**
+	 * @brief Load an AWB file from memory into AWE.
+	 * @param [in] buffer			buffer containing words to load
+	 * @param [in] len				number of words in buffer
+	 * @param [out] pPos			if non-NULL, return failing word offset
+	 * @return						0 or error code
+	 *
+	 * Loads a layout file in AWB format that has been read into an array of words
+	 * as though by using fread(). Afterloading a layout, you should call
+	 * PinProps() to find out the layout input and output details.
+	 *
+	 * Possible error returns:
+	 * E_NOT_CREATED - Create() must be called before use.
+	 * E_ARGUMENT_ERROR - buffer or len is not valid.
+	 * Others - see Errors.h.
+	 *
+	 * On error, if pPos is given, the word offset of the failing
+	 * command is returned.
+	 */
+	virtual int LoadAwbMem(UINT32 *buffer, UINT32 len, UINT32 *pPos = 0) = 0;
+
+	/**
+	 * @brief Send a binary command to AWE.
+	 * @param [in out] cmdBuffer	buffer containing command
+	 * @param [in] cmdBufferLen		buffer size in words
+	 * @return						0 or error code
+	 *
+	 * Warning: replies can be much larger than commands.
+	 * The buffer should be sized at MAX_COMMAND_BUFFER_LEN to handle the worst case.
+	 * On entry, the buffer must contain a binary AWE command packet.
+	 * On return, the buffer contains the reply packet.
+	 *
+	 * Possible error returns:
+	 * E_NOT_CREATED - Create() must be called before use.
+	 * Others - see Errors.h.
+	 */
+	virtual int SendCommand(UINT32 *cmdBuffer, UINT32 cmdBufferLen) = 0;
+
+	/**
+	 * @brief Get the cycle counter.
+	 * @return						the cycles
+	 *
+	 * The return value is in units of the cycle counter frequency.
+	 */
+	virtual UINT32 GetCycles() = 0;
+
+	/**
+	 * @brief Test if audio is running.
+	 * @return						true if it is
+	 */
+	virtual bool IsStarted() = 0;
+
+	/**
+	 * @brief Query the wire properties with optional sample rate
+	 * @param [out] in_samps		input wire samples
+	 * @param [out] in_chans		input wire channels
+	 * @param [out] in_complex		input wire complex
+	 * @param [out] in_ID			ID of input
+	 * @param [out] out_samps		output wire samples
+	 * @param [out] out_chans		output wire channels
+	 * @param [out] out_complex		output wire complex
+	 * @param [out] out_ID			ID of output
+	 * @param [out] pSrate			optional layout sample rate
+	 * @return						0, 1, or error code
+	 *
+	 * Queries the layout for the input and output details. Wires are almost never
+	 * complex, but if they are there are two values (real, imag) per logical sample.
+	 * Return the block size, channels, complex, and ID of the the wires.
+	 * If there is no layout, returns 0, otherwise returns 1 and these details.
+	 *
+	 * Possible error returns:
+	 * E_NOT_CREATED - Create() must be called before use.
+	 * Others - see Errors.h.
+	 */
+	virtual int PinPropsEx(UINT32 &in_samps, UINT32 &in_chans, UINT32 &in_complex, UINT32 &in_ID,
+		UINT32 &out_samps, UINT32 &out_chans, UINT32 &out_complex, UINT32 &out_ID,
+		UINT32 *pSrate = 0) = 0;
+
+	/**
+	 * @brief Create the AWE instance with profile control.
+	 * @param [in] name				instance name (max 8 chars)
+	 * @param [in] cpu_clock_speed	CPU clock speed in Hz
+	 * @param [in] cpu_cycle_speed	sample clock speed in Hz
+	 * @param [in] profile			default false, pass true to enable profiling
+	 * @param [in] blocksize		default 0, pass blocksize target info must report
+	 * @param [in] bufferlen		default 0, pass command buffer length target info must report
+	 * @param [in] inchans          default 0, pass number of input channels target info must report
+	 * @param [in] outchans         default 0, pass number of output channels target info must report
+	 * @return						0 or error code
+	 *
+	 * Creates the AWE instance. All other APIs will fail until you call this.
+	 * You must specify a name for this instance (max 8 chars), the CPU clock frequency
+	 * and sample clock frquency (usually the same).
+	 *
+	 * Cycle speed is the clock used for cycle counting. On a number of CPUs this
+	 * is not the same as the CPU clock. The value is used for Matlab profiling to
+	 * compute MIPs. See your processor data sheet.
+	 *
+	 * On many Linux systems and on Windows the cycle value should be 10000000 (10MHz).
+	 *
+	 * Possible error returns:
+	 * E_ALREADY_CREATED - Create() has already been called.
+	 * E_ARGUMENT_ERROR - invalid name.
+	 */
+	virtual int CreateEx(const char *name, float cpu_clock_speed, float cpu_cycle_speed,
+		bool profile = false, UINT32 blocksize = 0, UINT32 bufferlen = 0, UINT32 inchans = 0, UINT32 outchans = 0) = 0;
+
+	/**
+	 * @brief Set callback handlers for start and stop audio events.
+	 * @param [in] param			parameter to pass to callbacks
+	 * @param [in] start			start event handler
+	 * @param [in] stop				stop event handler
+	 *
+	 * You can disable callbacks again by passing NULLs.
+	 *
+	 * The callbacks are only called when the audio state changes.
+	 */
+	virtual void SetStartStopCallbacks(void *param, void (*start)(void *), void (*stop)(void *)) = 0;
+
+	/**
+	 * @brief Set the file search path
+	 * @param searchPath [in]		vertical bar delimited path
+	 *
+	 * Some modules that read files use a search path to locate them.
+	 * The items in this path must be '|' delimited. If not called,
+	 * a path of '.' is assumed, meaning the working directory.
+	 */
+	virtual void SetSearchPath(const char *searchPath) = 0;
+
+#ifndef NO_LOAD_FILE
+	/**
+	 * @brief Load a DSPC encrypted AWB file into AWE.
+	 * @param [in] filename			file to load
+	 * @param [out] pPos			if non-NULL, return failing word offset
+	 * @return						0 or error code
+	 *
+	 * Loads a layout file in AWB format. After loading a layout, you
+	 * should call PinProps() to find out the layout input and output details.
+	 *
+	 * Possible error returns:
+	 * E_NOT_CREATED - Create() must be called before use.
+	 * E_ARGUMENT_ERROR - filename is not valid.
+	 * Others - see Errors.h.
+	 *
+	 * On error, if pPos is given, the word offset of the failing
+	 * command is returned.
+	 */
+	virtual int LoadAwbFileDSPCEncrypted(const char *filename, UINT32 *pPos = 0) = 0;
+
+	/**
+	 * @brief Load an unencrypted AWB file into AWE.
+	 * @param [in] filename			file to load
+	 * @param [out] pPos			if non-NULL, return failing word offset
+	 * @return						0 or error code
+	 *
+	 * Loads a layout file in AWB format. After loading a layout, you
+	 * should call PinProps() to find out the layout input and output details.
+	 *
+	 * Possible error returns:
+	 * E_NOT_CREATED - Create() must be called before use.
+	 * E_ARGUMENT_ERROR - filename is not valid.
+	 * Others - see Errors.h.
+	 *
+	 * On error, if pPos is given, the word offset of the failing
+	 * command is returned.
+	 */
+	virtual int LoadAwbFileUnencrypted(const char *filename, UINT32 *pPos = 0) = 0;
+#endif
+
+	/**
+	 * @brief Load a DSPC encrypted AWB file from memory into AWE.
+	 * @param [in] buffer			buffer containing words to load
+	 * @param [in] len				number of words in buffer
+	 * @param [out] pPos			if non-NULL, return failing word offset
+	 * @return						0 or error code
+	 *
+	 * Loads a layout file in AWB format that has been read into an array of words
+	 * as though by using fread(). Afterloading a layout, you should call
+	 * PinProps() to find out the layout input and output details.
+	 *
+	 * Possible error returns:
+	 * E_NOT_CREATED - Create() must be called before use.
+	 * E_ARGUMENT_ERROR - buffer or len is not valid.
+	 * Others - see Errors.h.
+	 *
+	 * On error, if pPos is given, the word offset of the failing
+	 * command is returned.
+	 */
+	virtual int LoadAwbMemDSPCEncrypted(UINT32 *buffer, UINT32 len, UINT32 *pPos = 0) = 0;
+
+	/**
+	 * @brief Load an unencrypted AWB file from memory into AWE.
+	 * @param [in] buffer			buffer containing words to load
+	 * @param [in] len				number of words in buffer
+	 * @param [out] pPos			if non-NULL, return failing word offset
+	 * @return						0 or error code
+	 *
+	 * Loads a layout file in AWB format that has been read into an array of words
+	 * as though by using fread(). Afterloading a layout, you should call
+	 * PinProps() to find out the layout input and output details.
+	 *
+	 * Possible error returns:
+	 * E_NOT_CREATED - Create() must be called before use.
+	 * E_ARGUMENT_ERROR - buffer or len is not valid.
+	 * Others - see Errors.h.
+	 *
+	 * On error, if pPos is given, the word offset of the failing
+	 * command is returned.
+	 */
+	virtual int LoadAwbMemUnencrypted(UINT32 *buffer, UINT32 len, UINT32 *pPos = 0) = 0;
+	
+	/**
+	 * @brief Create the AWE instance with profile control and configurable heaps.
+	 * @param [in] name				instance name (max 8 chars)
+	 * @param [in] cpu_clock_speed	CPU clock speed in Hz
+	 * @param [in] cpu_cycle_speed	sample clock speed in Hz
+	 * @param [in] profile			default false, pass true to enable profiling
+	 * @param [in] blocksize		default 0, pass blocksize target info must report
+	 * @param [in] bufferlen		default 0, pass command buffer length target info must report
+	 * @param [in] inchans          default 0, pass number of input channels target info must report
+	 * @param [in] outchans         default 0, pass number of output channels target info must report
+	 * @param [in] masterHeap_size	default 0, pass in master heap size that will be allocated
+	 * @param [in] fastHeapB_size	default 0, pass in fast heap B size that will be allocated
+	 * @param [in] slowHeap_size	default 0, pass in slow  heap size that will be allocated
+	 * @return						0 or error code
+	 *
+	 * Creates the AWE instance. All other APIs will fail until you call this.
+	 * You must specify a name for this instance (max 8 chars), the CPU clock frequency
+	 * and sample clock frquency (usually the same). This updated CreateEx2 function allows 
+	 * heap sizes to be passed in (as opposed to the heap sizes built into the library). 
+	 *
+	 * Cycle speed is the clock used for cycle counting. On a number of CPUs this
+	 * is not the same as the CPU clock. The value is used for Matlab profiling to
+	 * compute MIPs. See your processor data sheet.
+	 *
+	 * On many Linux systems and on Windows the cycle value should be 10000000 (10MHz).
+	 *
+	 * Possible error returns:
+	 * E_ALREADY_CREATED - Create() has already been called.
+	 * E_ARGUMENT_ERROR - invalid name.
+	 */
+	virtual int CreateEx2(const char *name, float cpu_clock_speed, float cpu_cycle_speed,
+		bool profile = false, UINT32 blocksize = 0, UINT32 bufferlen = 0, UINT32 inchans = 0, UINT32 outchans = 0,  UINT32 masterHeap_size = 0 , UINT32 fastHeapB_size = 0, UINT32 slowHeap_size = 0) = 0;
+
+};
+
+#ifdef WIN32
+extern "C" {
+#endif
+
+/**
+ * @brief Create an instance of the library object.
+ * @return							the instance
+ */
+#if defined(WIN32) && !defined(FORMAIN)
+DLLSYMBOL
+#endif
+CAWELib *AWELibraryFactory();
+
+#ifdef WIN32
+}
+#endif
+
+#endif	// __AWELIB_H_INCLUDED__
+
+/**
+ * @}
+ *
+ * End of file.
+ */
+
diff --git a/third-party/DSPC-AWELib/include/basehelpers.h b/third-party/DSPC-AWELib/include/basehelpers.h
new file mode 100644
index 0000000..2196bad
--- /dev/null
+++ b/third-party/DSPC-AWELib/include/basehelpers.h
@@ -0,0 +1,960 @@
+/****************************************************************************
+ *
+ *		Helper Classes
+ *		--------------
+ *
+ ****************************************************************************
+ *
+ *	Description:	Helper classes
+ *
+ *	Copyright:		Copyright DEMA Consulting 2008-2009, All rights reserved.
+ *	Owner:			DEMA Consulting.
+ *					93 Richardson Road
+ *					Dublin, NH 03444
+ *
+ ***************************************************************************/
+
+/**
+ * @addtogroup Helpers
+ * @{
+ */
+
+/**
+ * @file
+ * @brief Helper classes
+ */
+
+#ifndef BASEHELPERS_H_INCLUDED
+#define BASEHELPERS_H_INCLUDED
+
+
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <string>
+#include <vector>
+#include <map>
+#include <algorithm>
+#include "paths.h"
+
+using namespace std;
+
+
+
+/** Device operation succeeded. */
+#define ERR_Success						(0)							// 0
+
+/** Caller must wait for later notification. */
+#define ERR_WaitNotify					(-1)						// -1
+
+/** Command threw an exception. */
+#define ERR_Exception					(-2)						// -2
+
+/** The action is not supported. */
+#define ERR_NotSupported				(-3)						// -3
+
+/** The named object was not found in the registry. */
+#define ERR_NoSuchObject				(-4)						// -4
+
+/** There is no registry. */
+#define ERR_NoRegistry					(-5)						// -5
+
+/** Command was called with the wrong number of arguments. */
+#define ERR_CMD_WrongNumberOfArgs		(-6)						// -6
+
+/** Error getting argv[2] as array. */
+#define ERR_CMD_CantGetArray			(-7)						// -7
+
+/** Error getting length of array argv[2]. */
+#define ERR_CMD_CantGetArrayLength		(-8)						// -8
+
+/** Error getting element of argv[2]. */
+#define ERR_CMD_CantGetArrayElement		(-9)						// -9
+
+/** Command argument count. */
+#define ERR_ArgumentCount				(-10)						// -10
+
+/** Command argument error. */
+#define ERR_ArgumentError				(-11)						// -11
+
+/** There was an issue with the JavaScript. */
+#define ERR_JscriptError				(-12)						// -12
+
+/** Unable to write a file. */
+#define ERR_FileWriteError				(-13)						// -13
+
+/** Can't find specified file. */
+#define ERR_NoSuchFile					(-14)						// -14
+
+/** Error reading file. */
+#define ERR_FileReadError				(-15)						// -15
+
+/** Format error in read data. */
+#define ERR_BadData						(-16)						// -16
+
+/** Syntax error in CSV string. */
+#define ERR_CSVSyntax					(-17)						// -17
+
+/** Error creating object. */
+#define ERR_CantCreate					(-18)						// -18
+
+
+/**
+ * @brief Map of string to string.
+ */
+class string_map : public map<string, string>
+{
+public:
+	/**
+	 * @brief Populate a string_map.
+	 *
+	 * This function populates the string-map from a string of the form:
+	 * name=value, name2 = value2, name3 = value3
+	 *
+	 * @param [in] src				Source string to parse.
+	 * @param [in] quote			Quote character.
+	 * @return						Number of items processed.
+	 */
+	size_t Split(const char *src, char quote = 0);
+};
+
+
+/**
+ * @brief Safe version of strncpy.
+ * @param [out] dest				destination of copy
+ * @param [in] source				source of copy
+ * @param [in] count				max number of bytes including NULL to copy
+ * @return							dest
+ *
+ * This function guarantees that dest is NULL terminated by truncating source
+ * if needed. It does not zero-fill unused parts of dest.
+ */
+char *strNcpy(char *dest, const char *source, size_t count);
+
+/**
+ * @brief Template function to perform deep-comparison of vectors.
+ *
+ * This function compares two vectors for equality by performing
+ * a member-wise comparison of all items in the vector.
+ *
+ * @param [in] v1		First vector to compare.
+ * @param [in] v2		Second vector to compare.
+ * @return				true if the vectors are equal.
+ */
+template <typename T>
+inline bool compare_vectors(const vector<T> &v1, const vector<T> &v2)
+{
+	/* Compare the count. */
+	if (v1.size() != v2.size())
+	{
+		return false;
+	}
+
+	/* Compare each member. */
+	for (size_t i = 0; i < v1.size(); ++i)
+	{
+		if (v1[i] != v2[i])
+		{
+			return false;
+		}
+	}
+
+	/* Vectors are identical. */
+	return true;
+}
+
+/** This is a wrapper for stdio FILE with additional functionality. */
+class File2
+{
+	/** Copy disabled by private assignment. */
+	File2 &operator = (const File2& );
+
+protected:
+	/** The stream we wrap. */
+	FILE *_stream;
+
+	/** When true, close the stream when the object is destroyed. Only false
+	if attached to pre-existing stream. */
+	bool _closeStream;
+
+public:
+	/** Default constructor. */
+	File2();
+
+	/**
+	 * @brief Construct using an existing stream.
+	 * @param [in] fh				the stream to wrap
+	 */
+	File2(FILE *fh);
+
+	/**
+	 * @brief Construct using a filename and open specification.
+	 * @param [in] filename			the file to open
+	 * @param [in] mode				how to open it - see fopen
+	 * @param [in] bufLen			optional buffer size for I/O buffer
+	 */
+	File2(const char *filename, const char *mode = "rb", int bufLen = -1);
+
+	/**
+	 * @brief File destructor.
+	 */
+	virtual ~File2();
+
+	/**
+	 * @brief Test if the object is valid (has q valid stream).
+	 * @return						true of valid
+	 */
+	inline bool valid() const
+	{
+		return (_stream)? true: false;
+	}
+
+	/**
+	 * @brief Open as though by fopen
+	 * @param [in] filename			the file to open
+	 * @param [in] mode				how to open it - see fopen
+	 * @return						true on success
+	 */
+	bool open(const char *filename, const char *mode = "rb");
+
+	/** Close the current stream. */
+	void close();
+
+	// Positioning.
+	/**
+	 * @brief Report the current seek position
+	 * @return						position, or -1 for error - see errno
+	 */
+	int tell();
+
+	/**
+	 * @brief Seek the current file pointer
+	 * @param [in] offs				the offset
+	 * @param [in] org				one of SEEK_CUR, SEEK_END, SEEK_SET
+	 * @return						0 on success
+	 */
+	int seek(int offs, int org);
+
+	/**
+	 * @brief Set an I/O buffer to use.
+	 * @param [in] buf				the buffer to use
+	 * @param [in] bufSize			its size
+	 * @return						false on success
+	 */
+	bool setBuffer(void *buf, size_t bufSize);
+
+	/**
+	 * @brief Flush the I/O buffer
+	 * @return						false on success
+	 */
+	bool flush();
+
+	/**
+	 * @brief Return the length of	a file
+	 * @return						the file's length
+	 *
+	 * This is intended for use on read streams.
+	 */
+	long getLength();
+
+	// Reading / Writing.
+	/**
+	 * @brief Read a single character
+	 * @return						the character read, or EOF
+	 */
+	inline int readChar()
+	{
+		return fgetc(_stream);
+	}
+
+	/**
+	 * @brief Write a single character
+	 * @param [in] ch				the character to write
+	 * @return						the character written, or EOF on error
+	 */
+	int writeChar(int ch);
+
+	/**
+	 * @brief Read data
+	 * @param [out] p				the data buffer to read into
+	 * @param [in] len				its size
+	 * @return						number of characters read
+	 */
+	size_t read(void *p, size_t len);
+
+	/**
+	 * @brief Write data
+	 * @param [in] p				the data to write
+	 * @param [in] len				its size
+	 * @return						number of characters written
+	 */
+	inline size_t write(const void *p, size_t len)
+	{
+		return fwrite(p, 1, len, _stream);
+	}
+
+	// Printing.
+	/**
+	 * @brief Write a string
+	 * @param [in] buf				the string to write
+	 * @return						number of characters written
+	 */
+	inline size_t puts(const char *buf)
+	{
+		return write((const void *)buf, strlen(buf));
+	}
+
+	/**
+	 * @brief Write formatted output
+	 * @param [in] fmt				the format string
+	 * @return						number of characters written
+	 */
+	size_t printf(const char *fmt, ...);
+
+	/**
+	 * @brief Read a text line
+	 * @param [out] out				the line read
+	 * @param [in] strip			when true, remove terminating line ends
+	 * @param [in] unix				when true, line ends are LF as well as CRLF
+	 * @return						true on success
+	 *
+	 * This function expands on the traditional fgets() by supporting stripping
+	 * line ends, and supporting both Windows and Unix line ends.
+	 */
+	bool fgets(std::string &out,
+		bool strip = false,
+		bool unixf = false);
+};
+
+/** This class is a wrapper for vector<string> to allow reading and
+writing of files. */
+class string_vector: public vector<string>
+{
+public:
+	/**
+	 * @brief Append a string to the vector
+	 * @param [in] s				the string to append
+	 */
+	inline void append(const char *s)
+	{
+		if (s == 0)
+		{
+			s = "";
+		}
+		push_back(s);
+	}
+
+	/**
+	 * @brief Append a string to the vector
+	 * @param [in] s				the string to append
+	 */
+	inline void append(const string &s)
+	{
+		push_back(s);
+	}
+
+	/**
+	 * @brief Append an argc/argv to the vector.
+	 * @param [in] argc				Number of strings.
+	 * @param [in] argv				Array of strings.
+	 */
+	inline void append(size_t argc, const char **argv)
+	{
+		/* Append all items. */
+		for (size_t i = 0; i < argc; ++i)
+		{
+			append(argv[i]);
+		}
+	}
+
+	/**
+	 * @brief Make an argc/argv array.
+	 *
+	 * The caller is responsible for deleting the array once finished. The
+	 * array will be corrupted if the corresponding string_vector object is
+	 * modified.
+	 *
+	 * @param [out] count			Number of strings.
+	 * @return						Array of string pointers.
+	 */
+	inline const char **MakeArgv(size_t &count)
+	{
+		/* Get the number of elements. */
+		count = size();
+
+		/* Allocate an array of string. */
+		const char** ret = new const char*[count];
+		for (size_t i = 0; i < count; ++i)
+		{
+			ret[i] = at(i).c_str();
+		}
+
+		/* Return the allocated string. Caller deletes. */
+		return ret;
+	}
+
+	/**
+	 * @brief Populate this string_vector by splitting the supplied string.
+	 * @param [in] src				Source string to split.
+	 * @param [in] delim			Delimiter character(s).
+	 * @param [in] quote			Quote character.
+	 */
+	void Split(const char *src, const char *delim, char quote = 0);
+
+	/**
+	 * @brief read a text file into the vector
+	 * @param [in] filename			the file to read
+	 * @return						the number of lines read, -1 if error
+	 *
+	 * The vector is emptied before reading the file. The strings
+	 * in the vector have line ends stripped. Both Windows and Unix
+	 * line ends are handled.
+	 */
+	int LoadFromFile(const char *filename);
+
+	/**
+	 * @brief write a text file from the vector
+	 * @param [in] filename			the file to read
+	 * @return						true if succesful
+	 *
+	 * Line ends of CRLF are added to every line written, so the lines
+	 * in the vector are expected to be unterminated.
+	 */
+	bool SaveToFile(const char *filename);
+
+#if 0
+	/**
+	 * @brief Read a text file into the vector
+	 * @param [in] filename			the file to read
+	 * @param [in] fileStore		the file store containing the file
+	 * @return						the number of lines read, -1 if error
+	 *
+	 * The vector is emptied before reading the file. The strings
+	 * in the vector have line ends stripped. Both Windows and Unix
+	 * line ends are handled.
+	 */
+	int LoadFromFileStoreFile(const char *filename, IFileStore *fileStore);
+
+	/**
+	 * @brief Read an IFile into the vector from the current position
+	 * @param [in] fileRef			file to read from
+	 * @return						the number of lines read, -1 if error
+	 */
+	int LoadFromIFile(IFileRef fileRef);
+
+	/**
+	 * @brief Write a text file from the vector
+	 * @param [in] filename			the file to read
+	 * @param [in] fileStore		the file store containing the file
+	 * @return						true if succesful
+	 *
+	 * Line ends of CRLF are added to every line written, so the lines
+	 * in the vector are expected to be unterminated.
+	 */
+	bool SaveToFileStoreFile(const char *filename, IFileStore *fileStore);
+
+	/**
+	 * @brief Write an IFile file from the vector at the current position
+	 * @param [in] fileRef			file to write to
+	 * @return						true if succesful
+	 */
+	bool SaveToIFile(IFileRef fileRef);
+#endif
+
+	/**
+	 * @brief read a string into the vector
+	 * @param [in] s				the string to read
+	 * @return						the number of lines read, -1 if error
+	 *
+	 * The vector is emptied before reading the string. The strings
+	 * in the vector have line ends stripped. Both Windows and Unix
+	 * line ends are handled.
+	 */
+	int LoadFromString(const char *s);
+
+	/**
+	 * @brief write a string from the vector
+	 * @param [in] s				the string to fill
+	 * @param [in] newLine			use new lines if set
+	 * @return						true if succesful
+	 *
+	 * Line ends of CRLF are added to every line written, so the lines
+	 * in the vector are expected to be unterminated.
+	 */
+	bool SaveToString(string &s, bool newLine = true) const;
+
+	/**
+	 * @brief Comparison operator.
+	 * @param [in] src				string_vector to compare against.
+	 * @return						true if the vectors are equal.
+	 */
+	inline bool operator==(const string_vector &src) const
+	{
+		/* Perform a deep comparison of the vectors. */
+		return compare_vectors(*this, src);
+	}
+
+	/**
+	 * @brief sort the vector
+	 * @param [in] st				optional start item
+	 */
+	void sort(size_t st = 0);
+
+	/**
+	 * @brief sort the vector reversed
+	 * @param [in] st				optional start item
+	 */
+	void sortrev(size_t st = 0);
+
+	/**
+	 * @brief Sort the vector ignoring case
+	 * @param [in] st				optional start item
+	 */
+	void sorti(size_t st = 0);
+
+	/**
+	 * @brief Sort the vector reversed ignoring case
+	 * @param [in] st				optional start item
+	 */
+	void sortirev(size_t st = 0);
+
+	/**
+	 * @brief Test if a string is in the vector
+	 * @param [in] s				string to test
+	 * @param [in] st				optional start index
+	 * @return						item index or -1
+	 */
+	int find(const char *s, size_t st = 0) const;
+
+	/**
+	 * @brief Test case insensitive if a string is in the vector
+	 * @param [in] s				string to test
+	 * @param [in] st				optional start index
+	 * @return						item index or -1
+	 */
+	int findi(const char *s, size_t st = 0) const;
+
+	/**
+	 * @brief Test with wildcard if a string is in the vector
+	 * @param [in] s				wildcard pattern to test
+	 * @param [in] st				optional start index
+	 * @return						item index or -1
+	 */
+	int findwild(const char *s, size_t st = 0) const;
+
+	/**
+	 * @brief Populate the vector from a CSV string
+	 * @param [in] str				the CSV string to parse
+	 * @param [in] stripWhite		when set remove leading and trailing white space from field value
+	 * @param [in] delim			delimiter character to use
+	 * @param [in] quote			quote character to use
+	 * @return						true if the parse succeeded
+	 */
+	bool loadFromCSVString(const char *str, bool stripWhite = false, char delim = ',', char quote = '\"');
+
+	/**
+	 * @brief Save the vector as a CSV string
+	 * @param [in] from				index to start saving from
+	 * @param [in] forceQuote		when set, quote the field anyway
+	 * @param [in] delim			delimiter character to use
+	 * @param [in] quote			quote character to use
+	 * @return						the CSV string
+	 */
+	std::string saveToCSVString(size_t from = 0, bool forceQuote = false, char delim = ',', char quote = '\"');
+
+	/**
+	 * @brief Get a string from a vector treated as an INI file
+	 * @param [in] section			INI file section
+	 * @param [in] key				section key
+	 * @param [in] def				default to use if key not present
+	 */
+	std::string GetProfileStr(const char *section, const char *key, const char *def = 0) const;
+
+	/**
+	 * @brief Get an integer from a vector treated as an INI file
+	 * @param [in] section			INI file section
+	 * @param [in] key				section key
+	 * @param [in] def				default to use if key not present
+	 */
+	int GetProfileIntg(const char *section, const char *key, int def = 0) const;
+
+	/**
+	 * @brief Write a string to a vector treated as an INI file
+	 * @param [in] section			INI file section
+	 * @param [in] key				section key
+	 * @param [in] val				value to write
+	 */
+	void WriteProfileStr(const char *section, const char *key, const char *val);
+
+	/**
+	 * @brief Write an integer to a vector treated as an INI file
+	 * @param [in] section			INI file section
+	 * @param [in] key				section key
+	 * @param [in] val				value to write
+	 */
+	void WriteProfileIntg(const char *section, const char *key, int val);
+};
+
+/** Template class for generalized vector of pair<string, T *>. */
+template <class T> class Dual
+{
+	/** True if this container owns the T storage. */
+	bool m_owns_storage;
+
+	/** The vector. */
+	vector<pair<string, T *> > m_vector;
+
+	/**
+	 * @brief Compare item strings for sort
+	 * @param [in] s1				first item
+	 * @param [in] s2				second item
+	 * @return						true if s1 < s2
+	 */
+	static bool compare_dual_strings(const pair<string, T *>& s1, const pair<string, T *>& s2)
+	{
+		return s1.first < s2.first;
+	}
+
+	/**
+	 * @brief Compare item strings case insensitive for sort
+	 * @param [in] s1				first item
+	 * @param [in] s2				second item
+	 * @return						true if s1 < s2
+	 */
+	static bool compare_duali_strings(const pair<string, T *>& s1, const pair<string, T *>& s2)
+	{
+#ifdef WIN32
+		return _stricmp(s1.first.c_str(), s2.first.c_str()) < 0;
+#else
+		return strcasecmp(s1.first.c_str(), s2.first.c_str()) < 0;
+#endif
+	}
+
+public:
+	/**
+	 * @brief Constructor.
+	 * @param [in] ownsStorage		set to own storage, default true
+	 */
+	Dual(bool ownsStorage = true)
+		: m_owns_storage(ownsStorage)
+	{
+	}
+
+	void SetOwnsStorage(bool owns)
+	{
+		m_owns_storage = owns;
+	}
+
+	/** Destructor. */
+	~Dual()
+	{
+		clear();
+	}
+
+	/** Clear the vector. */
+	inline void clear()
+	{
+		if (m_owns_storage)
+		{
+			for (size_t i = 0; i < m_vector.size(); i++)
+			{
+				delete m_vector[i].second;
+			}
+		}
+		m_vector.clear();
+	}
+
+	/**
+	 * @brief Get the size
+	 * @return						the size
+	 */
+	inline size_t size() const
+	{
+		return m_vector.size();
+	}
+
+	/**
+	 * @brief append a value to the vector
+	 * @param [in] s				the string to append
+	 * @param [in] p				the object to append
+	 */
+	inline void append(const char *s, const T *p = 0)
+	{
+		if (s == 0)
+		{
+			s = "";
+		}
+		m_vector.push_back(pair<string, T *>(s, const_cast<T *>(p)));
+	}
+
+	/**
+	 * @brief append a value to the vector
+	 * @param [in] s				the string to append
+	 * @param [in] p				the object to append
+	 */
+	inline void append(const string &s, const T *p = 0)
+	{
+		m_vector.push_back(pair<string, T *>(s, const_cast<T *>(p)));
+	}
+
+	/**
+	 * @brief insert a value at the index
+	 * @param [in] s				the string to insert
+	 * @param [in] idx				where to insert
+	 * @param [in] p				optional value
+	 * @return						where inserted
+	 */
+	inline size_t insert(const char *s, size_t idx, const T *p = 0)
+	{
+		if (s == 0)
+		{
+			s = "";
+		}
+		if (idx == 0 || idx < m_vector.size())
+		{
+			m_vector.insert(m_vector.begin() + idx, pair<string, T *>(s, const_cast<T *>(p)));
+		}
+		else
+		{
+			append(s, p);
+		}
+		return idx;
+	}
+
+	/**
+	 * @brief insert a value at the index
+	 * @param [in] s				the string to insert
+	 * @param [in] idx				where to insert
+	 * @param [in] p				optional value
+	 * @return						where inserted
+	 */
+	inline size_t insert(const string &s, size_t idx, const T *p = 0)
+	{
+		if (idx == 0 || idx < m_vector.size())
+		{
+			m_vector.insert(m_vector.begin() + idx, pair<string, T *>(s, const_cast<T *>(p)));
+		}
+		else
+		{
+			append(s, p);
+		}
+		return idx;
+	}
+
+	/**
+	 * @brief Replace a value
+	 * @param [in] s				the string to replace
+	 * @param [in] idx				where to replace
+	 * @param [in] p				optional value
+	 * @return						true if replaced
+	 */
+	inline bool replace(const char *s, size_t idx, const T *p = 0)
+	{
+		if (s == 0)
+		{
+			s = "";
+		}
+		if (idx < m_vector.size())
+		{
+			m_vector[idx].first = s;
+			if (m_owns_storage)
+			{
+				delete m_vector[idx].second;
+			}
+			m_vector[idx].second = const_cast<T *>(p);
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @brief Replace a value
+	 * @param [in] s				the string to replace
+	 * @param [in] idx				where to replace
+	 * @param [in] p				optional value
+	 * @return						true if replaced
+	 */
+	inline bool replace(const string &s, size_t idx, const T *p = 0)
+	{
+		if (idx < m_vector.size())
+		{
+			m_vector[idx].first = s;
+			if (m_owns_storage)
+			{
+				delete m_vector[idx].second;
+			}
+			m_vector[idx].second = p;
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @brief Remove a value
+	 * @param [in] idx				where to remove
+	 * @return						true if removed
+	 */
+	inline bool remove(size_t idx)
+	{
+		if (idx < m_vector.size())
+		{
+			if (m_owns_storage)
+			{
+				delete m_vector[idx].second;
+			}
+			m_vector.erase(m_vector.begin() + idx);
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @brief Detach a value
+	 * @param [in] idx				where to detach
+	 * @return						detached item, or 0 on failure
+	 */
+	inline T *detach(size_t idx)
+	{
+		if (idx < m_vector.size())
+		{
+			T *ptr = GetValue(idx);
+			m_vector.erase(m_vector.begin() + idx);
+			return ptr;
+		}
+		return 0;
+	}
+
+	/**
+	 * @brief Get a string value
+	 * @param [in] idx				where to get
+	 * @return						string at that index
+	 */
+	inline const string &operator[](size_t idx) const
+	{
+		return m_vector[idx].first;
+	}
+
+	/**
+	 * @brief Get a value
+	 * @param [in] idx				where to get
+	 * @return						value at that index
+	 */
+	inline T *GetValue(size_t idx)
+	{
+		return m_vector[idx].second;
+	}
+
+	/**
+	 * @brief Get a const value
+	 * @param [in] idx				where to get
+	 * @return						value at that index
+	 */
+	inline const T *GetValue(size_t idx) const
+	{
+		return m_vector[idx].second;
+	}
+
+	/**
+	 * @brief Get the string value
+	 * @param [in] idx				where to get
+	 * @return						value at that index
+	 */
+	inline const char *GetStr(size_t idx) const
+	{
+		return m_vector[idx].first.c_str();
+	}
+
+	/**
+	 * @brief Set a string value
+	 * @param [in] indx				where to set
+	 * @param [in] str				string to set
+	 */
+	inline void SetStr(size_t idx, const char *str)
+	{
+		m_vector[idx].first = str;
+	}
+
+	/**
+	 * @brief Set a string value
+	 * @param [in] indx				where to set
+	 * @param [in] str				string to set
+	 */
+	inline void SetStr(size_t idx, const std::string &str)
+	{
+		m_vector[idx].first = str;
+	}
+
+	/**
+	 * @brief Sort the vector
+	 * @param [in] st				optional start item
+	 */
+	inline void sort(size_t st = 0)
+	{
+		if (st == 0 || st < size() - 1)
+		{
+			stable_sort(m_vector.begin() + st, m_vector.end(), compare_dual_strings);
+		}
+	}
+
+	/**
+	 * @brief Sort the vector ignoring case
+	 * @param [in] st				optional start item
+	 */
+	inline void sorti(size_t st = 0)
+	{
+		if (st == 0 || st < size() - 1)
+		{
+			stable_sort(m_vector.begin() + st, m_vector.end(), compare_duali_strings);
+		}
+	}
+
+	/**
+	 * @brief Test if a string is in the vector
+	 * @param [in] s				string to test
+	 * @param [in] st				optional start item
+	 * @return						item index or -1
+	 */
+	inline int find(const char *s, size_t st = 0) const
+	{
+		for (size_t i = st; i < size(); i++)
+		{
+			if (m_vector[i].first == s)
+			{
+				return (int)i;
+			}
+		}
+		return -1;
+	}
+
+	/**
+	 * @brief Test case insensitive if a string is in the vector
+	 * @param [in] s				string to test
+	 * @param [in] st				optional start item
+	 * @return						item index or -1
+	 */
+	inline int findi(const char *s, size_t st = 0) const
+	{
+		for (size_t i = st; i < size(); i++)
+		{
+#ifdef WIN32
+			if (_stricmp(m_vector[i].first.c_str(), s) == 0)
+#else
+			if (strcasecmp(m_vector[i].first.c_str(), s) == 0)
+#endif
+			{
+				return (int)i;
+			}
+		}
+		return -1;
+	}
+};
+
+
+
+#endif	// !BASEHELPERS_H_INCLUDED
+
+/**
+ * @}
+ * End of file
+ */
diff --git a/third-party/DSPC-AWELib/include/passthroughSimple.h b/third-party/DSPC-AWELib/include/passthroughSimple.h
new file mode 100644
index 0000000..5a61629
--- /dev/null
+++ b/third-party/DSPC-AWELib/include/passthroughSimple.h
@@ -0,0 +1,233 @@
+/****************************************************************************
+ *
+ *		Target Tuning Symbol File
+ *		-------------------------
+ *
+ *          Generated on:  28-Apr-2017 11:58:41
+ *
+ ***************************************************************************/
+
+#ifndef PASSTHROUGHSIMPLE_H
+#define PASSTHROUGHSIMPLE_H
+
+// ----------------------------------------------------------------------
+// SYS_toFloat [TypeConversion]
+// Converts between numeric data types
+
+#define AWE_SYS_toFloat_ID 
+
+// int inputType - Specifies the dataType of the input
+// Default value: 1
+// Range: 0 to 2
+#define AWE_SYS_toFloat_inputType_OFFSET 8
+#define AWE_SYS_toFloat_inputType_MASK 0x00000100
+#define AWE_SYS_toFloat_inputType_SIZE -1
+
+// int outputType - Specifies the dataType of the output
+// Default value: 0
+// Range: 0 to 2
+#define AWE_SYS_toFloat_outputType_OFFSET 9
+#define AWE_SYS_toFloat_outputType_MASK 0x00000200
+#define AWE_SYS_toFloat_outputType_SIZE -1
+
+
+// ----------------------------------------------------------------------
+// Scaler1 [ScalerV2]
+// General purpose scaler with a single gain
+
+#define AWE_Scaler1_ID 30000
+
+// float gain - Gain in either linear or dB units.
+// Default value: 0
+// Range: -40 to 40
+#define AWE_Scaler1_gain_OFFSET 8
+#define AWE_Scaler1_gain_MASK 0x00000100
+#define AWE_Scaler1_gain_SIZE -1
+
+// float smoothingTime - Time constant of the smoothing process (0 = 
+//         unsmoothed).
+// Default value: 0
+// Range: 0 to 1000
+#define AWE_Scaler1_smoothingTime_OFFSET 9
+#define AWE_Scaler1_smoothingTime_MASK 0x00000200
+#define AWE_Scaler1_smoothingTime_SIZE -1
+
+// int isDB - Selects between linear (=0) and dB (=1) operation
+// Default value: 1
+// Range: 0 to 1
+#define AWE_Scaler1_isDB_OFFSET 10
+#define AWE_Scaler1_isDB_MASK 0x00000400
+#define AWE_Scaler1_isDB_SIZE -1
+
+// float targetGain - Target gain in linear units.
+#define AWE_Scaler1_targetGain_OFFSET 11
+#define AWE_Scaler1_targetGain_MASK 0x00000800
+#define AWE_Scaler1_targetGain_SIZE -1
+
+// float currentGain - Instantaneous gain applied by the module.
+#define AWE_Scaler1_currentGain_OFFSET 12
+#define AWE_Scaler1_currentGain_MASK 0x00001000
+#define AWE_Scaler1_currentGain_SIZE -1
+
+// float smoothingCoeff - Smoothing coefficient.
+#define AWE_Scaler1_smoothingCoeff_OFFSET 13
+#define AWE_Scaler1_smoothingCoeff_MASK 0x00002000
+#define AWE_Scaler1_smoothingCoeff_SIZE -1
+
+
+// ----------------------------------------------------------------------
+// Meter1 [Meter]
+// Peak and RMS meter module
+
+#define AWE_Meter1_ID 30002
+
+// int meterType - Operating mode of the meter. Selects between peak and 
+//         RMS calculations. See the discussion section for more details.
+// Default value: 18
+// Range: unrestricted
+#define AWE_Meter1_meterType_OFFSET 8
+#define AWE_Meter1_meterType_MASK 0x00000100
+#define AWE_Meter1_meterType_SIZE -1
+
+// float attackTime - Attack time of the meter. Specifies how quickly 
+//         the meter value rises.
+#define AWE_Meter1_attackTime_OFFSET 9
+#define AWE_Meter1_attackTime_MASK 0x00000200
+#define AWE_Meter1_attackTime_SIZE -1
+
+// float releaseTime - Release time of the meter. Specifies how quickly 
+//         the meter decays.
+#define AWE_Meter1_releaseTime_OFFSET 10
+#define AWE_Meter1_releaseTime_MASK 0x00000400
+#define AWE_Meter1_releaseTime_SIZE -1
+
+// float attackCoeff - Internal coefficient that realizes the attack 
+//         time.
+#define AWE_Meter1_attackCoeff_OFFSET 11
+#define AWE_Meter1_attackCoeff_MASK 0x00000800
+#define AWE_Meter1_attackCoeff_SIZE -1
+
+// float releaseCoeff - Internal coefficient that realizes the release 
+//         time.
+#define AWE_Meter1_releaseCoeff_OFFSET 12
+#define AWE_Meter1_releaseCoeff_MASK 0x00001000
+#define AWE_Meter1_releaseCoeff_SIZE -1
+
+// float value[1] - Array of meter output values, one per channel.
+#define AWE_Meter1_value_OFFSET 13
+#define AWE_Meter1_value_MASK 0x00002000
+#define AWE_Meter1_value_SIZE 1
+
+
+// ----------------------------------------------------------------------
+// Scaler2 [ScalerV2]
+// General purpose scaler with a single gain
+
+#define AWE_Scaler2_ID 30001
+
+// float gain - Gain in either linear or dB units.
+// Default value: 0
+// Range: -40 to 40
+#define AWE_Scaler2_gain_OFFSET 8
+#define AWE_Scaler2_gain_MASK 0x00000100
+#define AWE_Scaler2_gain_SIZE -1
+
+// float smoothingTime - Time constant of the smoothing process (0 = 
+//         unsmoothed).
+// Default value: 0
+// Range: 0 to 1000
+#define AWE_Scaler2_smoothingTime_OFFSET 9
+#define AWE_Scaler2_smoothingTime_MASK 0x00000200
+#define AWE_Scaler2_smoothingTime_SIZE -1
+
+// int isDB - Selects between linear (=0) and dB (=1) operation
+// Default value: 1
+// Range: 0 to 1
+#define AWE_Scaler2_isDB_OFFSET 10
+#define AWE_Scaler2_isDB_MASK 0x00000400
+#define AWE_Scaler2_isDB_SIZE -1
+
+// float targetGain - Target gain in linear units.
+#define AWE_Scaler2_targetGain_OFFSET 11
+#define AWE_Scaler2_targetGain_MASK 0x00000800
+#define AWE_Scaler2_targetGain_SIZE -1
+
+// float currentGain - Instantaneous gain applied by the module.
+#define AWE_Scaler2_currentGain_OFFSET 12
+#define AWE_Scaler2_currentGain_MASK 0x00001000
+#define AWE_Scaler2_currentGain_SIZE -1
+
+// float smoothingCoeff - Smoothing coefficient.
+#define AWE_Scaler2_smoothingCoeff_OFFSET 13
+#define AWE_Scaler2_smoothingCoeff_MASK 0x00002000
+#define AWE_Scaler2_smoothingCoeff_SIZE -1
+
+
+// ----------------------------------------------------------------------
+// Meter2 [Meter]
+// Peak and RMS meter module
+
+#define AWE_Meter2_ID 30003
+
+// int meterType - Operating mode of the meter. Selects between peak and 
+//         RMS calculations. See the discussion section for more details.
+// Default value: 18
+// Range: unrestricted
+#define AWE_Meter2_meterType_OFFSET 8
+#define AWE_Meter2_meterType_MASK 0x00000100
+#define AWE_Meter2_meterType_SIZE -1
+
+// float attackTime - Attack time of the meter. Specifies how quickly 
+//         the meter value rises.
+#define AWE_Meter2_attackTime_OFFSET 9
+#define AWE_Meter2_attackTime_MASK 0x00000200
+#define AWE_Meter2_attackTime_SIZE -1
+
+// float releaseTime - Release time of the meter. Specifies how quickly 
+//         the meter decays.
+#define AWE_Meter2_releaseTime_OFFSET 10
+#define AWE_Meter2_releaseTime_MASK 0x00000400
+#define AWE_Meter2_releaseTime_SIZE -1
+
+// float attackCoeff - Internal coefficient that realizes the attack 
+//         time.
+#define AWE_Meter2_attackCoeff_OFFSET 11
+#define AWE_Meter2_attackCoeff_MASK 0x00000800
+#define AWE_Meter2_attackCoeff_SIZE -1
+
+// float releaseCoeff - Internal coefficient that realizes the release 
+//         time.
+#define AWE_Meter2_releaseCoeff_OFFSET 12
+#define AWE_Meter2_releaseCoeff_MASK 0x00001000
+#define AWE_Meter2_releaseCoeff_SIZE -1
+
+// float value[1] - Array of meter output values, one per channel.
+#define AWE_Meter2_value_OFFSET 13
+#define AWE_Meter2_value_MASK 0x00002000
+#define AWE_Meter2_value_SIZE 1
+
+
+// ----------------------------------------------------------------------
+// SYS_toFract [TypeConversion]
+// Converts between numeric data types
+
+#define AWE_SYS_toFract_ID 
+
+// int inputType - Specifies the dataType of the input
+// Default value: 0
+// Range: 0 to 2
+#define AWE_SYS_toFract_inputType_OFFSET 8
+#define AWE_SYS_toFract_inputType_MASK 0x00000100
+#define AWE_SYS_toFract_inputType_SIZE -1
+
+// int outputType - Specifies the dataType of the output
+// Default value: 1
+// Range: 0 to 2
+#define AWE_SYS_toFract_outputType_OFFSET 9
+#define AWE_SYS_toFract_outputType_MASK 0x00000200
+#define AWE_SYS_toFract_outputType_SIZE -1
+
+
+
+#endif // PASSTHROUGHSIMPLE_H
+
diff --git a/third-party/DSPC-AWELib/include/utiltypes.h b/third-party/DSPC-AWELib/include/utiltypes.h
new file mode 100644
index 0000000..a1b4666
--- /dev/null
+++ b/third-party/DSPC-AWELib/include/utiltypes.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+ *
+ *		Utility types
+ *		-------------
+ *
+ ****************************************************************************
+ *
+ *	Description:	Utility types
+ *
+ *	Copyright:		Copyright DEMA Consulting 2008-2012, All rights reserved.
+ *	Owner:			DEMA Consulting.
+ *					93 Richardson Road
+ *					Dublin, NH 03444
+ *
+ ***************************************************************************/
+
+/**
+ * @addtogroup Debugging
+ * @{
+ */
+
+#ifndef _UTILTYPES_H_INCLUDED
+#define _UTILTYPES_H_INCLUDED
+
+#ifndef WIN32
+
+#ifndef IN
+#define IN
+#endif
+
+#ifndef OUT
+#define OUT
+#endif
+
+#ifndef IN_OUT
+#define IN_OUT
+#endif
+
+#ifndef E_FAIL
+#define E_FAIL			(-1)
+#endif
+
+#ifndef S_OK
+#define S_OK			(0)
+#endif
+
+#ifndef LRESULT
+#define LRESULT			int
+#endif
+
+#ifndef afx_msg
+#define afx_msg
+#endif
+
+#ifndef FAILED
+#define FAILED(hr)		((hr) < 0)
+#endif
+
+#ifndef DLLSYMBOL
+#define DLLSYMBOL
+#endif
+
+#ifndef HRESULT
+#define HRESULT			int
+#endif
+
+#ifndef SUCCEEDED
+#define SUCCEEDED(hr)	((hr) >= 0)
+#endif
+
+#ifndef HWND
+#define HWND			unsigned int
+#endif
+
+#ifndef BYTE
+#define BYTE			unsigned char
+#endif
+
+#ifndef WORD
+#define WORD			unsigned short
+#endif
+
+#ifndef DWORD
+#define DWORD			unsigned long
+#endif
+
+#ifndef UINT
+#define UINT			unsigned int
+#endif
+
+#ifndef HIWORD
+#define HIWORD(x)		(((x) >> 16) & 0xffff)
+#endif
+
+#ifndef LOWORD
+#define LOWORD(x)		((x) & 0xffff)
+#endif
+
+#endif	// !WIN32
+
+#endif	// _UTILTYPES_H_INCLUDED
+
+/**
+ * @}
+ * End of file.
+ */
diff --git a/third-party/DSPC-AWELib/versionInfo.txt b/third-party/DSPC-AWELib/versionInfo.txt
new file mode 100644
index 0000000..8606e25
--- /dev/null
+++ b/third-party/DSPC-AWELib/versionInfo.txt
@@ -0,0 +1,37 @@
+linux Build - imx8
+Built on:      Thu Apr 16 16:28:38 EDT 2020
+Build name:    release.awe6.linux-1181
+Built from:    awe
+Version:       6.18.02.L
+SHA:           e3b0f6e
+ 
+Built using recipe: v1.3-25hr-VUI.recipe
+Built on:      Thu Apr 16 16:28:40 EDT 2020
+Build name:    release.awe6.linux-1181
+Built from:    awe-recipes-linux
+Version:       master
+SHA:           ac1d785
+ 
+CMake Toolchain File - imx8.cmake
+Built on:      Thu Apr 16 16:28:42 EDT 2020
+Build name:    release.awe6.linux-1181
+Built from:    dspc-cmake-toolchains
+Version:       master
+SHA:           506d776
+ 
+Module Set - awe-mod-dspc-vui
+Built on:      Thu Apr 16 16:28:45 EDT 2020
+Build name:    release.awe6.linux-1181
+Built from:    awe-mod-dspc-vui
+Version:       tags/1.0.9
+SHA:           43c35c9
+ 
+
+Includes Timeout for Eval Build
+
+Encrypted build
+
+Static Heap Sizes (Applied to AWELib only)
+MASTER_HEAP_SIZE = 2048000
+SLOW_HEAP_SIZE = 2048000
+FASTB_HEAP_SIZE = 2048000
-- 
2.25.1

