Exemplo n.º 1
0
void MixerAdd(Mixer *mix, Waveform *in1, Waveform *in2, Waveform *out)
{
    int n;
    CopyWaveform(in1, out);

    if (in1->num_samples == in2->num_samples)
    {
        for (n = 0; n < in1->num_samples; n++)
        {
            out->samples[n] = in1->samples[n] * mix->gain_in1 + in2->samples[n] * mix->gain_in2;
        }
    }
    else
    {
        CopyWaveform(in1, out);
    }
}
Exemplo n.º 2
0
int	ReceiveWaveform (SinkVChan_type* sinkVChan, Waveform_type** waveform, WaveformTypes* waveformType, char** errorMsg)
{
#define		ReceiveWaveform_Err_NoWaveform			-1
#define		ReceiveWaveform_Err_WrongDataType		-2
#define		ReceiveWaveform_Err_NotSameDataType		-3
	
INIT_ERR	
	
	DataPacket_type*		dataPacket				= NULL;
	DLDataTypes				dataPacketType			= 0;
	DLDataTypes				firstDataPacketType		= 0;
	void*					dataPacketPtrToData		= NULL;
	char*					msgBuff					= NULL;
	
	
	// init
	*waveform = NULL;
	
	// get first data packet and check if it is a NULL packet
	errChk ( GetDataPacket(sinkVChan, &dataPacket, &errorInfo.errMsg) );
	
	if (!dataPacket) {
		nullChk( msgBuff = StrDup("Waveform received does not contain any data. This occurs if a NULL packet is encountered before any data packets") );
		SET_ERR(ReceiveWaveform_Err_NoWaveform, msgBuff);
	}
	
	// check if data packet type is supported by this function
	dataPacketPtrToData = GetDataPacketPtrToData(dataPacket, &firstDataPacketType);
	dataPacketType 		= firstDataPacketType;
	
	// check if data packet is of waveform type
	switch (firstDataPacketType) {
			
		case DL_Waveform_Char:
		case DL_Waveform_UChar:
		case DL_Waveform_Short:
		case DL_Waveform_UShort:
		case DL_Waveform_Int:
		case DL_Waveform_UInt:
		case DL_Waveform_Int64:
		case DL_Waveform_UInt64:	
		case DL_Waveform_SSize:
		case DL_Waveform_Size:
		case DL_Waveform_Float:
		case DL_Waveform_Double:
			break;
		
		default:
			
			nullChk( msgBuff = StrDup("Data packet received is not of a waveform type and cannot be retrieved by this function") );
			SET_ERR(ReceiveWaveform_Err_WrongDataType, msgBuff);
			break;
	}
	
	errChk( CopyWaveform(waveform, *(Waveform_type**)dataPacketPtrToData, &errorInfo.errMsg) );
	ReleaseDataPacket(&dataPacket);
	
	// get another data packet if any
	errChk ( GetDataPacket(sinkVChan, &dataPacket, &errorInfo.errMsg) );
	// assemble waveform from multiple packets until a NULL packet is encountered
	while (dataPacket) {
		
		// get waveform data from the first non-NULL data packet
		dataPacketPtrToData = GetDataPacketPtrToData(dataPacket, &dataPacketType);
		
		// check if retrieved data packet is of the same type as the first packet
		if (firstDataPacketType != dataPacketType) {
			nullChk( msgBuff = StrDup("Data packets must be all of the same type") );
			SET_ERR(ReceiveWaveform_Err_NotSameDataType, msgBuff);
		}
	
		errChk( AppendWaveform(*waveform, *(Waveform_type**)dataPacketPtrToData, &errorInfo.errMsg) );
	
		ReleaseDataPacket(&dataPacket);
		
		// get another packet
		errChk ( GetDataPacket(sinkVChan, &dataPacket, &errorInfo.errMsg) );
	}
	
	// check again if waveform is NULL
	if (!*waveform) {
		nullChk( msgBuff = StrDup("Waveform received does not contain any data. This occurs if a NULL packet is encountered before any data packets or the data packet doesn't have any data") );
		SET_ERR(ReceiveWaveform_Err_NoWaveform, msgBuff);
	}
	
	// assign waveform type
	if (waveformType)
		switch (dataPacketType) {
			
			case DL_Waveform_Char:
				*waveformType = Waveform_Char;
				break;
				
			case DL_Waveform_UChar:
				*waveformType = Waveform_UChar;
				break;
				
			case DL_Waveform_Short:
				*waveformType = Waveform_Short;
				break;
				
			case DL_Waveform_UShort:
				*waveformType = Waveform_UShort;
				break;
				
			case DL_Waveform_Int:
				*waveformType = Waveform_Int;
				break;
				
			case DL_Waveform_UInt:
				*waveformType = Waveform_UInt;
				break;
				
			case DL_Waveform_Int64:
				*waveformType = Waveform_Int64;
				break;
				
			case DL_Waveform_UInt64:
				*waveformType = Waveform_UInt64;
				break;
				
			case DL_Waveform_SSize:
				*waveformType = Waveform_SSize;
				break;
				
			case DL_Waveform_Size:
				*waveformType = Waveform_Size;
				break;
				
			case DL_Waveform_Float:
				*waveformType = Waveform_Float;
				break;
				
			case DL_Waveform_Double:
				*waveformType = Waveform_Double;
				break;
			
			default:
			
				nullChk( msgBuff = StrDup(" Data packet received is not of a waveform type and cannot be retrieved by this function") );
				SET_ERR(ReceiveWaveform_Err_WrongDataType, msgBuff);
		}
		
	return 0;
	
Error:
	
	// cleanup
	OKfree(msgBuff);
	ReleaseDataPacket(&dataPacket);
	discard_Waveform_type(waveform);
	
RETURN_ERR
}