ftp.nice.ch/pub/next/unix/audio/sms.N.bs.tar.gz#/sms/library/smsIO.c

This is smsIO.c in view mode; [Download] [Up]

#include "../sms.h"

#define READMODE "rb"
#define WRITEMODE "wb"

/* initialize the header structure 
 *
 * SMSHeader *pSmsHeader	header for SMS file
 */
int initSmsHeader (SMSHeader *pSmsHeader)
{    
	pSmsHeader->iSmsMagic = SMS_MAGIC;
	pSmsHeader->iHeadBSize =  sizeof(SMSHeader);
	pSmsHeader->nRecords = 0;
	pSmsHeader->iRecordBSize = 0;
	pSmsHeader->iFormat = FORMAT_HARMONIC;
	pSmsHeader->iFrameRate = 0;
	pSmsHeader->iStochasticType = STOC_FILTER_TYPE;
	pSmsHeader->nTrajectories = 0;
	pSmsHeader->nStochasticCoeff = 0;
	pSmsHeader->fAmplitude = 0;
	pSmsHeader->fFrequency = 0;
	pSmsHeader->iBegSteadyState = 0;
	pSmsHeader->iEndSteadyState = 0;
	pSmsHeader->fResidualPerc = 0;
	pSmsHeader->nLoopRecords = 0;
	pSmsHeader->nSpecEnvelopePoints = 0;
	pSmsHeader->nTextCharacters = 0;
	pSmsHeader->pILoopRecords = NULL;
	pSmsHeader->pFSpectralEnvelope = NULL;
	pSmsHeader->pChTextCharacters = NULL;
	pSmsHeader->pChDataRecords = NULL;
    
	return (1);
}
 
/* write SMS header and data to file
 *
 * char *pChFileName	file name for SMS file
 * SMSHeader *pSmsHeader header for SMS file
 */
int writeSmsFile (char *pChFileName, SMSHeader *pSmsHeader)
{
	FILE *pOutputFile;
	int iVariableSize = 0;
    
	if (pSmsHeader->iSmsMagic != SMS_MAGIC)
		return(SMS_NSMS);
	if ((pOutputFile = fopen(pChFileName, WRITEMODE)) == NULL)
		return(SMS_NOPEN);
	
	/* check variable size of header */
	iVariableSize = sizeof (int) * pSmsHeader->nLoopRecords +
		sizeof (float) * pSmsHeader->nSpecEnvelopePoints +
		sizeof(char) * pSmsHeader->nTextCharacters;

	pSmsHeader->iHeadBSize = sizeof(SMSHeader) + iVariableSize;

	/* write header */
	if (fwrite((void *)pSmsHeader, (size_t)1, (size_t)sizeof(SMSHeader),
	    pOutputFile) < (size_t)sizeof(SMSHeader))
		quit ("Error: Cannot write SMS header");
	
	/* write variable part of header */
	if (pSmsHeader->nLoopRecords > 0)
	{
		char *pChStart = (char *) pSmsHeader->pILoopRecords;
		int iSize = sizeof (int) * pSmsHeader->nLoopRecords;
    
		if (fwrite ((void *)pChStart, (size_t)1, (size_t)iSize, pOutputFile) < 
		    (size_t)iSize)
			quit ("Error: Cannot write SMS header");
	}
	if (pSmsHeader->nSpecEnvelopePoints > 0)
	{
		char *pChStart = (char *) pSmsHeader->pFSpectralEnvelope;
		int iSize = sizeof (float) * pSmsHeader->nSpecEnvelopePoints;
    
		if (fwrite ((void *)pChStart, (size_t)1, (size_t)iSize, pOutputFile) < 
		    (size_t)iSize)
			quit ("Error: Cannot write SMS header");
	}
	if (pSmsHeader->nTextCharacters > 0)
	{
		char *pChStart = (char *) pSmsHeader->pChTextCharacters;
		int iSize = sizeof(char) * pSmsHeader->nTextCharacters;
    
		if (fwrite ((void *)pChStart, (size_t)1, (size_t)iSize, pOutputFile) < 
		    (size_t)iSize)
			quit ("Error: Cannot write SMS header");
	}

	/* write records */
	if (pSmsHeader->iRecordBSize <= 0 ||
	    pSmsHeader->nRecords <= 0 || 
	    pSmsHeader->iHeadBSize <= 0)
		quit ("Error: Cannot write data records");
	else
	{
		char *pChStart = (char *) pSmsHeader->pChDataRecords;
		int iSize = pSmsHeader->iRecordBSize * pSmsHeader->nRecords;
    
		if (fwrite ((void *)pChStart, (size_t)1, (size_t)iSize, pOutputFile) < 
		    (size_t)iSize)
			quit ("Error: Cannot write data records");
	}  

	fclose(pOutputFile);
	return (SMS_OK);
}

/* function to read SMS header and data
 * char *pChFileName;		file name for SMS file
 * SMSHeader **ppSmsHeader;	SMS header
 *
 * returns SMS_NOPEN   if can't open
 *         SMS_NSMS    if not a SMS file
 *	   SMS_RDERR   if reads fail
 *	   SMS_MALLOC  if can't get memory
 *	   SMS_OK      otherwise	
 */
int readSmsFile (char *pChFileName, SMSHeader **ppSmsHeader)
{
	FILE *pInputFile;
	int iHeadBSize, iRecordBSize, nRecords;
	int iMagicNumber, iSize;
    
	if ((pInputFile = fopen(pChFileName, READMODE)) == NULL)
		return (SMS_NOPEN);
            
	if (fread ((void *) &iMagicNumber, (size_t) sizeof(int), (size_t)1, 
	           pInputFile) < (size_t)1)
		return (SMS_RDERR);
	
	if (iMagicNumber != SMS_MAGIC)
		return (SMS_NSMS);

	/* read size of of header */
	if (fread ((void *) &iHeadBSize, (size_t) sizeof(int), (size_t)1, 
		pInputFile) < (size_t)1)
		return (SMS_RDERR);
	
	if (iHeadBSize <= 0)
		return (SMS_RDERR);
     
  /* read number of data Records */
  if (fread ((void *) &nRecords, (size_t) sizeof(int), (size_t)1, 
	         pInputFile) < (size_t)1)
		return (SMS_RDERR);

	if (nRecords <= 0)
		return (SMS_RDERR);
	
	if (fread ((void *) &iRecordBSize, (size_t) sizeof(int), (size_t)1, 
	           pInputFile) < (size_t)1)
		return (SMS_RDERR);

	if (iRecordBSize <= 0)
		return (SMS_RDERR);

	/* allocate virtual memory for file */
	if (((*ppSmsHeader) =  
	    (SMSHeader *)malloc ((size_t)(iHeadBSize+ 
	    (iRecordBSize * nRecords)))) == NULL)
		return (SMS_MALLOC);

	/* read header plus data */
	rewind (pInputFile);
	iSize = iHeadBSize + iRecordBSize * nRecords;
	if (fread ((void *) (*ppSmsHeader), (size_t)1, (size_t) iSize,  
	           pInputFile) < iSize)
		return (SMS_RDERR);

	/* set pointers to variable part of header */
	if ((*ppSmsHeader)->nLoopRecords > 0)
		(*ppSmsHeader)->pILoopRecords = (int *) ((char *)(*ppSmsHeader) + 
			sizeof(SMSHeader));
						
	if ((*ppSmsHeader)->nSpecEnvelopePoints > 0)
		(*ppSmsHeader)->pFSpectralEnvelope = 
			(float *) ((char *)(*ppSmsHeader) + sizeof(SMSHeader) + 
			sizeof(int) * (*ppSmsHeader)->nLoopRecords);
			
	if ((*ppSmsHeader)->nTextCharacters > 0)
		(*ppSmsHeader)->pChTextCharacters = 
			(char *) ((char *)(*ppSmsHeader) + sizeof(SMSHeader) + 
			sizeof(int) * (*ppSmsHeader)->nLoopRecords +
			sizeof(float) * (*ppSmsHeader)->nSpecEnvelopePoints);

	(*ppSmsHeader)->pChDataRecords = 
		(char *) ((char *)(*ppSmsHeader) + sizeof(SMSHeader) + 
		sizeof(int) * (*ppSmsHeader)->nLoopRecords +
		sizeof(float) * (*ppSmsHeader)->nSpecEnvelopePoints +
		sizeof(char) * (*ppSmsHeader)->nTextCharacters);

	return (SMS_OK);			
}

/* function return the size in bytes of the record in a SMS file 
 * SMSHeader *pSmsHeader;    pointer to SMS header
 */
int getRecordBSize (SMSHeader *pSmsHeader)
{
	int iSize = 0, nGain = 1, nComp = 2;
    
	if (pSmsHeader->iStochasticType == STOC_NONE)
		nGain = 0;
    
	if (pSmsHeader->iFormat == FORMAT_HARMONIC_WITH_PHASE ||
	    pSmsHeader->iFormat == FORMAT_INHARMONIC_WITH_PHASE)
		nComp = 3;
     
	iSize = sizeof (float) * (nComp * pSmsHeader->nTrajectories + 
		pSmsHeader->nStochasticCoeff + nGain);
	return(iSize);
}	     
     

/* set the pointers of the SMS data to the right places in a record 
 *
 */
int setSmsRecord (SMSHeader *pSmsHeader, char *pData, SMS_DATA *pSmsData)
{
	int iOffset = 0;
	
	if ((pData + pSmsHeader->iRecordBSize) > 
	    (char *) pSmsHeader->pChDataRecords +
	    ((pSmsHeader->nRecords + 1) * pSmsHeader->iRecordBSize))
		return (SMS_WRERR); 

	pSmsData->nTraj = pSmsHeader->nTrajectories;
	pSmsData->nCoeff = pSmsHeader->nStochasticCoeff;
	pSmsData->pFFreqTraj = (float *) pData;
	iOffset += sizeof(float) * pSmsData->nTraj;
	pSmsData->pFMagTraj = (float *) (pData + iOffset);
	iOffset += sizeof(float) * pSmsData->nTraj;
	if (pSmsHeader->iFormat == FORMAT_HARMONIC_WITH_PHASE ||
	    pSmsHeader->iFormat == FORMAT_INHARMONIC_WITH_PHASE)
	{
		pSmsData->pFPhaTraj = (float *) (pData + iOffset);
		iOffset += sizeof(float) * pSmsData->nTraj;
	}
	else
		pSmsData->pFPhaTraj = NULL;
	if (pSmsData->nCoeff > 0)
	{
		pSmsData->pFStocCoeff = (float *)(pData + iOffset);
		iOffset += sizeof(float) * pSmsData->nCoeff;		      
		pSmsData->pFStocGain = (float *)(pData + iOffset);
	}
    else
	{
		pSmsData->pFStocCoeff = NULL;
		pSmsData->pFStocGain = NULL;
	}
	return (SMS_OK);
}

int quit (char *pChText)
{
	fprintf (stderr, pChText);
	fprintf (stderr, "\n");
	exit (1);
	return (1);
}			 

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.