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

Last change on this file since 2 was 2, checked in by stevenhl, 8 years ago

Import sources from cwmm-full.zip dated 2005-03-21

File size: 15.9 KB
Line 
1/*
2 * mmplayer.c (C) Chris Wohlgemuth 2004
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#include <os2.h>
41#include <sys\types.h>
42#include <sys\stat.h>
43#include <stdio.h>
44#include <string.h>
45#include <stdlib.h>
46#include "os2me.h"
47#include "common.h"
48#include "mmres.h"
49#include "mmprogs_defaults.h"
50#include "sys_funcs.h"
51#include "message_funcs.h"
52
53#ifndef OPEN_DEFAULT
54/* Open views for the wpOpen() method */
55
56 #define OPEN_UNKNOWN -1
57 #define OPEN_DEFAULT 0
58 #define OPEN_CONTENTS 1
59 #define OPEN_SETTINGS 2
60 #define OPEN_HELP 3
61 #define OPEN_RUNNING 4
62 #define OPEN_PROMPTDLG 5
63 #define OPEN_PALETTE 121 /*SPLIT*/
64 #define OPEN_USER 0x6500
65#endif
66
67#define TIMERID_SELECTION 1
68
69//#define DEBUG
70#ifdef DEBUG
71void HlpWriteToTrapLog(const char* chrFormat, ...);
72#endif
73
74BOOL IniSaveWindowPos(char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
75BOOL IniRestoreWindowPos(char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
76int IniRestoreInt(char * iniFile, char* chrApp, char *chrKey, int defaultInt);
77BOOL IniSaveInt(char * iniFile, char* chrApp, char *chrKey, int theInt);
78BOOL HlpBuildMMProgIniFileName(char* chrProgname, char * chrBuffer, ULONG ulBufferSize);
79void freeResHandle();
80HMODULE queryResModuleHandle(char *chrExePath);
81BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
82MRESULT menuInsertMenuSeparator(HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition );
83SHORT menuInsertMenuItem( HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition, int iID, char * chrText);
84void pmUsage();
85ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
86 char* title, ULONG ulTitleID, LONG lSizeTitle,
87 HMODULE hResource, HWND hwnd, ULONG ulFlags);
88
89HBITMAP loadBitmap ( PSZ pszFileName, PBITMAPINFOHEADER2 pBMPInfoHeader2);
90VOID DrawBitmap ( HWND hwnd );
91MRESULT EXPENTRY bmpPreviewProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
92void showImageControls(HWND hwnd, BOOL bShow);
93
94char logName[]="mmfind.log";
95
96char chrIniFile[CCHMAXPATH];
97
98#define NUMPARAMS 1
99/*
100 argv[0]: progname
101 */
102int numArgs;
103char* params[NUMPARAMS];
104
105HMODULE RESSOURCEHANDLE=0;
106
107#define numMediaType 3
108#define MT_AUDIO 0
109#define MT_IMAGE 1
110#define MT_VIDEO 2
111#define MT_UNKNOWN 100
112
113char chrMediaFileTypes[numMediaType][100]= {"Audio","Image","Video"};
114char chrMediaFileExt[numMediaType][300]= {"*.AIF;*.AU;*.FLA;*.FLAC;*.IFF;*.MID;*.MP3;*.OGG;*.SND;*.VOC;*.WAV;*._AU",
115 "*.BMP;*.DIB;*.GIF;*.JPG;*.PCX;*.PNG;*.PCD;*.TIF;*.TGA;*.VID;*._IM",
116 "*.AVI;*.MPG;*.FLI;*.FLC;*.MOV;*.QT;*.VBS"};
117int iMediaType=MT_AUDIO;
118
119char audioText[1000]={"Play time:\t%02d:%02d\n\nSamplerate:\t%d\n\nBits per sample:\t%d\n\nChannels:\t%d"};
120
121HAB globalHab;
122
123/* BMP info for preview */
124BITMAPINFOHEADER2 bmpInfoHeader2;
125HBITMAP hBitmap;
126
127FILEDLG fd = { 0 };
128
129void loadStrings(void)
130{
131
132}
133
134void showVideoControls(HWND hwnd, BOOL bShow)
135{
136 /* Preview area */
137 WinShowWindow(WinWindowFromID(hwnd, IDST_NOPREVIEWAVAILABLE), bShow);
138 /* Group box */
139 WinShowWindow(WinWindowFromID(hwnd, IDGB_PREVIEW), bShow);
140}
141
142void showAudioControls(HWND hwnd, BOOL bShow)
143{
144 /* Preview area */
145 WinShowWindow(WinWindowFromID(hwnd, IDST_AUDIOINFO), bShow);
146 /* Group box */
147 WinShowWindow(WinWindowFromID(hwnd, IDGB_AUDIOINFO), bShow);
148}
149
150
151ULONG mmIdentifyFile(char* chrFile)
152{
153 MMIOINFO mmioInfo={0};
154 MMFORMATINFO mmFormatInfo={0};
155 FOURCC fourCC;
156
157 // SysWriteToTrapLog("%s\n", chrFile);
158 if(MMIO_SUCCESS!=mmioIdentifyFile(chrFile, &mmioInfo, &mmFormatInfo, &fourCC, 0,0))
159 {
160 return MT_UNKNOWN;
161 }
162
163 switch(mmFormatInfo.ulMediaType)
164 {
165 case MMIO_MEDIATYPE_MIDI: /* Midi */
166 case MMIO_MEDIATYPE_AUDIO: /* Any other audio file */
167 return MT_AUDIO;
168 case MMIO_MEDIATYPE_IMAGE:
169 return MT_IMAGE;
170 case MMIO_MEDIATYPE_DIGITALVIDEO:
171 case MMIO_MEDIATYPE_MOVIE:
172 return MT_VIDEO;
173 default:
174 return MT_UNKNOWN;
175 }
176
177 return 0;
178}
179
180
181MRESULT findFileDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
182{
183
184 switch(msg)
185 {
186 case WM_INITDLG:
187 {
188 int a;
189
190 /* Set dialog font */
191 if(SysQueryOSRelease()>=40) {
192 WinSetPresParam(hwnd,
193 PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
194 DEFAULT_DIALOG_FONT );
195 }
196 /* Fill combo box with media types (audio, image, video) */
197 for(a=0;a<numMediaType;a++)
198 WinSendMsg(WinWindowFromID(hwnd, IDCB_TYPEOFFILE), LM_INSERTITEM, MRFROMSHORT(LIT_SORTASCENDING),
199 MPFROMP(chrMediaFileTypes[a]));
200 WinSetWindowText(WinWindowFromID(hwnd, IDCB_TYPEOFFILE), chrMediaFileTypes[0]);
201
202 /* Subclass preview area */
203 WinSubclassWindow(WinWindowFromID(hwnd, IDSR_IMGPREVIEW), bmpPreviewProc);
204 break;
205 }
206 case WM_CONTROL:
207 {
208 switch(SHORT1FROMMP(mp1))
209 {
210 case IDCB_TYPEOFFILE:
211 {
212 if(SHORT2FROMMP(mp1)==CBN_EFCHANGE) {
213 char chrText[100];
214 int a;
215 WinQueryWindowText(HWNDFROMMP(mp2), sizeof(chrText), chrText);
216 /* Find Index */
217 for(a=0; a<numMediaType;a++) {
218 if(!stricmp(chrMediaFileTypes[a], chrText))
219 break;
220 }
221 /* Error!??!*/
222 switch(a)
223 {
224 case 0: /* Audio */
225 {
226 showVideoControls(hwnd, FALSE);
227 showImageControls(hwnd, FALSE);
228 showAudioControls(hwnd, TRUE);
229 iMediaType=MT_AUDIO;
230 break;
231 }
232 case 1: /* Image */
233 showAudioControls(hwnd, FALSE);
234 showVideoControls(hwnd, FALSE);
235 showImageControls(hwnd, TRUE);
236 iMediaType=MT_IMAGE;
237 break;
238 case 2:
239 showAudioControls(hwnd, FALSE);
240 showImageControls(hwnd, FALSE);
241 showVideoControls(hwnd, TRUE);
242 iMediaType=MT_VIDEO;
243 break;
244 default:
245 return WinDefFileDlgProc(hwnd, msg, mp1, mp2);
246 }
247 WinSetWindowText(WinWindowFromID(hwnd, 258), chrMediaFileExt[a]);
248 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, 258));
249 WinSendMsg(WinWindowFromID(hwnd, 258), WM_CHAR,
250 MPFROM2SHORT(KC_VIRTUALKEY , 0), MPFROM2SHORT(0, VK_NEWLINE));
251
252 }
253 break;
254 }
255 case 258:
256 {
257 if(SHORT2FROMMP(mp1)==EN_CHANGE)
258 WinStartTimer(globalHab, hwnd, TIMERID_SELECTION, 100);
259 break;
260 }
261 default:
262 break;
263 }
264 break;
265 }
266 case WM_TIMER:
267 switch(SHORT1FROMMP(mp1))
268 {
269 case TIMERID_SELECTION:
270 {
271 char chrName[CCHMAXPATH];
272 char chrFullName[CCHMAXPATH*2];
273
274 WinStopTimer(globalHab, hwnd, TIMERID_SELECTION);
275 WinQueryWindowText(WinWindowFromID(hwnd, 258), sizeof(chrName), chrName);
276 strcpy(chrFullName, fd.szFullFile);
277 strcat(chrFullName, chrName);
278
279 switch(iMediaType)
280 {
281 case MT_AUDIO:
282 {
283 char text[500];
284 MMIOINFO mmio;
285 HMMIO hmmio;
286 MMAUDIOHEADER mmAudioHeader={0};
287 LONG lBytesRead=0;
288 ULONG rc;
289 ULONG ulPlaySecs;
290
291 memset(&mmio,0, sizeof(mmio));
292 mmio.ulFlags=MMIO_READ;
293 mmio.ulTranslate=MMIO_TRANSLATEHEADER;
294
295 hmmio = mmioOpen(chrFullName, &mmio, MMIO_READ);
296 if(!hmmio)
297 break;
298
299 memset(&mmAudioHeader,0,sizeof(MMAUDIOHEADER));
300 rc = mmioGetHeader(hmmio, &mmAudioHeader,sizeof(MMAUDIOHEADER),
301 &lBytesRead, 0, 0);
302
303 mmioClose(hmmio, 0);
304 if(rc!=MMIO_SUCCESS) {
305 WinSetWindowText(WinWindowFromID(hwnd, IDST_AUDIOINFO), "");
306 break;
307 }
308
309 ulPlaySecs=mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInMS/1000;
310 sprintf(text, audioText,
311 ulPlaySecs/60, ulPlaySecs%60,
312 mmAudioHeader.mmXWAVHeader.WAVEHeader.ulSamplesPerSec,
313 mmAudioHeader.mmXWAVHeader.WAVEHeader.usBitsPerSample,
314 mmAudioHeader.mmXWAVHeader.WAVEHeader.usChannels);
315 WinSetWindowText(WinWindowFromID(hwnd, IDST_AUDIOINFO), text);
316
317 break;
318 }
319 case MT_IMAGE:
320 if(hBitmap) {
321 HBITMAP hBitmapTemp;
322 hBitmapTemp=loadBitmap (chrFullName, &bmpInfoHeader2);
323 GpiDeleteBitmap(hBitmap);
324 hBitmap=hBitmapTemp;
325 }
326 else
327 hBitmap=loadBitmap (chrFullName, &bmpInfoHeader2);
328 /* Force redraw of preview area */
329 WinInvalidateRect(WinWindowFromID(hwnd, IDSR_IMGPREVIEW), NULLHANDLE, FALSE);
330 break;
331 case MT_VIDEO:
332 break;
333 default:
334 break;
335 }
336 return MRFALSE;
337 }
338 default:
339 break;
340 }
341 case WM_COMMAND:
342 switch(SHORT1FROMMP(mp1))
343 {
344 case IDPB_NEWFILE: /* New */
345 {
346 HOBJECT hObject;
347 if((hObject=WinQueryObject("<MMPM2_MMTEMPLATEFOLDER>"))!=NULLHANDLE) {
348 WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
349 WinDismissDlg(hwnd, DID_CANCEL);
350 }
351 else
352 showMessageBox2(hwnd, IDSTR_NOMMTEMPLATEFLDRTITLE, IDSTR_NOMMTEMPLATEFLDR, RESSOURCEHANDLE, MB_MOVEABLE|MB_OK);
353
354 return MRFALSE;
355 }
356 default:
357 break;
358 }
359 default:
360 break;
361 }
362 return WinDefFileDlgProc(hwnd, msg, mp1, mp2);
363}
364
365int main (int argc, char *argv[])
366{
367 HAB hab;
368 HMQ hmq;
369 char text[CCHMAXPATH];
370 short a;
371
372 // FILEDLG fd = { 0 };
373
374 /* Create a copy of the args */
375 /* argv[0]: progname
376 * argv[1]: audio file
377 */
378
379 numArgs=argc;
380
381 strcpy(text,"");
382 for(a=0;a<argc;a++)
383 {
384 params[a]=argv[a];
385 }
386
387 hab=WinInitialize(0);
388 if(hab) {
389 hmq=WinCreateMsgQueue(hab,0);
390 if(hmq) {
391 /* Check if user started prog by hand */
392 if(argc!=NUMPARAMS) {/* Not the right num of params */
393 pmUsage();
394 }
395 else {
396 HWND hwndDlg;
397
398 /* Get our ressource dll */
399 RESSOURCEHANDLE=queryResModuleHandle(argv[0]);
400 /* Get data from INI file */
401 HlpBuildMMProgIniFileName(argv[0], chrIniFile, sizeof(chrIniFile));
402
403 globalHab=WinQueryAnchorBlock(HWND_DESKTOP);
404
405 fd.cbSize = sizeof( fd );
406 /* It's an centered 'Open'-dialog */
407 fd.fl = FDS_OPEN_DIALOG|FDS_CENTER | FDS_CUSTOM;
408 /* Title: "Search CDRecord/2" */
409 //getMessage(text,IDSTR_FDLGSEARCHCDRDAOTITLE,sizeof(text), hSettingsResource,hwnd);
410 /* Set the title of the file dialog */
411 //fd.pszTitle = text;
412 // fd.pszTitle = "Find file";
413 /* Only show *.wav files */
414 sprintf(fd.szFullFile,"%s","*.wav");
415 fd.hMod=RESSOURCEHANDLE;
416 fd.usDlgId=IDDLG_MMFIND;
417 fd.pfnDlgProc=findFileDlgProc;
418 //SysWriteToTrapLog("%x\n", fd.hMod);
419 if( (hwndDlg=WinFileDlg( HWND_DESKTOP, HWND_DESKTOP, &fd )) != NULLHANDLE )
420 {
421 /* Set dialog font to WarpSans for Warp 4 and above */
422 if(hBitmap)
423 GpiDeleteBitmap(hBitmap);
424
425 if( fd.lReturn == DID_OK )
426 {
427 switch(mmIdentifyFile(fd.szFullFile))
428 {
429 case MT_IMAGE:
430 {
431 HOBJECT hObject;
432 if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
433 WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
434 break;
435 }
436 case MT_AUDIO:
437 {
438 HOBJECT hObject;
439 char *chr;
440 if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
441 WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
442 if((chr=strrchr(fd.szFullFile, '\\'))!=NULLHANDLE) {
443 *chr=0;
444 if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
445 WinOpenObject(hObject, OPEN_CONTENTS, TRUE);
446 }
447 break;
448 }
449 case MT_VIDEO:
450 {
451 HOBJECT hObject;
452 char *chr;
453 if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
454 WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
455 if((chr=strrchr(fd.szFullFile, '\\'))!=NULLHANDLE) {
456 *chr=0;
457 if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
458 WinOpenObject(hObject, OPEN_CONTENTS, TRUE);
459 }
460 break;
461 }
462 default:
463 {
464 HOBJECT hObject;
465 char *chr;
466 //if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
467 // WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
468 if((chr=strrchr(fd.szFullFile, '\\'))!=NULLHANDLE) {
469 *chr=0;
470 if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
471 WinOpenObject(hObject, OPEN_CONTENTS, TRUE);
472 }
473 break;
474 }
475 }/* switch()*/
476 }/* DID_OK */
477 }
478 // freeResHandle();
479 }
480 WinDestroyMsgQueue(hmq);
481 }
482 WinTerminate(hab);
483 }
484 return 0;
485}
486
Note: See TracBrowser for help on using the repository browser.