Ignore:
Timestamp:
Mar 23, 2000, 6:14:45 PM (25 years ago)
Author:
cbratschi
Message:

dynamic WINMM linking

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/comctl32/animate.cpp

    r2875 r3203  
    1 /* $Id: animate.cpp,v 1.1 2000-02-23 17:09:40 cbratschi Exp $ */
     1/* $Id: animate.cpp,v 1.2 2000-03-23 17:14:33 cbratschi Exp $ */
    22/*
    33 * Animation control
     
    2020#include "animate.h"
    2121
     22HINSTANCE hMSVFW32 = 0;
     23
     24HINSTANCE hWINMM = 0;
     25static LONG     (*WINAPI WINMM_mmioRead)(HMMIO,HPSTR,LONG) = 0;
     26static LONG     (*WINAPI WINMM_mmioSeek)(HMMIO,LONG,INT) = 0;
     27static MMRESULT (*WINAPI WINMM_mmioClose)(HMMIO,UINT) = 0;
     28static HMMIO    (*WINAPI WINMM_mmioOpenA)(LPSTR ,MMIOINFO*,DWORD) = 0;
     29static HMMIO    (*WINAPI WINMM_mmioOpenW)(LPWSTR,MMIOINFO*,DWORD) = 0;
     30static UINT     (*WINAPI WINMM_mmioDescend)(HMMIO,MMCKINFO*,const MMCKINFO*,UINT) = 0;
     31static UINT     (*WINAPI WINMM_mmioAscend)(HMMIO,MMCKINFO*,UINT) = 0;
     32
    2233#define ANIMATE_GetInfoPtr(hwnd) ((ANIMATE_INFO*)getInfoPtr(hwnd))
     34
     35static BOOL ANIMATE_LoadMSVFW32(VOID)
     36{
     37  if (hMSVFW32) return TRUE;
     38
     39  hMSVFW32 = LoadLibraryA("msvfw32.dll");
     40
     41  return hMSVFW32;
     42}
     43
     44static VOID ANIMATE_UnloadMSVFW32(VOID)
     45{
     46  if (hMSVFW32)
     47  {
     48    FreeLibrary(hMSVFW32);
     49    hMSVFW32 = 0;
     50  }
     51}
     52
     53static BOOL ANIMATE_LoadWINMM(VOID)
     54{
     55  if (hWINMM) return TRUE;
     56
     57  hWINMM = LoadLibraryA("WINMM");
     58  if (!hWINMM) return FALSE;
     59
     60  *(VOID**)&WINMM_mmioRead    = (VOID*)GetProcAddress(hWINMM,"mmioRead");
     61  *(VOID**)&WINMM_mmioSeek    = (VOID*)GetProcAddress(hWINMM,"mmioSeek");
     62  *(VOID**)&WINMM_mmioClose   = (VOID*)GetProcAddress(hWINMM,"mmioClose");
     63  *(VOID**)&WINMM_mmioOpenA   = (VOID*)GetProcAddress(hWINMM,"mmioOpenA");
     64  *(VOID**)&WINMM_mmioOpenW   = (VOID*)GetProcAddress(hWINMM,"mmioOpenW");
     65  *(VOID**)&WINMM_mmioDescend = (VOID*)GetProcAddress(hWINMM,"mmioDescend");
     66  *(VOID**)&WINMM_mmioAscend  = (VOID*)GetProcAddress(hWINMM,"mmioAscend");
     67
     68  return TRUE;
     69}
     70
     71static VOID ANIMATE_UnloadWINMM(VOID)
     72{
     73  if (hWINMM)
     74  {
     75    FreeLibrary(hWINMM);
     76    hWINMM = 0;
     77    *(VOID**)&WINMM_mmioRead    = NULL;
     78    *(VOID**)&WINMM_mmioSeek    = NULL;
     79    *(VOID**)&WINMM_mmioClose   = NULL;
     80    *(VOID**)&WINMM_mmioOpenA   = NULL;
     81    *(VOID**)&WINMM_mmioOpenW   = NULL;
     82    *(VOID**)&WINMM_mmioDescend = NULL;
     83    *(VOID**)&WINMM_mmioAscend  = NULL;
     84  }
     85}
    2386
    2487static BOOL ANIMATE_LoadRes(ANIMATE_INFO *infoPtr,HINSTANCE hInst,LPWSTR lpName,BOOL unicode)
     
    45108    mminfo.pchBuffer = (LPSTR)lpAvi;
    46109    mminfo.cchBuffer = SizeofResource(hInst, hrsrc);
    47     infoPtr->hMMio = mmioOpenA(NULL, &mminfo, MMIO_READ);
     110    infoPtr->hMMio = WINMM_mmioOpenA(NULL, &mminfo, MMIO_READ);
    48111
    49112    if (!infoPtr->hMMio) {
     
    58121{
    59122    if (unicode)
    60       infoPtr->hMMio = mmioOpenW(lpName,NULL,MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);
     123      infoPtr->hMMio = WINMM_mmioOpenW(lpName,NULL,MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);
    61124    else
    62       infoPtr->hMMio = mmioOpenA((LPSTR)lpName,NULL,MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);
     125      infoPtr->hMMio = WINMM_mmioOpenA((LPSTR)lpName,NULL,MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);
    63126
    64127    if (!infoPtr->hMMio)
     
    95158    if (infoPtr->hMMio) {
    96159        ANIMATE_DoStop(infoPtr);
    97         mmioClose(infoPtr->hMMio, 0);
     160        WINMM_mmioClose(infoPtr->hMMio, 0);
    98161        if (infoPtr->hRes) {
    99162            FreeResource(infoPtr->hRes);
     
    154217    EnterCriticalSection(&infoPtr->cs);
    155218
    156     mmioSeek(infoPtr->hMMio, infoPtr->lpIndex[infoPtr->currFrame], SEEK_SET);
    157     mmioRead(infoPtr->hMMio, (HPSTR)infoPtr->indata, infoPtr->ash.dwSuggestedBufferSize);
     219    WINMM_mmioSeek(infoPtr->hMMio, infoPtr->lpIndex[infoPtr->currFrame], SEEK_SET);
     220    WINMM_mmioRead(infoPtr->hMMio, (HPSTR)infoPtr->indata, infoPtr->ash.dwSuggestedBufferSize);
    158221
    159222    if (infoPtr->hic &&
     
    257320    DWORD               insize;
    258321
    259     if (mmioDescend(infoPtr->hMMio, &ckMainRIFF, NULL, 0) != 0) {
     322    if (WINMM_mmioDescend(infoPtr->hMMio, &ckMainRIFF, NULL, 0) != 0) {
    260323        //WARN("Can't find 'RIFF' chunk\n");
    261324        return FALSE;
     
    269332
    270333    mmckHead.fccType = mmioFOURCC('h', 'd', 'r', 'l');
    271     if (mmioDescend(infoPtr->hMMio, &mmckHead, &ckMainRIFF, MMIO_FINDLIST) != 0) {
     334    if (WINMM_mmioDescend(infoPtr->hMMio, &mmckHead, &ckMainRIFF, MMIO_FINDLIST) != 0) {
    272335        //WARN("Can't find 'hdrl' list\n");
    273336        return FALSE;
     
    275338
    276339    mmckInfo.ckid = mmioFOURCC('a', 'v', 'i', 'h');
    277     if (mmioDescend(infoPtr->hMMio, &mmckInfo, &mmckHead, MMIO_FINDCHUNK) != 0) {
     340    if (WINMM_mmioDescend(infoPtr->hMMio, &mmckInfo, &mmckHead, MMIO_FINDCHUNK) != 0) {
    278341        //WARN("Can't find 'avih' chunk\n");
    279342        return FALSE;
    280343    }
    281344
    282     mmioRead(infoPtr->hMMio, (LPSTR)&infoPtr->mah, sizeof(infoPtr->mah));
     345    WINMM_mmioRead(infoPtr->hMMio, (LPSTR)&infoPtr->mah, sizeof(infoPtr->mah));
    283346    //TRACE("mah.dwMicroSecPerFrame=%ld\n",     infoPtr->mah.dwMicroSecPerFrame);
    284347    //TRACE("mah.dwMaxBytesPerSec=%ld\n",       infoPtr->mah.dwMaxBytesPerSec);
     
    291354    //TRACE("mah.dwWidth=%ld\n",                        infoPtr->mah.dwWidth);
    292355    //TRACE("mah.dwHeight=%ld\n",               infoPtr->mah.dwHeight);
    293     mmioAscend(infoPtr->hMMio, &mmckInfo, 0);
     356    WINMM_mmioAscend(infoPtr->hMMio, &mmckInfo, 0);
    294357
    295358    mmckList.fccType = mmioFOURCC('s', 't', 'r', 'l');
    296     if (mmioDescend(infoPtr->hMMio, &mmckList, &mmckHead, MMIO_FINDLIST) != 0) {
     359    if (WINMM_mmioDescend(infoPtr->hMMio, &mmckList, &mmckHead, MMIO_FINDLIST) != 0) {
    297360        //WARN("Can't find 'strl' list\n");
    298361        return FALSE;
     
    300363
    301364    mmckInfo.ckid = mmioFOURCC('s', 't', 'r', 'h');
    302     if (mmioDescend(infoPtr->hMMio, &mmckInfo, &mmckList, MMIO_FINDCHUNK) != 0) {
     365    if (WINMM_mmioDescend(infoPtr->hMMio, &mmckInfo, &mmckList, MMIO_FINDCHUNK) != 0) {
    303366        //WARN("Can't find 'strh' chunk\n");
    304367        return FALSE;
    305368    }
    306369
    307     mmioRead(infoPtr->hMMio, (LPSTR)&infoPtr->ash, sizeof(infoPtr->ash));
     370    WINMM_mmioRead(infoPtr->hMMio, (LPSTR)&infoPtr->ash, sizeof(infoPtr->ash));
    308371    //TRACE("ash.fccType='%c%c%c%c'\n",                 LOBYTE(LOWORD(infoPtr->ash.fccType)),
    309372    //                                          HIBYTE(LOWORD(infoPtr->ash.fccType)),
     
    327390    //TRACE("ash.rcFrame=(%d,%d,%d,%d)\n",      infoPtr->ash.rcFrame.top, infoPtr->ash.rcFrame.left,
    328391    //    infoPtr->ash.rcFrame.bottom, infoPtr->ash.rcFrame.right);
    329     mmioAscend(infoPtr->hMMio, &mmckInfo, 0);
     392    WINMM_mmioAscend(infoPtr->hMMio, &mmckInfo, 0);
    330393
    331394    mmckInfo.ckid = mmioFOURCC('s', 't', 'r', 'f');
    332     if (mmioDescend(infoPtr->hMMio, &mmckInfo, &mmckList, MMIO_FINDCHUNK) != 0) {
     395    if (WINMM_mmioDescend(infoPtr->hMMio, &mmckInfo, &mmckList, MMIO_FINDCHUNK) != 0) {
    333396        //WARN("Can't find 'strh' chunk\n");
    334397        return FALSE;
     
    341404    }
    342405
    343     mmioRead(infoPtr->hMMio, (LPSTR)infoPtr->inbih, mmckInfo.cksize);
     406    WINMM_mmioRead(infoPtr->hMMio, (LPSTR)infoPtr->inbih, mmckInfo.cksize);
    344407    //TRACE("bih.biSize=%ld\n",                 infoPtr->inbih->biSize);
    345408    //TRACE("bih.biWidth=%ld\n",                infoPtr->inbih->biWidth);
     
    353416    //TRACE("bih.biClrUsed=%ld\n",      infoPtr->inbih->biClrUsed);
    354417    //TRACE("bih.biClrImportant=%ld\n",         infoPtr->inbih->biClrImportant);
    355     mmioAscend(infoPtr->hMMio, &mmckInfo, 0);
    356 
    357     mmioAscend(infoPtr->hMMio, &mmckList, 0);
     418    WINMM_mmioAscend(infoPtr->hMMio, &mmckInfo, 0);
     419
     420    WINMM_mmioAscend(infoPtr->hMMio, &mmckList, 0);
    358421
    359422#if 0
     
    362425     */
    363426    mmckList.fccType = mmioFOURCC('s', 't', 'r', 'l');
    364     if (mmioDescend(infoPtr->hMMio, &mmckList, &mmckHead, MMIO_FINDLIST) == 0) {
     427    if (WINMM_mmioDescend(infoPtr->hMMio, &mmckList, &mmckHead, MMIO_FINDLIST) == 0) {
    365428        //WARN("There should be a single 'strl' list\n");
    366429        return FALSE;
     
    368431#endif
    369432
    370     mmioAscend(infoPtr->hMMio, &mmckHead, 0);
     433    WINMM_mmioAscend(infoPtr->hMMio, &mmckHead, 0);
    371434
    372435    /* no need to read optional JUNK chunk */
    373436
    374437    mmckList.fccType = mmioFOURCC('m', 'o', 'v', 'i');
    375     if (mmioDescend(infoPtr->hMMio, &mmckList, &ckMainRIFF, MMIO_FINDLIST) != 0) {
     438    if (WINMM_mmioDescend(infoPtr->hMMio, &mmckList, &ckMainRIFF, MMIO_FINDLIST) != 0) {
    376439        //WARN("Can't find 'movi' list\n");
    377440        return FALSE;
     
    388451
    389452    numFrame = insize = 0;
    390     while (mmioDescend(infoPtr->hMMio, &mmckInfo, &mmckList, 0) == 0 &&
     453    while (WINMM_mmioDescend(infoPtr->hMMio, &mmckInfo, &mmckList, 0) == 0 &&
    391454           numFrame < infoPtr->mah.dwTotalFrames) {
    392455        infoPtr->lpIndex[numFrame] = mmckInfo.dwDataOffset;
     
    394457            insize = mmckInfo.cksize;
    395458        numFrame++;
    396         mmioAscend(infoPtr->hMMio, &mmckInfo, 0);
     459        WINMM_mmioAscend(infoPtr->hMMio, &mmckInfo, 0);
    397460    }
    398461    if (numFrame != infoPtr->mah.dwTotalFrames) {
     
    547610{
    548611    ANIMATE_INFO*       infoPtr;
    549     HMODULE             hModule = LoadLibraryA("msvfw32.dll");
    550 
    551     if (!hModule)
    552         return FALSE;
     612
     613    if (!ANIMATE_LoadWINMM()) return FALSE;
     614    if (!ANIMATE_LoadMSVFW32()) return FALSE;
    553615
    554616    /* allocate memory for info structure */
     
    560622
    561623    /* Temporary hack until we get dllglue up and running */
    562     *(VOID**)&infoPtr->fnICOpen        = (VOID*)GetProcAddress(hModule, "ICOpen");
    563     *(VOID**)&infoPtr->fnICClose       = (VOID*)GetProcAddress(hModule, "ICClose");
    564     *(VOID**)&infoPtr->fnICSendMessage = (VOID*)GetProcAddress(hModule, "ICSendMessage");
    565     *(VOID**)&infoPtr->fnICDecompress  = (VOID*)GetProcAddress(hModule, "ICDecompress");
     624    *(VOID**)&infoPtr->fnICOpen        = (VOID*)GetProcAddress(hMSVFW32,"ICOpen");
     625    *(VOID**)&infoPtr->fnICClose       = (VOID*)GetProcAddress(hMSVFW32,"ICClose");
     626    *(VOID**)&infoPtr->fnICSendMessage = (VOID*)GetProcAddress(hMSVFW32,"ICSendMessage");
     627    *(VOID**)&infoPtr->fnICDecompress  = (VOID*)GetProcAddress(hMSVFW32,"ICDecompress");
    566628
    567629    //TRACE("Animate style=0x%08lx, parent=%08lx\n", GetWindowLongA(hWnd, GWL_STYLE), (DWORD)GetParent(hWnd));
Note: See TracChangeset for help on using the changeset viewer.