www.pudn.com > 播放mp3的控件.rar > stream.cpp


#include "common.h" 
#include  
#include  
#include "stream.h" 
#include "args.h" 
#include "player.h" 
 
unsigned char bsspace[2][MAXFRAMESIZE+512],*bsbuf=bsspace[1],*bsbufold; 
static HGLOBAL MBHnd; 
static char *MappedBuffer = NULL; 
static DWORD MappedPointer = 0; 
static int framesize; 
 
int bitindex; 
unsigned char *wordpointer; 
HANDLE StreamHandle; 
unsigned long StreamSize; 
int ibufnum, fsize, fsizeold, ssize, bsnum; 
unsigned long oldhead,firsthead, MinFrames, MaxFrames; 
esInputMode InputMode; 
 
bool StreamInit = false; 
 
bool Init_Stream(){ 
    StreamSize = 0;  
    char *buf = (char *)malloc(128); 
    SECURITY_ATTRIBUTES Sec; 
    // Set the security attributes  
    Sec.nLength = sizeof(SECURITY_ATTRIBUTES); 
    Sec.lpSecurityDescriptor = false; 
    Sec.bInheritHandle = false; 
    // Open the stream using CreateFile 
    InputMode = Args->InputMode;     
    if (InputMode == imCallback)  
    { 
        if (!Args->InOpenCB(Args->InCBData1, &Args->InCBData2, &Args->Seekable)) { 
            free(buf);  
            throw 1; 
        }; 
        if (!Args->InGetSizeCB(Args->InCBData1, Args->InCBData2, &StreamSize)) { 
            free(buf);  
            throw 1; 
        }; 
    } else { 
        // Open the stream using CreateFile 
        StreamHandle = CreateFile(Args->InName, GENERIC_READ, FILE_SHARE_READ, &Sec, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL); 
        if(StreamHandle == INVALID_HANDLE_VALUE)  
        {  
            free(buf);  
            throw 1;         
        }; 
        StreamSize = GetFileSize(StreamHandle, NULL); 
    } 
 
    // Set "stream is open" flag 
    LONG XPosi = 0; 
     
    // Global initializations 
    ibufnum=0;fsize=0,fsizeold=0;bsnum=0;oldhead=0;firsthead=0; 
    StreamInit = true;     
    return true; 
} 
 
bool Seek_Stream(unsigned long Position) 
{ 
    unsigned long Posi = Position; 
    unsigned long OldPosi, XPosi; 
     
    if(Posi >= 0 && Posi <= Stream_GetSize()) 
    { 
        XPosi =  Posi + 44; 
             
        if (InputMode == imCallback)  
        { 
            OldPosi = 0; 
            Args->InSeekCB(Args->InCBData1, Args->InCBData2, (LPDWORD) &OldPosi, FILE_CURRENT) ; 
             
            if (!Args->InSeekCB(Args->InCBData1, Args->InCBData2, (LPDWORD)&XPosi, FILE_BEGIN))  
            { 
                Args->InSeekCB(Args->InCBData1, Args->InCBData2, (LPDWORD)&OldPosi, FILE_BEGIN); 
                return false; 
            } 
        } else  
        { 
            OldPosi =  SetFilePointer(StreamHandle, 0, 0, FILE_CURRENT); 
            if (SetFilePointer(StreamHandle, XPosi, 0, FILE_BEGIN) == 0xFFFFFFFF)  
            { 
                SetFilePointer(StreamHandle, OldPosi, 0, FILE_BEGIN); 
                return false; 
            } 
        } 
         
        Args->CurrentPos = Stream_GetPosition() / Args->AudioBits * 8 /  Args->SampleRate / Args->Channels * 1000; 
        return true;  
    } 
    return false; 
} 
 
void Reset_Stream() 
{ 
    LONG XPosi = 0; 
    if (InputMode ==imCallback) { 
        if (!Args->InSeekCB(Args->InCBData1, Args->InCBData2, (LPDWORD) &XPosi, FILE_BEGIN)) { 
            return; 
        } 
    } else {                             
        if (SetFilePointer(StreamHandle, XPosi, 0, FILE_BEGIN) == 0xFFFFFFFF)  
            return; 
    } 
    Args->CurrentPos=0; 
} 
 
bool Done_Stream() 
{ 
    if (InputMode == imCallback)  
    { 
           if (StreamInit) Args->InCloseCB(Args->InCBData1, Args->InCBData2); 
    } 
    else  
    { 
        if (StreamInit) CloseHandle(StreamHandle); 
    } 
 
    StreamInit = false; 
    return true; 
} 
 
bool Stream_Read(void *p, unsigned long BytesToRead) 
{ 
    unsigned long numread; 
    if (Args->InputMode == imCallback)  
    { 
        if (!Args->InReadCB (Args->InCBData1, Args->InCBData2, p, BytesToRead, (DWORD*) &numread) || (numread != BytesToRead))  
        { 
            return false; 
        } 
        return true; 
    }  
    else  
    { 
        if (!ReadFile(StreamHandle, p, BytesToRead, (DWORD*) &numread, NULL) || (numread != BytesToRead))   
        { 
            return false; 
        } 
        return true; 
    }     
} 
 
long Stream_GetSize() 
{ 
    unsigned long StreamSize = 0; 
    InputMode = Args->InputMode;     
    if (Args->InputMode == imCallback)  
    { 
        if (!Args->InGetSizeCB(Args->InCBData1, Args->InCBData2, &StreamSize))  
        { 
            throw 1; 
        }; 
    } else  
    { 
        StreamSize = GetFileSize(StreamHandle, NULL); 
    }         
    return StreamSize; 
} 
 
extern long Stream_GetPosition() 
{ 
    unsigned long FilePos = 0; 
    if (Args->InputMode == imCallback)  
    { 
        Args->InSeekCB(Args->InCBData1, Args->InCBData2, (LPDWORD) &FilePos, FILE_CURRENT) ; 
    } else  
    { 
        FilePos =  SetFilePointer(StreamHandle, 0, 0, FILE_CURRENT); 
    } 
    return FilePos; 
} 
 
typedef struct _RIFFHEADER 
{ 
    ULONG RIFFSig; 
    ULONG BytesInFile; 
    ULONG WAVESig; 
    ULONG FmtSig; 
    ULONG Len; 
    __int16 Style; 
    __int16 Channels; 
    ULONG Rate; 
    ULONG AvgBps; 
    __int16 Align; 
    __int16 BitSize; 
} RIFFHEADER, *LPRIFFHEADER; 
 
 
typedef struct _RIFFDATAHEADER 
{ 
    ULONG DataSig; 
    ULONG Len; 
} RIFFDATAHEADER, *LPRIFFDATAHEADER; 
 
bool Stream_ReadHeader() 
{ 
    bool res = false; 
    RIFFHEADER RH; 
    RIFFDATAHEADER RDH; 
    if (Stream_Read(&RH, sizeof(RH))) 
    { 
        if (Stream_Read(&RDH, sizeof(RDH))) 
        { 
            res = true; 
            Args->AudioBits = RH.BitSize; 
            Args->Channels = RH.Channels; 
            Args->SampleRate = RH.Rate; 
            Args->Format = RH.Style; 
            res = true; 
        } 
    } 
    return res; 
}