shithub: aacenc

Download patch

ref: fbc0f3f60fb0e8e8621910623a77233763ad8c5e
parent: 7740b9ad96cc594997dd6273b31f52c134ff8e72
author: lenox <lenox>
date: Sat Feb 19 07:48:43 EST 2000

restructure

--- a/aacenc.h
+++ b/aacenc.h
@@ -3,16 +3,48 @@
 
 typedef struct RCBufStruct RCBuf;	/* buffer handle */
 
-#define MAIN_PROFILE 0
+#define PROFILE         1
+#define HEADER_TYPE     2
+#define MS_STEREO       3
+#define IS_STEREO       4
+#define BITRATE         5         // default: 128
+#define CUT_OFF         6         // default: 0
+#define OUT_SAMPLING_RATE       7 // default: 0
+#define RAW_AUDIO       8         // default: 0
+#define TNS             9
+#define LTP             10
+#define PNS             11
+
+#define MAIN_PROFILE 0           // default
 #define LOW_PROFILE 1
 
+#define NO_HEADER	0
+#define ADIF_HEADER     1
+#define ADTS_HEADER     2        // default
+
+#define NO_MS           -1
+#define FORCE_MS        1
+#define SWITCHING_MS    0        // default
+
+#define USE_IS          1
+#define NO_IS           0        // default
+
+#define USE_TNS         1
+#define NO_TNS          0        // default
+
+#define USE_LTP         1        // default
+#define NO_LTP          0
+
+#define USE_PNS         1
+#define NO_PNS          0        // default
+
+#define USE_RAW_AUDIO   1
+#define NO_RAW_AUDIO    0        //default
+
 #define FNO_ERROR 0
 #define FERROR 1
 #define F_FINISH 2
 
-#define NO_HEADER	0
-#define ADIF_HEADER     1
-#define ADTS_HEADER     2
 
 typedef struct {
 	int DLLMajorVersion; // These 2 values should always be checked, because the DLL
@@ -65,6 +97,7 @@
 void faac_EncodeFinish(faacAACStream *as);
 faacVersion *faac_Version(void);
 void faac_InitParams(faacAACStream *as);
+void faac_SetParam(faacAACStream *as, int param, int value);
 
 #else
 
@@ -74,6 +107,7 @@
 __declspec(dllexport) void faac_EncodeFinish(faacAACStream *as);
 __declspec(dllexport) faacVersion *faac_Version(void);
 __declspec(dllexport) void faac_InitParams(faacAACStream *as);
+__declspec(dllexport) void faac_SetParam(faacAACStream *as, int param, int value);
 
 #endif
 
--- a/encoder.c
+++ b/encoder.c
@@ -1,690 +1,413 @@
 #ifdef WIN32
 #include <windows.h>
 #endif
-#include <memory.h>
-#include <string.h>
-#include <stdlib.h>
+
 #include "aacenc.h"
-#include "bitstream.h"	/* bit stream module */
+#include "enc.h"
 #include "rateconv.h"
 
-#include "enc.h"	/* encoder core */
 ////////////////////////////////////////////////////////////////////////////////
 int write_ADIF_header(faacAACStream *as)
 {
-	BsBitStream *bitHeader;
-        unsigned char headerBuf[20];
-	float seconds;
-	int i, bits, bytes;
-	static int SampleRates[] = {96000,88200,64000,48000,44100,32000,24000,22050,16000,12000,11025,8000,0};
+  BsBitStream *bitHeader;
+  unsigned char headerBuf[20];
+  float seconds;
+  int i, bits, bytes;
+  static int SampleRates[] = {96000,88200,64000,48000,44100,32000,24000,22050,16000,12000,11025,8000,0};
 
-	seconds = (float)as->out_sampling_rate/(float)1024;
-	seconds = (float)as->cur_frame/seconds;
+  seconds = (float)as->out_sampling_rate/(float)1024;
+  seconds = (float)as->cur_frame/seconds;
 
-	as->total_bits += 17 * 8;
-	bitHeader = BsOpenWrite(200);
+  as->total_bits += 17 * 8;
+  bitHeader = BsOpenWrite(200);
 
-	for (i = 0; ; i++)
-	{
-		if (SampleRates[i] == as->out_sampling_rate)
-			break;
-		else if (SampleRates[i] == 0)
-		{
-			return FERROR;
-		}
-	}
+  for (i = 0; ; i++){
+    if (SampleRates[i] == as->out_sampling_rate)
+      break;
+    else if (SampleRates[i] == 0)
+      return FERROR;
+  }
 
-	// ADIF_Header
-	BsPutBit(bitHeader,'A',8);
-	BsPutBit(bitHeader,'D',8);
-	BsPutBit(bitHeader,'I',8);
-	BsPutBit(bitHeader,'F',8);
-	BsPutBit(bitHeader,0,1);   // Copyright present
-	BsPutBit(bitHeader,0,1);   // Original
-	BsPutBit(bitHeader,0,1);   // Home
-	BsPutBit(bitHeader,0,1);   // Bitstream type
-	BsPutBit(bitHeader,(int)(as->total_bits/seconds),23);  // Bitrate
-	BsPutBit(bitHeader, 0, 4);   // num program config elements
+  // ADIF_Header
+  BsPutBit(bitHeader,'A',8);
+  BsPutBit(bitHeader,'D',8);
+  BsPutBit(bitHeader,'I',8);
+  BsPutBit(bitHeader,'F',8);
+  BsPutBit(bitHeader,0,1);   // Copyright present
+  BsPutBit(bitHeader,0,1);   // Original
+  BsPutBit(bitHeader,0,1);   // Home
+  BsPutBit(bitHeader,0,1);   // Bitstream type
+  BsPutBit(bitHeader,(int)(as->total_bits/seconds),23);  // Bitrate
+  BsPutBit(bitHeader, 0, 4);   // num program config elements
 
-	// ADIF_buffer_fulness
-	BsPutBit(bitHeader, 0, 20);
+  // ADIF_buffer_fulness
+  BsPutBit(bitHeader, 0, 20);
 
-	// program_config_element
-	BsPutBit(bitHeader,0,4);
-	BsPutBit(bitHeader,as->profile,2);
-	BsPutBit(bitHeader,i,4);
-	BsPutBit(bitHeader,1,4);
-	BsPutBit(bitHeader,0,4);
-	BsPutBit(bitHeader,0,4);
-	BsPutBit(bitHeader,0,2);
-	BsPutBit(bitHeader,0,3);
-	BsPutBit(bitHeader,0,4);
-	BsPutBit(bitHeader,0,1);
-	BsPutBit(bitHeader,0,1);
-	BsPutBit(bitHeader,0,1);
-	// element_list
-	BsPutBit(bitHeader,(as->channels == 2),1);
-	BsPutBit(bitHeader,0,4);
+  // program_config_element
+  BsPutBit(bitHeader,0,4);
+  BsPutBit(bitHeader,as->profile,2);
+  BsPutBit(bitHeader,i,4);
+  BsPutBit(bitHeader,1,4);
+  BsPutBit(bitHeader,0,4);
+  BsPutBit(bitHeader,0,4);
+  BsPutBit(bitHeader,0,2);
+  BsPutBit(bitHeader,0,3);
+  BsPutBit(bitHeader,0,4);
+  BsPutBit(bitHeader,0,1);
+  BsPutBit(bitHeader,0,1);
+  BsPutBit(bitHeader,0,1);
+  // element_list
+  BsPutBit(bitHeader,(as->channels == 2),1);
+  BsPutBit(bitHeader,0,4);
 
-	ByteAlign(bitHeader, 1);
-        // Comment
-	BsPutBit(bitHeader,0,8);
+  ByteAlign(bitHeader, 1);
+  // Comment
+  BsPutBit(bitHeader,0,8);
 
-	bits = BsBufferNumBit(bitHeader);
+  bits = BsBufferNumBit(bitHeader);
 
-	// Copy bitBuf into bitBuffer here
-	bytes = (int)((bits+7)/8);
-	for (i = 0; i < bytes; i++)
-		headerBuf[i] = bitHeader->data[i];
-	BsClose(bitHeader);
-        // Write header to a file
-	fseek(as->out_file, 0, SEEK_SET);
-	fwrite(headerBuf, 1, 17, as->out_file);
-	return FNO_ERROR;
+  // Copy bitBuf into bitBuffer here
+  bytes = (int)((bits+7)/8);
+  for (i = 0; i < bytes; i++)
+    headerBuf[i] = bitHeader->data[i];
+  BsClose(bitHeader);
+  // Write header to a file
+  fseek(as->out_file, 0, SEEK_SET);
+  fwrite(headerBuf, 1, 17, as->out_file);
+  return FNO_ERROR;
 }
 ////////////////////////////////////////////////////////////////////////////////
 int faac_EncodeInit(faacAACStream *as, char *in_file, char *out_file)
 {
-	int frameNumSample,delayNumSample;
-	int ch, frames, startupNumFrame;
-	SF_INFO sf_info;
+  int frameNumSample,delayNumSample;
+  int ch, frames, startupNumFrame;
+  SF_INFO sf_info;
 
-	if (as->raw_audio) {
-		sf_info.format =  SF_FORMAT_RAW;
-		sf_info.format |= SF_FORMAT_PCM_BE;
-		sf_info.channels = 2;
-		sf_info.pcmbitwidth = 16;
-		sf_info.samplerate = 44100;
-		}
+  if (as->raw_audio) {
+    sf_info.format =  SF_FORMAT_RAW;
+    sf_info.format |= SF_FORMAT_PCM_BE;
+    sf_info.channels = 2;
+    sf_info.pcmbitwidth = 16;
+    sf_info.samplerate = 44100;
+  }
 
-	as->in_file = sf_open_read(in_file, &sf_info);
-	if (as->in_file==NULL)
-		return -1;
+  as->in_file = sf_open_read(in_file, &sf_info);
+  if (as->in_file == NULL)
+    return -1;
 
-	as->out_file = fopen(out_file, "wb");
-	if (as->out_file==NULL)
-		return -2;
+  as->out_file = fopen(out_file, "wb");
+  if (as->out_file == NULL)
+    return -2;
 
-	frames = (int)(sf_info.samples/1024+0.5);
+  frames = (int)(sf_info.samples/1024+0.5);
 
-	as->channels = sf_info.channels;
-	as->in_sampling_rate = sf_info.samplerate;
-	as->out_sampling_rate = (as->out_sampling_rate) ? (as->out_sampling_rate) : sf_info.samplerate;
-	as->cut_off = (as->cut_off) ? (as->cut_off) : ((as->out_sampling_rate)>>1);
+  as->channels = sf_info.channels;
+  as->in_sampling_rate = sf_info.samplerate;
+  as->out_sampling_rate = (as->out_sampling_rate) ? (as->out_sampling_rate) : sf_info.samplerate;
+  as->cut_off = (as->cut_off) ? (as->cut_off) : ((as->out_sampling_rate)>>1);
 
-	if ((as->inputBuffer = (double**)malloc( as->channels*sizeof(double*)))==NULL)
-		return -3;
-	for (ch=0; ch < as->channels; ch++)
-	{
-		if ((as->inputBuffer[ch]=(double*)malloc( 1024*sizeof(double)))==NULL)
-			return -4;
-	}
+  if ((as->inputBuffer = (double**)malloc( as->channels*sizeof(double*))) == NULL)
+    return -3;
+  for (ch=0; ch < as->channels; ch++){
+    if ((as->inputBuffer[ch]=(double*)malloc( 1024*sizeof(double))) == NULL)
+      return -4;
+  }
 
-        as->bit_rate*=1000;
-        if((as->bit_rate % 1000)||(as->bit_rate < 16000)) {
-		return -5;
-	}
-	if (as->channels != 2)
-		return -6;
-	if ((as->profile != MAIN_PROFILE)&&(as->profile != LOW_PROFILE))
-		return -7;
+  as->bit_rate*=1000;
+  if((as->bit_rate % 1000)||(as->bit_rate < 16000))
+    return -5;
+  if (as->channels != 2)
+    return -6;
+  if ((as->profile != MAIN_PROFILE)&&(as->profile != LOW_PROFILE))
+    return -7;
 
-	as->total_bits = 0;
-	as->frames = 0;
-	as->cur_frame = 0;
-	as->is_first_frame = 1;
-        as->is_last_frames = 0;
+  as->total_bits = 0;
+  as->frames = 0;
+  as->cur_frame = 0;
+  as->is_first_frame = 1;
+  as->is_last_frames = 0;
 
-	if (as->in_sampling_rate != as->out_sampling_rate)
-		as->rc_needed = 1;
-	else
-		as->rc_needed = 0;
+  if (as->in_sampling_rate != as->out_sampling_rate)
+    as->rc_needed = 1;
+  else
+    as->rc_needed = 0;
 
-	EncTfInit(as);
+  EncTfInit(as);
 
-	frameNumSample = 1024;
-	delayNumSample = 2*frameNumSample;
+  frameNumSample = 1024;
+  delayNumSample = 2*frameNumSample;
 
-	as->samplesToRead = frameNumSample * as->channels;
+  as->samplesToRead = frameNumSample * as->channels;
 
-	as->frame_bits = (int)(as->bit_rate*frameNumSample/as->out_sampling_rate+0.5);
-	as->bitBufferSize = (int)(((as->frame_bits * 5) + 7)/8);
+  as->frame_bits = (int)(as->bit_rate*frameNumSample/as->out_sampling_rate+0.5);
+  as->bitBufferSize = (int)(((as->frame_bits * 5) + 7)/8);
 
 
-	/* num frames to start up encoder due to delay compensation */
-	startupNumFrame = (delayNumSample+frameNumSample-1)/frameNumSample;
+  /* num frames to start up encoder due to delay compensation */
+  startupNumFrame = (delayNumSample+frameNumSample-1)/frameNumSample;
 
-	/* process audio file frame by frame */
-	as->cur_frame = -startupNumFrame;
-	as->available_bits = 8184;
+  /* process audio file frame by frame */
+  as->cur_frame = -startupNumFrame;
+  as->available_bits = 8184;
 
-	if (as->rc_needed) {
-		as->rc_buf = RateConvInit (0,		/* in: debug level */
-			(double)as->out_sampling_rate/(double)as->in_sampling_rate, /* in: outputRate / inputRate */
-			as->channels,		/* in: number of channels */
-			-1,			/* in: num taps */
-			-1,			/* in: alpha for Kaiser window */
-			-1,			/* in: 6dB cutoff freq / input bandwidth */
-			-1,			/* in: 100dB cutoff freq / input bandwidth */
-			&as->samplesToRead);        /* out: num input samples / frame */
-	} else {
-		as->samplesToRead = 1024*as->channels;
-	}
+  if (as->rc_needed) {
+    as->rc_buf = RateConvInit (0,		/* in: debug level */
+		(double)as->out_sampling_rate/(double)as->in_sampling_rate, /* in: outputRate / inputRate */
+		as->channels,		/* in: number of channels */
+		-1,			/* in: num taps */
+		-1,			/* in: alpha for Kaiser window */
+		-1,			/* in: 6dB cutoff freq / input bandwidth */
+		-1,			/* in: 100dB cutoff freq / input bandwidth */
+		&as->samplesToRead);        /* out: num input samples / frame */
+  }
+  else
+    as->samplesToRead = 1024*as->channels;
 
-	as->savedSize = 0;
+  as->savedSize = 0;
 
-       	if (as->header_type == ADIF_HEADER) {
-                char tmp[17];
-		memset(tmp, 0, 17*sizeof(char));
-		fwrite(tmp, 1, 17, as->out_file);
-	}
-	as->sampleBuffer = (short*) malloc(as->samplesToRead*sizeof(short));
-	as->bitBuffer = (unsigned char*) malloc((as->bitBufferSize+100)*sizeof(char));
+  if (as->header_type == ADIF_HEADER) {
+    char tmp[17];
+    memset(tmp, 0, 17*sizeof(char));
+    fwrite(tmp, 1, 17, as->out_file);
+  }
+  as->sampleBuffer = (short*) malloc(as->samplesToRead*sizeof(short));
+  as->bitBuffer = (unsigned char*) malloc((as->bitBufferSize+100)*sizeof(char));
 
-	return frames;
+  return frames;
 }
 ////////////////////////////////////////////////////////////////////////////////
 int faac_EncodeFrame(faacAACStream *as)
 {
-	int i, j, error;
-	int usedNumBit, usedBytes;
-	int samplesOut, curSample = 0, Samples;
-	BsBitStream *bitBuf;
-	float *dataOut;
-	float *data = NULL;
-	int totalBytes = 0;
+  int i, j, error;
+  int usedNumBit, usedBytes;
+  int samplesOut, curSample = 0, Samples;
+  BsBitStream *bitBuf;
+  float *dataOut;
+  float *data = NULL;
+  int totalBytes = 0;
 
-        if (!as->is_last_frames){
-               	Samples = sf_read_short(as->in_file, as->sampleBuffer, as->samplesToRead);
-                if (Samples < as->samplesToRead) as->is_last_frames = 1;
-                }
-            else {
-                 Samples = 0;
-                 if(as->sampleBuffer){
-                         free(as->sampleBuffer);
-                         as->sampleBuffer = NULL;
-                         }
-                 }
+  if (!as->is_last_frames){
+    Samples = sf_read_short(as->in_file, as->sampleBuffer, as->samplesToRead);
+    if (Samples < as->samplesToRead)
+      as->is_last_frames = 1;
+  }
+  else {
+      Samples = 0;
+      if(as->sampleBuffer){
+        free(as->sampleBuffer);
+        as->sampleBuffer = NULL;
+      }
+  }
 
-	// Is this the last (incomplete) frame
-	if ((Samples < as->samplesToRead)&&(Samples > 0)) {
-		// Padd with zeros
-		memset(as->sampleBuffer + Samples, 0, (as->samplesToRead-Samples)*sizeof(short));
-	}
+  // Is this the last (incomplete) frame
+  if ((Samples < as->samplesToRead)&&(Samples > 0)) {
+    // Padd with zeros
+    memset(as->sampleBuffer + Samples, 0, (as->samplesToRead-Samples)*sizeof(short));
+  }
 
-	if (as->rc_needed && (Samples > 0)) {
-		samplesOut = as->savedSize + RateConv (
-			as->rc_buf,			/* in: buffer (handle) */
-			as->sampleBuffer,		/* in: input data[] */
-			as->samplesToRead,		/* in: number of input samples */
-			&dataOut);
+  if (as->rc_needed && (Samples > 0)) {
+    samplesOut = as->savedSize + RateConv (
+                 as->rc_buf,			/* in: buffer (handle) */
+                 as->sampleBuffer,		/* in: input data[] */
+	         as->samplesToRead,		/* in: number of input samples */
+	         &dataOut);
 
-		data = (float*) malloc((samplesOut)*sizeof(float));
-		for (i = 0; i < as->savedSize; i++)
-			data[i] = as->saved[i];
-		for (j = 0; i < samplesOut; i++, j++)
-			data[i] = dataOut[j];
-	} else if (Samples > 0) {
-		samplesOut = 1024*as->channels;
-		data = (float*) malloc((samplesOut)*sizeof(float));
-		for (i = 0; i < samplesOut; i++)
-			data[i] = as->sampleBuffer[i];
-	} else
-		samplesOut = 1024*as->channels;
+    data = (float*) malloc((samplesOut)*sizeof(float));
+    for (i = 0; i < as->savedSize; i++)
+      data[i] = as->saved[i];
+    for (j = 0; i < samplesOut; i++, j++)
+      data[i] = dataOut[j];
+  }
+  else if (Samples > 0) {
+    samplesOut = 1024*as->channels;
+    data = (float*) malloc((samplesOut)*sizeof(float));
+    for (i = 0; i < samplesOut; i++)
+      data[i] = as->sampleBuffer[i];
+  }
+  else
+    samplesOut = 1024*as->channels;
 
-	while(samplesOut >= 1024*as->channels)
-	{
+  while(samplesOut >= 1024*as->channels) {
+    // Process Buffer
+    if (as->sampleBuffer) {
+      if (as->channels == 2) {
+        if (Samples > 0)
+          for (i = 0; i < 1024; i++) {
+	    as->inputBuffer[0][i] = data[curSample+(i*2)];
+  	    as->inputBuffer[1][i] = data[curSample+(i*2)+1];
+	  }
+        else // (Samples == 0) when called by faacEncodeFinish
+          for (i = 0; i < 1024; i++) {
+	    as->inputBuffer[0][i] = 0;
+            as->inputBuffer[1][i] = 0;
+	  }
+        }
+      else {
+        // No mono supported yet (basically only a problem with decoder
+        // the encoder in fact supports it).
+        return FERROR;
+      }
+    }
 
-		// Process Buffer
-		if (as->sampleBuffer) {
-			if (as->channels == 2)
-			{
-				if (Samples > 0)
-					for (i = 0; i < 1024; i++)
-					{
-						as->inputBuffer[0][i] = data[curSample+(i*2)];
-						as->inputBuffer[1][i] = data[curSample+(i*2)+1];
-					}
-				else // (Samples == 0) when called by faacEncodeFinish
-					for (i = 0; i < 1024; i++)
-					{
-						as->inputBuffer[0][i] = 0;
-						as->inputBuffer[1][i] = 0;
-					}
-			} else {
-				// No mono supported yet (basically only a problem with decoder
-				// the encoder in fact supports it).
-				return FERROR;
-			}
-		}
+  if (as->is_first_frame) {
+    EncTfFrame(as, (BsBitStream*)NULL);
+    as->is_first_frame = 0;
+    as->cur_frame++;
 
-		if (as->is_first_frame) {
-			EncTfFrame(as, (BsBitStream*)NULL);
+    as->bitBufferSize = 0;
 
-			as->is_first_frame = 0;
-			as->cur_frame++;
+    samplesOut -= (as->channels*1024);
+    curSample  += (as->channels*1024);
 
-			as->bitBufferSize = 0;
+    continue;
+  }
 
-			samplesOut -= (as->channels*1024);
-			curSample  += (as->channels*1024);
+  bitBuf = BsOpenWrite(as->frame_bits * 10);
 
-			continue;
-		}
+  /* compute available number of bits */
+  /* frameAvailNumBit contains number of bits in reservoir */
+  /* variable bit rate: don't exceed bit reservoir size */
+  if (as->available_bits > 8184)
+    as->available_bits = 8184;
 
-		bitBuf = BsOpenWrite(as->frame_bits * 10);
+  /* Add to frameAvailNumBit the number of bits for this frame */
+  as->available_bits += as->frame_bits;
 
-		/* compute available number of bits */
-		/* frameAvailNumBit contains number of bits in reservoir */
-		/* variable bit rate: don't exceed bit reservoir size */
-		if (as->available_bits > 8184)
-			as->available_bits = 8184;
+  /* Encode frame */
+  error = EncTfFrame(as, bitBuf);
 
-		/* Add to frameAvailNumBit the number of bits for this frame */
-		as->available_bits += as->frame_bits;
+  if (error == FERROR)
+    return FERROR;
 
-		/* Encode frame */
-		error = EncTfFrame(as, bitBuf);
+  usedNumBit = BsBufferNumBit(bitBuf);
+  as->total_bits += usedNumBit;
 
-		if (error == FERROR)
-			return FERROR;
+  // Copy bitBuf into bitBuffer here
+  usedBytes = (int)((usedNumBit+7)/8);
+  for (i = 0; i < usedBytes; i++)
+    as->bitBuffer[i+totalBytes] = bitBuf->data[i];
+  totalBytes += usedBytes;
+  BsClose(bitBuf);
 
-		usedNumBit = BsBufferNumBit(bitBuf);
-		as->total_bits += usedNumBit;
+  /* Adjust available bit counts */
+  as->available_bits -= usedNumBit;    /* Subtract bits used */
 
-		// Copy bitBuf into bitBuffer here
-		usedBytes = (int)((usedNumBit+7)/8);
-		for (i = 0; i < usedBytes; i++)
-			as->bitBuffer[i+totalBytes] = bitBuf->data[i];
-		totalBytes += usedBytes;
-		BsClose(bitBuf);
+  as->cur_frame++;
 
-		/* Adjust available bit counts */
-		as->available_bits -= usedNumBit;    /* Subtract bits used */
+  samplesOut -= (as->channels*1024);
+  curSample  += (as->channels*1024);
+  }
 
-		as->cur_frame++;
+  as->bitBufferSize = totalBytes;
 
-		samplesOut -= (as->channels*1024);
-		curSample  += (as->channels*1024);
+  as->savedSize = samplesOut;
+  for (i = 0; i < samplesOut; i++)
+    as->saved[i] = data[curSample+i];
+  if (data)
+    free(data);
 
-	}
-
-	as->bitBufferSize = totalBytes;
-
-	as->savedSize = samplesOut;
-	for (i = 0; i < samplesOut; i++)
-		as->saved[i] = data[curSample+i];
-	if (data) free(data);
-
-       	fwrite(as->bitBuffer, 1, as->bitBufferSize, as->out_file);
-        if (Samples < as->samplesToRead) return F_FINISH;
-                else	return FNO_ERROR;
+   fwrite(as->bitBuffer, 1, as->bitBufferSize, as->out_file);
+  if (Samples < as->samplesToRead)
+    return F_FINISH;
+  else
+    return FNO_ERROR;
 }
 ////////////////////////////////////////////////////////////////////////////////
 void faac_EncodeFinish(faacAACStream *as)
 {
-	faac_EncodeFrame(as);
-	faac_EncodeFrame(as);
+  faac_EncodeFrame(as);
+  faac_EncodeFrame(as);
 }
 ////////////////////////////////////////////////////////////////////////////////
 void faac_EncodeFree(faacAACStream *as)
 {
-	int ch;
+  int ch;
 
-	/* free encoder memory */
-	EncTfFree();
-	if (as->rc_needed)
-		RateConvFree (as->rc_buf);
+  /* free encoder memory */
+  EncTfFree();
+  if (as->rc_needed)
+    RateConvFree (as->rc_buf);
 
-	for(ch=0; ch < as->channels; ch++)
-		if(as->inputBuffer[ch]) free(as->inputBuffer[ch]);
-	if(as->inputBuffer) free(as->inputBuffer);
+  for(ch=0; ch < as->channels; ch++)
+    if(as->inputBuffer[ch])
+      free(as->inputBuffer[ch]);
+  if(as->inputBuffer)
+    free(as->inputBuffer);
 
-        if (as->header_type==ADIF_HEADER)
-             write_ADIF_header(as);
+  if (as->header_type == ADIF_HEADER)
+    write_ADIF_header(as);
 
-        sf_close(as->in_file);
-        fclose(as->out_file);
+  sf_close(as->in_file);
+  fclose(as->out_file);
 
-	if (as->bitBuffer)  free(as->bitBuffer);
+  if (as->bitBuffer)
+    free(as->bitBuffer);
 }
 ////////////////////////////////////////////////////////////////////////////////
 faacVersion *faac_Version(void)
 {
-	faacVersion *faacv = malloc(sizeof(faacVersion));
+  faacVersion *faacv = malloc(sizeof(faacVersion));
 
-	faacv->DLLMajorVersion = 2;
-	faacv->DLLMinorVersion = 30;
-	faacv->MajorVersion = 0;
-	faacv->MinorVersion = 70;
-	strcpy(faacv->HomePage, "http://www.slimline.net/aac/");
+  faacv->DLLMajorVersion = 2;
+  faacv->DLLMinorVersion = 30;
+  faacv->MajorVersion = 0;
+  faacv->MinorVersion = 70;
+  strcpy(faacv->HomePage, "http://www.slimline.net/aac/");
 
-	return faacv;
+  return faacv;
 }
 ////////////////////////////////////////////////////////////////////////////////
 void faac_InitParams(faacAACStream *as)
 {
-as->profile = MAIN_PROFILE;
-as->header_type = ADTS_HEADER;
-as->use_IS = 0;
-as->use_MS = 0;
-as->use_TNS = 0;
-as->use_LTP = 1;
-as->use_PNS = 0;
-as->cut_off = 0;
-as->bit_rate = 128;
-as->out_sampling_rate = 0;
-as->raw_audio = 0;
+  as->profile = MAIN_PROFILE;
+  as->header_type = ADTS_HEADER;
+  as->use_IS = 0;
+  as->use_MS = 0;
+  as->use_TNS = 0;
+  as->use_LTP = 1;
+  as->use_PNS = 0;
+  as->cut_off = 0;
+  as->bit_rate = 128;
+  as->out_sampling_rate = 0;
+  as->raw_audio = 0;
 }
 ////////////////////////////////////////////////////////////////////////////////
-#ifdef FAAC_DLL
-
-BOOL APIENTRY DllMain(HANDLE hModule,
-                      DWORD  ul_reason_for_call,
-                      LPVOID lpReserved)
+void faac_SetParam(faacAACStream *as, int param, int value)
 {
-    return TRUE;
+  switch (param){
+    case PROFILE:
+      as->profile = value;
+      break;
+    case HEADER_TYPE:
+      as->header_type = value;
+      break;
+    case MS_STEREO:
+      as->use_MS = value;
+      break;
+    case IS_STEREO:
+      as->use_IS = value;
+      break;
+    case BITRATE:
+      as->bit_rate = value;
+      break;
+    case CUT_OFF:
+      as->cut_off = value;
+      break;
+    case OUT_SAMPLING_RATE:
+      as->out_sampling_rate = value;
+      break;
+    case RAW_AUDIO:
+      as->raw_audio = value;
+      break;
+    case TNS:
+      as->use_TNS = value;
+      break;
+    case LTP:
+      as->use_LTP = value;
+      break;
+    case PNS:
+      as->use_PNS = value;
+      break;
+  }
 }
-
-#else  // Not dll
-
-/* You can download libsndfile from http://www.zip.com.au/~erikd/libsndfile/ */
-#ifdef WIN32
-#include <windows.h>
-#else
-#include <time.h>
-#endif
-
-char *get_filename(char *pPath)
-{
-    char *pT;
-
-    for (pT = pPath; *pPath; pPath++) {
-        if ((pPath[0] == '\\' || pPath[0] == ':') && pPath[1] && (pPath[1] != '\\'))
-            pT = pPath + 1;
-    }
-
-    return pT;
-}
-
-void combine_path(char *path, char *dir, char *file)
-{
-	/* Should be a bit more sophisticated
-	   This code assumes that the path exists */
-
-	/* Assume dir is allocated big enough */
-	if (dir[strlen(dir)-1] != '\\')
-		strcat(dir, "\\");
-	strcat(dir, get_filename(file));
-	strcpy(path, dir);
-}
-
-void usage(void)
-{
-	printf("Usage:\n");
-	printf("faac.exe -options file ...\n");
-	printf("Options:\n");
-	printf(" -?    Shows this help screen.\n");
-	printf(" -pX   AAC profile (X can be LOW, or MAIN (default).\n");
-	printf(" -bX   Bitrate in kbps (in steps of 1kbps, min. 16kbps)\n");
-	printf(" -pns  Use PNS (Perceptual Noise Substitution).\n");
-	printf(" -tns  Use TNS (Temporal Noise Shaping).\n");
-	printf(" -is   Use intensity stereo coding.\n");
-	printf(" -ms   Use mid/side stereo coding.\n");
-	printf(" -nm   Don't use mid/side stereo coding.\n");
-	printf("       The default for MS is intelligent switching.\n");
-	printf(" -np   Don't use LTP (Long Term Prediction).\n");
-	printf(" -oX   Set output directory.\n");
-	printf(" -sX   Set output sampling rate.\n");
-	printf(" -cX   Set cut-off frequency.\n");
-	printf(" -r    Use raw data input file.\n");
-	printf(" -hN   No header will be written to the AAC file.\n");
-	printf(" -hS   ADTS headers will be written to the AAC file(default).\n");
-	printf(" -hI   ADIF header will be written to the AAC file.\n");
-	printf(" file  Multiple files can be given as well as wild cards.\n");
-	printf("       Can be any of the filetypes supported by libsndfile\n");
-	printf("       (http://www.zip.com.au/~erikd/libsndfile/).\n");
-	printf("Example:\n");
-	printf("       faac.exe -b96 -oc:\\aac\\ *.wav\n");
-	return;
-}
-
-int parse_arg(int argc, char *argv[],faacAACStream *as, char *InFileNames[100], char *OutFileNames[100])
-{
-int i, out_dir_set=0, FileCount=0;
-char *argp, *fnp, out_dir[255];
-
-faac_InitParams(as);
-	if (argc == 1) {
-		usage();
-		return -1;
-	}
-
-	for (i = 1; i < argc; i++)
-	{
-		if ((argv[i][0] != '-')&&(argv[i][0] != '/')) {
-			if (strchr("-/", argv[i][0]))
-				argp = &argv[i][1];
-			else  argp = argv[i];
-
-			if (!strchr(argp, '*') && !strchr(argp, '?'))
-			{
-				InFileNames[FileCount] = (char*) malloc((strlen(argv[i])+1)*sizeof(char));
-				OutFileNames[FileCount] = (char*) malloc((strlen(argv[i])+1)*sizeof(char));
-				strcpy(InFileNames[FileCount], argv[i]);
-				FileCount++;
-			} else {
-#ifdef WIN32
-				HANDLE hFindFile;
-				WIN32_FIND_DATA fd;
-
-				char path[255], *p;
-
-				if (NULL == (p = strrchr(argp, '\\')))
-					p = strrchr(argp, '/');
-				if (p)
-				{
-					char ch = *p;
-
-					*p = 0;
-					strcat(strcpy(path, argp), "\\");
-					*p = ch;
-				}
-				else
-					*path = 0;
-
-				if (INVALID_HANDLE_VALUE != (hFindFile = FindFirstFile(argp, &fd)))
-				{
-					do
-					{
-						InFileNames[FileCount] = (char*) malloc((strlen(fd.cFileName)
-							+ strlen(path) + 2)*sizeof(char));
-						strcat(strcpy(InFileNames[FileCount], path), fd.cFileName);
-						FileCount++;
-					} while (FindNextFile(hFindFile, &fd));
-					FindClose(hFindFile);
-				}
-#else
-				printf("Wildcards not yet supported on systems other than WIN32\n");
-#endif
-			}
-		} else {
-			switch(argv[i][1]) {
-			case 'p': case 'P':
-				if ((argv[i][2] == 'n') || (argv[i][2] == 'N'))
-					as->use_PNS = 1;
-				else if ((argv[i][2] == 'l') || (argv[i][2] == 'L'))
-					as->profile = LOW_PROFILE;
-				else
-					as->profile = MAIN_PROFILE;
-				break;
-			case 'n': case 'N':
-				if ((argv[i][2] == 'm') || (argv[i][2] == 'M'))
-					as->use_MS = -1;
-				else if ((argv[i][2] == 'p') || (argv[i][2] == 'P'))
-					as->use_LTP = 0;
-				break;
-                        case 'h': case 'H':
-                                if ((argv[i][2] == 'i') || (argv[i][2] == 'I'))
-                                        as->header_type = ADIF_HEADER;
-                                else if ((argv[i][2] == 's') || (argv[i][2] == 'S'))
-                                        as->header_type = ADTS_HEADER;
-                                else if ((argv[i][2] == 'n') || (argv[i][2] == 'N'))
-                                        as->header_type = NO_HEADER;
-				break;
-			case 'm': case 'M':
-				as->use_MS = 1;
-				break;
-			case 'i': case 'I':
-				as->use_IS = 1;
-				break;
-			case 'r': case 'R':
-				as->raw_audio = 1;
-				break;
-			case 't': case 'T':
-				as->use_TNS = 1;
-				break;
-			case 'b': case 'B':
-				as->bit_rate = atoi(&argv[i][2]);
-				break;
-			case 's': case 'S':
-				as->out_sampling_rate = atoi(&argv[i][2]);
-				break;
-			case 'c': case 'C':
-				as->cut_off = atoi(&argv[i][2]);
-				break;
-			case 'o': case 'O':
-				out_dir_set = 1;
-				strcpy(out_dir, &argv[i][2]);
-				break;
-			case '?':
-				usage();
-				return 1;
-			}
-		}
-	}
-        if (FileCount == 0) {
-		return -1;
-        	}
-            else{
-                for (i = 0; i < FileCount; i++){
-        		if (out_dir_set)
-        			combine_path(OutFileNames[i], out_dir, InFileNames[i]);
-        		else
-        			strcpy(OutFileNames[i], InFileNames[i]);
-        		fnp = strrchr(OutFileNames[i],'.');
-        		fnp[0] = '\0';
-        		strcat(OutFileNames[i],".aac");
-                }
-            }
-return FileCount;
-}
-
-void printVersion(void)
-{
-faacVersion *faacv;
-faacv = faac_Version();
-printf("FAAC cl (Freeware AAC Encoder)\n");
-printf("FAAC homepage: %s\n", faacv->HomePage);
-printf("Encoder engine version: %d.%d\n\n",
-	faacv->MajorVersion, faacv->MinorVersion);
-if (faacv) free(faacv);
-}
-
-void printConf(faacAACStream *as)
-{
-printf("AAC configuration:\n");
-printf("----------------------------------------------\n");
-printf("AAC profile: %s.\n", (as->profile==MAIN_PROFILE)?"MAIN":"LOW");
-printf("Bitrate: %dkbps.\n", as->bit_rate);
-printf("Mid/Side (MS) stereo coding: %s.\n",
-	(as->use_MS==1)?"Full":((as->use_MS==0)?"Switching":"Off"));
-printf("Intensity stereo (IS) coding: %s.\n", as->use_IS?"On":"Off");
-printf("Temporal Noise Shaping: %s.\n", as->use_TNS?"On":"Off");
-printf("Long Term Prediction: %s.\n", as->use_LTP?"On":"Off");
-printf("Perceptual Noise Substitution: %s.\n", as->use_PNS?"On":"Off");
-if (as->out_sampling_rate)
-	printf("Output sampling rate: %dHz.\n", as->out_sampling_rate);
-if (as->cut_off)
-	printf("Cut-off frequency: %dHz.\n", as->cut_off);
-if (as->header_type == ADIF_HEADER)
-	printf("Header info: ADIF header (seeking disabled)\n");
-    else if (as->header_type == ADTS_HEADER)
-	printf("Header info: ADTS headers (seeking enabled)\n");
-    else
-	printf("Header info: no headers (seeking disabled)\n");
-printf("----------------------------------------------\n");
-}
-
-int main(int argc, char *argv[])
-{
-	int i, frames, currentFrame, result, FileCount;
-	char *InFileNames[100];
-	char *OutFileNames[100];
-
-	faacAACStream *as;
-
-        /* timing vars */
-	long begin, end;
-	int nTotSecs, nSecs;
-	int nMins;
-
-        /* create main aacstream object */
-        as =(faacAACStream *) malloc(sizeof(faacAACStream));
-
-        /* Print version of FAAC */
-        printVersion();
-
-	/* Process command line params */
-        if ((FileCount=parse_arg(argc, argv, as, InFileNames, OutFileNames))<0) return 0;
-
-        /* Print configuration */
-        printConf(as);
-
-        /* Process input files */
-	for (i = 0; i < FileCount; i++) {
-		printf("0%\tBusy encoding %s.\r", InFileNames[i]);
-#ifdef WIN32
-		begin = GetTickCount();
-#else
-		begin = clock();
-#endif
-                /* Init encoder core and retrieve number of frames */
-                if ((frames=faac_EncodeInit(as, InFileNames[i], OutFileNames[i])) < 0) {
-			printf("Error %d while encoding %s.\n",-frames,InFileNames[i]);
-			continue;
-		}
-                currentFrame = 0;
-		// Keep encoding frames until the end of the audio file
-		do {
-			currentFrame++;
-			result = faac_EncodeFrame(as);
-			if (result == FERROR) {
-				printf("Error while encoding %s.\n", InFileNames[i]);
-				break;
-			}
-			printf("%.2f%%\tBusy encoding %s.\r", min(((double)currentFrame/(double)frames)*100,100),InFileNames[i]);
-
-		} while (result != F_FINISH);
-
-                /* finishing last frames and destroying internal data */
-		faac_EncodeFinish(as);
-                faac_EncodeFree(as);
-#ifdef WIN32
-		end = GetTickCount();
-#else
-		end = clock();
-#endif
-		nTotSecs = (end-begin)/1000;
-		nMins = nTotSecs / 60;
-		nSecs = nTotSecs - (60*nMins);
-		printf("Encoding %s took:\t%d:%.2d\t\n", InFileNames[i], nMins, nSecs);
-                if(InFileNames[i]) free(InFileNames[i]);
-                if(OutFileNames[i]) free(OutFileNames[i]);
-	}
-        if (as) free (as);
-	return FNO_ERROR;
-}
-
-#endif // end of #ifndef FAAC_DLL