⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpi_stream_internet.c

📁 < VC++视频音频开发>> 这本书的源码
💻 C
字号:
#include "stdafx.h"
#include "globals.h"
#include "CPI_Stream.h"
#include "CPI_CircleBuffer.h"
#include "CPI_Player_Messages.h"


#define CIC_STREAMBUFFERSIZE		0x40000
#define CIC_PREBUFFERAMOUNT			0x8000
#define CIC_READCHUNKSIZE			0x1000

typedef struct _CPs_BufferFillerContext
{
    char* m_pcFlexiURL;
    CPs_CircleBuffer* m_pCircleBuffer;
    BOOL m_bTerminate;
    HWND m_hWndNotify;


} CPs_BufferFillerContext;

typedef struct _CPs_InStream_Internet
{
    CPs_CircleBuffer* m_pCircleBuffer;
    HANDLE m_hFillerThread;
    CPs_BufferFillerContext* m_pBufferFillContext;

} CPs_InStream_Internet;



void CPSINET_Uninitialise(CPs_InStream* pStream);
BOOL CPSINET_Read(CPs_InStream* pStream, void* pDestBuffer, const unsigned int iBytesToRead, unsigned int* piBytesRead);
void CPSINET_Seek(CPs_InStream* pStream, const unsigned int iNewOffset);
UINT CPSINET_Tell(CPs_InStream* pStream);
UINT CPSINET_GetLength(CPs_InStream* pStream);
BOOL CPSINET_IsSeekable(CPs_InStream* pStream);
////////////////////////////////////////////////////////////////////////////////
unsigned int _stdcall EP_FillerThread(void* _pContext)
{
    CPs_BufferFillerContext* pContext = (CPs_BufferFillerContext*)_pContext;
    HINTERNET hInternet;
    HINTERNET hURLStream;
    DWORD dwTimeout;
    BOOL bStreamComplete = FALSE;
    INTERNET_BUFFERS internetbuffer;
    BYTE bReadBuffer[CIC_READCHUNKSIZE];

    CP_CHECKOBJECT(pContext);

    PostMessage(pContext->m_hWndNotify, CPNM_SETSTREAMINGSTATE, (WPARAM)TRUE, (LPARAM)0);

    hInternet = InternetOpen(	"CoolPlayer",
                              INTERNET_OPEN_TYPE_PRECONFIG,
                              NULL, NULL, 0L);
    if(hInternet == NULL)
    {
        pContext->m_pCircleBuffer->SetComplete(pContext->m_pCircleBuffer);
        CP_TRACE0("EP_FillerThread::NoInternetOpen");
        return 0;
    }

    dwTimeout = 2000;
    InternetSetOption(hInternet, INTERNET_OPTION_CONNECT_TIMEOUT, &dwTimeout, sizeof(dwTimeout));

    hURLStream = InternetOpenUrl(	hInternet,
                                  pContext->m_pcFlexiURL,
                                  NULL,
                                  0,
                                  INTERNET_FLAG_NO_CACHE_WRITE
                                  | INTERNET_FLAG_PRAGMA_NOCACHE,
                                  0);
    if(hURLStream == NULL)
    {
        InternetCloseHandle(hInternet);
        pContext->m_pCircleBuffer->SetComplete(pContext->m_pCircleBuffer);
        CP_TRACE1("EP_FillerThread::NoOpenURL %s",pContext->m_pcFlexiURL);
        return 0;
    }

    internetbuffer.dwStructSize = sizeof(internetbuffer);
    internetbuffer.Next = NULL;
    internetbuffer.lpcszHeader = NULL;
    internetbuffer.lpvBuffer = bReadBuffer;
    internetbuffer.dwBufferLength = CIC_READCHUNKSIZE;

    while(pContext->m_bTerminate == FALSE && bStreamComplete == FALSE)
    {
        BOOL bReadResult;

        if(pContext->m_pCircleBuffer->GetFreeSize(pContext->m_pCircleBuffer) < CIC_READCHUNKSIZE)
        {
            Sleep(20);
            continue;
        }

        internetbuffer.dwBufferLength = CIC_READCHUNKSIZE;
        bReadResult = InternetReadFileEx(hURLStream, &internetbuffer, IRF_NO_WAIT, 0);
        if(bReadResult == FALSE)
            bStreamComplete = TRUE;
        if(internetbuffer.dwBufferLength)
        {
            pContext->m_pCircleBuffer->Write(	pContext->m_pCircleBuffer,
                                              internetbuffer.lpvBuffer,
                                              internetbuffer.dwBufferLength);

            PostMessage(	pContext->m_hWndNotify,
                         CPNM_SETSTREAMINGSTATE,
                         (WPARAM)TRUE,
                         (LPARAM)(pContext->m_pCircleBuffer->GetUsedSize(pContext->m_pCircleBuffer)*100)/CIC_STREAMBUFFERSIZE);
        }
        else
            Sleep(20);
    }

    InternetCloseHandle(hURLStream);
    InternetCloseHandle(hInternet);

    pContext->m_pCircleBuffer->SetComplete(pContext->m_pCircleBuffer);
    PostMessage(pContext->m_hWndNotify, CPNM_SETSTREAMINGSTATE, (WPARAM)FALSE, (LPARAM)0);
    CP_TRACE0("EP_FillerThread normal shutdown");
    return 0;
}
//
CPs_InStream* CP_CreateInStream_Internet(const char* pcFlexiURL, HWND hWndOwner)
{
    CPs_InStream* pNewStream;
    CPs_InStream_Internet* pContext;
    unsigned int iUsedSpace;

    {
        pNewStream = (CPs_InStream*)malloc(sizeof(CPs_InStream));
        pContext = (CPs_InStream_Internet*)malloc(sizeof(CPs_InStream_Internet));

        pNewStream->Uninitialise = CPSINET_Uninitialise;
        pNewStream->Read = CPSINET_Read;
        pNewStream->Seek = CPSINET_Seek;
        pNewStream->GetLength = CPSINET_GetLength;
        pNewStream->IsSeekable = CPSINET_IsSeekable;
        pNewStream->m_pModuleCookie = pContext;

        pContext->m_pCircleBuffer = CP_CreateCircleBuffer(CIC_STREAMBUFFERSIZE);
    }

    {
        CPs_BufferFillerContext* pBufferFillContext;
        UINT uiThreadID;

        pBufferFillContext = (CPs_BufferFillerContext*)malloc(sizeof(CPs_BufferFillerContext));
        pBufferFillContext->m_pCircleBuffer = pContext->m_pCircleBuffer;
        pBufferFillContext->m_bTerminate = FALSE;
        STR_AllocSetString(&pBufferFillContext->m_pcFlexiURL, pcFlexiURL, FALSE);
        pBufferFillContext->m_hWndNotify = hWndOwner;

        pContext->m_hFillerThread = (HANDLE)_beginthreadex(NULL, 0, EP_FillerThread, pBufferFillContext, 0, &uiThreadID);
        pContext->m_pBufferFillContext = pBufferFillContext;
    }

    do
    {
        MSG msg;
        BOOL bMessageReceived;

        if(pContext->m_pCircleBuffer->IsComplete(pContext->m_pCircleBuffer))
            break;

        Sleep(100);
        iUsedSpace = pContext->m_pCircleBuffer->GetUsedSize(pContext->m_pCircleBuffer);

        bMessageReceived = PeekMessage(&msg, NULL, CPTM_STOP, CPTM_STOP, PM_NOREMOVE);
        if(bMessageReceived)
            break;
    }
    while(iUsedSpace < CIC_PREBUFFERAMOUNT);

    return pNewStream;
}
//
void CPSINET_Uninitialise(CPs_InStream* pStream)
{
    CPs_InStream_Internet* pContext = (CPs_InStream_Internet*)pStream->m_pModuleCookie;
    CP_CHECKOBJECT(pContext);

    pContext->m_pBufferFillContext->m_bTerminate = TRUE;
    WaitForSingleObject(pContext->m_hFillerThread, INFINITE);
    CloseHandle(pContext->m_hFillerThread);
    free(pContext->m_pBufferFillContext->m_pcFlexiURL);
    free(pContext->m_pBufferFillContext);

    pContext->m_pCircleBuffer->Uninitialise(pContext->m_pCircleBuffer);
    free(pContext);
    free(pStream);
}
//
BOOL CPSINET_Read(CPs_InStream* pStream, void* pDestBuffer, const unsigned int iBytesToRead, unsigned int* piBytesRead)
{
    CPs_InStream_Internet* pContext = (CPs_InStream_Internet*)pStream->m_pModuleCookie;
    CP_CHECKOBJECT(pContext);

    return pContext->m_pCircleBuffer->Read(pContext->m_pCircleBuffer, pDestBuffer, iBytesToRead, piBytesRead);
}
//
void CPSINET_Seek(CPs_InStream* pStream, const unsigned int iNewOffset)
{
    CPs_InStream_Internet* pContext = (CPs_InStream_Internet*)pStream->m_pModuleCookie;
    CP_CHECKOBJECT(pContext);

}
//

unsigned int CPSINET_GetLength(CPs_InStream* pStream)
{
    CPs_InStream_Internet* pContext = (CPs_InStream_Internet*)pStream->m_pModuleCookie;
    CP_CHECKOBJECT(pContext);

    return 0;
}
//
BOOL CPSINET_IsSeekable(CPs_InStream* pStream)
{
    return FALSE;
}

UINT CPSINET_Tell(CPs_InStream* pStream)
{
	return 0;

}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -