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); } }
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 }