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

Last change on this file since 104 was 104, checked in by gyoung, 23 months ago

Remaining changes from merge with Lars 2.9 branch

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