// faacode.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <faac.h>
#include <stdio.h>
typedef unsigned long   ULONG;
typedef unsigned int    UINT;
typedef unsigned char   BYTE;
//typedef char            _TCHAR;
#pragma comment(lib,"libfaac.lib")
int main(int argc, _TCHAR* argv[])
{
	ULONG nSampleRate = 44100;  // 采样率
	UINT nChannels = 2;         // 声道数
	UINT nPCMBitSize = 16;      // 单样本位数
	ULONG nInputSamples = 0;
	ULONG nMaxOutputBytes = 0;
	int nRet;
	faacEncHandle hEncoder;
	faacEncConfigurationPtr pConfiguration; 
	int nBytesRead;
	int nPCMBufferSize;
	BYTE* pbPCMBuffer;
	BYTE* pbAACBuffer;
	FILE* fpIn; // WAV file for input
	FILE* fpOut; // AAC file for output
	fpIn = fopen("test.wav", "rb");//  resample.pcm
	fpOut = fopen("test.aac", "wb");//  resample.aac
	// (1) Open FAAC engine
	hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes);
	if(hEncoder == NULL)
	{
		printf("[ERROR] Failed to call faacEncOpen()\n");
		return -1;
	}
	nPCMBufferSize = nInputSamples * nPCMBitSize / 8;
	pbPCMBuffer = new BYTE [nPCMBufferSize];
	pbAACBuffer = new BYTE [nMaxOutputBytes];
	// (2.1) Get current encoding configuration
	pConfiguration = faacEncGetCurrentConfiguration(hEncoder);
	
	pConfiguration->inputFormat = FAAC_INPUT_16BIT;
	// (2.2) Set encoding configuration
	nRet = faacEncSetConfiguration(hEncoder, pConfiguration);
	//如果是wav格式,先读取前面的
	fseek(fpIn,58,SEEK_SET);
	for(int i = 0; 1; i++)
	{
		// 读入的实际字节数,最大不会超过nPCMBufferSize,
		nBytesRead = fread(pbPCMBuffer, 1, nPCMBufferSize, fpIn);
		// 输入样本数,用实际读入字节数计算,一般只有读到文件尾时才不是nPCMBufferSize/(nPCMBitSize/8);
		nInputSamples = nBytesRead / (nPCMBitSize / 8);
		// (3) Encode
		nRet = faacEncEncode(
			hEncoder, (int*) pbPCMBuffer, nInputSamples, pbAACBuffer, nMaxOutputBytes);
		fwrite(pbAACBuffer, 1, nRet, fpOut);
		printf("%d: faacEncEncode returns %d\n", i, nRet);
		if(nBytesRead <= 0)
		{
			break;
		}
	}
	// (4) Close FAAC engine
	nRet = faacEncClose(hEncoder);
	delete[] pbPCMBuffer;
	delete[] pbAACBuffer;
	fclose(fpIn);
	fclose(fpOut);
	//getchar();
	return 0;
}