www.pudn.com > mp3rar.rar > in_aac.c
#ifdef PLUGIN #include#include #include "in2.h" #include "faad.h" #include "all.h" // post this to the main window at end of file (after playback as stopped) #define WM_WA_AAC_EOF WM_USER+2 // raw configuration #define NCH 2 #define SAMPLERATE 44100 #define BPS 16 faadAACInfo fInfo; In_Module mod; // the output module (declared near the bottom of this file) char lastfn[MAX_PATH]; // currently playing file (used for getting info on the current file) int file_length; // file length, in bytes int decode_pos_ms; // current decoding position, in milliseconds int paused; // are we paused? int seek_needed; // if != -1, it is the point that the decode thread should seek to, in ms. char sample_buffer[1024*NCH*(BPS/8)]; // sample buffer int killPlayThread=0; // the kill switch for the decode thread HANDLE play_thread_handle=INVALID_HANDLE_VALUE; // the handle to the decode thread DWORD WINAPI __stdcall PlayThread(void *b); // the decode thread procedure void config(HWND hwndParent) { MessageBox(hwndParent, "AAC files without an ADIF header must be 44100kHz\n" "and must be encoded using MAIN or LOW profile.\n" "When an ADIF header is present, configuration\n" "will be done automatically.", "Configuration",MB_OK); } void about(HWND hwndParent) { MessageBox(hwndParent,"Freeware AAC Player v0.5\nhttp://www.slimline.net/aac/","About AAC Player",MB_OK); } void init() { } void quit() { } int isourfile(char *fn) { return 0; } // used for detecting URL streams.. unused here. strncmp(fn,"http://",7) to detect HTTP streams, etc int play(char *fn) { int maxlatency; int thread_id; aac_decode_init(&fInfo, fn); strcpy(lastfn,fn); paused=0; decode_pos_ms=0; seek_needed=-1; maxlatency = mod.outMod->Open(fInfo.sampling_rate,fInfo.channels, BPS, -1,-1); if (maxlatency < 0) // error opening device { return 1; } // initialize vis stuff mod.SAVSAInit(maxlatency, fInfo.sampling_rate); mod.VSASetInfo(fInfo.sampling_rate, fInfo.channels); mod.outMod->SetVolume(-666); // set the output plug-ins default volume killPlayThread = 0; play_thread_handle = (HANDLE) CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) PlayThread,(void *) &killPlayThread,0,&thread_id); return 0; } void pause() { paused=1; mod.outMod->Pause(1); } void unpause() { paused=0; mod.outMod->Pause(0); } int ispaused() { return paused; } void stop() { if (play_thread_handle != INVALID_HANDLE_VALUE) { killPlayThread=1; if (WaitForSingleObject(play_thread_handle,INFINITE) == WAIT_TIMEOUT) { MessageBox(mod.hMainWindow,"error asking thread to die!\n","error killing decode thread",0); TerminateThread(play_thread_handle,0); } CloseHandle(play_thread_handle); play_thread_handle = INVALID_HANDLE_VALUE; } aac_decode_free(); mod.outMod->Close(); mod.SAVSADeInit(); } int getlength() { // return (int)((file_length/(((Bitrate*8)/1000)*BPS))*1000); return fInfo.length; } int getoutputtime() { return decode_pos_ms+(mod.outMod->GetOutputTime()-mod.outMod->GetWrittenTime()); } void setoutputtime(int time_in_ms) { seek_needed=time_in_ms; } void setvolume(int volume) { mod.outMod->SetVolume(volume); } void setpan(int pan) { mod.outMod->SetPan(pan); } int EOFfound = 0; unsigned long bitbuf; unsigned int subbitbuf; int bitcount; #define CHAR_BIT 8 #define BITBUFSIZ (CHAR_BIT * sizeof(bitbuf)) void fillbuf(int n, FILE *file) { bitbuf <<= n; while (n > bitcount) { bitbuf |= subbitbuf << (n -= bitcount); subbitbuf = (unsigned char) fgetc(file); bitcount = CHAR_BIT; } bitbuf |= subbitbuf >> (bitcount -= n); } unsigned int TMPgetbits(int n, FILE *file) { unsigned int x; x = bitbuf >> (BITBUFSIZ - n); fillbuf(n, file); return x; } void init_getbits(FILE *file) { bitbuf = 0; subbitbuf = 0; bitcount = 0; fillbuf(BITBUFSIZ, file); } int infoDlg(char *fn, HWND hwnd) { char Info[500]; char *strProfile; char adif_id[5]; FILE *file; int i; int unused; int bitstream, bitrate, profile, sr_idx, srate; static int SampleRates[] = {96000,88200,64000,48000,44100,32000,24000,22050,16000,12000,11025,8000}; file = fopen(fn,"rb"); for (i=0; i non const } int getbitrate(char *fn) { FILE *file; char adif_id[5]; int i, unused, bitrate; file = fopen(fn,"rb"); for (i=0; i = lastfn) p--; strcpy(title,++p); if (title[lstrlen(title)-4] == '.') title[lstrlen(title)-4] = '\0'; } } else // some other file { if (length_in_ms) { HANDLE hFile; *length_in_ms=-1000; hFile = CreateFile(filename,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if (hFile != INVALID_HANDLE_VALUE) { int bitrate = getbitrate(filename); *length_in_ms = (GetFileSize(hFile,NULL)/(((bitrate*8)/1000)*BPS))*1000; } CloseHandle(hFile); } if (title) { char *p=filename+strlen(filename); while (*p != '\\' && p >= filename) p--; strcpy(title,++p); if (title[lstrlen(title)-4] == '.') title[lstrlen(title)-4] = '\0'; } } } void eq_set(int on, char data[10], int preamp) { } DWORD WINAPI __stdcall PlayThread(void *b) { int done=0; int framebits = 0; int tmp_bits; int framecount = 0; char sample_buffer[2048*2]; int frame = 0; int last_frame = 0; while (! *((int *)b) ) { if (done) { mod.outMod->CanWrite(); if (!mod.outMod->IsPlaying()) { PostMessage(mod.hMainWindow,WM_WA_AAC_EOF,0,0); return 0; } Sleep(10); } else if (mod.outMod->CanWrite() >= ((1024*fInfo.channels*2)<<(mod.dsp_isactive()?1:0))) { int l = 1024*2*fInfo.channels; if (last_frame) { done=1; } else { tmp_bits = aac_decode_frame((short*)sample_buffer); if (!tmp_bits) last_frame = 1; framebits += tmp_bits; framecount++; if (framecount==(int)(fInfo.sampling_rate/8192)) { mod.SetInfo((int)(((framebits*8)/1000)*1.08+0.5),fInfo.sampling_rate/1000,fInfo.channels,1); framecount = 0; framebits = 0; } if ((frame > 0)&&(!stop_now)) { mod.SAAddPCMData(sample_buffer,fInfo.channels,BPS,decode_pos_ms); mod.VSAAddPCMData(sample_buffer,fInfo.channels,BPS,decode_pos_ms); decode_pos_ms+=(1024*1000)/fInfo.sampling_rate; if (mod.dsp_isactive()) l=mod.dsp_dosamples((short *)sample_buffer,l/fInfo.channels/(BPS/8),BPS,fInfo.channels,fInfo.sampling_rate)*(fInfo.channels*(BPS/8)); mod.outMod->Write(sample_buffer,l); } frame++; } } else Sleep(10); } return 0; } void CommonWarning(char *message) { MessageBox(mod.hMainWindow,message,"Warning...",MB_OK); } void CommonExit(int errorcode, char *message) { MessageBox(mod.hMainWindow,message,"Error...",MB_OK); stop_now = 1; } In_Module mod = { IN_VER, "Freeware AAC Decoder v0.5", 0, // hMainWindow 0, // hDllInstance "AAC\0AAC File (*.AAC)\0" , 0, // is_seekable 1, // uses output config, about, init, quit, getfileinfo, infoDlg, isourfile, play, pause, unpause, ispaused, stop, getlength, getoutputtime, setoutputtime, setvolume, setpan, 0,0,0,0,0,0,0,0,0, // vis stuff 0,0, // dsp eq_set, NULL, // setinfo 0 // out_mod }; __declspec( dllexport ) In_Module * winampGetInModule2() { return &mod; } #endif // PLUGIN