source: branches/v2.9/classes/c/ohne_CWMMDataFile/cwaudio.c

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

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

File size: 54.7 KB
Line 
1
2/*
3 * This file was generated by the SOM Compiler and Emitter Framework.
4 * Generated using:
5 * SOM Emitter emitctm: 2.42
6 */
7
8#ifndef SOM_Module_cwaudio_Source
9#define SOM_Module_cwaudio_Source
10#endif
11#define CWAudio_Class_Source
12#define M_CWAudio_Class_Source
13
14#define INCL_PM
15#define INCL_DOSMODULEMGR
16#define INCL_DOS
17#define INCL_WINWORKPLACE
18#define INCL_MMIOOS2
19#define INCL_REXXSAA
20#define INCL_DOSDEVIOCTL
21#define INCL_MCIOS2
22
23#include <os2.h>
24#include <stdio.h>
25#include <rexxsaa.h> /* needed for Rexx */
26#include "os2me.h"
27#include "cwaudio.ih"
28#include "cwaudioinc.h"
29#include <wpdisk.h>
30
31typedef ULONG (APIENTRY FNWPSFUNC)(WPObject* ,...);
32typedef FNWPSFUNC *PFNWPSFUNC;
33
34char classDLLPath[CCHMAXPATH]={0};
35
36int iFirstCD;
37int iNumCD;
38BOOL bGotCD=FALSE;
39
40void parameterError(char *chrMethod)
41{
42 char text[200];
43 sprintf(text, "%s: wrong number of parameters.", chrMethod);
44
45 WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "Method error",
46 1234, MB_OK|MB_MOVEABLE);
47
48}
49
50void wpObjectError(char *chrMethod)
51{
52 char text[200];
53 sprintf(text, "Method %s: object pointer is not valid.", chrMethod);
54
55 WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "Object error",
56 1234, MB_OK|MB_MOVEABLE);
57
58}
59
60
61#define HASHSIZE 101
62ULONG calculateHash(char * theString)
63{
64 ULONG ulHash=0;
65
66 if(theString)
67 for(ulHash=0;*theString!='\0'; theString++)
68 ulHash=*theString+31*ulHash;
69
70 return ulHash%HASHSIZE;
71}
72
73#define HASHSIZE2 123
74ULONG calculateHash2(char * theString)
75{
76 ULONG ulHash=0;
77
78 if(theString)
79 for(ulHash=0;*theString!='\0'; theString++)
80 ulHash=*theString+37*ulHash;
81
82 return ulHash%HASHSIZE;
83}
84
85/* This function handles new WPS functions introduced by private classes */
86ULONG EXPENTRY rxCallCWMMFunc(PSZ name, LONG argc, RXSTRING argv[], PSZ queuename,PRXSTRING retstring)
87{
88 char text[200];
89 ULONG ulHash;
90 ULONG ulReturn;
91 WPObject* wpObject;
92 WPFileSystem* wpFSObject;
93
94 /* At least WPObject* and name of method */
95 if(argc<2)
96 return 40;
97
98 /* TRY_LOUD(RX) {*/
99 /* Get a hash for the methodname for the switch() statement */
100 ulHash=calculateHash(argv[0].strptr)<<8;
101 ulHash+=calculateHash2(argv[0].strptr);
102 ulReturn=0;
103
104 wpObject=(WPObject*)atol(argv[1].strptr);
105 /* Check if it's a valid object */
106 if(somIsObj(wpObject)) {
107 PFNWPSFUNC procAddr;
108
109 /* Try to find the requested method */
110 if((procAddr=(PFNWPSFUNC) somResolveByName(wpObject, argv[0].strptr))==NULL) {
111 /* method not found */
112 sprintf(retstring->strptr, "ERROR_METHOD:");
113 retstring->strlength=strlen(retstring->strptr);
114 }
115 else {
116 switch(ulHash)
117 {
118 case 0x2a1b: /* cwmmQueryTrackInfo */
119 {
120 ULONG ulParam1;
121 char text[100];
122
123 if(argc<3) {
124 parameterError(argv[0].strptr);
125 ulReturn=40;
126 break;
127 }
128
129 ulParam1=atol(argv[2].strptr);/* ulWhich */
130
131 switch(ulParam1)
132 {
133 case IDINFO_PLAYTIME:
134 case IDINFO_BPS:
135 case IDINFO_CHANNELS:
136 case IDINFO_SAMPLERATE:
137 sprintf(retstring->strptr,"%d",procAddr(wpObject, NULLHANDLE, 0, ulParam1));
138 break;
139 default:
140 if(!procAddr(wpObject, &retstring->strptr, retstring->strlength, ulParam1))
141 //if(!procAddr(wpObject, text, 100, ))
142 sprintf(retstring->strptr,"ERROR:");
143 }
144 retstring->strlength=strlen(retstring->strptr);
145 break;
146 }
147 default:
148 ulReturn=40;
149 }/* switch */
150 }/* else if((procAddr=(PFNWPSFUNC) somResolveByName(wpObject, argv[1].strptr))==NULL) */
151 }/* if(somIsObj(wpObject)) */
152 else {
153 /* wpObject is not valid */
154 wpObjectError(argv[0].strptr);
155
156 ulReturn=40;
157 }
158
159 /* }
160 CATCH(RX)
161 {}END_CATCH;*/
162
163 return ulReturn;
164}
165
166/**************************************************************/
167/* */
168/* This funktion returns the CD-Drives in the system */
169/* */
170/* iNumCD (output): # of CD-Drives */
171/* iFirstDrive (output): first cd-Drive */
172/* returns TRUE: We have cd-drives */
173/* */
174/**************************************************************/
175BOOL cwQueryCDDrives(int *iNumCD, int * iFirstDrive)
176{
177 HFILE hfDevice;
178 ULONG ulAction;
179 ULONG ulLen;
180 static int iFirst=0;
181 static int iNumCDLocal=0;
182 static BOOL haveCD=FALSE;
183 static BOOL done=FALSE;
184 struct
185 {
186 USHORT usCountCD;
187 USHORT usFirstCD;
188 } CDInfo;
189
190 if(!done){
191 ulLen = sizeof(CDInfo);
192 if(!DosOpen("\\DEV\\CD-ROM2$", &hfDevice, &ulAction, 0,
193 FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS,
194 OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, NULL))
195 {
196 if(!DosDevIOCtl(hfDevice, 0x82, 0x60, NULL, 0, NULL, &CDInfo, ulLen, &ulLen))
197 {
198 if(CDInfo.usCountCD) {
199 haveCD=TRUE;
200 iNumCDLocal=CDInfo.usCountCD;
201 iFirst=1+CDInfo.usFirstCD;
202 }
203 }
204 DosClose(hfDevice);
205 }
206 done=TRUE;
207 }
208 *iNumCD=iNumCDLocal;
209 *iFirstDrive=iFirst;
210 return haveCD;
211}
212
213/****************************************/
214/* Input: drive (e.g. o:) */
215/****************************************/
216HFILE openDrive(char* drive)
217{
218 HFILE hfDrive = 0;
219 ULONG ulAction;
220 ULONG rc;
221
222 rc = DosOpen(drive, &hfDrive, &ulAction, 0,
223 FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS,
224 OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY |
225 OPEN_FLAGS_DASD|OPEN_FLAGS_FAIL_ON_ERROR, NULL);
226
227 if(rc)
228 return NULLHANDLE;//Error
229
230 return hfDrive;
231}
232
233void closeDrive(HFILE hfDrive)
234{
235 DosClose(hfDrive);
236}
237
238#pragma pack(1)
239
240typedef struct{
241 UCHAR ucFirstTrack;
242 UCHAR ucLastTrack;
243 ULONG ulLeadOut;
244}CDINFO;
245
246typedef struct
247{
248 UCHAR signature[4];
249 UCHAR ucTrackNum;
250}TINFOPARAM;
251
252typedef struct
253{
254 ULONG ulTrackAddress;
255 UCHAR ucTCInfo;
256}CDTRACKINFO;
257
258#pragma pack()
259
260/******************************************/
261/* Result:
262 0: Error
263 -1: CD is Data Disk
264 other: # Audio tracks */
265/******************************************/
266int CDQueryAudioCDTracks(HFILE hfDrive)
267{
268 ULONG ulParamLen;
269 ULONG ulDataLen;
270 ULONG rc;
271 CDINFO cdInfo;
272 TINFOPARAM tip;
273 CDTRACKINFO trackInfo;
274 //char text[100];
275
276 ulDataLen=sizeof(cdInfo);
277 ulParamLen=4;
278
279 if(!hfDrive)
280 return 0;
281
282 rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
283 "CD01", 4, &ulParamLen, &cdInfo,
284 sizeof(cdInfo), &ulDataLen);
285
286 if(rc) {
287 return 0;//Error
288 }
289
290 ulDataLen=sizeof(trackInfo);
291 ulParamLen=sizeof(TINFOPARAM);
292 tip.signature[0]='C';
293 tip.signature[1]='D';
294 tip.signature[2]='0';
295 tip.signature[3]='1';
296 tip.ucTrackNum=1;
297
298 /* We have a disc. Check if it's audio */
299 rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
300 &tip, sizeof(tip), &ulParamLen, &trackInfo,
301 sizeof(trackInfo), &ulDataLen);
302
303 if(rc) {
304 return 0;//Error
305 }
306
307 if(trackInfo.ucTCInfo & 0x40) {
308 return -1;//It's a data track
309 }
310 return cdInfo.ucLastTrack-cdInfo.ucFirstTrack+1;
311}
312
313
314BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd)
315{
316 if(!WinLoadString(WinQueryAnchorBlock(hwnd),hResource,ulID,lSizeText,text)) {
317 sprintf(text,"");
318 return FALSE;
319 }
320 return TRUE;
321}
322
323/* Remove all trailing spaces from a string. The string MUST be terminated by 0! */
324void _removeTrailingSpaces(char * chrString)
325{
326 char *ptr;
327
328 if((ptr=strrchr(chrString, 0))==NULLHANDLE)
329 return;
330
331 if(ptr==chrString)
332 return;
333
334 while(ptr>=chrString && (*ptr==0 || *ptr==' '))
335 ptr--;
336
337 *(++ptr)=0;
338}
339
340HMODULE queryModuleHandle(void)
341{
342 PSZ moduleName;
343 static ULONG hModule=0;
344 somId mySomId;
345
346 if(!hModule)
347 {
348 mySomId=somIdFromString("M_CWAudio");
349 moduleName=_somLocateClassFile(SOMClassMgrObject, mySomId, 1, 1);
350 SOMFree(mySomId);
351 DosQueryModuleHandle(moduleName, &hModule);
352 strncpy(classDLLPath,moduleName, sizeof(classDLLPath));
353 classDLLPath[sizeof(classDLLPath)-1]=0;
354 }
355 return hModule;
356}
357
358PSZ queryModuleName(void)
359{
360 if(queryModuleHandle())
361 return classDLLPath;
362
363 return NULLHANDLE;
364}
365
366SOMClass* cwGetSomClass(char* chrClassName)
367{
368 somId mySomId;
369 SOMClass *somClass;
370
371 if((mySomId=somIdFromString(chrClassName))==NULLHANDLE)
372 return NULLHANDLE;
373
374 somClass=_somClassFromId(SOMClassMgrObject, mySomId);
375 SOMFree(mySomId);
376
377 return somClass;
378}
379
380#if 0
381ULONG launchPMProg(PSZ pszTitle, PSZ wrapperExe, PSZ parameters)
382{
383 STARTDATA startData={0};
384 APIRET rc;
385 PID pid;
386 ULONG ulSessionID=0;
387 char chrLoadError[CCHMAXPATH];
388
389 memset(&startData,0,sizeof(startData));
390 startData.Length=sizeof(startData);
391 startData.Related=SSF_RELATED_INDEPENDENT;
392 startData.FgBg=SSF_FGBG_FORE;
393 startData.TraceOpt=SSF_TRACEOPT_NONE;
394 startData.PgmTitle=pszTitle;
395
396 startData.PgmName=wrapperExe;
397 startData.InheritOpt=SSF_INHERTOPT_SHELL;
398 startData.SessionType=SSF_TYPE_PM;
399 startData.PgmControl=0;
400 startData.InitXPos=30;
401 startData.InitYPos=30;
402 startData.InitXSize=500;
403 startData.InitYSize=400;
404 startData.ObjectBuffer=chrLoadError;
405 startData.ObjectBuffLen=(ULONG)sizeof(chrLoadError);
406
407 startData.PgmInputs=parameters;
408
409 rc=DosStartSession(&startData,&ulSessionID,&pid);
410 return 0;
411}
412
413ULONG _launchPMProg(PSZ pszTitle, PSZ wrapperExe, PSZ parameters)
414{
415 PROGDETAILS progDetails={0};
416
417 memset(&progDetails,0, sizeof(progDetails));
418 progDetails.Length=sizeof(PROGDETAILS);
419 progDetails.progt.progc=PROG_PM;
420 progDetails.progt.fbVisible=SHE_VISIBLE;
421 progDetails.pszTitle=pszTitle;
422 progDetails.pszTitle="Text";
423 progDetails.pszStartupDir="";
424 progDetails.pszEnvironment="WORKPLACE\0\0";
425 progDetails.pszExecutable=wrapperExe;
426 progDetails.pszExecutable="ab.EXE";
427 progDetails.swpInitial.fl=SWP_ACTIVATE;
428 progDetails.swpInitial.hwndInsertBehind=HWND_TOP;
429
430 // WinMessageBox(HWND_DESKTOP,HWND_DESKTOP, progDetails.pszExecutable, parameters, 12324, MB_MOVEABLE);
431 return WinStartApp(NULLHANDLE, &progDetails, NULL, NULL, SAF_STARTCHILDAPP);
432}
433
434#endif
435
436MRESULT EXPENTRY waveInfoDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
437{
438 CWAudio *cwAudio;
439
440 switch(msg) {
441 case WM_INITDLG :
442 cwAudio=(CWAudio*)LONGFROMMP(mp2);
443 if(somIsObj(cwAudio)) {
444 CWAudioData *somThis = CWAudioGetData(cwAudio);
445 do {
446 char fName[CCHMAXPATH];
447
448 sprintf(fName,"%d",_ulChannels);
449 WinSetWindowText(WinWindowFromID(hwnd, IDST_CHANNELS),fName);
450
451 sprintf(fName,"%d",_ulSampleRate);
452 WinSetWindowText(WinWindowFromID(hwnd, IDST_SAMPLERATE),fName);
453 sprintf(fName,"%d",_ulBPS);
454 WinSetWindowText(WinWindowFromID(hwnd, IDST_BPS),fName);
455 sprintf(fName,"%d:%02d",_ulPlaySecs/60, _ulPlaySecs%60);
456 WinSetWindowText(WinWindowFromID(hwnd, IDST_PLAYTIME),fName);
457 WinSetWindowULong(WinQueryWindow(hwnd, QW_PARENT), QWL_HWNDFOCUSSAVE, hwnd);
458 break;
459 }while (FALSE);
460 }
461 return (MRESULT)TRUE;
462 /* This prevents switching the notebook page behind the open folder */
463 case WM_WINDOWPOSCHANGED:
464 {
465 MRESULT mr;
466
467 if(WinQueryFocus(HWND_DESKTOP)!=
468 WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), QW_PARENT)) {
469 mp2=MPFROMLONG(LONGFROMMP(mp2)|0x80000);/*AWP_ACTIVATE 0x00080000L*/
470 mr=WinDefDlgProc(hwnd, msg, mp1, mp2);
471 return mr;
472 }
473 break;
474 }
475 case WM_FOCUSCHANGE:
476 {
477 if(!SHORT1FROMMP(mp2)) {
478 if(HWNDFROMMP(mp1)==hwnd) {
479 MRESULT mr;
480
481 mr=WinDefDlgProc(hwnd, msg, mp1, mp2);
482 WinSendMsg(WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), QW_PARENT),
483 WM_SETFOCUS, MPFROMHWND(hwnd), (MPARAM)TRUE);
484 return mr;
485 }
486 }
487 break;
488 }
489 case WM_DESTROY:
490 /* The notebook closes and gets destroyed */
491 /* Set focus to desktop to prevent PM freeze */
492 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
493 break;
494#if 0
495 case WM_WINDOWPOSCHANGED:
496 {
497 /* This prevents switching the notebook page behind the open folder */
498 if(!(WinQueryWindowUShort(WinQueryWindow(hwnd, QW_PARENT), QWS_FLAGS) & FF_ACTIVE))
499 mp2=MPFROMLONG(0x80000);
500 break;
501 }
502#endif
503 default:
504 break;
505 }
506 return WinDefDlgProc(hwnd, msg, mp1, mp2);
507
508}
509
510SOM_Scope ULONG SOMLINK cwaudio_cwmmAddWaveInformationPage(CWAudio *somSelf,
511 HWND hwndNotebook)
512{
513 PAGEINFO pageinfo;
514 char pageName[100];
515
516
517 /* CWAudioData *somThis = CWAudioGetData(somSelf); */
518 CWAudioMethodDebug("CWAudio","cwaudio_cwmmAddWaveInformationPage");
519
520 //Clear the pageinfo structure
521 memset((PCH)&pageinfo, 0, sizeof(PAGEINFO));
522 //Fill the pageinfo structure
523 pageinfo.cb = sizeof(PAGEINFO);
524 pageinfo.hwndPage = NULLHANDLE;
525 pageinfo.usPageStyleFlags = BKA_MAJOR | BKA_STATUSTEXTON;
526 pageinfo.usPageInsertFlags = BKA_FIRST;
527 //We want page numbers
528 pageinfo.usSettingsFlags = SETTINGS_PAGE_NUMBERS;
529 //The dialog procedure for this page
530 pageinfo.pfnwp = waveInfoDlgProc;
531 //The resource DLL
532 pageinfo.resid = queryModuleHandle();
533 //pageinfo.resid = queryModuleHandle();
534 //The ID of the dialog template
535 pageinfo.dlgid = IDDLG_WAVEINFOPAGE;
536 //We need a pointer to our WPS-object in the dialog procedure
537 //to call class functions
538 pageinfo.pCreateParams = somSelf;
539 //The ID of the help panel for this page
540 //pageinfo.idDefaultHelpPanel = IDDLG_GENERAL2PAGE;
541 //Tell the WPS the help library name
542 pageinfo.pszHelpLibraryName = NULLHANDLE;
543 //We have a major tab so we need a name
544 /* pageName: "ISO filesystem" */
545 getMessage(pageName, ID_WAVEINFOPAGENAME, sizeof(pageName), queryModuleHandle(), hwndNotebook);
546 pageinfo.pszName = pageName;
547 //Insert the page into the settings notebook
548 return _wpInsertSettingsPage(somSelf,hwndNotebook,&pageinfo);
549
550}
551
552
553SOM_Scope BOOL SOMLINK cwaudio_cwmmSetTrackInfo(CWAudio *somSelf,
554 char* chrString,
555 ULONG ulValue,
556 int iWhich)
557{
558 CWAudioData *somThis = CWAudioGetData(somSelf);
559 CWAudioMethodDebug("CWAudio","cwaudio_cwmmSetIdInfo");
560
561 if(iWhich<1||iWhich>IDINFO_LASTINFO)
562 return FALSE;
563
564 switch(iWhich)
565 {
566 case IDINFO_PLAYTIME:
567 _ulPlaySecs=ulValue;
568 sprintf(_chrPlayTime, "%02d:%02d",_ulPlaySecs/60, _ulPlaySecs%60);
569 break;
570 case IDINFO_NAME:
571 strncpy(_id3Name,chrString,sizeof(_id3Name));
572 _id3Name[sizeof(_id3Name)-1]=0;
573 _removeTrailingSpaces(_id3Name);
574 break;
575 case IDINFO_ARTIST:
576 strncpy(_id3Artist,chrString,sizeof(_id3Artist));
577 _id3Artist[sizeof(_id3Artist)-1]=0;
578 _removeTrailingSpaces(_id3Artist);
579 break;
580 case IDINFO_ALBUM:
581 strncpy(_id3Album, chrString, sizeof(_id3Album));
582 _id3Album[sizeof(_id3Album)-1]=0;
583 _removeTrailingSpaces(_id3Album);
584 break;
585 case IDINFO_YEAR:
586 strncpy(_id3Year, chrString, sizeof(_id3Year));
587 _id3Year[sizeof(_id3Year)-1]=0;
588 _removeTrailingSpaces(_id3Year);
589 break;
590 case IDINFO_COMMENT:
591 strncpy(_id3Comment,chrString, sizeof(_id3Comment));
592 _id3Comment[sizeof(_id3Comment)]=0;
593 _removeTrailingSpaces(_id3Comment);
594 break;
595 case IDINFO_GENRE:
596 strncpy(_id3Genre, chrString, sizeof(_id3Genre));
597 _id3Genre[sizeof(_id3Genre)-1]=0;
598 _removeTrailingSpaces(_id3Genre);
599 break;
600 default:
601 return FALSE;
602 }
603 /* Return statement to be customized: */
604 return TRUE;
605}
606
607
608/*
609 * The prototype for cwaudio_cwmmQueryTrackInfo was replaced by the following prototype:
610 */
611SOM_Scope ULONG SOMLINK cwaudio_cwmmQueryTrackInfo(CWAudio *somSelf,
612 char** chrString,
613 ULONG ulSize,
614 int iWhich)
615{
616 CWAudioData *somThis = CWAudioGetData(somSelf);
617 CWAudioMethodDebug("CWAudio","cwaudio_cwmmQueryTrackInfo");
618
619 switch(iWhich)
620 {
621 case IDINFO_PLAYTIME:
622 return _ulPlaySecs;
623 case IDINFO_BPS:
624 return _ulBPS;
625 case IDINFO_CHANNELS:
626 return _ulChannels;
627 case IDINFO_SAMPLERATE:
628 return _ulSampleRate;
629 case IDINFO_NAME:
630 {
631 char *chr=*chrString;
632 if(ulSize>=sizeof(_id3Name)) {
633 strncpy(chr, _id3Name, sizeof(_id3Name));
634 chr[sizeof(_id3Name)-1]=0;
635 }
636 else {
637 strncpy(chr, _id3Name, ulSize);
638 chr[ulSize-1]=0;
639 }
640 if(chr[0]==0)
641 return FALSE;
642 else
643 return TRUE;
644 }
645 case IDINFO_ARTIST:
646 {
647 char *chr=*chrString;
648 if(ulSize>=sizeof(_id3Artist)) {
649 strncpy(chr, _id3Artist, sizeof(_id3Artist));
650 chr[sizeof(_id3Artist)-1]=0;
651 }
652 else {
653 strncpy(chr, _id3Artist, ulSize);
654 chr[ulSize-1]=0;
655 }
656 if(chr[0]==0)
657 return FALSE;
658 else
659 return TRUE;
660 }
661 case IDINFO_ALBUM:
662 {
663 char *chr=*chrString;
664 if(ulSize>=sizeof(_id3Album)) {
665 strncpy(chr, _id3Album, sizeof(_id3Album));
666 chr[sizeof(_id3Album)-1]=0;
667 }
668 else {
669 strncpy(chr, _id3Album, ulSize);
670 chr[ulSize-1]=0;
671 }
672 if(chr[0]==0)
673 return FALSE;
674 else
675 return TRUE;
676 }
677 case IDINFO_COMMENT:
678 {
679 char *chr=*chrString;
680 if(ulSize>=sizeof(_id3Comment)) {
681 strncpy(chr, _id3Comment, sizeof(_id3Comment));
682 chr[sizeof(_id3Comment)-1]=0;
683 }
684 else {
685 strncpy(chr, _id3Comment, ulSize);
686 chr[ulSize-1]=0;
687 }
688 if(chr[0]==0)
689 return FALSE;
690 else
691 return TRUE;
692 }
693 case IDINFO_YEAR:
694 {
695 char *chr=*chrString;
696 if(ulSize>=sizeof(_id3Year)) {
697 strncpy(chr, _id3Year, sizeof(_id3Year));
698 chr[sizeof(_id3Year)-1]=0;
699 }
700 else {
701 strncpy(chr, _id3Year, ulSize);
702 chr[ulSize-1]=0;
703 }
704 if(chr[0]==0)
705 return FALSE;
706 else
707 return TRUE;
708 }
709 case IDINFO_GENRE:
710 {
711 char *chr=*chrString;
712 if(ulSize>=sizeof(_id3Genre)) {
713 strncpy(chr, _id3Genre, sizeof(_id3Genre));
714 chr[sizeof(_id3Genre)-1]=0;
715 }
716 else {
717 strncpy(chr, _id3Genre, ulSize);
718 chr[ulSize-1]=0;
719 }
720 if(chr[0]==0)
721 return FALSE;
722 else
723 return TRUE;
724 }
725 default:
726 break;
727 }
728
729 /* Return statement to be customized: */
730 return 0;
731}
732
733
734typedef struct _OPENPARAMS
735{
736 CWAudio* thisPtr;
737 PID pid;
738 SWCNTRL swCtrl;
739 USEITEM useItem;
740 VIEWITEM viewItem;
741}OPENPARAMS;
742
743/* This Proc handles */
744MRESULT EXPENTRY playObjectProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
745{
746
747 switch (msg)
748 {
749 case WM_APPTERMINATENOTIFY:
750 {
751 CWAudio * thisPtr;
752 thisPtr=(CWAudio *)PVOIDFROMMP(mp2);/* Get object ptr */
753 if(somIsObj(thisPtr)) {
754 if(LONGFROMMP(mp1)==ACKEY_START) {
755 unsigned char chrCommand[CCHMAXPATH*2];
756 char chrDevice[20];
757 char name[CCHMAXPATH];
758 ULONG ulNameSize;
759 char retMsg[20];
760 APIRET rc;
761 int iTime;
762 SOMClass* mmMIDIClass=cwGetSomClass("CWMIDI");
763
764 WinSetWindowULong(hwnd, QWL_USER, (ULONG)thisPtr);
765#if 0
766 if(contentObject->somIsA(mmAudioClass))
767 strncpy(chrDevice,"WAVEAUDIO", sizeof(chrDevice));
768 else if(contentObject->somIsA(mmMIDIClass))
769 strncpy(chrDevice,"SEQUENCER", sizeof(chrDevice));
770#endif
771 if(_somIsA(thisPtr, mmMIDIClass))
772 strncpy(chrDevice,"SEQUENCER", sizeof(chrDevice));
773 else
774 strncpy(chrDevice,"WAVEAUDIO", sizeof(chrDevice));
775
776 ulNameSize=sizeof(name);
777 _wpQueryRealName(thisPtr, name, &ulNameSize, TRUE);
778
779 /* Start audio file */
780 sprintf(chrCommand,"open \"%s\" type %s alias wave%d SHAREABLE wait",name, chrDevice, thisPtr);
781 //WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, chrCommand, "CWAudio", 1234, MB_OK|MB_MOVEABLE);
782 rc = mciSendString( chrCommand, retMsg, sizeof(retMsg), hwnd, 0);
783 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
784 WinPostMsg(hwnd,WM_QUIT,0,0);
785 return MRFALSE;
786 }
787 sprintf(chrCommand,"STATUS wave%d LENGTH WAIT", thisPtr);
788 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
789 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
790 WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
791 return MRFALSE;
792 }
793 iTime=atoi(retMsg);
794 if(iTime>3000)
795 iTime-=3000;
796 // WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, retMsg, "CWAudio", 1234, MB_OK|MB_MOVEABLE);
797 sprintf(chrCommand,"SETCUEPOINT wave%d ON at %d WAIT", thisPtr, iTime);
798 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwnd, 0);
799 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
800
801 WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
802 return MRFALSE;
803 }
804
805 sprintf(chrCommand,"play wave%d ", thisPtr);
806 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
807 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
808 WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
809 return MRFALSE;
810 }
811 }
812 else if(LONGFROMMP(mp1)==ACKEY_STOP) {
813 /* Stop playing */
814 unsigned char chrCommand[CCHMAXPATH*2];
815 char retMsg[20];
816
817 sprintf(chrCommand,"stop wave%d wait", thisPtr);
818 mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
819
820 sprintf(chrCommand,"close wave%d wait", thisPtr);
821 mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
822
823 WinPostMsg(hwnd,WM_QUIT,0,0);
824 }
825 }/* if(thisPtr) */
826 return MRFALSE;
827 }
828 case MM_MCICUEPOINT:
829 {
830 CWAudio * thisPtr;
831 unsigned char chrCommand[CCHMAXPATH*2];
832 char retMsg[20];
833 thisPtr=(CWAudio *)WinQueryWindowULong(hwnd, QWL_USER);
834
835 if(somIsObj(thisPtr)) {
836 sprintf(chrCommand,"STATUS wave%d MODE WAIT", thisPtr);
837 do {
838 APIRET rc;
839 DosSleep(100);
840 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
841 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
842 WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
843 return MRFALSE;
844 }
845 }
846 while(stricmp(retMsg, "playing"));
847
848 WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
849 }
850 return MRFALSE;
851 }
852 default:
853 break;
854 }
855 return WinDefWindowProc( hwnd, msg, mp1, mp2);
856
857}
858
859/* This thread is only to handle the object in use emphasis */
860void _Optlink playThreadFunc (void *arg)
861{
862 HAB hab;
863 HMQ hmq;
864 QMSG qmsg;
865 OPENPARAMS * params;
866 CWAudio *thisPtr;
867 //WPObject *thisPtr;
868
869 params=(OPENPARAMS*)arg;
870 if(!params)
871 return;
872
873 thisPtr=params->thisPtr;
874 if(!somIsObj(thisPtr))
875 return;
876
877 hab=WinInitialize(0);
878 if(hab) {
879 hmq=WinCreateMsgQueue(hab,0);
880 if(hmq) {
881 HWND hwnd;
882 // WPObjectData *somThis = WPObjectGetData(thisPtr);
883 CWAudioData *somThis = CWAudioGetData(thisPtr);
884 params->useItem.type=USAGE_OPENVIEW;
885 params->viewItem.handle=NULLHANDLE;
886 _wpAddToObjUseList(thisPtr, &params->useItem);
887
888 hwnd=WinCreateWindow(HWND_OBJECT,WC_STATIC,"playObj", 0, 0, 0, 0, 0,
889 NULLHANDLE, HWND_BOTTOM,12343,NULL,NULL);
890 if(hwnd) {
891 WinSubclassWindow(hwnd,&playObjectProc);
892 /* Window created. */
893 WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_START), MPFROMP(thisPtr));
894 _hwndObjectPlay=hwnd;
895 while(WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))
896 WinDispatchMsg(hab,&qmsg);
897 WinDestroyWindow(hwnd);
898 }
899 _wpDeleteFromObjUseList(thisPtr, &params->useItem);
900 _hwndObjectPlay=NULLHANDLE;
901 _wpSetDefaultView(thisPtr, _ulPreviousView);
902 WinDestroyMsgQueue(hmq);
903 }
904 WinTerminate(hab);
905 }
906 /* Free the parameters */
907 _wpFreeMem(thisPtr, (PBYTE)params);
908}
909
910SOM_Scope void SOMLINK cwaudio_cwmmPlayTrack(CWAudio *somSelf,
911 BOOL bPlay)
912{
913 ULONG ulError;
914 OPENPARAMS *pThreadParams;
915
916 CWAudioData *somThis = CWAudioGetData(somSelf);
917 CWAudioMethodDebug("CWAudio","cwaudio_cwmmPlayTrack");
918
919 if(bPlay) {
920 if(!WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP),_hwndObjectPlay)) {
921 /* Start playing */
922 pThreadParams=(OPENPARAMS*)_wpAllocMem(somSelf, sizeof(OPENPARAMS), &ulError);
923
924 if(pThreadParams) {
925 memset((void*)pThreadParams ,0, sizeof(OPENPARAMS));
926 pThreadParams->thisPtr=somSelf;
927 pThreadParams->viewItem.view=ID_MENU_START;
928 _beginthread(playThreadFunc,NULL,8192*16,(void*)pThreadParams); //Fehlerbehandlung fehlt
929 }
930 }
931 }
932 else
933 if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP),_hwndObjectPlay))
934 WinPostMsg(_hwndObjectPlay, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(somSelf));
935}
936
937
938SOM_Scope BOOL SOMLINK cwaudio_wpAddSettingsPages(CWAudio *somSelf,
939 HWND hwndNotebook)
940{
941 BOOL rc;
942
943 MMIOINFO mmio;
944 ULONG ulSize;
945 HMMIO hmmio;
946 MMAUDIOHEADER mmAudioHeader={0};
947 LONG lBytesRead=0;
948 char fName[CCHMAXPATH];
949
950 CWAudioData *somThis = CWAudioGetData(somSelf);
951 CWAudioMethodDebug("CWAudio","cwaudio_wpAddSettingsPages");
952
953 /* Reread the cached audio info because the cached value may be wrong for
954 some reason. Doing it when opening the settings page does not
955 slow down things too much and the user isn't surprised because it's
956 normal that this needs some time. By doing it here it's semi automatic
957 because once in atime every user will open the notebook. */
958 do {
959 memset(&mmio,0, sizeof(mmio));
960 mmio.ulFlags=MMIO_READ;
961 mmio.ulTranslate=MMIO_TRANSLATEHEADER;
962
963 ulSize=sizeof(fName);
964 _wpQueryRealName(somSelf, fName, &ulSize, TRUE);
965 hmmio = mmioOpen(fName, &mmio, MMIO_READ);
966
967 if(!hmmio)
968 break;
969
970 memset(&mmAudioHeader,0,sizeof(MMAUDIOHEADER));
971 rc = mmioGetHeader(hmmio, &mmAudioHeader,sizeof(MMAUDIOHEADER),
972 &lBytesRead, 0, 0);
973
974 if(rc!=MMIO_SUCCESS) {
975 mmioClose(hmmio, 0);
976 break;
977 }
978 mmioClose(hmmio, 0);
979
980 _ulChannels=mmAudioHeader.mmXWAVHeader.WAVEHeader.usChannels;
981 _ulSampleRate=mmAudioHeader.mmXWAVHeader.WAVEHeader.ulSamplesPerSec;
982 _ulBPS=mmAudioHeader.mmXWAVHeader.WAVEHeader.usBitsPerSample;
983
984 if(mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInMS/1000)
985 _ulPlaySecs=mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInMS/1000;
986 else
987 _ulPlaySecs=mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInBytes/
988 mmAudioHeader.mmXWAVHeader.WAVEHeader.ulAvgBytesPerSec;
989
990 _ulFileSize=_wpQueryFileSize(somSelf);
991
992 sprintf(fName,"%d",_ulChannels);
993 strncpy(_chrChannels, fName, sizeof(_chrChannels));
994 _chrChannels[sizeof(_chrChannels)-1]=0;
995
996 sprintf(fName,"%d", _ulSampleRate);
997 strncpy(_chrSampleRate, fName, sizeof(_chrSampleRate));
998 _chrSampleRate[sizeof(_chrSampleRate)-1]=0;
999
1000 sprintf(fName,"%d",_ulBPS);
1001 strncpy(_chrBPS, fName, sizeof(_chrBPS));
1002 _chrBPS[sizeof(_chrBPS)-1]=0;
1003
1004 sprintf(fName,"%02d:%02d",_ulPlaySecs/60, _ulPlaySecs%60);
1005 strncpy(_chrPlayTime, fName, sizeof(_chrPlayTime));
1006 _chrPlayTime[sizeof(_chrPlayTime)-1]=0;
1007
1008 _wpSaveDeferred(somSelf);
1009 }while(FALSE);
1010
1011 rc= (CWAudio_parent_WPDataFile_wpAddSettingsPages(somSelf,
1012 hwndNotebook));
1013 return rc|cwaudio_cwmmAddWaveInformationPage(somSelf, hwndNotebook);
1014}
1015
1016
1017SOM_Scope ULONG SOMLINK cwaudio_wpQueryDetailsData(CWAudio *somSelf,
1018 PVOID* ppDetailsData,
1019 PULONG pcp)
1020{
1021 BOOL rcParent;
1022 PAUDIODETAILS pAudioDetails;
1023 CWAudioData *somThis = CWAudioGetData(somSelf);
1024 CWAudioMethodDebug("CWAudio","cwaudio_wpQueryDetailsData");
1025
1026
1027 rcParent= (CWAudio_parent_WPDataFile_wpQueryDetailsData(somSelf,
1028 ppDetailsData,
1029 pcp));
1030
1031 /* The WPS asks for data to be displayed */
1032 if(ppDetailsData)
1033 {
1034#if 0
1035 char chrCommand[400];
1036 sprintf(chrCommand, "%s , ppDetailsData: %x *ppDetailsData: %x &_chrPlayTime: %x", _id3Artist, ppDetailsData,
1037 *ppDetailsData, &_chrPlayTime);
1038 WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, chrCommand, "CWAudio", 1234, MB_OK|MB_MOVEABLE);
1039#endif
1040 /* Fill the structure with the info to be displayed */
1041 pAudioDetails=(PAUDIODETAILS)*ppDetailsData;
1042 pAudioDetails->pszPlayTime=_chrPlayTime;
1043 pAudioDetails->pszSampleRate=_chrSampleRate;
1044 pAudioDetails->pszChannels=_chrChannels;
1045 pAudioDetails->pszBPS=_chrBPS;
1046
1047 pAudioDetails->pszName=_id3Name;
1048 pAudioDetails->pszArtist=_id3Artist;
1049 pAudioDetails->pszAlbum=_id3Album;
1050 pAudioDetails->pszYear=_id3Year;
1051 pAudioDetails->pszComment=_id3Comment;
1052 pAudioDetails->pszGenre=_id3Genre;
1053 *ppDetailsData=((PBYTE) (*ppDetailsData))+sizeof(*pAudioDetails);
1054 }
1055 else
1056 {
1057 /* Buffer size is queried */
1058 if(pcp)
1059 *pcp+=sizeof(*pAudioDetails);
1060 }
1061 return rcParent;
1062}
1063
1064SOM_Scope BOOL SOMLINK cwaudio_wpRestoreState(CWAudio *somSelf,
1065 ULONG ulReserved)
1066{
1067 BOOL bRc;
1068 char fName[CCHMAXPATH];
1069 BOOL bReRead=FALSE;
1070 ULONG ulSize;
1071
1072 CWAudioData *somThis = CWAudioGetData(somSelf);
1073 CWAudioMethodDebug("CWAudio","cwaudio_wpRestoreState");
1074
1075 bRc=(CWAudio_parent_WPDataFile_wpRestoreState(somSelf, ulReserved));
1076
1077 _bNeedSaving=FALSE;
1078
1079 /* Query the audio info */
1080 if(!_wpRestoreLong(somSelf, "CWAudio", KEY_FILESIZE, &_ulFileSize))
1081 bReRead=TRUE;
1082 if(!_wpRestoreLong(somSelf, "CWAudio", KEY_TIME, &_ulPlaySecs))
1083 bReRead=TRUE;
1084 if(!_wpRestoreLong(somSelf, "CWAudio", KEY_CHANNELS, &_ulChannels))
1085 bReRead=TRUE;
1086 if(!_wpRestoreLong(somSelf, "CWAudio", KEY_SAMPLERATE, &_ulSampleRate))
1087 bReRead=TRUE;
1088 if(!_wpRestoreLong(somSelf, "CWAudio", KEY_BPS, &_ulBPS))
1089 bReRead=TRUE;
1090
1091 ulSize=sizeof(_id3Name);
1092 _wpRestoreString(somSelf, "CWAudio",KEY_TRACKNAME, _id3Name, &ulSize);
1093 ulSize=sizeof(_id3Artist);
1094 _wpRestoreString(somSelf, "CWAudio",KEY_ARTIST, _id3Artist, &ulSize);
1095 ulSize=sizeof(_id3Album);
1096 _wpRestoreString(somSelf, "CWAudio",KEY_ALBUM, _id3Album, &ulSize);
1097
1098 if(_ulFileSize!=_wpQueryFileSize(somSelf))
1099 bReRead=TRUE; /* The filesize changed, somebody altered the audio file so reread the info */
1100
1101
1102 if(bGotCD && bReRead) {
1103 WPDisk *wpDisk;
1104 int iDiskNum;
1105
1106 /* Only get audio info when file isn't on CD. This speeds up opening of folders on CDs filled with
1107 MP3s. Doesn't hurt because folders of CDs open in normal details view as default so the audio info
1108 isn't necessary. When opening the settings notebook the info is reread anyway. */
1109 if((wpDisk=_wpQueryDisk(somSelf))!=NULLHANDLE) {
1110 if((iDiskNum=_wpQueryLogicalDrive(wpDisk))!=0) {
1111 if((iDiskNum>=iFirstCD && iDiskNum<=iFirstCD+iNumCD)) {
1112 bReRead=FALSE;
1113 }
1114 }
1115 }
1116 }
1117
1118 if(bReRead){
1119 ULONG rc;
1120 MMIOINFO mmio;
1121 ULONG ulSize;
1122 HMMIO hmmio;
1123 MMAUDIOHEADER mmAudioHeader={0};
1124 LONG lBytesRead=0;
1125
1126 memset(&mmio,0, sizeof(mmio));
1127 mmio.ulFlags=MMIO_READ;
1128 mmio.ulTranslate=MMIO_TRANSLATEHEADER;
1129
1130 ulSize=sizeof(fName);
1131 _wpQueryRealName(somSelf, fName, &ulSize, TRUE);
1132 hmmio = mmioOpen(fName, &mmio, MMIO_READ);
1133
1134 if(!hmmio)
1135 return bRc;
1136
1137 memset(&mmAudioHeader,0,sizeof(MMAUDIOHEADER));
1138 rc = mmioGetHeader(hmmio, &mmAudioHeader,sizeof(MMAUDIOHEADER),
1139 &lBytesRead, 0, 0);
1140
1141 if(rc!=MMIO_SUCCESS) {
1142 mmioClose(hmmio, 0);
1143 return bRc;
1144 }
1145 mmioClose(hmmio, 0);
1146
1147 _ulChannels=mmAudioHeader.mmXWAVHeader.WAVEHeader.usChannels;
1148 _ulSampleRate=mmAudioHeader.mmXWAVHeader.WAVEHeader.ulSamplesPerSec;
1149 _ulBPS=mmAudioHeader.mmXWAVHeader.WAVEHeader.usBitsPerSample;
1150 /* sprintf(fName,"%02d:%02d",mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInBytes/
1151 mmAudioHeader.mmXWAVHeader.WAVEHeader.ulAvgBytesPerSec/60,
1152 mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInBytes/
1153 mmAudioHeader.mmXWAVHeader.WAVEHeader.ulAvgBytesPerSec%60);*/
1154 if(mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInMS/1000)
1155 _ulPlaySecs=mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInMS/1000;
1156 else
1157 _ulPlaySecs=mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInBytes/
1158 mmAudioHeader.mmXWAVHeader.WAVEHeader.ulAvgBytesPerSec;
1159
1160 _ulFileSize=_wpQueryFileSize(somSelf);
1161 _bNeedSaving=TRUE;/* When the object is initialized the new instance data will be saved in wpObjectReady(). */
1162 }/* bReRead */
1163
1164 sprintf(fName,"%d",_ulChannels);
1165 strncpy(_chrChannels, fName, sizeof(_chrChannels));
1166 _chrChannels[sizeof(_chrChannels)-1]=0;
1167
1168 sprintf(fName,"%d", _ulSampleRate);
1169 strncpy(_chrSampleRate, fName, sizeof(_chrSampleRate));
1170 _chrSampleRate[sizeof(_chrSampleRate)-1]=0;
1171
1172 sprintf(fName,"%d",_ulBPS);
1173 strncpy(_chrBPS, fName, sizeof(_chrBPS));
1174 _chrBPS[sizeof(_chrBPS)-1]=0;
1175
1176 sprintf(fName,"%02d:%02d",_ulPlaySecs/60, _ulPlaySecs%60);
1177 strncpy(_chrPlayTime, fName, sizeof(_chrPlayTime));
1178 _chrPlayTime[sizeof(_chrPlayTime)-1]=0;
1179
1180 return bRc;
1181}
1182
1183SOM_Scope BOOL SOMLINK cwaudio_wpSaveState(CWAudio *somSelf)
1184{
1185 CWAudioData *somThis = CWAudioGetData(somSelf);
1186 CWAudioMethodDebug("CWAudio","cwaudio_wpSaveState");
1187
1188 _wpSaveLong(somSelf, "CWAudio",KEY_TIME,_ulPlaySecs);
1189 _wpSaveLong(somSelf, "CWAudio",KEY_SAMPLERATE,_ulSampleRate);
1190 _wpSaveLong(somSelf, "CWAudio",KEY_CHANNELS,_ulChannels);
1191 _wpSaveLong(somSelf, "CWAudio",KEY_BPS,_ulBPS);
1192 _wpSaveLong(somSelf, "CWAudio",KEY_FILESIZE,_ulFileSize);
1193
1194 _wpSaveString(somSelf, "CWAudio",KEY_TRACKNAME, _id3Name);
1195 _wpSaveString(somSelf, "CWAudio",KEY_ARTIST, _id3Artist);
1196 _wpSaveString(somSelf, "CWAudio",KEY_ALBUM, _id3Album);
1197
1198 return (CWAudio_parent_WPDataFile_wpSaveState(somSelf));
1199}
1200
1201SOM_Scope BOOL SOMLINK cwaudio_wpModifyPopupMenu(CWAudio *somSelf,
1202 HWND hwndMenu,
1203 HWND hwndCnr,
1204 ULONG iPosition)
1205{
1206 CWAudioData *somThis = CWAudioGetData(somSelf);
1207 CWAudioMethodDebug("CWAudio","cwaudio_wpModifyPopupMenu");
1208
1209
1210 _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryModuleHandle(), ID_MENU_VOLUME, 1);
1211 _wpInsertPopupMenuItems(somSelf, hwndMenu, -1, queryModuleHandle(), ID_MENU_CONVERT, 0);
1212 if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP),_hwndObjectPlay))
1213 _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryModuleHandle(), ID_MENU_STOP, 1);
1214 else
1215 {
1216 _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryModuleHandle(), ID_MENU_EDITOR, 1);
1217 _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryModuleHandle(), ID_MENU_PLAYER, 1);
1218 _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryModuleHandle(), ID_MENU_START, 1);
1219 }
1220 return (CWAudio_parent_WPDataFile_wpModifyPopupMenu(somSelf,
1221 hwndMenu,
1222 hwndCnr,
1223 iPosition));
1224}
1225
1226
1227SOM_Scope BOOL SOMLINK cwaudio_wpMenuItemSelected(CWAudio *somSelf,
1228 HWND hwndFrame,
1229 ULONG ulMenuId)
1230{
1231 CWAudioData *somThis = CWAudioGetData(somSelf);
1232 CWAudioMethodDebug("CWAudio","cwaudio_wpMenuItemSelected");
1233
1234 switch(ulMenuId)
1235 {
1236 case ID_MENU_VOLUME:
1237 {
1238 HOBJECT hObject;
1239 if((hObject=WinQueryObject("<MMPM2_MMVOLUME>"))!=NULLHANDLE)
1240 WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
1241 return TRUE;
1242 }
1243 case ID_MENU_START:
1244 case ID_MENU_STOP:
1245 case ID_MENU_PLAYER:
1246 case ID_MENU_EDITOR:
1247 case ID_ITEM_CONVERT:
1248 _wpViewObject(somSelf, NULLHANDLE, ulMenuId,0);
1249 return TRUE;
1250 default:
1251 break;
1252 }
1253 return (CWAudio_parent_WPDataFile_wpMenuItemSelected(somSelf,
1254 hwndFrame,
1255 ulMenuId));
1256}
1257
1258
1259SOM_Scope void SOMLINK cwaudio_wpObjectReady(CWAudio *somSelf,
1260 ULONG ulCode, WPObject* refObject)
1261{
1262 CWAudioData *somThis = CWAudioGetData(somSelf);
1263 CWAudioMethodDebug("CWAudio","cwaudio_wpObjectReady");
1264
1265 if(_bNeedSaving)
1266 _wpSaveDeferred(somSelf);
1267
1268 CWAudio_parent_WPDataFile_wpObjectReady(somSelf, ulCode, refObject);
1269}
1270
1271
1272SOM_Scope BOOL SOMLINK cwaudio_wpRefresh(CWAudio *somSelf, ULONG ulView,
1273 PVOID pReserved)
1274{
1275 BOOL bRc;
1276 ULONG rc;
1277 MMIOINFO mmio;
1278 ULONG ulSize;
1279 HMMIO hmmio;
1280 MMAUDIOHEADER mmAudioHeader={0};
1281 LONG lBytesRead=0;
1282 char fName[CCHMAXPATH];
1283
1284 CWAudioData *somThis = CWAudioGetData(somSelf);
1285 CWAudioMethodDebug("CWAudio","cwaudio_wpRefresh");
1286
1287 bRc=(CWAudio_parent_WPDataFile_wpRefresh(somSelf, ulView,
1288 pReserved));
1289
1290 return bRc;
1291}
1292
1293
1294SOM_Scope BOOL SOMLINK cwaudio_wpSetup(CWAudio *somSelf, PSZ pszSetupString)
1295{
1296 char buffer[CCHMAXPATH];
1297 ULONG bufferSize;
1298
1299 /* CWAudioData *somThis = CWAudioGetData(somSelf); */
1300 CWAudioMethodDebug("CWAudio","cwaudio_wpSetup");
1301
1302 bufferSize=sizeof(buffer);
1303 if(_wpScanSetupString(somSelf, pszSetupString, SETUP_AUDIOTRACKNAME, buffer, &bufferSize))
1304 {
1305 _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_NAME);
1306 // _wpCnrRefreshDetails(somSelf);
1307 }
1308
1309 bufferSize=sizeof(buffer);
1310 if(_wpScanSetupString(somSelf, pszSetupString, SETUP_AUDIOARTIST, buffer, &bufferSize))
1311 {
1312 _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_ARTIST);
1313 // _wpCnrRefreshDetails(somSelf);
1314 }
1315
1316 bufferSize=sizeof(buffer);
1317 if(_wpScanSetupString(somSelf, pszSetupString, SETUP_AUDIOALBUM, buffer, &bufferSize))
1318 {
1319 _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_ALBUM);
1320 // _wpCnrRefreshDetails(somSelf);
1321 }
1322
1323 bufferSize=sizeof(buffer);
1324 if(_wpScanSetupString(somSelf, pszSetupString, SETUP_AUDIOPLAYTIME, buffer, &bufferSize))
1325 {
1326 int iPlaytime=atoi(buffer);
1327 if(iPlaytime<0)
1328 iPlaytime=0;
1329 _cwmmSetTrackInfo(somSelf, buffer, iPlaytime, IDINFO_PLAYTIME);
1330 // _wpCnrRefreshDetails(somSelf);
1331 }
1332
1333 /* Refresh */
1334 bufferSize=sizeof(buffer);
1335 if(_wpScanSetupString(somSelf, pszSetupString, SETUP_REFRESH, buffer,&bufferSize))
1336 {
1337 _wpRefresh(somSelf, 0,NULL);
1338 _wpCnrRefreshDetails(somSelf);
1339 }
1340
1341 return (CWAudio_parent_WPDataFile_wpSetup(somSelf, pszSetupString));
1342}
1343
1344/* This thread is only to handle the object in use emphasis */
1345void _Optlink openThreadFunc (void *arg)
1346{
1347 HAB hab;
1348 HMQ hmq;
1349 QMSG qmsg;
1350 OPENPARAMS * params;
1351 CWAudio *thisPtr;
1352
1353 params=(OPENPARAMS*)arg;
1354 if(!params)
1355 return;
1356
1357 thisPtr=params->thisPtr;
1358 if(!somIsObj(thisPtr))
1359 return;
1360
1361 hab=WinInitialize(0);
1362 if(hab) {
1363 hmq=WinCreateMsgQueue(hab,0);
1364 if(hmq) {
1365 RESULTCODES result;
1366 PID pid;
1367
1368 params->useItem.type=USAGE_OPENVIEW;
1369 params->viewItem.handle=params->swCtrl.hwnd;
1370 _wpAddToObjUseList(thisPtr, &params->useItem);
1371 DosWaitChild(DCWA_PROCESS, DCWW_WAIT, &result, &pid, params->pid);
1372 _wpDeleteFromObjUseList(thisPtr, &params->useItem);
1373 WinDestroyMsgQueue(hmq);
1374 }
1375 WinTerminate(hab);
1376 }
1377 /* Free the parameters */
1378 _wpFreeMem(thisPtr, (PBYTE)params);
1379}
1380
1381ULONG launchPMProg(PSZ pszTitle, PSZ wrapperExe, PSZ parameters, CWAudio *thisPtr, ULONG ulView)
1382{
1383 APIRET rc;
1384 PID pid;
1385 char chrLoadError[CCHMAXPATH]={0};
1386 RESULTCODES result;
1387 char *chrPtr;
1388 char args[CCHMAXPATH*2+3]={0};//"ab.exe\0\"M:\\Test-Audio-CD\\track Space.wav\"\0\0";
1389
1390 strcpy(args,wrapperExe);
1391 if((chrPtr=strchr(args, 0))!=NULLHANDLE) {
1392 // sprintf(args,"%s\0%s\0\0",wrapperExe, parameters);
1393 chrPtr++;
1394 strcat(chrPtr, parameters);
1395 // WinMessageBox(HWND_DESKTOP,HWND_DESKTOP, args, chrPtr, 12324, MB_MOVEABLE);
1396 if(!DosExecPgm(chrLoadError, sizeof(chrLoadError), EXEC_ASYNCRESULT, args, NULL, &result, wrapperExe)) {
1397 HSWITCH hSwitch;
1398
1399 if((hSwitch=WinQuerySwitchHandle(NULLHANDLE, result.codeTerminate))!=NULLHANDLE)
1400 {
1401 SWCNTRL swCtrl;
1402
1403 if(!WinQuerySwitchEntry(hSwitch, &swCtrl)) {
1404 ULONG ulError;
1405 OPENPARAMS *pThreadParams=(OPENPARAMS*)_wpAllocMem(thisPtr,sizeof(OPENPARAMS), &ulError);
1406
1407 if(pThreadParams) {
1408 memset((void*)pThreadParams ,0, sizeof(OPENPARAMS));
1409 pThreadParams->swCtrl=swCtrl;
1410 pThreadParams->pid=result.codeTerminate;
1411 pThreadParams->thisPtr=thisPtr;
1412 pThreadParams->viewItem.view=ulView;
1413 _beginthread(openThreadFunc,NULL,8192*16,(void*)pThreadParams); //Fehlerbehandlung fehlt
1414 }
1415 return 1;
1416 };
1417 };
1418 return 1;
1419 }
1420 }
1421 return 0;
1422}
1423
1424SOM_Scope HWND SOMLINK cwaudio_wpOpen(CWAudio *somSelf, HWND hwndCnr,
1425 ULONG ulView, ULONG param)
1426{
1427 ULONG ulRc;
1428
1429 CWAudioData *somThis = CWAudioGetData(somSelf);
1430 CWAudioMethodDebug("CWAudio","cwaudio_wpOpen");
1431
1432 // sprintf(text, "Open: %d, %x", ulView, ulView);
1433 // WinMessageBox(HWND_DESKTOP,HWND_DESKTOP, text, "", 12324, MB_MOVEABLE);
1434 switch(ulView)
1435 {
1436 case ID_MENU_START:
1437 {
1438 _ulPreviousView=_wpQueryDefaultView(somSelf);
1439 _cwmmPlayTrack(somSelf, TRUE);
1440 _wpSetDefaultView(somSelf, ID_MENU_STOP);
1441 return NULLHANDLE;
1442 }
1443 case ID_MENU_STOP:
1444 {
1445 _cwmmPlayTrack(somSelf, FALSE);
1446 _wpSetDefaultView(somSelf, _ulPreviousView);
1447 return NULLHANDLE;
1448 }
1449 case ID_MENU_PLAYER:
1450 /*case 0xbbe5: Player */
1451 {
1452 char chrPlayer[CCHMAXPATH]={0};
1453 char chrParams[CCHMAXPATH+2]="\"";
1454 char *chrPtr=chrParams;
1455 ULONG ulSize;
1456
1457 PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "audioplayer", "ab.exe", chrPlayer,sizeof(chrPlayer));
1458 chrPtr++;
1459 ulSize=sizeof(chrParams)-2;
1460 _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
1461 strcat(chrPtr,"\"");
1462 if((ulRc=launchPMProg("Spieler", chrPlayer, chrParams, somSelf, ulView))==NULLHANDLE) {
1463 break;
1464 }
1465 return NULLHANDLE;
1466 }
1467 case ID_MENU_EDITOR:
1468 /* case 0xbc0d: Editor */
1469 {
1470 char chrPlayer[CCHMAXPATH]={0};
1471 char chrParams[CCHMAXPATH+10]="-e \"";
1472 char *chrPtr=chrParams;
1473 ULONG ulSize;
1474
1475 PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "audioeditor", "ab.exe", chrPlayer,sizeof(chrPlayer));
1476 if((chrPtr=strchr(chrParams,0))!=NULLHANDLE) {
1477 ulSize=sizeof(chrParams)-2;
1478 _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
1479 strcat(chrPtr,"\"");
1480 if((ulRc=launchPMProg("Editor", chrPlayer, chrParams, somSelf, ulView))==NULLHANDLE)
1481 break;
1482 return NULLHANDLE;
1483 }
1484 break;
1485 }
1486 case 0xb4dd: /* Convert */
1487 {
1488 char chrPlayer[CCHMAXPATH]={0};
1489 char chrParams[CCHMAXPATH+2]="\"";
1490 char *chrPtr=chrParams;
1491 ULONG ulSize;
1492
1493 PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "audioconverter", "", chrPlayer,sizeof(chrPlayer));
1494 chrPtr++;
1495 ulSize=sizeof(chrParams)-2;
1496 _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
1497 strcat(chrPtr,"\"");
1498 if((ulRc=launchPMProg("Spieler", chrPlayer, chrParams, somSelf, ulView))==NULLHANDLE) {
1499 break;
1500 }
1501 return NULLHANDLE;
1502 }
1503 default:
1504 break;
1505 }
1506 return (CWAudio_parent_WPDataFile_wpOpen(somSelf, hwndCnr, ulView,
1507 param));
1508}
1509
1510
1511SOM_Scope BOOL SOMLINK cwaudioM_wpclsCreateDefaultTemplates(M_CWAudio *somSelf,
1512 WPObject* Folder)
1513{
1514 /* M_CWAudioData *somThis = M_CWAudioGetData(somSelf); */
1515 M_CWAudioMethodDebug("M_CWAudio","cwaudioM_wpclsCreateDefaultTemplates");
1516
1517 return TRUE;
1518}
1519
1520SOM_Scope ULONG SOMLINK cwaudioM_wpclsQueryDetailsInfo(M_CWAudio *somSelf,
1521 PCLASSFIELDINFO* ppClassFieldInfo,
1522 PULONG pSize)
1523{
1524 ULONG cParentColumns;
1525 PCLASSFIELDINFO pCfi;
1526 int i;
1527 ULONG rc;
1528
1529
1530 /* M_CWAudioData *somThis = M_CWAudioGetData(somSelf); */
1531 M_CWAudioMethodDebug("M_CWAudio","cwaudioM_wpclsQueryDetailsInfo");
1532
1533 cParentColumns= (M_CWAudio_parent_M_WPDataFile_wpclsQueryDetailsInfo(somSelf,
1534 ppClassFieldInfo,
1535 pSize));
1536 if(pSize)
1537 *pSize+=sizeof(AUDIODETAILS);
1538
1539 if(ppClassFieldInfo)
1540 {
1541 if(*ppClassFieldInfo)
1542 {
1543 pCfi=*ppClassFieldInfo;
1544 for(i=0; i<cParentColumns;i++)
1545 pCfi=(pCfi->pNextFieldInfo ? pCfi->pNextFieldInfo: pCfi);
1546
1547 pCfi->pNextFieldInfo=cfiFieldInfo;
1548 }
1549 else
1550 *ppClassFieldInfo=cfiFieldInfo;
1551 }
1552 return (cParentColumns+NUM_AUDIO_FIELDS);
1553}
1554
1555SOM_Scope PSZ SOMLINK cwaudioM_wpclsQueryTitle(M_CWAudio *somSelf)
1556{
1557 static char chrTitle[20]={0};
1558 /* M_CWAudioData *somThis = M_CWAudioGetData(somSelf); */
1559 M_CWAudioMethodDebug("M_CWAudio","cwaudioM_wpclsQueryTitle");
1560
1561 if(chrTitle[0]==0)
1562 if(!getMessage(chrTitle, IDSTR_CWAUDIOTITLE, sizeof(chrTitle), queryModuleHandle(), HWND_DESKTOP))
1563 strcpy(chrTitle,"Digital audio");
1564
1565 return chrTitle;
1566}
1567
1568SOM_Scope void SOMLINK cwaudioM_wpclsInitData(M_CWAudio *somSelf)
1569{
1570 PCLASSFIELDINFO pCfi;
1571 USHORT i,rc;
1572
1573 /* M_CWAudioData *somThis = M_CWAudioGetData(somSelf); */
1574 M_CWAudioMethodDebug("M_CWAudio","cwaudioM_wpclsInitData");
1575
1576 M_CWAudio_parent_M_WPDataFile_wpclsInitData(somSelf);
1577
1578 /* Register mmedia class REXX functions */
1579 RexxRegisterFunctionExe("MMClsCallFunc", (PFN)rxCallCWMMFunc);
1580
1581 /* Get CD drives */
1582 if(cwQueryCDDrives(&iNumCD, &iFirstCD))
1583 bGotCD=TRUE;
1584
1585 if(getMessage(chrPlayTime, IDSTR_PLAYTIME, sizeof(chrPlayTime), queryModuleHandle(), HWND_DESKTOP))
1586 pszAudioColTitles[0]=chrPlayTime;
1587 if(getMessage(chrSampleRate, IDSTR_SAMPLERATE, sizeof(chrSampleRate), queryModuleHandle(), HWND_DESKTOP))
1588 pszAudioColTitles[1]=chrSampleRate;
1589 if(getMessage(chrChannels, IDSTR_CHANNELS, sizeof(chrChannels), queryModuleHandle(), HWND_DESKTOP))
1590 pszAudioColTitles[2]=chrChannels;
1591 if(getMessage(chrBPS, IDSTR_BPS, sizeof(chrBPS), queryModuleHandle(), HWND_DESKTOP))
1592 pszAudioColTitles[3]=chrBPS;
1593
1594 if(getMessage(chrName, IDSTR_TITLE, sizeof(chrName), queryModuleHandle(), HWND_DESKTOP))
1595 pszAudioColTitles[4]=chrName;
1596 if(getMessage(chrArtist, IDSTR_ARTIST, sizeof(chrArtist), queryModuleHandle(), HWND_DESKTOP))
1597 pszAudioColTitles[5]=chrArtist;
1598 if(getMessage(chrAlbum, IDSTR_ALBUM, sizeof(chrAlbum), queryModuleHandle(), HWND_DESKTOP))
1599 pszAudioColTitles[6]=chrAlbum;
1600 if(getMessage(chrYear, IDSTR_YEAR, sizeof(chrYear), queryModuleHandle(), HWND_DESKTOP))
1601 pszAudioColTitles[7]=chrYear;
1602 if(getMessage(chrComment, IDSTR_COMMENT, sizeof(chrComment), queryModuleHandle(), HWND_DESKTOP))
1603 pszAudioColTitles[8]=chrComment;
1604 if(getMessage(chrGenre, IDSTR_GENRE, sizeof(chrGenre), queryModuleHandle(), HWND_DESKTOP))
1605 pszAudioColTitles[9]=chrGenre;
1606
1607
1608 /* Setup the static data for the details view */
1609 for(i=0,pCfi=cfiFieldInfo;i<NUM_AUDIO_FIELDS;i++,pCfi++)
1610 {
1611 memset((PCH)pCfi,0,sizeof(CLASSFIELDINFO));
1612
1613 pCfi->cb=sizeof(CLASSFIELDINFO);
1614 pCfi->flData=CFA_LEFT|CFA_SEPARATOR|CFA_FIREADONLY;
1615 pCfi->flTitle=CFA_CENTER|CFA_SEPARATOR|CFA_HORZSEPARATOR|CFA_STRING|CFA_FITITLEREADONLY;
1616 pCfi->pNextFieldInfo=pCfi+1;
1617 pCfi->pTitleData=(PVOID)pszAudioColTitles[i];
1618 pCfi->flCompare=COMPARE_SUPPORTED|SORTBY_SUPPORTED;
1619
1620 switch(i)
1621 {
1622 case 0: /* Subject */
1623 pCfi->flData|=CFA_STRING;
1624 pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszPlayTime));
1625 pCfi->ulLenFieldData=sizeof(PSZ);
1626 pCfi->DefaultComparison=CMP_EQUAL;
1627 break;
1628 case 1: /* From */
1629 pCfi->flData|=CFA_STRING;
1630 pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszSampleRate));
1631 pCfi->ulLenFieldData=sizeof(PSZ);
1632 pCfi->DefaultComparison=CMP_EQUAL;
1633 break;
1634 case 2:
1635 pCfi->flData|=CFA_STRING;
1636 pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszChannels));
1637 pCfi->ulLenFieldData=sizeof(PSZ);
1638 pCfi->DefaultComparison=CMP_EQUAL;
1639 break;
1640 case 3:
1641 pCfi->flData|=CFA_STRING;
1642 pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszBPS));
1643 pCfi->ulLenFieldData=sizeof(PSZ);
1644 pCfi->DefaultComparison=CMP_EQUAL;
1645 break;
1646
1647 case 4:
1648 pCfi->flData|=CFA_STRING;
1649 pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszName));
1650 pCfi->ulLenFieldData=sizeof(PSZ);
1651 pCfi->DefaultComparison=CMP_EQUAL;
1652 break;
1653 case 5:
1654 pCfi->flData|=CFA_STRING;
1655 pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszArtist));
1656 pCfi->ulLenFieldData=sizeof(PSZ);
1657 pCfi->DefaultComparison=CMP_EQUAL;
1658 break;
1659 case 6:
1660 pCfi->flData|=CFA_STRING;
1661 pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszAlbum));
1662 pCfi->ulLenFieldData=sizeof(PSZ);
1663 pCfi->DefaultComparison=CMP_EQUAL;
1664 break;
1665 case 7:
1666 pCfi->flData|=CFA_STRING;
1667 pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszYear));
1668 pCfi->ulLenFieldData=sizeof(PSZ);
1669 pCfi->DefaultComparison=CMP_EQUAL;
1670 break;
1671 case 8:
1672 pCfi->flData|=CFA_STRING;
1673 pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszComment));
1674 pCfi->ulLenFieldData=sizeof(PSZ);
1675 pCfi->DefaultComparison=CMP_EQUAL;
1676 break;
1677 case 9:
1678 pCfi->flData|=CFA_STRING;
1679 pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszGenre));
1680 pCfi->ulLenFieldData=sizeof(PSZ);
1681 pCfi->DefaultComparison=CMP_EQUAL;
1682 break;
1683
1684 }/* switch(i) */
1685 }/* for() */
1686 cfiFieldInfo[NUM_AUDIO_FIELDS].pNextFieldInfo=NULL;
1687
1688}
1689
1690SOM_Scope void SOMLINK cwaudioM_wpclsUnInitData(M_CWAudio *somSelf)
1691{
1692 /* M_CWAudioData *somThis = M_CWAudioGetData(somSelf); */
1693 M_CWAudioMethodDebug("M_CWAudio","cwaudioM_wpclsUnInitData");
1694
1695 RexxDeregisterFunction("MMClsCallFunc");
1696
1697 M_CWAudio_parent_M_WPDataFile_wpclsUnInitData(somSelf);
1698}
1699
1700
1701SOM_Scope ULONG SOMLINK cwaudioM_wpclsQueryDefaultView(M_CWAudio *somSelf)
1702{
1703 /* M_CWAudioData *somThis = M_CWAudioGetData(somSelf); */
1704 M_CWAudioMethodDebug("M_CWAudio","cwaudioM_wpclsQueryDefaultView");
1705
1706 return ID_MENU_START;
1707
1708 // return (M_CWAudio_parent_M_MMAudio_wpclsQueryDefaultView(somSelf));
1709}
1710
1711
1712SOM_Scope ULONG SOMLINK cwaudioM_wpclsQueryIconData(M_CWAudio *somSelf,
1713 PICONINFO pIconInfo)
1714{
1715 /* M_CWAudioData *somThis = M_CWAudioGetData(somSelf); */
1716 M_CWAudioMethodDebug("M_CWAudio","cwaudioM_wpclsQueryIconData");
1717
1718 if (pIconInfo) {
1719 pIconInfo->fFormat = ICON_RESOURCE;
1720 pIconInfo->hmod = queryModuleHandle();
1721 pIconInfo->resid = ID_ICONCWAUDIOFILE;
1722 } /* endif */
1723
1724 return ( sizeof(ICONINFO) );
1725
1726}
1727
Note: See TracBrowser for help on using the repository browser.