public RESULT getInput(int index, ref DSP input, ref DSPConnection inputconnection)
		{
			RESULT result = RESULT.OK;
			IntPtr dsprawnew = new IntPtr();
			DSP dspnew = null;
			IntPtr dspconnectionraw = new IntPtr();
			DSPConnection dspconnectionnew = null;

			try
			{
				result = FMOD_DSP_GetInput(dspraw, index, ref dsprawnew, ref dspconnectionraw);
			}
			catch
			{
				result = RESULT.ERR_INVALID_PARAM;
			}
			if (result != RESULT.OK)
			{
				return result;
			}

			if (input == null)
			{
				dspnew = new DSP();
				dspnew.setRaw(dsprawnew);
				input = dspnew;
			}
			else
			{
				input.setRaw(dsprawnew);
			}

			if (inputconnection == null)
			{
				dspconnectionnew = new DSPConnection();
				dspconnectionnew.setRaw(dspconnectionraw);
				inputconnection = dspconnectionnew;
			}
			else
			{
				inputconnection.setRaw(dspconnectionraw);
			}

			return result;
		}
		public RESULT getOutput(ref DSP output)
		{
			RESULT result = RESULT.OK;
			IntPtr dspraw = new IntPtr();
			DSP dspnew = null;

			try
			{
				result = FMOD_DSPConnection_GetOutput(dspconnectionraw, ref dspraw);
			}
			catch
			{
				result = RESULT.ERR_INVALID_PARAM;
			}
			if (result != RESULT.OK)
			{
				return result;
			}

			if (output == null)
			{
				dspnew = new DSP();
				dspnew.setRaw(dspraw);
				output = dspnew;
			}
			else
			{
				output.setRaw(dspraw);
			}

			return result;
		}
		public RESULT addInput(DSP target, ref DSPConnection connection)
		{
			RESULT result = RESULT.OK;
			IntPtr dspconnectionraw = new IntPtr();
			DSPConnection dspconnectionnew = null;

			try
			{
				result = FMOD_DSP_AddInput(dspraw, target.getRaw(), ref dspconnectionraw);
			}
			catch
			{
				result = RESULT.ERR_INVALID_PARAM;
			}
			if (result != RESULT.OK)
			{
				return result;
			}

			if (connection == null)
			{
				dspconnectionnew = new DSPConnection();
				dspconnectionnew.setRaw(dspconnectionraw);
				connection = dspconnectionnew;
			}
			else
			{
				connection.setRaw(dspconnectionraw);
			}

			return result;
		}
		public RESULT disconnectFrom(DSP target)
		{
			return FMOD_DSP_DisconnectFrom(dspraw, target.getRaw());
		}
		public RESULT addDSP(DSP dsp, ref DSPConnection connection)
		{
			RESULT result = RESULT.OK;
			IntPtr dspconnectionraw = new IntPtr();
			DSPConnection dspconnectionnew = null;

			try
			{
				result = FMOD_ChannelGroup_AddDSP(channelgroupraw, dsp.getRaw(), ref dspconnectionraw);
			}
			catch
			{
				result = RESULT.ERR_INVALID_PARAM;
			}
			if (result != RESULT.OK)
			{
				return result;
			}

			if (connection == null)
			{
				dspconnectionnew = new DSPConnection();
				dspconnectionnew.setRaw(dspconnectionraw);
				connection = dspconnectionnew;
			}
			else
			{
				connection.setRaw(dspconnectionraw);
			}

			return result;
		}
		// DSP functionality only for channel groups playing sounds created with FMOD_SOFTWARE.
		public RESULT getDSPHead(ref DSP dsp)
		{
			RESULT result = RESULT.OK;
			IntPtr dspraw = new IntPtr();
			DSP dspnew = null;

			try
			{
				result = FMOD_ChannelGroup_GetDSPHead(channelgroupraw, ref dspraw);
			}
			catch
			{
				result = RESULT.ERR_INVALID_PARAM;
			}
			if (result != RESULT.OK)
			{
				return result;
			}

			if (dsp == null)
			{
				dspnew = new DSP();
				dspnew.setRaw(dspraw);
				dsp = dspnew;
			}
			else
			{
				dsp.setRaw(dspraw);
			}

			return result;
		}
		public RESULT playDSP(CHANNELINDEX channelid, DSP dsp, bool paused, ref Channel channel)
		{
			RESULT result = RESULT.OK;
			IntPtr channelraw;
			Channel channelnew = null;

			if (channel != null)
			{
				channelraw = channel.getRaw();
			}
			else
			{
				channelraw = new IntPtr();
			}

			try
			{
				result = FMOD_System_PlayDSP(systemraw, channelid, dsp.getRaw(), (paused ? 1 : 0), ref channelraw);
			}
			catch
			{
				result = RESULT.ERR_INVALID_PARAM;
			}
			if (result != RESULT.OK)
			{
				return result;
			}

			if (channel == null)
			{
				channelnew = new Channel();
				channelnew.setRaw(channelraw);
				channel = channelnew;
			}
			else
			{
				channel.setRaw(channelraw);
			}

			return result;
		}
		public RESULT createDSPByType(DSP_TYPE type, ref DSP dsp)
		{
			RESULT result = RESULT.OK;
			IntPtr dspraw = new IntPtr();
			DSP dspnew = null;

			try
			{
				result = FMOD_System_CreateDSPByType(systemraw, type, ref dspraw);
			}
			catch
			{
				result = RESULT.ERR_INVALID_PARAM;
			}
			if (result != RESULT.OK)
			{
				return result;
			}

			if (dsp == null)
			{
				dspnew = new DSP();
				dspnew.setRaw(dspraw);
				dsp = dspnew;
			}
			else
			{
				dsp.setRaw(dspraw);
			}

			return result;
		}
		public RESULT createDSP(ref DSP_DESCRIPTION description, ref DSP dsp)
		{
			RESULT result = RESULT.OK;
			IntPtr dspraw = new IntPtr();
			DSP dspnew = null;

			try
			{
				result = FMOD_System_CreateDSP(systemraw, ref description, ref dspraw);
			}
			catch
			{
				result = RESULT.ERR_INVALID_PARAM;
			}
			if (result != RESULT.OK)
			{
				return result;
			}

			if (dsp == null)
			{
				dspnew = new DSP();
				dspnew.setRaw(dspraw);
				dsp = dspnew;
			}
			else
			{
				dsp.setRaw(dspraw);
			}

			return result;
		}