source: trunk/classes/mm-progs/mmfind/mmfind.c@ 126

Last change on this file since 126 was 126, checked in by gyoung, 22 months ago

Changes to build players and related cwmm class exe using VAC 3.08

File size: 35.2 KB
Line 
1/*
2 * mmfind.c (C) Chris Wohlgemuth 2004-2005
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#define INCL_REXXSAA
40
41/* OS/2 and compiler includes */
42#include <os2.h>
43#include <sys\types.h>
44#include <sys\stat.h>
45#include <stdio.h>
46#include <string.h>
47#include <stdlib.h>
48#include <rexxsaa.h>
49#include "os2me.h"
50/* CW toolkit includes */
51#include "sys_funcs.h"
52#include "message_funcs.h"
53#include "window_funcs.h"
54#include "img_funcs.h"
55#include "ini_funcs.h"
56/* Program includes */
57#include "common.h"
58#include "mmres.h" /* Ressource IDs */
59#include "mmprogs_defaults.h"
60//#define DEBUG
61#include "mmfind.h" /* mmfind specific defines */
62
63char logName[]="mmfind.log"; /* To keep some (unused) helpers in helper.c happy */
64
65char chrIniFile[CCHMAXPATH];
66char chrInstallDir[CCHMAXPATH];
67
68char chrLastAudioDir[CCHMAXPATH];
69char chrLastVideoDir[CCHMAXPATH];
70char chrLastImageDir[CCHMAXPATH];
71
72/***** For previewing audio tracks *****/
73char chrSourceName[CCHMAXPATH]; /* The audio file to be played */
74BOOL bIsMidi=FALSE; /* No MIDI support atm */
75BOOL bIsPlaying=FALSE; /* TRUE if currently playing */
76BOOL bPaused=FALSE;
77ULONG ulPos;
78ULONG ulTotalLength;
79HWND hwndPlayer; /* HWND of the player object window used for async coommunication */
80
81/***************************************/
82
83#define NUMPARAMS 1
84/*
85 argv[0]: progname
86 */
87int numArgs;
88char* params[NUMPARAMS];
89
90HMODULE RESSOURCEHANDLE=0;
91
92char chrMediaFileTypes[NUMMEDIATYPES][100];
93
94char chrMediaFileExt[NUMMEDIATYPES][EXT_STRING_LENGTH]= {"*.AIF;*.AU;*.FLA;*.FLAC;*.IFF;*.MID;*.MP3;*.OGG;*.SND;*.VOC;*.WAV;*._AU",
95 /* The image extensions are queried using the imageext.rx and imageadd.rx scripts */
96 "*.BMP;*.DIB;*.GIF;*.JPG;*.PCX;*.PNG;*.PCD;*.TIF;*.TGA;*.VID;*._IM",
97 "*.AVI;*.MPG;*.FLI;*.FLC;*.MOV;*.QT;*.VBS"};
98/* Additional audio extensions to be queried during runtime */
99char chrAdditionalExt[200];
100/* This holds the template used when building the audio information text */
101char audioText[255];
102
103int iMediaType=MT_AUDIO;
104
105/* BMP stuff for preview */
106BITMAPINFOHEADER2 bmpInfoHeader2;
107HBITMAP hBitmap;
108
109/* HBITMAP for the play control buttons */
110HBITMAP hbmPlay;
111HBITMAP hbmStop;
112
113FILEDLG fd = { 0 };
114
115static void _loadButtonBmps()
116{
117 HPS hps;
118 HMODULE hResource;
119
120 hResource=NULLHANDLE;
121 hps=WinGetPS(HWND_DESKTOP);
122
123 /* Play */
124 hbmPlay=GpiLoadBitmap(hps, hResource, IDBMP_PLAY, 0, 0);
125
126 /* Stop */
127 hbmStop=GpiLoadBitmap(hps, hResource, IDBMP_STOP, 0, 0);
128
129 WinReleasePS(hps);
130}
131
132static void changeButtons(HWND hwnd)
133{
134 HWND hwndTemp;
135 BTNCDATA btCtrl;
136 WNDPARAMS wndParams;
137 ULONG ulStyle;
138
139 if(hbmPlay) {
140 hwndTemp=WinWindowFromID(hwnd, IDPB_MMFINDPLAY);
141
142 /* Change Style to bitmap */
143 ulStyle=WinQueryWindowULong(hwndTemp,QWL_STYLE);
144 ulStyle|=(BS_BITMAP);
145 ulStyle&=~BS_TEXT;
146
147 if(WinSetWindowULong(hwndTemp, QWL_STYLE, ulStyle)) {
148 memset(&btCtrl, 0, sizeof(btCtrl));
149 btCtrl.cb=sizeof(btCtrl);
150 btCtrl.hImage=hbmPlay;
151 memset(&wndParams, 0, sizeof(wndParams));
152 wndParams.fsStatus=WPM_CTLDATA;
153 wndParams.cbCtlData=btCtrl.cb;
154 wndParams.pCtlData=&btCtrl;
155 WinSendMsg(hwndTemp,WM_SETWINDOWPARAMS,
156 MPFROMP(&wndParams),0);
157 }
158 }
159
160 if(hbmStop) {
161 hwndTemp=WinWindowFromID(hwnd, IDPB_MMFINDSTOP);
162 /* Change Style to bitmap */
163 ulStyle=WinQueryWindowULong(hwndTemp,QWL_STYLE);
164 ulStyle|=(BS_BITMAP);
165 ulStyle&=~BS_TEXT;
166
167 if(WinSetWindowULong(hwndTemp, QWL_STYLE, ulStyle)) {
168 memset(&btCtrl, 0, sizeof(btCtrl));
169 btCtrl.cb=sizeof(btCtrl);
170 btCtrl.hImage=hbmStop;
171 memset(&wndParams, 0, sizeof(wndParams));
172 wndParams.fsStatus=WPM_CTLDATA;
173 wndParams.cbCtlData=btCtrl.cb;
174 wndParams.pCtlData=&btCtrl;
175 WinSendMsg(hwndTemp,WM_SETWINDOWPARAMS,
176 MPFROMP(&wndParams),0);
177 }
178 }
179}
180
181static char* translateChars(char * chrString, char chrFrom, char chrTo)
182{
183 char *chr=chrString;
184
185 if(chrTo == '\0' || chrFrom=='\0'|| chrString==NULLHANDLE)
186 return NULLHANDLE;
187
188 while(*chr)
189 {
190 if(*chr==chrFrom)
191 *chr=chrTo;
192
193 chr++;
194 }
195 return chrString;
196}
197
198static void loadStringsFromResourceDLL(HMODULE hResMod)
199{
200 if(!MsgGetMessage(audioText, IDSTR_AUDIOINFOTEXT, sizeof(audioText), hResMod,HWND_DESKTOP))
201 strcpy(audioText, TEXT_INFOTEXT);
202 if(!MsgGetMessage(chrMediaFileTypes[MT_AUDIO], IDSTR_TYPEAUDIO,
203 sizeof(chrMediaFileTypes[MT_AUDIO]), hResMod, HWND_DESKTOP))
204 strcpy(chrMediaFileTypes[MT_AUDIO], TEXT_TYPEAUDIO);
205 if(!MsgGetMessage(chrMediaFileTypes[MT_IMAGE], IDSTR_TYPEIMAGE,
206 sizeof(chrMediaFileTypes[MT_IMAGE]), hResMod, HWND_DESKTOP))
207 strcpy(chrMediaFileTypes[MT_AUDIO], TEXT_TYPEIMAGE);
208 if(!MsgGetMessage(chrMediaFileTypes[MT_VIDEO], IDSTR_TYPEVIDEO,
209 sizeof(chrMediaFileTypes[MT_VIDEO]), hResMod, HWND_DESKTOP))
210 strcpy(chrMediaFileTypes[MT_VIDEO], TEXT_TYPEVIDEO);
211}
212
213static void showVideoControls(HWND hwnd, BOOL bShow)
214{
215 /* Preview area */
216 WinShowWindow(WinWindowFromID(hwnd, IDST_NOPREVIEWAVAILABLE), bShow);
217 /* Group box */
218 WinShowWindow(WinWindowFromID(hwnd, IDGB_PREVIEW), bShow);
219}
220
221
222static void enableAudioPlayControls(HWND hwnd, BOOL bEnable)
223{
224 WinEnableWindow(WinWindowFromID(hwnd, IDPB_MMFINDPAUSE), bEnable);
225 WinEnableWindow(WinWindowFromID(hwnd, IDPB_MMFINDPLAY), bEnable);
226 WinEnableWindow(WinWindowFromID(hwnd, IDPB_MMFINDSTOP), bEnable);
227}
228
229void showAudioControls(HWND hwnd, BOOL bShow)
230{
231 /* Preview area */
232 WinShowWindow(WinWindowFromID(hwnd, IDST_AUDIOINFO), bShow);
233 /* Group box */
234 WinShowWindow(WinWindowFromID(hwnd, IDGB_AUDIOINFO), bShow);
235 /* Playcontrols */
236 WinShowWindow(WinWindowFromID(hwnd, IDPB_MMFINDPLAY), bShow);
237 WinShowWindow(WinWindowFromID(hwnd, IDPB_MMFINDSTOP), bShow);
238 WinShowWindow(WinWindowFromID(hwnd, IDPB_MMFINDPAUSE), bShow);
239 if(bShow) {
240 WinSetWindowToTop(WinWindowFromID(hwnd, IDPB_MMFINDPAUSE));
241 WinSetWindowToTop(WinWindowFromID(hwnd, IDPB_MMFINDPLAY));
242 WinSetWindowToTop(WinWindowFromID(hwnd, IDPB_MMFINDSTOP));
243 enableAudioPlayControls(hwnd, FALSE);
244 }
245}
246
247BOOL pauseAudioFile(HWND hwndNotify)
248{
249#if 0
250 char chrCommand[50];
251 char retMsg[100];
252 ULONG rc;
253
254 iWavePriv=ulPid;
255
256 if(bPaused) {
257 sprintf(chrCommand,"RESUME wave%d wait", hwndNotify);
258 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
259 bPaused=FALSE;
260 showPlayTimeDisplay( hwndFrame, TRUE);
261 }
262 else {
263 sprintf(chrCommand,"PAUSE wave%d wait", iWavePriv);
264 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
265 bPaused=TRUE;
266 }
267#endif
268 return TRUE;
269}
270
271BOOL stopAudioFile(HWND hwndNotify)
272{
273 char chrCommand[50];
274 char retMsg[100];
275
276 if(bIsPlaying) {
277 sprintf(chrCommand,"stop wave%ld wait", hwndNotify);
278 mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
279
280 sprintf(chrCommand,"close wave%ld wait", hwndNotify);
281 mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
282
283#if 0
284 _resetDisplay(hwndFrame);
285 showPlayTimeDisplay( hwndFrame, TRUE);
286 WinStopTimer(WinQueryAnchorBlock(hwndFrame), hwndFrame, IDTIMER_PLAY);
287#endif
288 bIsPlaying=FALSE;
289 bPaused=FALSE;
290 }
291
292 return TRUE;
293}
294
295ULONG playAudioFile(HWND hwndFrame)
296{
297 char chrCommand[CCHMAXPATH*2];
298 char chrDevice[30];
299 char retMsg[20];
300 ULONG rc;
301 int iTime2;
302 HWND hwndNotify;
303
304 hwndNotify=hwndFrame;//WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE);
305
306 if(bPaused)
307 {
308 pauseAudioFile(hwndFrame);
309 return 1;
310 }
311
312 ulPos=0;
313
314 stopAudioFile(hwndFrame);
315
316 if(bIsMidi)
317 strncpy(chrDevice,"SEQUENCER", sizeof(chrDevice));
318 else
319 strncpy(chrDevice,"WAVEAUDIO", sizeof(chrDevice));
320
321 /* Start audio file */
322 sprintf(chrCommand,"open \"%s\" type %s alias wave%ld SHAREABLE wait", chrSourceName, chrDevice, hwndNotify);
323
324
325 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwndNotify, 0);
326 if((rc & 0x0000ffff)!=MCIERR_SUCCESS)
327 return 0;
328
329 /* Set time format */
330 sprintf(chrCommand,"SET wave%ld TIME FORMAT MILLISECONDS wait", hwndNotify);
331 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
332 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
333 sprintf(chrCommand,"close wave%ld wait", hwndNotify);
334 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
335 return 0;
336 }
337
338#if 0
339 sprintf(chrCommand,"SETPOSITIONADVISE wave%d ON EVERY 1000 notify", iWavePriv);
340 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg),hwndNotify, 0);
341 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
342 sprintf(chrCommand,"close wave%d wait",iWavePriv);
343 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
344 return 0;
345 }
346#endif
347
348 /* Get wave length in ms */
349 iTime2=0;
350 sprintf(chrCommand,"STATUS wave%ld LENGTH WAIT", hwndNotify);
351 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
352 if((rc & 0x0000ffff)==MCIERR_SUCCESS) {
353 iTime2=atoi(retMsg);
354 sprintf(chrCommand,"%d:%02d %d:%02d -%d:%02d",iTime2/1000/60,(iTime2/1000)%60,
355 0, 0,
356 iTime2/1000/60,(iTime2/1000)%60);
357 }
358 ulTotalLength=iTime2;
359
360#if 0
361 /* Set volume */
362 sprintf(chrCommand,"SET wave%ld AUDIO VOLUME %ld wait", hwndFrame, ulVolume);
363 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
364 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
365 sprintf(chrCommand,"close wave%d",iWavePriv);
366 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
367 return 0;
368 }
369#endif
370
371 sprintf(chrCommand,"play wave%ld FROM 0", hwndNotify);
372 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
373 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
374 sprintf(chrCommand,"close wave%ld", hwndNotify);
375 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
376 return 0;
377 }
378
379#if 0
380 WinStartTimer(WinQueryAnchorBlock(hwndFrame), hwndFrame, IDTIMER_PLAY, PLAYTIMER_DELAY);
381#endif
382
383 bIsPlaying=TRUE;
384
385 return 1;
386}
387
388static MRESULT EXPENTRY playObjectProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
389{
390 switch (msg)
391 {
392 case WM_APPTERMINATENOTIFY:
393 {
394
395 HWND hwndFrame=HWNDFROMMP(mp2);
396 switch(LONGFROMMP(mp1))
397 {
398 case PLAY_FILE:
399 playAudioFile(hwndFrame);
400 break;
401 case STOP_TRACK:
402 stopAudioFile(hwndFrame);
403 break;
404 case PAUSE_TRACK:
405 pauseAudioFile(hwndFrame);
406 break;
407 default:
408 break;
409 }
410 return (MRESULT)0;
411 }
412 case WM_CLOSE:
413
414 break;
415 default:
416 break;
417 }
418 return WinDefWindowProc( hwnd, msg, mp1, mp2);
419}
420
421/* Every folder has one running play thread to handle play commands */
422void playThreadFunc (void *arg)
423{
424 HAB hab;
425 HMQ hmq;
426 QMSG qmsg;
427 HWND hwndNotify=(HWND)arg;
428
429 hab=WinInitialize(0);
430 if(hab) {
431 hmq=WinCreateMsgQueue(hab,0);
432 if(hmq) {
433 HWND hwndPlayObject;
434 hwndPlayObject=WinCreateWindow(HWND_OBJECT,WC_STATIC,"MMAudioPlayObj",
435 0,0,0,0,0,NULLHANDLE,HWND_BOTTOM,13343,NULL,NULL);
436 if(hwndPlayObject) {
437 WinSubclassWindow(hwndPlayObject,&playObjectProc);
438 /* Window created. */
439 WinPostMsg(hwndNotify, WM_APPTERMINATENOTIFY, MPFROMSHORT(MMAUDIO_PLAYER_CREATED),
440 MPFROMHWND(hwndPlayObject));
441 while(WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))
442 WinDispatchMsg(hab,&qmsg);
443
444 WinDestroyWindow(hwndPlayObject);
445 }
446 WinDestroyMsgQueue(hmq);
447 }
448 WinTerminate(hab);
449 }
450}
451
452
453void MMAudioPlayFile(HWND hwndPlayer, HWND hwndNotify, char* chrFile)
454{
455 WinPostMsg(hwndPlayer, WM_APPTERMINATENOTIFY, MPFROMSHORT(PLAY_FILE), MPFROMHWND(hwndNotify));
456}
457
458void MMAudioStop(HWND hwndPlayer, HWND hwndNotify)
459{
460 WinPostMsg(hwndPlayer, WM_APPTERMINATENOTIFY, MPFROMSHORT(STOP_TRACK), MPFROMHWND(hwndNotify));
461}
462
463void MMAudioPause(HWND hwndPlayer, HWND hwndNotify)
464{
465 WinPostMsg(hwndPlayer, WM_APPTERMINATENOTIFY, MPFROMSHORT(PAUSE_TRACK), MPFROMHWND(hwndNotify));
466}
467
468BOOL MMAudioOpenPlayer(HWND hwndNotify)
469{
470 if(-1==_beginthread(playThreadFunc,NULL,8192*16, (void*)hwndNotify))
471 return FALSE; /* Error occured */
472
473 return TRUE;
474}
475
476void MMAudioClosePlayer(HWND hwndPlayer)
477{
478 WinSendMsg(hwndPlayer, WM_QUIT, 0, 0);
479 return;
480}
481
482static ULONG mmIdentifyFile(char* chrFile)
483{
484 MMIOINFO mmioInfo={0};
485 MMFORMATINFO mmFormatInfo={0};
486 FOURCC fourCC;
487
488 if(MMIO_SUCCESS!=mmioIdentifyFile(chrFile, &mmioInfo, &mmFormatInfo, &fourCC, 0,0))
489 {
490 return MT_UNKNOWN;
491 }
492
493 switch(mmFormatInfo.ulMediaType)
494 {
495 case MMIO_MEDIATYPE_MIDI: /* Midi */
496 case MMIO_MEDIATYPE_AUDIO: /* Any other audio file */
497 return MT_AUDIO;
498 case MMIO_MEDIATYPE_IMAGE:
499 return MT_IMAGE;
500 case MMIO_MEDIATYPE_DIGITALVIDEO:
501 case MMIO_MEDIATYPE_MOVIE:
502 return MT_VIDEO;
503 default:
504 return MT_UNKNOWN;
505 }
506
507 return 0;
508}
509
510static PSZ queryExeDir(const char *chrEXE)
511{
512 if(chrInstallDir[0]==0)
513 {
514 char * chr;
515 strlcpy(chrInstallDir, chrEXE, sizeof(chrInstallDir));
516 if((chr=strrchr(chrInstallDir, '\\'))!=NULLHANDLE)
517 *chr='\0';
518 }
519 return chrInstallDir;
520}
521
522
523MRESULT findFileDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
524{
525
526 switch(msg)
527 {
528 case WM_INITDLG:
529 {
530 int a;
531 SWCNTRL swctl;
532 PID pid;
533
534 /* Set dialog font */
535 if(SysQueryOSRelease()>=40) {
536 WinSetPresParam(hwnd,
537 PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
538 DEFAULT_DIALOG_FONT );
539 }
540 /* Fill combo box with media types (audio, image, video) */
541 for(a=0;a<NUMMEDIATYPES;a++)
542 WinSendMsg(WinWindowFromID(hwnd, IDCB_TYPEOFFILE), LM_INSERTITEM, MRFROMSHORT(LIT_SORTASCENDING),
543 MPFROMP(chrMediaFileTypes[a]));
544 WinSetWindowText(WinWindowFromID(hwnd, IDCB_TYPEOFFILE), chrMediaFileTypes[0]);
545
546 /* Subclass preview area */
547 WinSubclassWindow(WinWindowFromID(hwnd, IDSR_IMGPREVIEW), bmpPreviewProc);
548
549 /* Add switch entry */
550 memset(&swctl,0,sizeof(swctl));
551 WinQueryWindowProcess(hwnd,&pid,NULL);
552 swctl.hwnd=hwnd;
553 swctl.uchVisibility=SWL_VISIBLE;
554 swctl.idProcess=pid;
555 swctl.bProgType=PROG_DEFAULT;
556 swctl.fbJump=SWL_JUMPABLE;
557 WinAddSwitchEntry(&swctl);
558
559 /* Add bitmap to play control buttons */
560 changeButtons(hwnd);
561
562 /* Start an audio player thread */
563 MMAudioOpenPlayer(hwnd);
564 break;
565 }
566 case WM_APPTERMINATENOTIFY:
567 {
568 /* Posted from player object window */
569 switch(SHORT1FROMMP(mp1))
570 {
571 case MMAUDIO_PLAYER_CREATED:
572 /* Player object window */
573 hwndPlayer=HWNDFROMMP(mp2);
574 break;
575 default:
576 break;
577 }
578 return MRFALSE;
579 }
580 case WM_CONTROL:
581 {
582 switch(SHORT1FROMMP(mp1))
583 {
584 case IDCB_TYPEOFFILE:
585 {
586 if(SHORT2FROMMP(mp1)==CBN_EFCHANGE) {
587 char chrText[100];
588 int a;
589 WinQueryWindowText(HWNDFROMMP(mp2), sizeof(chrText), chrText);
590 /* Find Index */
591 for(a=0; a<NUMMEDIATYPES;a++) {
592 if(!stricmp(chrMediaFileTypes[a], chrText))
593 break;
594 }
595 /* Error!??!*/
596 switch(a)
597 {
598 case 0: /* Audio */
599 {
600 showVideoControls(hwnd, FALSE);
601 showImageControls(hwnd, FALSE);
602 showAudioControls(hwnd, TRUE);
603 iMediaType=MT_AUDIO;
604 break;
605 }
606 case 1: /* Image */
607 showAudioControls(hwnd, FALSE);
608 showVideoControls(hwnd, FALSE);
609 showImageControls(hwnd, TRUE);
610 iMediaType=MT_IMAGE;
611 break;
612 case 2:
613 showAudioControls(hwnd, FALSE);
614 showImageControls(hwnd, FALSE);
615 showVideoControls(hwnd, TRUE);
616 iMediaType=MT_VIDEO;
617 break;
618 default:
619 return WinDefFileDlgProc(hwnd, msg, mp1, mp2);
620 }
621 WinSetWindowText(WinWindowFromID(hwnd, 258), chrMediaFileExt[a]);
622 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, 258));
623 WinSendMsg(WinWindowFromID(hwnd, 258), WM_CHAR,
624 MPFROM2SHORT(KC_VIRTUALKEY , 0), MPFROM2SHORT(0, VK_NEWLINE));
625 }
626 break;
627 }
628 case 258:
629 {
630 if(SHORT2FROMMP(mp1)==EN_CHANGE)
631 WinStartTimer(WinQueryAnchorBlock(HWND_DESKTOP), hwnd, TIMERID_SELECTION, 100);
632 break;
633 }
634 default:
635 break;
636 }
637 break;
638 }
639 case WM_TIMER:
640 switch(SHORT1FROMMP(mp1))
641 {
642 case TIMERID_SELECTION:
643 {
644 char chrName[CCHMAXPATH];
645 char chrFullName[CCHMAXPATH*2];
646
647 WinStopTimer(WinQueryAnchorBlock(HWND_DESKTOP), hwnd, TIMERID_SELECTION);
648 WinQueryWindowText(WinWindowFromID(hwnd, 258), sizeof(chrName), chrName);
649 strcpy(chrFullName, fd.szFullFile);
650 switch(iMediaType)
651 {
652 case MT_AUDIO:
653 strlcpy(chrLastAudioDir, fd.szFullFile, sizeof(chrLastAudioDir));
654 break;
655 case MT_IMAGE:
656 strlcpy(chrLastImageDir, fd.szFullFile, sizeof(chrLastImageDir));
657 break;
658 case MT_VIDEO:
659 strlcpy(chrLastImageDir, fd.szFullFile, sizeof(chrLastImageDir));
660 break;
661 default:
662 break;
663 }
664 strcat(chrFullName, chrName);
665 strlcpy(chrSourceName, chrFullName, sizeof(chrSourceName));
666 switch(iMediaType)
667 {
668 case MT_AUDIO:
669 {
670 char text[500];
671 MMIOINFO mmio;
672 HMMIO hmmio;
673 MMAUDIOHEADER mmAudioHeader={0};
674 LONG lBytesRead=0;
675 ULONG rc;
676 ULONG ulPlaySecs;
677
678 MMAudioStop(hwndPlayer, hwnd);
679
680 memset(&mmio,0, sizeof(mmio));
681 mmio.ulFlags=MMIO_READ;
682 mmio.ulTranslate=MMIO_TRANSLATEHEADER;
683
684 hmmio = mmioOpen(chrFullName, &mmio, MMIO_READ);
685 if(!hmmio)
686 break;
687
688 memset(&mmAudioHeader,0,sizeof(MMAUDIOHEADER));
689 rc = mmioGetHeader(hmmio, &mmAudioHeader,sizeof(MMAUDIOHEADER),
690 &lBytesRead, 0, 0);
691
692 mmioClose(hmmio, 0);
693 if(rc!=MMIO_SUCCESS) {
694 WinSetWindowText(WinWindowFromID(hwnd, IDST_AUDIOINFO), "");
695 enableAudioPlayControls(hwnd, FALSE);
696 break;
697 }
698
699 ulPlaySecs=mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInMS/1000;
700 sprintf(text, audioText, ulPlaySecs/60, ulPlaySecs%60,
701 mmAudioHeader.mmXWAVHeader.WAVEHeader.ulSamplesPerSec,
702 mmAudioHeader.mmXWAVHeader.WAVEHeader.usBitsPerSample,
703 mmAudioHeader.mmXWAVHeader.WAVEHeader.usChannels);
704 WinSetWindowText(WinWindowFromID(hwnd, IDST_AUDIOINFO), text);
705 enableAudioPlayControls(hwnd, TRUE);
706 break;
707 }
708 case MT_IMAGE:
709 if(hBitmap) {
710 HBITMAP hBitmapTemp;
711 // hBitmapTemp=loadBitmap (chrFullName, &bmpInfoHeader2);
712 hBitmapTemp=ImgLoadImageFileAndHeader(chrFullName, &bmpInfoHeader2);
713 GpiDeleteBitmap(hBitmap);
714 hBitmap=hBitmapTemp;
715 }
716 else
717 hBitmap=ImgLoadImageFileAndHeader(chrFullName, &bmpInfoHeader2);
718 // hBitmap=loadBitmap (chrFullName, &bmpInfoHeader2);
719 /* Force redraw of preview area */
720 WinInvalidateRect(WinWindowFromID(hwnd, IDSR_IMGPREVIEW), NULLHANDLE, FALSE);
721 break;
722 case MT_VIDEO:
723 break;
724 default:
725 break;
726 }
727 return MRFALSE;
728 }
729 default:
730 break;
731 }
732 case WM_COMMAND:
733 switch(SHORT1FROMMP(mp1))
734 {
735 case IDPB_MMFINDPLAY:
736 {
737 MMAudioPlayFile(hwndPlayer, hwnd, NULLHANDLE);
738 return MRFALSE;
739 }
740 case IDPB_MMFINDSTOP:
741 {
742 MMAudioStop(hwndPlayer, hwnd);
743 return MRFALSE;
744 }
745 case IDPB_MMFINDPAUSE:
746 {
747 MMAudioPause(hwndPlayer, hwnd);
748 return MRFALSE;
749 }
750 case IDPB_NEWFILE: /* New */
751 {
752 HOBJECT hObject;
753
754 MMAudioStop(hwndPlayer, hwnd);
755 MMAudioClosePlayer(hwndPlayer);
756
757 /* Open the MM templates folder */
758 if((hObject=WinQueryObject("<MMPM2_MMTEMPLATEFOLDER>"))!=NULLHANDLE) {
759 WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
760 WinDismissDlg(hwnd, DID_CANCEL);
761 }
762 else
763 MsgShowMessageBox(hwnd, IDSTR_NOMMTEMPLATEFLDRTITLE, IDSTR_NOMMTEMPLATEFLDR,
764 RESSOURCEHANDLE, MB_MOVEABLE|MB_OK);
765 return MRFALSE;
766 }
767 default:
768 // MMAudioStop(hwndPlayer, hwnd);
769 stopAudioFile(hwnd);
770 MMAudioClosePlayer(hwndPlayer);
771 // DosSleep(1000);
772 break;
773 }
774 default:
775 break;
776 }
777 return WinDefFileDlgProc(hwnd, msg, mp1, mp2);
778}
779
780BOOL getStringFromRexxScript(PSZ pszBinDir, PSZ rexxFile, char* chrResult, ULONG ulSize)
781{
782
783 RXSTRING arg[1]; /* argument string for REXX */
784 RXSTRING rexxretval; /* return value from REXX */
785 APIRET rc; /* return code from REXX */
786 SHORT rexxrc = 0; /* return code from function */
787 char theScript[CCHMAXPATH];
788 /* By setting the strlength of the output RXSTRING to zero, we */
789 /* force the interpreter to allocate memory and return it to us. */
790 /* We could provide a buffer for the interpreter to use instead. */
791 rexxretval.strlength = 0L; /* initialize return to empty*/
792
793 sprintf(theScript, "%s\\%s", pszBinDir, rexxFile);
794
795 /* Here we call the interpreter. We don't really need to use */
796 /* all the casts in this call; they just help illustrate */
797 /* the data types used. */
798 rc=RexxStart((LONG) 0, /* number of arguments */
799 (PRXSTRING) &arg, /* array of arguments */
800 (PSZ) theScript, /* name of REXX file */
801 (PRXSTRING) 0, /* No INSTORE used */
802 (PSZ) "CWRXX", /* Command env. name */
803 (LONG) RXSUBROUTINE, /* Code for how invoked */
804 (PRXSYSEXIT) 0, /* No EXITs on this call */
805 (PSHORT) &rexxrc, /* Rexx program output */
806 (PRXSTRING) &rexxretval ); /* Rexx program output */
807#if 0
808 if(rc) {
809 sprintf(text,"Error in the Rexx skript %s\n\n Get more information with 'help REX%04d'.\n",
810 tPt->rexxSkript, rc*-1);
811 WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "", 1234, MB_OK|MB_MOVEABLE|MB_ERROR);
812 }
813#endif
814 if(!rc) {
815 if(ulSize>rexxretval.strlength) {
816 strncpy(chrResult, rexxretval.strptr, rexxretval.strlength);
817 chrResult[rexxretval.strlength]=0;
818 }
819 else
820 strncpy(chrResult, rexxretval.strptr, ulSize);
821 chrResult[ulSize-1]=0;
822 }
823 if(rexxretval.strptr)
824 DosFreeMem(rexxretval.strptr); /* Release storage given to us by REXX. */
825 if(!rc)
826 return TRUE;
827 else
828 return FALSE;
829}
830/*
831 This function checks the installed image IO procs and adds extensions which are not yet handled
832 to the list of known extensions.
833 */
834static BOOL getMissingExtFromImageIOProc(char *chrMMImageKnownExt, ULONG ulSize)
835{
836 MMFORMATINFO mmFormatInfo;
837 PMMFORMATINFO pmmFormatInfoArray;
838 void * memPtr;
839 ULONG ulReturnCode;
840 LONG lFormatsRead;
841 LONG index;
842 LONG lNumIOProcs;
843
844 memset( &mmFormatInfo,
845 '\0',
846 sizeof(MMFORMATINFO) );
847
848 mmFormatInfo.ulMediaType |= MMIO_MEDIATYPE_IMAGE;
849 mmFormatInfo.ulFlags|=MMIO_CANREADTRANSLATED;/* Read !!!*/
850 ulReturnCode = mmioQueryFormatCount ( &mmFormatInfo,
851 &lNumIOProcs,
852 0,
853 0 );
854
855 if( ulReturnCode != MMIO_SUCCESS )
856 {
857 /*
858 * Error - mmioQueryFormatCount failed.
859 */
860 return FALSE;
861 }
862
863 /*
864 * Allocate enough memory for n number of FormatInfo blocks
865 */
866 pmmFormatInfoArray = malloc (lNumIOProcs * sizeof( MMFORMATINFO ) );
867 memPtr=pmmFormatInfoArray;
868 if( pmmFormatInfoArray == NULL )
869 {
870 /*
871 * Could not allocate enough memory for mmFormatInfo array.
872 */
873 return FALSE;
874 }
875
876 /*
877 * call mmioGetFormats to get info on the formats supported.
878 */
879 ulReturnCode = mmioGetFormats( &mmFormatInfo,
880 lNumIOProcs,
881 pmmFormatInfoArray,
882 &lFormatsRead,
883 0,
884 0 );
885 if( ulReturnCode != MMIO_SUCCESS )
886 {
887 /*
888 * mmioGetFormats failed.
889 */
890 free(pmmFormatInfoArray);
891 return FALSE;
892 }
893
894 if( lFormatsRead != lNumIOProcs )
895 {
896 /*
897 * Error in MMIO - number of formats read in by
898 * mmioGetFormats is not equal to number of formats
899 * found by mmioQueryFormatCount.
900 */
901 free(pmmFormatInfoArray);
902 return FALSE;
903 }
904
905 for ( index = 0; index <lNumIOProcs; index++ )
906 {
907 /* Now scan the whole image proc array */
908 if(!strstr(chrMMImageKnownExt, pmmFormatInfoArray->szDefaultFormatExt)) {
909 /* This extension is yet unknown */
910 if(chrMMImageKnownExt[0]==0) {
911 /* It's the first one */
912 sprintf(chrMMImageKnownExt,"*.%s", pmmFormatInfoArray->szDefaultFormatExt);
913 }
914 else {
915 /* Check if the extension is not already added (e.g. TIF has a lot of subformats) */
916 if(!strstr(chrMMImageKnownExt, pmmFormatInfoArray->szDefaultFormatExt)) {
917 strlcat(chrMMImageKnownExt,";*.", ulSize);
918 strlcat(chrMMImageKnownExt, pmmFormatInfoArray->szDefaultFormatExt, ulSize);
919 }
920 }
921 }
922 /*
923 * advance to next entry in mmFormatInfo array
924 */
925 pmmFormatInfoArray++;
926 }
927 free(memPtr);
928 return FALSE;
929}
930
931
932int main (int argc, char *argv[])
933{
934 HAB hab;
935 HMQ hmq;
936 char text[CCHMAXPATH];
937 short a;
938
939 /* Create a copy of the args */
940 /* argv[0]: progname
941 */
942
943 numArgs=argc;
944
945 strcpy(text,"");
946 for(a=0;a<argc;a++)
947 {
948 params[a]=argv[a];
949 }
950
951 hab=WinInitialize(0);
952 if(hab) {
953 hmq=WinCreateMsgQueue(hab,0);
954 if(hmq) {
955 /* Check if user started prog by hand */
956 if(argc!=NUMPARAMS) {/* Not the right num of params */
957 pmUsage();
958 }
959 else {
960 HWND hwndDlg;
961
962 /* Get our ressource dll */
963 RESSOURCEHANDLE=queryResModuleHandle(argv[0]);
964 /* Load NLV strings */
965 loadStringsFromResourceDLL(RESSOURCEHANDLE);
966
967 /* Get data from INI file */
968 HlpBuildMMProgIniFileName(argv[0], chrIniFile, sizeof(chrIniFile));
969
970 /* Get additional audio extensions from mmpm2.ini */
971 getStringFromRexxScript(queryExeDir(argv[0]), "audioext.rx",
972 chrAdditionalExt, sizeof(chrAdditionalExt));
973 if(strlen(chrAdditionalExt)!=0) {
974 translateChars(chrAdditionalExt, ',', ';');
975 strlcat(chrMediaFileExt[MT_AUDIO], ";", sizeof(chrMediaFileExt[MT_AUDIO]));
976 strlcat(chrMediaFileExt[MT_AUDIO], chrAdditionalExt, sizeof(chrMediaFileExt[MT_AUDIO]));
977 }
978
979 /* Get image extensions */
980 getStringFromRexxScript(queryExeDir(argv[0]), "imageext.rx",
981 chrMediaFileExt[MT_IMAGE], sizeof(chrMediaFileExt[MT_IMAGE]));
982 if(strlen(chrMediaFileExt[MT_IMAGE])!=0)
983 translateChars(chrMediaFileExt[MT_IMAGE], ',', ';');
984 /* Get additional image extensions supplied by the user in imageadd.rx */
985 chrAdditionalExt[0]=0;
986 getStringFromRexxScript(queryExeDir(argv[0]), "imageadd.rx",
987 chrAdditionalExt, sizeof(chrAdditionalExt));
988 if(strlen(chrAdditionalExt)!=0) {
989 translateChars(chrAdditionalExt, ',', ';');
990 strlcat(chrMediaFileExt[MT_IMAGE], ";", sizeof(chrMediaFileExt[MT_IMAGE]));
991 strlcat(chrMediaFileExt[MT_IMAGE], chrAdditionalExt, sizeof(chrMediaFileExt[MT_IMAGE]));
992 }
993 /* Get extensions handled by installed IO procs */
994 getMissingExtFromImageIOProc(chrMediaFileExt[MT_IMAGE], sizeof(chrMediaFileExt[MT_IMAGE]));
995
996#if 0
997 sprintf(chrInstallDir, "%d!%s!", strlen(chrMediaFileExt[MT_IMAGE]), chrMediaFileExt[MT_IMAGE]);
998 WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, chrInstallDir, chrMediaFileExt[MT_IMAGE], 1234, MB_OK);
999#endif
1000
1001 /* Restore recent visited directories */
1002 PrfQueryString(NULLHANDLE, chrIniFile, "mmfind", "lastaudiodir", "", chrLastAudioDir, sizeof(chrLastAudioDir));
1003 PrfQueryString(NULLHANDLE, chrIniFile, "mmfind", "lastvideodir", "", chrLastVideoDir, sizeof(chrLastVideoDir));
1004 PrfQueryString(NULLHANDLE, chrIniFile, "mmfind", "lastimagedir", "", chrLastImageDir, sizeof(chrLastImageDir));
1005
1006 _loadButtonBmps();
1007 fd.cbSize = sizeof( fd );
1008 /* It's an centered 'Open'-dialog */
1009 fd.fl = FDS_OPEN_DIALOG|FDS_CENTER | FDS_CUSTOM;
1010 fd.hMod=RESSOURCEHANDLE;
1011 fd.usDlgId=IDDLG_MMFIND;
1012 fd.pfnDlgProc=findFileDlgProc;
1013
1014
1015 switch(iMediaType)
1016 {
1017 case MT_AUDIO:
1018 strlcpy(fd.szFullFile, chrLastAudioDir, sizeof(fd.szFullFile));
1019 break;
1020 case MT_IMAGE:
1021 strlcpy(fd.szFullFile, chrLastImageDir, sizeof(fd.szFullFile));
1022 break;
1023 case MT_VIDEO:
1024 strlcpy(fd.szFullFile, chrLastVideoDir, sizeof(fd.szFullFile));
1025 break;
1026 default:
1027 break;
1028 }
1029
1030 if( (hwndDlg=WinFileDlg( HWND_DESKTOP, HWND_DESKTOP, &fd )) != NULLHANDLE )
1031 {
1032 if(hBitmap)
1033 GpiDeleteBitmap(hBitmap);
1034 if( fd.lReturn == DID_OK )
1035 {
1036 switch(mmIdentifyFile(fd.szFullFile))
1037 {
1038 case MT_IMAGE:
1039 {
1040 HOBJECT hObject;
1041 if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
1042 WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
1043 break;
1044 }
1045 case MT_AUDIO:
1046 {
1047 HOBJECT hObject;
1048
1049 /* Open the audio file in the editor */
1050 if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
1051 WinOpenObject(hObject, ID_MENU_EDITOR, TRUE);
1052 // WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
1053 break;
1054 }
1055 case MT_VIDEO:
1056 {
1057 HOBJECT hObject;
1058 if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
1059 WinOpenObject(hObject, ID_MENU_PLAYER /* OPEN_DEFAULT */, TRUE);
1060#if 0
1061 /* Open folder */
1062 if(strrchr(fd.szFullFile, '\\')!=NULLHANDLE) {
1063 if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
1064 WinOpenObject(hObject, OPEN_CONTENTS, TRUE);
1065 }
1066#endif
1067 break;
1068 }
1069 default:
1070 {
1071 HOBJECT hObject;
1072 char *chr;
1073 if((chr=strrchr(fd.szFullFile, '\\'))!=NULLHANDLE) {
1074 *chr=0;
1075 if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
1076 WinOpenObject(hObject, OPEN_CONTENTS, TRUE);
1077 }
1078 break;
1079 }
1080 }/* switch()*/
1081 }/* DID_OK */
1082 /* Save the last visited directories */
1083 PrfWriteString(NULLHANDLE, chrIniFile, "mmfind", "lastaudiodir", chrLastAudioDir);
1084 PrfWriteString(NULLHANDLE, chrIniFile, "mmfind", "lastvideodir", chrLastVideoDir);
1085 PrfWriteString(NULLHANDLE, chrIniFile, "mmfind", "lastimagedir", chrLastImageDir);
1086 }
1087 freeResHandle();
1088 }
1089 WinDestroyMsgQueue(hmq);
1090 }
1091 WinTerminate(hab);
1092 }
1093 return 0;
1094}
1095
Note: See TracBrowser for help on using the repository browser.