4 * Copyright 1993, 1994 Martin Ayotte
5 * Copyright 1998 Marcus Meissner
6 * Copyright 1999 Eric Pouech
8 * Originally distributed under LPGL 2.1 (or later) by the Wine project.
10 * Modified for use with MPlayer, detailed CVS changelog at
11 * http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
13 * File now distributed as part of VLC media player with no modifications.
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
42 #include "wine/driver.h"
43 #include "wine/pe_image.h"
44 #include "wine/winreg.h"
48 #include "ldt_keeper.h"
56 char* def_path=WIN32_PATH;
58 extern char* def_path;
64 * STORE_ALL/REST_ALL seems like an attempt to workaround problems due to
65 * WINAPI/no-WINAPI bustage.
67 * There should be no need for the STORE_ALL/REST_ALL hack once all
68 * function definitions agree with their prototypes (WINAPI-wise) and
69 * we make sure, that we do not call these functions without a proper
76 // this asm code is no longer needed
78 __asm__ __volatile__ ( \
86 __asm__ __volatile__ ( \
94 static int needs_free=0;
95 void SetCodecPath(const char* path)
97 if(needs_free)free(def_path);
104 def_path = (char*) malloc(strlen(path)+1);
105 strcpy(def_path, path);
109 static DWORD dwDrvID = 0;
111 LRESULT WINAPI SendDriverMessage(HDRVR hDriver, UINT message,
112 LPARAM lParam1, LPARAM lParam2)
114 DRVR* module=(DRVR*)hDriver;
120 printf("SendDriverMessage: driver %X, message %X, arg1 %X, arg2 %X\n", hDriver, message, lParam1, lParam2);
122 if (!module || !module->hDriverModule || !module->DriverProc) return -1;
124 __asm__ __volatile__ ("fsave (%0)\n\t": :"r"(&qw));
132 result=module->DriverProc(module->dwDriverID, hDriver, message, lParam1, lParam2);
136 __asm__ __volatile__ ("frstor (%0)\n\t": :"r"(&qw));
140 printf("\t\tResult: %X\n", result);
145 void DrvClose(HDRVR hDriver)
149 DRVR* d = (DRVR*)hDriver;
150 if (d->hDriverModule)
157 SendDriverMessage(hDriver, DRV_CLOSE, 0, 0);
159 SendDriverMessage(hDriver, DRV_FREE, 0, 0);
161 FreeLibrary(d->hDriverModule);
170 //DrvOpen(LPCSTR lpszDriverName, LPCSTR lpszSectionName, LPARAM lParam2)
171 HDRVR DrvOpen(LPARAM lParam2)
176 const char* filename = (const char*) ((ICOPEN*) lParam2)->pV1Reserved;
182 printf("Loading codec DLL: '%s'\n",filename);
185 hDriver = (NPDRVR) malloc(sizeof(DRVR));
188 memset((void*)hDriver, 0, sizeof(DRVR));
195 hDriver->hDriverModule = LoadLibraryA(filename);
196 if (!hDriver->hDriverModule)
198 printf("Can't open library %s\n", filename);
199 DrvClose((HDRVR)hDriver);
203 hDriver->DriverProc = (DRIVERPROC) GetProcAddress(hDriver->hDriverModule,
205 if (!hDriver->DriverProc)
207 printf("Library %s is not a valid VfW/ACM codec\n", filename);
208 DrvClose((HDRVR)hDriver);
212 TRACE("DriverProc == %X\n", hDriver->DriverProc);
213 SendDriverMessage((HDRVR)hDriver, DRV_LOAD, 0, 0);
214 TRACE("DRV_LOAD Ok!\n");
215 SendDriverMessage((HDRVR)hDriver, DRV_ENABLE, 0, 0);
216 TRACE("DRV_ENABLE Ok!\n");
217 hDriver->dwDriverID = ++dwDrvID; // generate new id
219 // open driver and remmeber proper DriverID
220 hDriver->dwDriverID = SendDriverMessage((HDRVR)hDriver, DRV_OPEN, (LPARAM) unknown, lParam2);
221 TRACE("DRV_OPEN Ok!(%X)\n", hDriver->dwDriverID);
223 printf("Loaded DLL driver %s at %x\n", filename, hDriver->hDriverModule);
224 return (HDRVR)hDriver;