ref: 56a143b9e40f3cd419b30b12b00346efe47b25ad
dir: /cooledit/faac.c/
#include <windows.h>
#include <stdio.h> // FILE *
#include "filters.h" //CoolEdit
#include "resource.h"
#include "faac.h"
typedef struct output_tag // any special vars associated with output file
{
FILE *fFile;
DWORD lSize;
long lSamprate;
WORD wBitsPerSample;
WORD wChannels;
DWORD dwDataOffset;
BOOL bWrittenHeader;
char szNAME[256];
faacEncHandle hEncoder;
unsigned char *bitbuf;
DWORD maxBytesOutput;
long samplesInput;
BOOL bStopEnc;
} MYOUTPUT;
faacEncConfiguration faacEncCfg;
__declspec(dllexport) BOOL FAR PASCAL DIALOGMsgProc(HWND hWndDlg, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_INITDIALOG:
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"8");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"18");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"20");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"24");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"32");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"40");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"48");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"56");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"64");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"96");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"112");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"128");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"160");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"192");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"256");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BITRATE), CB_SETCURSEL, 11, 0);
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BANDWIDTH), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"4000");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BANDWIDTH), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"8000");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BANDWIDTH), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"16000");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BANDWIDTH), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"22050");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BANDWIDTH), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"24000");
SendMessage(GetDlgItem(hWndDlg, IDC_CB_BANDWIDTH), CB_SETCURSEL, 3, 0);
CheckDlgButton(hWndDlg, IDC_ALLOWMIDSIDE, TRUE);
CheckDlgButton(hWndDlg, IDC_USETNS, TRUE);
CheckDlgButton(hWndDlg, IDC_USELFE, FALSE);
switch((long)lParam)
{
case 1:
CheckDlgButton(hWndDlg,IDC_RADIO_MPEG4,TRUE);
break;
case 2:
CheckDlgButton(hWndDlg,IDC_RADIO_MPEG2,TRUE);
break;
case 3:
CheckDlgButton(hWndDlg,IDC_RADIO_MAIN,TRUE);
break;
case 4:
CheckDlgButton(hWndDlg,IDC_RADIO_LOW,TRUE);
break;
case 5:
CheckDlgButton(hWndDlg,IDC_RADIO_SSR,TRUE);
break;
case 6:
CheckDlgButton(hWndDlg,IDC_RADIO_LTP,TRUE);
break;
case 19:
CheckDlgButton(hWndDlg,IDC_CHK_AUTOCFG, !IsDlgButtonChecked(hWndDlg,IDC_CHK_AUTOCFG));
break;
default:
CheckDlgButton(hWndDlg,IDC_RADIO_MPEG4,TRUE);
CheckDlgButton(hWndDlg,IDC_RADIO_MAIN,TRUE);
break;
}
break; // End of WM_INITDIALOG
case WM_CLOSE:
// Closing the Dialog behaves the same as Cancel
PostMessage(hWndDlg, WM_COMMAND, IDCANCEL, 0L);
break; // End of WM_CLOSE
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
{
DWORD retVal=0;
if(IsDlgButtonChecked(hWndDlg,IDC_RADIO_MPEG4))
{
faacEncCfg.mpegVersion=4;
retVal|=4<<29;
}
if(IsDlgButtonChecked(hWndDlg,IDC_RADIO_MPEG2))
{
faacEncCfg.mpegVersion=2;
retVal|=2<<29;
}
if(IsDlgButtonChecked(hWndDlg,IDC_RADIO_MAIN))
faacEncCfg.aacObjectType=0;
if(IsDlgButtonChecked(hWndDlg,IDC_RADIO_LOW))
{
faacEncCfg.aacObjectType=1;
retVal|=1<<27;
}
if(IsDlgButtonChecked(hWndDlg,IDC_RADIO_SSR))
{
faacEncCfg.aacObjectType=2;
retVal|=2<<27;
}
if(IsDlgButtonChecked(hWndDlg,IDC_RADIO_LTP))
{
faacEncCfg.aacObjectType=3;
retVal|=3<<27;
}
faacEncCfg.allowMidside=IsDlgButtonChecked(hWndDlg, IDC_ALLOWMIDSIDE) == BST_CHECKED ? 1 : 0;
retVal|=faacEncCfg.allowMidside<<26;
faacEncCfg.useTns=IsDlgButtonChecked(hWndDlg, IDC_USETNS) == BST_CHECKED ? 1 : 0;
retVal|=faacEncCfg.useTns<<25;
faacEncCfg.useLfe=IsDlgButtonChecked(hWndDlg, IDC_USELFE) == BST_CHECKED ? 1 : 0;
retVal|=faacEncCfg.useLfe<<24;
faacEncCfg.bitRate=GetDlgItemInt(hWndDlg, IDC_CB_BITRATE, 0, FALSE);
retVal|=faacEncCfg.bitRate;
faacEncCfg.bandWidth=GetDlgItemInt(hWndDlg, IDC_CB_BANDWIDTH, 0, FALSE);
retVal|=(faacEncCfg.bandWidth/1000)<<16;
if(IsDlgButtonChecked(hWndDlg,IDC_CHK_AUTOCFG))
retVal=1;
EndDialog(hWndDlg, retVal);
}
break;
case IDCANCEL:
// Ignore data values entered into the controls
// and dismiss the dialog window returning FALSE
EndDialog(hWndDlg, FALSE);
break;
}
break; // End of WM_COMMAND
default: return FALSE;
}
return TRUE;
} // End of DIALOGSMsgProc
__declspec(dllexport) DWORD FAR PASCAL FilterGetOptions(HWND hWnd, HINSTANCE hInst, long lSamprate, WORD wChannels, WORD wBitsPerSample, DWORD dwOptions) // return 0 if no options box
{
long nDialogReturn=0;
FARPROC lpfnDIALOGMsgProc;
lpfnDIALOGMsgProc=GetProcAddress(hInst,(LPCSTR)MAKELONG(20,0));
nDialogReturn=(long)DialogBoxParam((HINSTANCE)hInst,(LPCSTR)MAKEINTRESOURCE(IDD_COMPRESSION), (HWND)hWnd, (DLGPROC)lpfnDIALOGMsgProc,nDialogReturn);
return nDialogReturn;
}
__declspec(dllexport) DWORD FAR PASCAL FilterWriteFirstSpecialData(HANDLE hInput,
SPECIALDATA * psp)
{
return 0;
}
__declspec(dllexport) DWORD FAR PASCAL FilterWriteNextSpecialData(HANDLE hInput, SPECIALDATA * psp)
{
return 0;
// only has 1 special data! Otherwise we would use psp->hSpecialData
// as either a counter to know which item to retrieve next, or as a
// structure with other state information in it.
}
__declspec(dllexport) DWORD FAR PASCAL FilterWriteSpecialData(HANDLE hOutput,
LPCSTR szListType, LPCSTR szType, char * pData,DWORD dwSize)
{
return 0;
}
__declspec(dllexport) void FAR PASCAL CloseFilterOutput(HANDLE hOutput)
{
if(hOutput)
{
MYOUTPUT *mo;
mo=(MYOUTPUT *)GlobalLock(hOutput);
if(mo->fFile)
{
fclose(mo->fFile);
mo->fFile=0;
}
if(mo->hEncoder)
faacEncClose(mo->hEncoder);
if(mo->bitbuf)
{
free(mo->bitbuf);
mo->bitbuf=0;
}
GlobalUnlock(hOutput);
GlobalFree(hOutput);
}
}
__declspec(dllexport) HANDLE FAR PASCAL OpenFilterOutput(LPSTR lpstrFilename,long lSamprate,WORD wBitsPerSample,WORD wChannels,long lSize, long far *lpChunkSize, DWORD dwOptions)
{
HANDLE hOutput;
faacEncHandle hEncoder;
FILE *outfile;
unsigned char *bitbuf;
DWORD maxBytesOutput;
long samplesInput;
int bytesEncoded;
/* open the aac output file */
if(!(outfile=fopen(lpstrFilename, "wb")))
{
MessageBox(0, "Can't create file", "FAAC interface", MB_OK);
return 0;
}
/* open the encoder library */
if(!(hEncoder=faacEncOpen(lSamprate, wChannels, &samplesInput, &maxBytesOutput)))
{
MessageBox(0, "Can't init library", "FAAC interface", MB_OK);
fclose(outfile);
return 0;
}
if(!(bitbuf=(unsigned char*)malloc(maxBytesOutput*sizeof(unsigned char))))
{
MessageBox(0, "Memory allocation error: output buffer", "FAAC interface", MB_OK);
faacEncClose(hEncoder);
fclose(outfile);
return 0;
}
bytesEncoded=faacEncEncode(hEncoder, 0, 0, bitbuf, maxBytesOutput); // initializes the flushing process
if(bytesEncoded>0)
fwrite(bitbuf, 1, bytesEncoded, outfile);
*lpChunkSize=samplesInput*2;
hOutput=GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,sizeof(MYOUTPUT));
if(hOutput)
{
MYOUTPUT *mo;
mo=(MYOUTPUT *)GlobalLock(hOutput);
mo->fFile=outfile;
mo->lSize=lSize;
mo->lSamprate=lSamprate;
mo->wBitsPerSample=wBitsPerSample;
mo->wChannels=wChannels;
mo->dwDataOffset=0; // ???
mo->bWrittenHeader=0;
strcpy(mo->szNAME,lpstrFilename);
mo->hEncoder=hEncoder;
mo->bitbuf=bitbuf;
mo->maxBytesOutput=maxBytesOutput;
mo->samplesInput=samplesInput;
mo->bStopEnc=0;
GlobalUnlock(hOutput);
}
else
{
MessageBox(0, "hOutput=NULL", "FAAC interface", MB_OK);
faacEncClose(hEncoder);
fclose(outfile);
free(bitbuf);
return 0;
}
if(dwOptions && dwOptions!=1)
{
faacEncConfigurationPtr myFormat;
myFormat=faacEncGetCurrentConfiguration(hEncoder);
myFormat->mpegVersion=(dwOptions>>29)&7;
myFormat->aacObjectType=(dwOptions>>27)&3;
myFormat->allowMidside=(dwOptions>>26)&1;
myFormat->useTns=(dwOptions>>25)&1;
myFormat->useLfe=(dwOptions>>24)&1;
myFormat->bitRate=(dwOptions&0x00ff)*1000;
myFormat->bandWidth=((dwOptions>>16)&127)*1000;
switch(myFormat->bandWidth)
{
case 11000:
myFormat->bandWidth=11025;
break;
case 22000:
myFormat->bandWidth=22050;
break;
case 44000:
myFormat->bandWidth=44100;
break;
}
if(!faacEncSetConfiguration(hEncoder, myFormat))
{
MessageBox(0, "Unsupported parameters", "FAAC interface", MB_OK);
faacEncClose(hEncoder);
fclose(outfile);
free(bitbuf);
GlobalFree(hOutput);
return 0;
}
/* {
faacEncConfigurationPtr myFormat;
myFormat=faacEncGetCurrentConfiguration(hEncoder);
myFormat->mpegVersion=faacEncCfg.mpegVersion;
myFormat->aacObjectType=faacEncCfg.aacObjectType;
myFormat->allowMidside=faacEncCfg.allowMidside;
myFormat->useLfe=faacEncCfg.useLfe;
myFormat->useTns=faacEncCfg.useTns;
myFormat->bandWidth=faacEncCfg.bandWidth;
myFormat->bitRate=faacEncCfg.bitRate;
if(!faacEncSetConfiguration(hEncoder, myFormat))
{
MessageBox(0, "Unsupported parameters", "FAAC interface", MB_OK);
faacEncClose(hEncoder);
fclose(outfile);
free(bitbuf);
GlobalFree(hOutput);
return 0;
}*/
}
return hOutput;
}
__declspec(dllexport) DWORD FAR PASCAL WriteFilterOutput(HANDLE hOutput, unsigned char far *buf, long lBytes)
{
int bytesWritten;
int bytesEncoded;
if(hOutput)
{
MYOUTPUT far *mo;
mo=(MYOUTPUT far *)GlobalLock(hOutput);
if(!mo->bStopEnc)
{
// call the actual encoding routine
bytesEncoded=faacEncEncode(mo->hEncoder, (short *)buf, mo->samplesInput, mo->bitbuf, mo->maxBytesOutput);
if(bytesEncoded<1) // end of flushing process
{
if(bytesEncoded<0)
MessageBox(0, "faacEncEncode() failed", "FAAC interface", MB_OK);
mo->bStopEnc=1;
GlobalUnlock(hOutput);
return 0;
}
// write bitstream to aac file
bytesWritten=fwrite(mo->bitbuf, 1, bytesEncoded, mo->fFile);
if(bytesWritten!=bytesEncoded)
{
MessageBox(0, "bytesWritten and bytesEncoded are different", "FAAC interface", MB_OK);
mo->bStopEnc=1;
GlobalUnlock(hOutput);
return 0;
}
GlobalUnlock(hOutput);
}
}
return bytesWritten;
}