source: trunk/classes/mm-progs/videoplayer/mmplayer.c@ 46

Last change on this file since 46 was 46, checked in by gyoung, 2 years ago

Fix missing = sign

File size: 42.7 KB
Line 
1/*
2 * mmplayer.c (C) Chris Wohlgemuth 2002-2003
3 *
4 */
5/*
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
9 * any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; see the file COPYING. If not, write to
18 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20/*
21 * If you need another license for your project/product (commercial,
22 * noncommercial, whatever) contact me at
23 *
24 * http://www.os2world.com/cdwriting
25 * http://www.geocities.com/SiliconValley/Sector/5785/
26 *
27 */
28
29#define INCL_DOS
30#define INCL_DOSFILEMGR
31#define INCL_DOSERRORS
32#define INCL_WIN
33#define INCL_WINWORKPLACE
34#define INCL_OS2MM
35#define INCL_MMIOOS2
36#define INCL_MCIOS2
37#define INCL_GPI
38#define INCL_PM
39
40#ifdef __EMX__
41//#define USE_OS2_TOOLKIT_HEADERS
42#endif
43#include <os2.h>
44#include <sys\types.h>
45#include <sys\stat.h>
46#include <stdio.h>
47#include <string.h>
48#include <stdlib.h>
49#include <os2me.h>
50#include "common.h"
51#include "mmplayerres.h"
52#include "mmres.h"
53#include "mmplayer.h"
54#include "mmprogs_defaults.h"
55#include "sys_funcs.h"
56
57#ifndef OPEN_DEFAULT
58/* Open views for the wpOpen() method */
59
60 #define OPEN_UNKNOWN -1
61 #define OPEN_DEFAULT 0
62 #define OPEN_CONTENTS 1
63 #define OPEN_SETTINGS 2
64 #define OPEN_HELP 3
65 #define OPEN_RUNNING 4
66 #define OPEN_PROMPTDLG 5
67 #define OPEN_PALETTE 121 /*SPLIT*/
68 #define OPEN_USER 0x6500
69#endif
70
71LOADEDBITMAP allBMPs[NUM_CTRL_IDX];
72
73/* Format:
74 typedef struct
75 {
76 INT id;
77 RECTL rclSource;
78 HBITMAP hbmSource;
79 RECTL rclDest;
80 }CONTROLINFO;
81 */
82CONTROLINFO ciControls[NUM_CTRL_IDX]={
83 {0,{0,0,414,70}, NULLHANDLE,{0}}, /* main */
84 /* Achtung destination verwendet fuer position */
85
86 {IDPB_MMPLAYERPLAY, {0, 0, 36, 36},NULLHANDLE, { 108, 24, 144, 60} },/* Play */
87 {IDPB_MMPLAYERPLAY, {0, 0, 36,36},NULLHANDLE, { 108, 24, 144, 60} }, /* Playsel */
88 {IDPB_MMPLAYERSTOP, {0, 0, 36, 36},NULLHANDLE, { 24, 24, 60, 60} },/* Stop */
89 {IDPB_MMPLAYERSTOP, {0, 0, 36,36},NULLHANDLE, { 24, 24, 60, 60} }, /* Stop sel */
90 {IDPB_MMPLAYERPAUSE, {0, 0, 36, 36},NULLHANDLE, { 66, 24, 101, 60} },/* Pause */
91 {IDPB_MMPLAYERPAUSE, {0, 0, 36,36},NULLHANDLE, { 66, 24, 101, 60} }, /* Pause sel */
92 {IDSL_MMPLAYERPOSBAR,{191-5, 19-4, 389-5,32-4}, NULLHANDLE, { 191, 19, 389, 32} }, //NULLHANDLE, { 0, 0, 191,10} },
93 {IDPB_MMPLAYERSLIDERARM,{0,1,9,8},NULLHANDLE, {0,0,9,9} },
94 {IDST_MMPLAYERPLAYTIME, {191, 32, 391,54},NULLHANDLE, { 0, 0, 190, 25} },
95 {IDSL_MMPLAYERVOLUME,{15, 2,141,17},NULLHANDLE, {20, 6, 146, 21} }, //{0, 0, 126, 9} /* {10,18,93,13} */ },
96 {IDSL_MMPLAYERVOLUMEARM,{0,0,9,9},NULLHANDLE, {0,0,9,9}},
97 {IDSL_MMPLAYERVOLUMEARM,{0,0,9,9},NULLHANDLE, {0,0,9,9}},
98};
99
100
101HWND hwndVideo, hwndVideoClient;
102
103#define NUMPARAMS 2
104
105/* argv[0]: progname
106 * argv[1]: audio file
107 * ( argv[2]: class )
108 */
109
110//#define DEBUG
111#ifdef DEBUG
112void HlpWriteToTrapLog(const char* chrFormat, ...);
113#endif
114
115BOOL IniSaveWindowPos(char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
116BOOL IniRestoreWindowPos(char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
117int IniRestoreInt(char * iniFile, char* chrApp, char *chrKey, int defaultInt);
118BOOL IniSaveInt(char * iniFile, char* chrApp, char *chrKey, int theInt);
119BOOL HlpBuildMMProgIniFileName(char* chrProgname, char * chrBuffer, ULONG ulBufferSize);
120void freeResHandle();
121HMODULE queryResModuleHandle(char *chrExePath);
122BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
123//MRESULT menuInsertMenuSeparator(int iPosition, HWND hwndMenu, HWND hwndSubMenu);
124MRESULT menuInsertMenuSeparator(HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition );
125//MRESULT menuInsertMenuItem(int iPosition, HWND hwndMenu, HWND hwndSubMenu, int iID, char * chrText);
126SHORT menuInsertMenuItem( HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition, int iID, char * chrText);
127void pmUsage();
128ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
129 char* title, ULONG ulTitleID, LONG lSizeTitle,
130 HMODULE hResource, HWND hwnd, ULONG ulFlags);
131
132
133MRESULT EXPENTRY playTimeTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
134MRESULT drawSlider(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2, USHORT id);
135MRESULT EXPENTRY privateSliderProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
136BOOL paintHilitedControl(HWND hwnd, USHORT usControl, BOOL bHilite);
137MRESULT paintControls(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
138MRESULT EXPENTRY bgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
139MRESULT EXPENTRY buttonProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
140
141/* Every folder has one running play thread to handle play commands */
142void _Optlink playThreadFunc (void *arg);
143void controlPlaying(HWND hwndDialog, ULONG ulAction, ULONG ulReserved);
144BOOL stopAudioFile(HWND hwndFrame);
145BOOL seekAudioFile(LONG lPosSec);
146void showPlayTimeDisplay(HWND hwndFrame, BOOL bShow);
147void togglePlayTimeDisplayVisibility(HWND hwndFrame);
148void setPlayTimeText(HWND hwndFrame);
149
150BOOL writeVolumeToIni(char * iniFile, char* chrApp, char *chrKey, ULONG ulVoume);
151int readVolumeFromIni(char * iniFile, char* chrApp, char *chrKey, int iDefault);
152BOOL writeDisplayTypeToIni(char * iniFile, char* chrApp, char *chrKey, int iDisplay);
153int readDisplayTypeFromIni(char * iniFile, char* chrApp, char *chrKey, int iDefault);
154
155char logName[]="mmplayer.log";
156
157extern SWP swpWindow;
158BOOL bHaveWindowPos=FALSE;
159
160/* Track to play. Full path */
161char chrSourceName[CCHMAXPATH]={0};
162char * chrPtrName=NULLHANDLE; /* Pointer to filename */
163char chrClassName[100]= {0};
164
165char chrIniFile[CCHMAXPATH];
166
167int numArgs;
168char* params[NUMPARAMS];
169
170/* TRUE when track is playing */
171BOOL bIsPlaying=FALSE;
172/* TRUE when track is paused */
173BOOL bPaused=FALSE;
174/* TRUE when user drags the position slider */
175BOOL bPosDragging=FALSE;
176BOOL bIsMidi=FALSE;
177
178/* Which display to show */
179/* 0: time, 1: remaining, 2: filename */
180int iWhichDisplay=0;
181/* Display timer for changing between track info */
182ULONG ulDisplayTimer=0;
183
184ULONG ulVolume=75;
185
186PID ulPid;
187/* The play time of the track */
188ULONG ulTotalLength=0;
189/* Current time in track */
190ULONG ulPos=0;
191
192HMODULE RESSOURCEHANDLE=0;
193
194HMODULE BMP_RESSOURCEHANDLE=0;
195
196PFNWP oldPlayTimeProc;
197PFNWP orgBgProc=NULLHANDLE; /* Org proc of background */
198PFNWP orgButtonProc=NULLHANDLE;
199
200HPOINTER hptrArrowWE=NULLHANDLE;
201
202void HlpContextMenu(HWND hwnd, USHORT usItem, BOOL fCheckItem)
203{
204 POINTL ptl;
205 HWND hwndPopup;
206
207 // hwndPopup = WinLoadMenu(hwnd, _queryResModuleHandle(), ID_MENUTIMECONTEXT) ;
208 hwndPopup = WinLoadMenu(hwnd, RESSOURCEHANDLE, ID_MENUTIMECONTEXT) ;
209 if (hwndPopup == NULLHANDLE) {
210 DosBeep(100,1000);
211 return;
212 }
213 if(fCheckItem)
214 WinSendMsg(hwndPopup,MM_SETITEMATTR,MPFROM2SHORT(usItem, TRUE), MPFROM2SHORT(MIA_CHECKED,MIA_CHECKED));
215
216 WinQueryPointerPos(HWND_DESKTOP, &ptl) ;
217 WinMapWindowPoints(HWND_DESKTOP,hwnd,&ptl,1);
218 WinPopupMenu(hwnd, hwnd, hwndPopup,
219 ptl.x, ptl.y, 0, PU_HCONSTRAIN | PU_VCONSTRAIN |
220 PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_MOUSEBUTTON2 | PU_NONE );
221
222}
223
224static void _loadBmps()
225{
226 HPS hps;
227 HMODULE hResource;
228
229 if(allBMPs[MAIN_BMP_IDX].hbm)
230 return;
231
232 hResource=BMP_RESSOURCEHANDLE; //_queryResModuleHandle();
233 hps=WinGetPS(HWND_DESKTOP);
234
235 /* The main BMP */
236 allBMPs[MAIN_BMP_IDX].hbm=GpiLoadBitmap(hps, hResource, IDBMP_TOPMIDDLE, 0, 0);
237 GpiQueryBitmapParameters(allBMPs[MAIN_BMP_IDX].hbm, &allBMPs[MAIN_BMP_IDX].bmpInfoHdr);
238
239 /* Stop */
240 allBMPs[CTRLIDX_STOPBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_STOP, 0, 0);
241 GpiQueryBitmapParameters(allBMPs[CTRLIDX_STOPBUTTON].hbm, &allBMPs[CTRLIDX_STOPBUTTON].bmpInfoHdr);
242 ciControls[CTRLIDX_STOPBUTTON].hbmSource=allBMPs[CTRLIDX_STOPBUTTON].hbm;
243
244 /* Stop sel */
245 allBMPs[CTRLIDX_STOPBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_STOPSEL, 0, 0);
246 GpiQueryBitmapParameters(allBMPs[CTRLIDX_STOPBUTTONSEL].hbm, &allBMPs[CTRLIDX_STOPBUTTONSEL].bmpInfoHdr);
247 ciControls[CTRLIDX_STOPBUTTONSEL].hbmSource=allBMPs[CTRLIDX_STOPBUTTONSEL].hbm;
248
249 /* Pause */
250 allBMPs[CTRLIDX_PAUSEBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PAUSE, 0, 0);
251 GpiQueryBitmapParameters(allBMPs[CTRLIDX_PAUSEBUTTON].hbm, &allBMPs[CTRLIDX_PAUSEBUTTON].bmpInfoHdr);
252 ciControls[CTRLIDX_PAUSEBUTTON].hbmSource=allBMPs[CTRLIDX_PAUSEBUTTON].hbm;
253
254 /* Pause sel */
255 allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PAUSESEL, 0, 0);
256 GpiQueryBitmapParameters(allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm, &allBMPs[CTRLIDX_PAUSEBUTTONSEL].bmpInfoHdr);
257 ciControls[CTRLIDX_PAUSEBUTTONSEL].hbmSource=allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm;
258
259 /* Play */
260 allBMPs[CTRLIDX_PLAYBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PLAY, 0, 0);
261 GpiQueryBitmapParameters(allBMPs[CTRLIDX_PLAYBUTTON].hbm, &allBMPs[CTRLIDX_PLAYBUTTON].bmpInfoHdr);
262 ciControls[CTRLIDX_PLAYBUTTON].hbmSource=allBMPs[CTRLIDX_PLAYBUTTON].hbm;
263
264 /* Play sel */
265 allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PLAYSEL, 0, 0);
266 GpiQueryBitmapParameters(allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm, &allBMPs[CTRLIDX_PLAYBUTTONSEL].bmpInfoHdr);
267 ciControls[CTRLIDX_PLAYBUTTONSEL].hbmSource=allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm;
268
269 /* Positionslider bg */
270 ciControls[CTRLIDX_POSSLIDER].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
271
272 /* Positionslider arm */
273 allBMPs[CTRLIDX_POSSLIDERARM].hbm=GpiLoadBitmap(hps, hResource, IDBMP_POSSLIDERARM, 0, 0);
274 GpiQueryBitmapParameters(allBMPs[CTRLIDX_POSSLIDERARM].hbm, &allBMPs[CTRLIDX_POSSLIDERARM].bmpInfoHdr);
275 ciControls[CTRLIDX_POSSLIDERARM].hbmSource=allBMPs[CTRLIDX_POSSLIDERARM].hbm;
276
277 /* Playtime text field */
278 ciControls[CTRLIDX_PLAYTIME].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
279
280 /* Volume slider background */
281 ciControls[CTRLIDX_VOLSLIDER].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
282
283 /* Volume slider arm */
284 allBMPs[CTRLIDX_VOLSLIDERARM].hbm=GpiLoadBitmap(hps, hResource, IDBMP_VOLSLIDERARM, 0, 0);
285 GpiQueryBitmapParameters(allBMPs[CTRLIDX_VOLSLIDERARM].hbm, &allBMPs[CTRLIDX_VOLSLIDERARM].bmpInfoHdr);
286 ciControls[CTRLIDX_VOLSLIDERARM].hbmSource=allBMPs[CTRLIDX_VOLSLIDERARM].hbm;
287
288 /* Volume slider arm selected*/
289 allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_VOLSLIDERARMSEL, 0, 0);
290 GpiQueryBitmapParameters(allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm, &allBMPs[CTRLIDX_VOLSLIDERARMSEL].bmpInfoHdr);
291 ciControls[CTRLIDX_VOLSLIDERARMSEL].hbmSource=allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm;
292
293 WinReleasePS(hps);
294}
295
296
297/***********************************************************/
298/* */
299/* Move the controls to the position defined by the */
300/* background bitmap. */
301/* */
302/***********************************************************/
303void adjustDialogControlPos(HWND hwnd)
304{
305 CONTROLINFO ci;
306 ULONG ulStyle;
307
308 /* STOP button */
309 ci=ciControls[CTRLIDX_STOPBUTTON];
310 ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
311 WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
312 WinSetWindowPos(WinWindowFromID(hwnd, ci.id), HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
313 ci.rclDest.xRight-ci.rclDest.xLeft,
314 ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
315 /* Pause button */
316 ci=ciControls[CTRLIDX_PAUSEBUTTON];
317 ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
318 WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
319 WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
320 ci.rclDest.xRight-ci.rclDest.xLeft,
321 ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
322 /* Play button */
323 ci=ciControls[CTRLIDX_PLAYBUTTON];
324 ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
325 WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
326 WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
327 ci.rclDest.xRight-ci.rclDest.xLeft,
328 ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
329
330 /* Playtime text */
331 ci=ciControls[CTRLIDX_PLAYTIME];
332 WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclSource.xLeft,ci.rclSource.yBottom,
333 ci.rclSource.xRight-ci.rclSource.xLeft,
334 ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE|SWP_SIZE);
335 oldPlayTimeProc=WinSubclassWindow(WinWindowFromID(hwnd, IDST_MMPLAYERPLAYTIME), playTimeTextProc);
336
337 /* Pos slider */
338 ci=ciControls[CTRLIDX_POSSLIDER];//ciPosSlider;
339 WinCreateWindow(hwnd, SLIDER_CLASS, "", WS_VISIBLE | WS_TABSTOP, 0,0, 10, 10,
340 hwnd, HWND_TOP, ci.id, NULLHANDLE, NULLHANDLE);
341 WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft, ci.rclDest.yBottom,
342 ci.rclSource.xRight-ci.rclSource.xLeft,
343 ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE | SWP_SIZE);
344
345 WinSendMsg(WinWindowFromID(hwnd, ci.id),SLM_SETSLIDERINFO,
346 MPFROM2SHORT(SMA_SLIDERARMDIMENSIONS,0),
347 MPFROM2SHORT( 9, 9));
348
349 /* Vol slider */
350 ci=ciControls[CTRLIDX_VOLSLIDER];//ciVolSlider;
351 WinCreateWindow(hwnd, SLIDER_CLASS, "", WS_VISIBLE | WS_TABSTOP, 0,0, 10, 10,
352 hwnd, HWND_TOP, ci.id, NULLHANDLE, NULLHANDLE);
353 WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft, ci.rclDest.yBottom,
354 ci.rclSource.xRight-ci.rclSource.xLeft,
355 ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE | SWP_SIZE);
356 WinSendMsg(WinWindowFromID(hwnd, ci.id),SLM_SETSLIDERINFO,
357 MPFROM2SHORT(SMA_SLIDERARMDIMENSIONS,0),
358 MPFROM2SHORT( 9, 9));
359
360}
361
362
363void playTimeCallback(HWND hwndFrame, LONG lPosSec)
364{
365 char chrCommand[50];
366 char retMsg[20];
367 ULONG rc;
368 int iWavePriv;
369
370 iWavePriv=ulPid;
371
372 /* Timeout. Check if wave is still playing */
373 sprintf(chrCommand,"STATUS wave%d MODE WAIT", iWavePriv);
374 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
375 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
376 /* Problem with MCI. Clean up. The Timer will be stopped in the method */
377 stopAudioFile(hwndFrame);
378 }
379 else {
380 if(!stricmp(retMsg, "stopped")) {
381 /* Audio file played. */
382 stopAudioFile(hwndFrame);
383 }
384 showPlayTimeDisplay(hwndFrame, TRUE);/* Ensure display is visible */
385 }
386}
387
388USHORT DrgGetNumObjects(PDRAGINFO pDragInfo)
389{
390 if(DrgAccessDraginfo(pDragInfo))
391 {
392 USHORT usItems=DrgQueryDragitemCount(pDragInfo);
393
394
395 DrgFreeDraginfo(pDragInfo);
396 return usItems;
397 }
398
399 return 0;
400}
401
402BOOL DrgVerifyTypeCW(PDRAGITEM pDragItem, char * chrType)
403{
404 /* DrgVerifyType() seems not to work when several types are in the list??
405 Dokumentation says, it works... */
406 /* Only check for a single type for now */
407 char text[CCHMAXPATH];
408
409 DrgQueryStrName(pDragItem->hstrType,sizeof(text), text); /* May be MP3, WAV etc... */
410
411 if(strstr(text, chrType))
412 return TRUE;
413
414 return FALSE;
415}
416
417/* Check if we know the file type dragged */
418BOOL DrgCheckForKnownType(PDRAGINFO pDragInfo , HWND hwnd )
419{
420 BOOL rc=FALSE;
421
422 if(DrgAccessDraginfo(pDragInfo))
423 {
424 PDRAGITEM pDragItem;
425 // char text[100];
426
427 pDragItem=DrgQueryDragitemPtr(pDragInfo, 0);
428 // DrgQueryStrName(pDragItem->hstrType,sizeof(text), text); /* May be MP3, WAV etc... */
429
430 // WinSetWindowText(hwnd, text);
431 bIsMidi=FALSE;
432 if(DrgVerifyTypeCW(pDragItem, "Digital Audio")) /* This should work for audio files added using the MM configuration */
433 rc=TRUE;
434 else if(DrgVerifyTypeCW(pDragItem, "WAV"))
435 rc=TRUE;
436 else if(DrgVerifyTypeCW(pDragItem, "MP3"))
437 rc=TRUE;
438 else if(DrgVerifyTypeCW(pDragItem, "MIDI")) {
439 rc=TRUE;
440 bIsMidi=TRUE;
441 }
442 else if(DrgVerifyTypeCW(pDragItem, "OGGS"))
443 rc=TRUE;
444 else if(DrgVerifyTypeCW(pDragItem, "VOC"))
445 rc=TRUE;
446 else if(DrgVerifyTypeCW(pDragItem, "IFF"))
447 rc=TRUE;
448 else if(DrgVerifyTypeCW(pDragItem, "AIF"))
449 rc=TRUE;
450 else if(DrgVerifyTypeCW(pDragItem, "AU"))
451 rc=TRUE;
452 else if(DrgVerifyTypeCW(pDragItem, "SND"))
453 rc=TRUE;
454 else if(DrgVerifyTypeCW(pDragItem, "_AU"))
455 rc=TRUE;
456 else if(DrgVerifyTypeCW(pDragItem, "FLAC"))
457 rc=TRUE;
458 DrgFreeDraginfo(pDragInfo);
459 }
460
461 return rc;
462}
463
464#if 0
465#define HASHSIZE 101
466/* This is poor mans HASH function... */
467USHORT calculateHash(char * theString)
468{
469 ULONG ulHash=0;
470
471 if(theString)
472 for(ulHash=0;*theString!='\0'; theString++)
473 ulHash=*theString+37*ulHash;
474
475 return ulHash%HASHSIZE;
476}
477
478/*
479 Hashes:
480
481 AIF: 0x30
482 AU: 0x42
483 WAV: 0x5b
484 MP3: 0x33
485 MIDI: 0x4c
486 OGGS: 0x58
487 IFF: 0x52
488 SND: 0x1b
489 VOC: 0x1d
490 _AU: 0x20
491 */
492BOOL DrgCheckForKnownType(PDRAGINFO pDragInfo /* , HWND hwnd */)
493{
494 BOOL rc=FALSE;
495
496return FALSE;
497 if(DrgAccessDraginfo(pDragInfo))
498 {
499 PDRAGITEM pDragItem;
500 char text[100];
501 USHORT usHash;
502
503 pDragItem=DrgQueryDragitemPtr(pDragInfo, 0);
504 DrgQueryStrName(pDragItem->hstrType,sizeof(text), text); /* May be MP3, WAV etc... */
505
506 usHash=calculateHash(text);
507 //sprintf(text,"%s, %x", text, usHash);
508 // WinSetWindowText(hwnd, text);
509 switch(usHash)
510 {
511 case 0x30:
512 case 0x42:
513 case 0x5b:
514 case 0x33:
515 case 0x4c:
516 case 0x58:
517 case 0x52:
518 case 0x1b:
519 case 0x1d:
520 case 0x21:
521 rc=TRUE;
522 default:
523 break;
524 }
525
526 /* FIXME: Ugly Hack for MP3 files.
527 Some versions of the MP3 IO proc scan the whole file during identifying.
528 This is bad during dragging. */
529 /* Check if type contains MP3 type. There may be different types in the string */
530 if(!rc)
531 if(strstr(strupr(text), "MP3"))
532 rc=TRUE;
533
534 DrgFreeDraginfo(pDragInfo);
535 }
536
537
538 return rc;
539}
540#endif
541
542
543MRESULT handleDrag0ver(PDRAGINFO pdi, HWND hwnd)
544{
545
546 /* Only accept one file */
547 if(DrgGetNumObjects(pdi)!=1) {
548 return MRFROM2SHORT(DOR_NODROP, DO_LINK);
549 }
550 /* Check if the file is a known type. that's way faster than using mmioIdentifyFile() to check */
551 if(DrgCheckForKnownType(pdi, hwnd))
552 return MRFROM2SHORT(DOR_DROP, DO_COPY);
553
554 return MRFROM2SHORT(DOR_NEVERDROP, DO_COPY);
555}
556
557MRESULT handleDrop(PDRAGINFO pdi, HWND hwnd)
558{
559
560 /* Stop current track (if any) */
561 paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, FALSE);
562 paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE, FALSE);
563 controlPlaying(hwnd, STOP_TRACK, 0);
564 /* Get file name */
565 if(DrgAccessDraginfo(pdi))
566 {
567 char chrFile[CCHMAXPATH];
568 PDRAGITEM pDragItem;
569
570 pDragItem=DrgQueryDragitemPtr(pdi, 0);
571 DrgQueryStrName(pDragItem->hstrSourceName,sizeof(chrFile), chrFile);
572 DrgQueryStrName(pDragItem->hstrContainerName,sizeof(chrSourceName), chrSourceName);
573 strcat(chrSourceName, chrFile);
574
575 /* Start new file */
576 controlPlaying(hwnd, PLAY_FIRST, 0);
577 DrgFreeDraginfo(pdi);
578 }
579 return MRFALSE;
580}
581
582/****************************************************************
583 * FixSysMenu procedure
584 *--------------------------------------------------------------
585 *
586 * Name: FixSysMenu(HWND hwndDlg)
587 *
588 * Purpose: This routine removes the Restore, Size, Minimize, and
589 * Maximize options from the system menu of a dialog.
590 *
591 * Usage
592 *
593 * Method: Called during the WM_INITDLG of a dialog procedure.
594 *
595 * Returns: VOID
596 *
597 ****************************************************************/
598VOID FixSysMenu(HWND hwndDlg)
599{
600 HWND hwndMenu; /* Handle to system menu */
601 MENUITEM mi={0};
602
603 hwndMenu = WinWindowFromID(hwndDlg, FID_SYSMENU);
604
605
606 WinSendMsg(hwndMenu, /* Delete Restore from the system menu */
607 MM_DELETEITEM,
608 MPFROM2SHORT(SC_RESTORE, TRUE),
609 MPFROMP(NULL));
610
611 WinSendMsg(hwndMenu, /* Delete Size from the system menu */
612 MM_DELETEITEM,
613 MPFROM2SHORT(SC_SIZE, TRUE),
614 MPFROMP(NULL));
615
616 WinSendMsg(hwndMenu, /* Delete Minimize from the system menu */
617 MM_DELETEITEM,
618 MPFROM2SHORT(SC_MINIMIZE, TRUE),
619 MPFROMP(NULL));
620
621 WinSendMsg(hwndMenu, /* Delete Maximize from the system menu */
622 MM_DELETEITEM,
623 MPFROM2SHORT(SC_MAXIMIZE, TRUE),
624 MPFROMP(NULL));
625
626 WinSendMsg(hwndMenu, /* Delete Maximize from the system menu */
627 MM_DELETEITEM,
628 MPFROM2SHORT(SC_HIDE, TRUE),
629 MPFROMP(NULL));
630
631 if(WinSendMsg(hwndMenu, /* Get sys menu menuitem */
632 MM_QUERYITEM,
633 MPFROM2SHORT(SC_SYSMENU, FALSE),
634 MPFROMP(&mi)))
635 {
636 char chrText[100];
637 menuInsertMenuSeparator( mi.hwndSubMenu, NULLHANDLE, MIT_END);
638 if(!getMessage(chrText, IDSTR_MASTERVOLUMEITEM, sizeof(chrText), RESSOURCEHANDLE, hwndMenu))
639 strcpy(chrText, "Master ~Volume");
640 menuInsertMenuItem( mi.hwndSubMenu, NULLHANDLE, MIT_END, ID_MENUITEMMASTERVOLUME, chrText);
641 }
642 return;
643}
644
645
646/* This Proc handles the main dialog */
647MRESULT EXPENTRY decodeStatusDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
648{
649 // char text[CCHMAXPATH*4 +10];
650 // char title[CCHMAXPATH*4];
651 SWCNTRL swctl;
652 PID pid;
653
654 switch (msg)
655 {
656 case DM_DRAGOVER:
657 {
658 PDRAGINFO pdi=PVOIDFROMMP(mp1);
659
660 return handleDrag0ver( pdi, hwnd);
661
662 break;
663 }
664 case DM_DROP:
665 {
666 PDRAGINFO pdi=PVOIDFROMMP(mp1);
667
668 return handleDrop( pdi, hwnd);
669 }
670 case WM_INITDLG:
671 {
672 ULONG createFlags;
673 IniRestoreWindowPos(chrIniFile, INI_MMPLAYER_APP, INI_WINDOWPOS_KEY, hwnd);
674
675 /* Add switch entry */
676 memset(&swctl,0,sizeof(swctl));
677 WinQueryWindowProcess(hwnd,&pid,NULL);
678 swctl.hwnd=hwnd;
679 swctl.uchVisibility=SWL_VISIBLE;
680 swctl.idProcess=pid;
681 swctl.bProgType=PROG_DEFAULT;
682 swctl.fbJump=SWL_JUMPABLE;
683 WinAddSwitchEntry(&swctl);
684
685 adjustDialogControlPos(hwnd);
686
687 /* Set volume slider*/
688 WinSendMsg( WinWindowFromID(hwnd, IDSL_MMPLAYERVOLUME),
689 SLM_SETSLIDERINFO,
690 MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
691 MPFROMLONG( ulVolume));
692
693 /* Subclass buttons for DnD */
694 orgButtonProc=WinSubclassWindow(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), buttonProc);
695 WinSubclassWindow(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), buttonProc);
696 WinSubclassWindow(WinWindowFromID(hwnd, IDPB_MMPLAYERSTOP), buttonProc);
697
698 FixSysMenu(hwnd);
699
700 /* Size dialog */
701 if(allBMPs[MAIN_BMP_IDX].hbm) {
702 SWP swp;
703
704 WinQueryWindowPos(WinWindowFromID(hwnd, FID_TITLEBAR), &swp);
705 WinSetWindowPos(WinWindowFromID(hwnd, ID_CLIENT), NULLHANDLE,
706 WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME),
707 WinQuerySysValue(HWND_DESKTOP, SV_CYDLGFRAME),
708 allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx,
709 allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cy,
710 SWP_SIZE|SWP_MOVE);
711 orgBgProc=WinSubclassWindow(WinWindowFromID(hwnd, ID_CLIENT), bgProc);
712
713 WinSetWindowPos(hwnd, NULLHANDLE, 0, 0,
714 allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx+WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME)*2,
715 allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cy+swp.cy+WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME)*2
716 , SWP_SIZE);
717 }
718 /* Set dialog font to WarpSans for Warp 4 and above */
719 if(SysQueryOSRelease()>=40) {
720 WinSetPresParam(WinWindowFromID(hwnd, IDST_MMPLAYERPLAYTIME),
721 PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
722 DEFAULT_DIALOG_FONT );
723 }
724 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY));
725 createFlags=FCF_TITLEBAR;
726 hwndVideo=WinCreateStdWindow(HWND_DESKTOP, WS_VISIBLE, &createFlags, WC_STATIC, "Video", 0, NULLHANDLE, 123, &hwndVideoClient);
727 WinSetWindowPos(hwndVideo, NULLHANDLE, 0, 0, 300, 200, SWP_SIZE|SWP_SHOW);
728 WinStartTimer(WinQueryAnchorBlock(HWND_DESKTOP), hwnd, IDTIMER_START_PLAYING, START_TIMEOUT);
729 return (MRESULT) TRUE;
730 }
731 case WM_CLOSE:
732 controlPlaying(hwnd, STOP_TRACK, 0);
733 IniSaveWindowPos(chrIniFile, INI_MMPLAYER_APP, INI_WINDOWPOS_KEY, hwnd);
734 writeVolumeToIni(chrIniFile, INI_MMPLAYER_APP, INI_VOLUME_KEY, ulVolume);
735 writeDisplayTypeToIni(chrIniFile, INI_MMPLAYER_APP, INI_DISPLAY_KEY, iWhichDisplay);
736 // WinSendMsg(hwndPlayObject, WM_CLOSE, 0, 0);
737 break;
738 /*****************************************************/
739 /* Handle playtime display switching. */
740 /* The messages are coming from the static text. */
741 /*****************************************************/
742 case WM_APPTERMINATENOTIFY:
743
744 switch(SHORT1FROMMP(mp1))
745 {
746 case NOTIFY_CLICK:
747 /* Clicked on the playtime display */
748 iWhichDisplay++;
749 if(iWhichDisplay>2)
750 iWhichDisplay=0;
751 if(iWhichDisplay==2)
752 ulDisplayTimer=0;
753 setPlayTimeText(hwnd);
754 return MRFALSE;
755 case NOTIFY_CONTEXT:
756 /* Show context menu. */
757 HlpContextMenu(hwnd, iWhichDisplay+ID_MENUITEMELAPSED, TRUE);
758 return MRFALSE;
759 default:
760 break;
761 }
762 return MRFALSE;
763
764 /*****************************************************/
765 /* The following two messages are for device sharing */
766 /*****************************************************/
767 case WM_ACTIVATE:
768 if(SHORT1FROMMP(mp1)){
769 char chrCommand[100];
770 int iWavePriv;
771
772 iWavePriv=ulPid;
773
774 if(bIsPlaying) {
775 sprintf(chrCommand,"ACQUIRE wave%d QUEUE wait", iWavePriv);
776 mciSendString(chrCommand, NULL, 0, 0, 0);
777 }
778 }
779 break;
780
781 case MM_MCIPASSDEVICE:
782 {
783 switch(SHORT1FROMMP(mp2))
784 {
785 case MCI_GAINING_USE:
786 bPaused=FALSE;/* The time display will not be increased */
787 paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE, FALSE);
788 return (MRESULT)0;
789 case MCI_LOSING_USE:
790 bPaused=TRUE;
791 paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, FALSE);
792 return (MRESULT)0;
793 default:
794 break;
795 }
796 }
797 break;
798 /*****************************************************/
799 /* Set the time in the palytime display. */
800 /* SETPOSITIONADVICE does not work for some reason, */
801 /* so a timer is used. Yes, it's quit cumbersome... */
802 /*****************************************************/
803 case WM_TIMER:
804 if(SHORT1FROMMP(mp1)==IDTIMER_PLAY) {
805 if(!bPaused) {
806 /* Adjust position info */
807 ulPos++;
808 if(ulPos*1000>ulTotalLength)
809 ulPos=ulTotalLength/1000;/* Prevent wrong time if timer info isn't accurate.
810 I know all this timing stuff is an ugly thing. */
811
812
813 if(!bPosDragging) {
814 ULONG ulInc=ulTotalLength/1000;
815 setPlayTimeText(hwnd); /* Set time display */
816 /* Catch potential division by zero trap */
817 if(ulInc)
818 ulInc=ulPos*100/ulInc;
819 else
820 ulInc=100;
821 /* Set slider position */
822
823 WinPostMsg( WinWindowFromID(hwnd, IDSL_MMPLAYERPOSBAR),
824 SLM_SETSLIDERINFO,
825 MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
826 MPFROMLONG(ulInc));
827
828 }
829
830 playTimeCallback(hwnd, ulPos);
831 /* Blink play control */
832 paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, ulPos%2);
833 }
834 else {
835 /* Currently pausing */
836 togglePlayTimeDisplayVisibility(hwnd);
837 paintHilitedControl( WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE,
838 WinIsWindowVisible(WinWindowFromID(hwnd, IDST_MMPLAYERPLAYTIME)));
839 }
840 return (MRESULT)0;
841 }
842 else if(SHORT1FROMMP(mp1)==IDTIMER_START_PLAYING)
843 {
844 WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, IDTIMER_START_PLAYING);
845 //playAudioFile(HWND_DESKTOP);
846 controlPlaying(hwnd, PLAY_FIRST, 0);
847 return (MRESULT)0;
848 }
849 break;
850
851 /* The play control handling for starting, stopping etc. */
852 case WM_COMMAND:
853 {
854 switch(SHORT1FROMMP(mp1))
855 {
856 case IDPB_MMPLAYERPLAY:
857 paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE, FALSE);
858 controlPlaying(hwnd, PLAY_FIRST, 0);
859 break;
860 case IDPB_MMPLAYERSTOP:
861 paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, FALSE);
862 paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE, FALSE);
863 controlPlaying(hwnd, STOP_TRACK, 0);
864 break;
865 case IDPB_MMPLAYERPAUSE:
866 paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, FALSE);
867 controlPlaying(hwnd, PAUSE_TRACK, 0);
868 break;
869 /* Popup menu over time control */
870 case ID_MENUITEMELAPSED:
871 iWhichDisplay=DISPLAY_TIMEELAPSED;
872 setPlayTimeText(hwnd);
873 break;
874 case ID_MENUITEMREMAINING:
875 iWhichDisplay=DISPLAY_TIMEREMAINING;
876 setPlayTimeText(hwnd);
877 break;
878 case ID_MENUITEMID3:
879 iWhichDisplay=DISPLAY_TIMEID3;
880 ulDisplayTimer=0;
881 setPlayTimeText(hwnd);
882 break;
883 case ID_MENUITEMMASTERVOLUME:
884 {
885 HOBJECT hObject;
886 /* User selected master volume item from sys menu */
887 if((hObject=WinQueryObject("<MMPM2_MMVOLUME>"))!=NULLHANDLE) {
888 WinOpenObject(hObject,OPEN_DEFAULT,TRUE);
889 }
890 break;
891 }
892 default:
893 break;
894 }/* switch() */
895
896 return (MRESULT)FALSE;
897 }/* case */
898
899 /*****************************************************/
900 /* Draw the sliders. */
901 /*****************************************************/
902 case WM_DRAWITEM:
903 switch(SHORT1FROMMP(mp1))
904 {
905 case IDSL_MMPLAYERPOSBAR:
906 case IDSL_MMPLAYERVOLUME:
907 return drawSlider(hwnd, msg, mp1, mp2, SHORT1FROMMP(mp1));
908 default:
909 break;
910 }
911 break;
912
913 /*****************************************************/
914 /* Control messages */
915 /*****************************************************/
916 case WM_CONTROL:
917 {
918 SWP swp;
919 char chrCommand[50];
920 char retMsg[20];
921
922 switch(SHORT2FROMMP(mp1))
923 {
924 case BN_PAINT:
925 /* Paint the custom controls (buttons, sliders ) */
926 WinQueryWindowPos(hwnd,&swp);
927 if(swp.fl & SWP_MINIMIZE)
928 break;
929 return paintControls(hwnd, msg, mp1, mp2);
930 /*****************************************************/
931 /* Handle position and volume changes. */
932 /*****************************************************/
933 case SLN_SLIDERTRACK:
934 {
935 switch(SHORT1FROMMP(mp1))
936 {
937 case IDSL_MMPLAYERVOLUME:
938 {
939 ULONG ulValue;
940
941 ulValue=LONGFROMMP(mp2);
942 ulVolume=ulValue;
943 sprintf(chrCommand,"SET wave%ld AUDIO VOLUME %ld WAIT", ulPid, ulVolume);
944 mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
945 break;
946 }
947 case IDSL_MMPLAYERPOSBAR:
948 {
949 static long lLastPos=0;
950 long lPos=LONGFROMMP(mp2);
951
952 bPosDragging=TRUE;
953 lPos*=ulTotalLength/100;
954 if(lPos/1000!=lLastPos) {
955 /* Prevent flickering */
956 sprintf(chrCommand, "%d:%02d", lPos/1000/60, (lPos/1000)%60);
957 WinSetWindowText(WinWindowFromID(hwnd, IDST_MMPLAYERPLAYTIME), chrCommand);
958 lLastPos=lPos/1000;
959 }
960 break;
961 }
962 default:
963 break;
964 }/* switch */
965 return (MRESULT) 0;
966 break;
967 }
968 case SLN_CHANGE:
969 {
970 switch(SHORT1FROMMP(mp1))
971 {
972 case IDSL_MMPLAYERVOLUME:
973 {
974 ULONG ulValue;
975
976 ulValue=LONGFROMMP(mp2);
977 ulVolume=ulValue;
978 sprintf(chrCommand,"SET wave%ld AUDIO VOLUME %ld WAIT", ulPid, ulVolume);
979 mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
980 break;
981 }
982 case IDSL_MMPLAYERPOSBAR:
983 {
984 long lPos=LONGFROMMP(mp2);
985
986 bPosDragging=FALSE;
987 lPos*=1000;
988 lPos*=ulTotalLength/100;
989 lPos/=1000;// Use only full seconds
990
991 /* Set time display first */
992 seekAudioFile(lPos);
993 /* restart timer */
994 WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, IDTIMER_PLAY, PLAYTIMER_DELAY);
995 ulPos=lPos/1000;
996 break;
997 }
998 default:
999 break;
1000 }/* switch */
1001 return (MRESULT)TRUE;
1002 }
1003 default:
1004 break;
1005 }/* switch */
1006 break;
1007 }/* WM_CONTROL */
1008 default:
1009 break;
1010 }/* switch */
1011
1012 return WinDefDlgProc( hwnd, msg, mp1, mp2);
1013}
1014
1015BOOL cwGetStringFromEA( char * chrFileName, PSZ pKey, char * chrBuffer, ULONG ulBuffSize)
1016{
1017 LONG rc; /* Ret code */
1018 UCHAR geabuff[300]; /* buffer for GEA */
1019 PVOID fealist; /* fealist buffer */
1020 EAOP2 eaop; /* eaop structure */
1021 PGEA2 pgea; /* pgea structure */
1022 PFEA2 pfea; /* pfea structure */
1023 HFILE handle; /* file handle */
1024 ULONG act; /* open action */
1025 ULONG ulSize;
1026 USHORT *ptrUs;
1027
1028 if((fealist=malloc(0x00010000L /* Add some space */
1029 ))==NULLHANDLE)
1030 return FALSE;
1031
1032 ulSize=sizeof(chrFileName);
1033
1034 if ((rc = DosOpen(chrFileName, &handle, &act,
1035 0L, 0, OPEN_ACTION_OPEN_IF_EXISTS,
1036 OPEN_ACCESS_READONLY + OPEN_SHARE_DENYREADWRITE +
1037 OPEN_FLAGS_FAIL_ON_ERROR + OPEN_FLAGS_WRITE_THROUGH,NULL))!=NO_ERROR) {
1038 free(fealist); /* Free the memory */
1039 return FALSE;
1040 } /* get the file status info */
1041
1042 /* FEA and GEA lists */
1043 eaop.fpGEA2List = (PGEA2LIST)geabuff;
1044 eaop.fpFEA2List = (PFEA2LIST)fealist;
1045 eaop.oError = 0; /* no error occurred yet */
1046 pgea = &eaop.fpGEA2List->list[0]; /* point to first GEA */
1047 eaop.fpGEA2List->cbList = sizeof(ULONG) + sizeof(GEA2) +
1048 strlen(pKey);
1049 eaop.fpFEA2List->cbList = (ULONG)0xffff;
1050
1051 /* fill in the EA name length */
1052 pgea->cbName = (BYTE)strlen(pKey);
1053 strcpy(pgea->szName, pKey); /* fill in the name */
1054 pgea->oNextEntryOffset = 0; /* fill in the next offset */
1055 /* read the extended attribute*/
1056 rc = DosQueryFileInfo(handle, 3, (PSZ)&eaop, sizeof(EAOP2));
1057 DosClose(handle); /* close the file */
1058 if (eaop.fpFEA2List->cbList <= sizeof(ULONG))
1059 rc = ERROR_EAS_NOT_SUPPORTED; /* this is error also */
1060
1061 if (rc) { /* failure? */
1062 free(fealist); /* Free the memory */
1063 return FALSE;
1064 }
1065
1066 pfea = &(eaop.fpFEA2List->list[0]); /* point to the first FEA */
1067
1068 ptrUs=(USHORT*)((PSZ)pfea->szName+(pfea->cbName+1));
1069 if(*ptrUs!=0xfffd) {
1070 /* Not an ASCII EA */
1071 free(fealist); /* Free the memory */
1072 return FALSE;
1073 }
1074 ptrUs++; /* Move to length */
1075 ulSize=(ULONG)*ptrUs;
1076
1077 ptrUs++; /* Move to value */
1078 if(ulSize==0) {
1079 /* Not an ASCII EA */
1080 free(fealist); /* Free the memory */
1081 return FALSE;
1082 }
1083
1084 memset(chrBuffer,0,ulBuffSize);
1085 memcpy(chrBuffer, (char*)ptrUs, (ulSize>=ulBuffSize ? ulBuffSize-1 : ulSize));
1086 free(fealist); /* Free the memory */
1087 return TRUE;
1088}
1089
1090int readVolumeFromIni(char * iniFile, char* chrApp, char *chrKey, int iDefault)
1091{
1092 return IniRestoreInt(iniFile, chrApp, chrKey, iDefault);
1093}
1094
1095BOOL writeVolumeToIni(char * iniFile, char* chrApp, char *chrKey, ULONG ulVolume)
1096{
1097
1098 return IniSaveInt(iniFile, chrApp, chrKey, ulVolume);
1099}
1100
1101int readDisplayTypeFromIni(char * iniFile, char* chrApp, char *chrKey, int iDefault)
1102{
1103 return IniRestoreInt(iniFile, chrApp, chrKey, iDefault);
1104}
1105
1106BOOL writeDisplayTypeToIni(char * iniFile, char* chrApp, char *chrKey, int iDisplay)
1107{
1108 return IniSaveInt(iniFile, chrApp, chrKey, iDisplay);
1109}
1110
1111
1112int main (int argc, char *argv[])
1113{
1114 HAB hab;
1115 HMQ hmq;
1116 char text[CCHMAXPATH];
1117 char title[CCHMAXPATH];
1118 short a;
1119 PTIB ptib;
1120 PPIB ppib;
1121
1122 /* Create a copy of the args */
1123 /* argv[0]: progname
1124 * argv[1]: audio file
1125 */
1126
1127 numArgs=argc;
1128
1129 strcpy(text,"");
1130 for(a=0;a<argc;a++)
1131 {
1132 params[a]=argv[a];
1133 }
1134
1135 /* Save source name */
1136 strcpy(chrSourceName, argv[1]);
1137 if(DosGetInfoBlocks(&ptib, &ppib)==NO_ERROR)
1138 {
1139 printf("Got info block...\n");
1140 ulPid=ppib->pib_ulpid;
1141 ppib->pib_ultype=3; /* Morph into PM */
1142 }
1143
1144 hab=WinInitialize(0);
1145 if(hab) {
1146 hmq=WinCreateMsgQueue(hab,0);
1147 if(hmq) {
1148 /* Check if user started prog by hand */
1149 if(argc!=NUMPARAMS) {/* Not the right num of params */
1150 pmUsage();
1151 }
1152 else {
1153
1154 /* Save source name */
1155 strcpy(chrSourceName, params[1]);
1156 //strcpy(chrSourceName, "H:\\cwmm\\classes\\mm-progs\\MMPlayer\\01 Vicious Circle - Propaganda - 1234.WAV");
1157 if((chrPtrName=strrchr(chrSourceName, '\\'))!=NULLHANDLE)
1158 ++chrPtrName;
1159
1160 bIsMidi=FALSE;
1161
1162 /* Class name. We need it to distinguish MIDI and audio files */
1163 if(argc==3)
1164 strcpy(chrClassName, params[1]);
1165
1166 /* Get our ressource dll */
1167 RESSOURCEHANDLE=queryResModuleHandle(argv[0]);
1168 /* Get data from INI file */
1169 HlpBuildMMProgIniFileName(argv[0], chrIniFile, sizeof(chrIniFile));
1170 ulVolume=readVolumeFromIni(chrIniFile, INI_MMPLAYER_APP, INI_VOLUME_KEY, DEFAULT_VOLUME);
1171 iWhichDisplay=readDisplayTypeFromIni(chrIniFile, INI_MMPLAYER_APP, INI_DISPLAY_KEY, 0);
1172
1173 /* Load pointer for slider */
1174 hptrArrowWE=WinLoadPointer(HWND_DESKTOP, BMP_RESSOURCEHANDLE /*_queryResModuleHandle()*/, IDPTR_ARROWWE);
1175 /* Register the slider window class */
1176 WinRegisterClass(WinQueryAnchorBlock(HWND_DESKTOP), SLIDER_CLASS, privateSliderProc,0, SLADDBYTES);
1177
1178 _loadBmps();
1179 DosGetInfoBlocks(&ptib, &ppib);
1180 ulPid=ppib->pib_ulpid;
1181 _beginthread(playThreadFunc,NULL,8192*16, NULLHANDLE); //Fehlerbehandlung fehlt
1182 // playAudioFile(HWND_DESKTOP);
1183 //DosBeep(5000, 400);
1184
1185 if( WinDlgBox( HWND_DESKTOP, NULLHANDLE, decodeStatusDialogProc,
1186 RESSOURCEHANDLE, IDDLG_MMPLAYER, 0) == DID_ERROR )
1187 {
1188 /*
1189 Text:
1190 Title: "Installation problem"
1191 */
1192 messageBox( text, IDSTR_CONVERTDIALOGERROR , sizeof(text),
1193 title, IDSTR_INSTALLERRORTITLE , sizeof(title),
1194 RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE);
1195 freeResHandle();
1196 WinDestroyMsgQueue( hmq );
1197 WinTerminate( hab );
1198 DosBeep(100,600);
1199 return( 1 );
1200 }
1201 }
1202 freeResHandle();
1203 WinDestroyMsgQueue(hmq);
1204 }
1205 WinTerminate(hab);
1206 }
1207 if(DosGetInfoBlocks(&ptib, &ppib)==NO_ERROR)
1208 {
1209 printf("Got info block...\n");
1210 ulPid=ppib->pib_ulpid;
1211 ppib->pib_ultype=2; /* Morph into VIO */
1212 }
1213
1214 exit(0);
1215 return 0;
1216}
1217
Note: See TracBrowser for help on using the repository browser.