source: cmedia/trunk/Cmpciset/cmpciset.c@ 553

Last change on this file since 553 was 553, checked in by rudi, 14 years ago

Adapt sourcecode to OpenWatcom

File size: 26.1 KB
Line 
1//----------------------------------------------------------------------//
2// //
3// erzeugt: 16.02.02 R.Ihle //
4// //
5//----------------------------------------------------------------------//
6
7#define INCL_WINSYS
8#define INCL_WININPUT
9#define INCL_WINSTDDLGS
10#define INCL_WINBUTTONS
11#define INCL_WINDIALOGS
12#define INCL_WINWINDOWMGR
13#define INCL_WINRECTANGLES
14#define INCL_WINSWITCHLIST
15#define INCL_DOSDEVICES
16#define INCL_DOSPROCESS
17#define INCL_DOSSEMAPHORES
18#include <os2.h>
19
20#define INCL_32
21#include <mcios2.h>
22
23#include <stdio.h>
24#include <stdlib.h>
25#include <stdarg.h>
26#include <string.h>
27#include <process.h>
28#include <malloc.h>
29
30#if defined(__BORLANDC__) || __WATCOMC__ < 1200
31#include "warp4.h"
32#endif
33
34//#define DEBUG
35
36
37#include "cmpciset.h"
38#include "../include/ioctl90.h"
39
40
41
42// See CMPCI.C
43
44#define DO_LINE_AS_REAR 0x00000010
45#define DO_LINE_AS_BASS 0x00000020
46#define DO_MIC_AS_BASS 0x00000040
47#define DO_SPDIF_OUT 0x00000100
48#define DO_SPDIF_IN 0x00000200
49#define DO_SPDIF_LOOP 0x00000400
50#define DO_SPDIF_MONITOR 0x00010000
51#define DO_SPDIF_COPYRIGHT 0x00020000
52#define DO_SPDIF_5V 0x00040000
53#define DO_SPDIF_INPUT2 0x00080000
54#define DO_SPDIF_INVERSE 0x00100000
55#define DO_SPDIF_OUT_ENABLE 0x00200000
56#define DO_POWER_DOWN 0x00400000
57#define DO_MIC_BOOST 0x00800000
58
59
60
61//----------------------------------------------------------------------//
62// Prototypen //
63//----------------------------------------------------------------------//
64
65MRESULT EXPENTRY ClientWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
66MRESULT EXPENTRY DlgPage1Proc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
67MRESULT EXPENTRY DlgPage2Proc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
68
69typedef VOID (*THREAD)(PVOID);
70
71
72#define UM_MIXERCHANGE (WM_USER + 100)
73
74
75//----------------------------------------------------------------------//
76// statische Daten //
77//----------------------------------------------------------------------//
78
79static HWND hwndFrame = NULLHANDLE;
80static HWND hwndClient = NULLHANDLE;
81static PFNWP pfnOldClientProc = NULL;
82
83
84
85/************************************************************************/
86/* */
87/* Device access */
88/* */
89/************************************************************************/
90
91typedef struct
92{
93 HFILE hDev;
94 ULONG arInfo[5];
95 BOOL fInfoOK;
96 ULONG ulFlags;
97 ULONG ulMasterVol;
98 BOOL fTerminate;
99 TID tidCallback;
100 HEV hevMixerChange;
101 SIZEL szWinPos;
102} CMI_DATA, *PCMI_DATA;
103
104
105//----------------------------------------------------------------------//
106// //
107//----------------------------------------------------------------------//
108
109HFILE CMIOpenDevice(VOID)
110{
111 HFILE hDev;
112 ULONG ulAction;
113
114 if( DosOpen("CMPCI1$", &hDev, &ulAction, 0,
115 FILE_NORMAL, FILE_OPEN,
116 OPEN_ACCESS_READWRITE |
117 OPEN_SHARE_DENYNONE |
118 OPEN_FLAGS_FAIL_ON_ERROR, NULL) != 0 )
119 {
120 hDev = (HFILE)-1;
121 }
122
123 return hDev;
124}
125
126
127//----------------------------------------------------------------------//
128// //
129//----------------------------------------------------------------------//
130
131VOID CMICloseDevice(HFILE hDev)
132{
133 DosClose(hDev);
134}
135
136
137//----------------------------------------------------------------------//
138// //
139//----------------------------------------------------------------------//
140
141BOOL CMIQueryInfo(HFILE hDev, PULONG arInfo, ULONG ctInfo)
142{
143 return DosDevIOCtl(hDev, 0x81, 0x80,
144 NULL, 0, NULL, arInfo, ctInfo*sizeof(ULONG), NULL) == 0;
145}
146
147
148//----------------------------------------------------------------------//
149// //
150//----------------------------------------------------------------------//
151
152ULONG CMIQueryFlags(HFILE hDev)
153{
154 ULONG arTemp[3] = { 0, 0 };
155
156 if( DosDevIOCtl(hDev, 0x81, 0x81,
157 &arTemp[0], 2*sizeof(ULONG), NULL,
158 &arTemp[2], 1*sizeof(ULONG), NULL) != 0 )
159 {
160 arTemp[2] = 0;
161 }
162
163 return arTemp[2];
164}
165
166
167//----------------------------------------------------------------------//
168// //
169//----------------------------------------------------------------------//
170
171ULONG CMISetFlags(HFILE hDev, ULONG ulOnMask, ULONG ulOffMask)
172{
173 ULONG arTemp[3];
174
175 arTemp[0] = ulOnMask;
176 arTemp[1] = ulOffMask;
177 if( DosDevIOCtl(hDev, 0x81, 0x81,
178 &arTemp[0], 2*sizeof(ULONG), NULL,
179 &arTemp[2], 1*sizeof(ULONG), NULL) != 0 )
180 {
181 arTemp[2] = 0;
182 }
183
184 return arTemp[2];
185}
186
187
188//----------------------------------------------------------------------//
189// //
190//----------------------------------------------------------------------//
191
192BOOL CMISetRecordSource(HFILE hDev, ULONG ulRecSrc)
193{
194 ULONG ulDataLen;
195 MIXSTRUCT MixStruct;
196
197 MixStruct.Mute = ( !ulRecSrc ) ? 2 : 0;
198 MixStruct.VolumeL = ulRecSrc;
199 MixStruct.VolumeR = 0;
200
201 ulDataLen = sizeof(MixStruct);
202 return DosDevIOCtl(hDev, 0x90, RECORDSRCSET,
203 NULL, 0, NULL, &MixStruct, ulDataLen, &ulDataLen) == 0;
204}
205
206
207//----------------------------------------------------------------------//
208// //
209//----------------------------------------------------------------------//
210
211#pragma pack(1)
212
213#ifndef FAR16PTR
214 #define FAR16PTR __far16 *
215#endif
216
217#ifndef AUDIO_CHANGE
218 #define AUDIO_CHANGE 0
219#endif
220
221#ifndef AUDIO_IGNORE
222 #define AUDIO_IGNORE (-1)
223#endif
224
225
226typedef struct _MCI_AUDIO_CONTROL { /* contr */
227 USHORT usIOCtlRequest;
228 VOID FAR16PTR pbRequestInfo;
229 ULONG ulPosition;
230 SHORT sReturnCode;
231 } MCI_AUDIO_CONTROL;
232
233typedef struct _MCI_AUDIO_DEVID { /* devid */
234 ULONG ulDevType;
235 ULONG ulDevNum;
236 } MCI_AUDIO_DEVID;
237
238typedef struct _MCI_AUDIO_CHANGE { /* chang */
239 VOID FAR16PTR pvDevInfo;
240 LONG lInput;
241 LONG lOutput;
242 LONG lMonitor;
243 LONG lVolume;
244 LONG lVolumeDelay;
245 LONG lBalance;
246 LONG lBalanceDelay;
247 LONG lTreble;
248 LONG lBass;
249 LONG lPitch;
250 MCI_AUDIO_DEVID rInputList[8];
251 MCI_AUDIO_DEVID rOutputList[8];
252
253 MCI_AUDIO_DEVID FAR16PTR prMoreInputs;
254 MCI_AUDIO_DEVID FAR16PTR prMoreOutputs;
255 LONG lGain;
256 VOID FAR16PTR pvModeInfo;
257 } MCI_AUDIO_CHANGE;
258
259typedef struct _MCI_TRACK_INFO { /* info */
260 USHORT usMasterVolume;
261 USHORT usDitherPct;
262 USHORT usMasterVolumeDelay;
263 USHORT usMasterBalance;
264 USHORT usMasterBalanceDelay;
265 } MCI_TRACK_INFO;
266
267#pragma pack()
268
269
270BOOL CMISetMasterVolume(HFILE hDev, ULONG ulValue, BOOL fToCardOnly)
271{
272 MCI_TRACK_INFO *pTrackInfo;
273 MCI_AUDIO_CHANGE *pAudioChange;
274 MCI_AUDIO_CONTROL *pAudioCtrl;
275 CHAR achTemp[64];
276 ULONG ulDataLen = sizeof(MCI_TRACK_INFO) +
277 sizeof(MCI_AUDIO_CHANGE) +
278 sizeof(MCI_AUDIO_CONTROL);
279
280 // Make sure, that structures don't cross a 64k boundary !
281 pAudioCtrl = (MCI_AUDIO_CONTROL *)alloca(2 * ulDataLen);
282 if( LOUSHORT(pAudioCtrl) > LOUSHORT(~ulDataLen) )
283 pAudioCtrl = (MCI_AUDIO_CONTROL *)(((ULONG)pAudioCtrl) + ulDataLen);
284
285 memset(pAudioCtrl, 0, ulDataLen);
286 pAudioChange = (MCI_AUDIO_CHANGE *)&pAudioCtrl[1];
287 pTrackInfo = (MCI_TRACK_INFO *)&pAudioChange[1];
288
289 pAudioCtrl->usIOCtlRequest = AUDIO_CHANGE;
290 pAudioCtrl->pbRequestInfo = pAudioChange;
291
292 pAudioChange->lInput = pAudioChange->lOutput =
293 pAudioChange->lMonitor = pAudioChange->lBalance =
294 pAudioChange->lTreble = pAudioChange->lBass =
295 pAudioChange->lPitch = pAudioChange->lGain =
296 pAudioChange->lBalanceDelay = pAudioChange->lVolumeDelay = AUDIO_IGNORE;
297 pAudioChange->pvDevInfo = pTrackInfo;
298
299 pTrackInfo->usMasterVolume = (USHORT)((ulValue * 0x7fff) / 100);
300 pTrackInfo->usMasterVolumeDelay = pTrackInfo->usMasterBalance =
301 pTrackInfo->usMasterBalanceDelay = pTrackInfo->usDitherPct = (USHORT)AUDIO_IGNORE;
302
303 if( !fToCardOnly )
304 {
305 sprintf(achTemp, "MASTERAUDIO VOLUME %u", ulValue);
306 mciSendString(achTemp, NULL, 0, 0, 0);
307 mciSetSysValue(MSV_MASTERVOLUME, &ulValue);
308 }
309
310 ulDataLen = sizeof(MCI_AUDIO_CONTROL);
311 return DosDevIOCtl(hDev, 0x80, 0x42,
312 NULL, 0, NULL, pAudioCtrl, ulDataLen, &ulDataLen) == 0;
313}
314
315
316//----------------------------------------------------------------------//
317// //
318//----------------------------------------------------------------------//
319
320ULONG CMIQueryMasterVolume(HFILE hDev)
321{
322 CHAR achTemp[32];
323
324 (void)hDev;
325 sprintf(achTemp, "MASTERAUDIO QUERY VOLUME WAIT");
326 mciSendString(achTemp, achTemp, sizeof(achTemp), 0, 0);
327 return strtoul(achTemp, NULL, 10);
328}
329
330
331//----------------------------------------------------------------------//
332// //
333//----------------------------------------------------------------------//
334
335VOID CMICallbackThread(CMI_DATA *pWndData)
336{
337 HEV hevTemp;
338 ULONG ulDataLen;
339
340 if( DosCreateEventSem(NULL,
341 &pWndData->hevMixerChange, DC_SEM_SHARED, FALSE) == 0 )
342 {
343 hevTemp = pWndData->hevMixerChange;
344
345 ulDataLen = sizeof(hevTemp);
346 if( DosDevIOCtl(pWndData->hDev, 0x90, CALLBACKREG,
347 NULL, 0, NULL, &hevTemp, ulDataLen, &ulDataLen) == 0 )
348 {
349 while( DosWaitEventSem(hevTemp, SEM_INDEFINITE_WAIT) == 0 &&
350 !pWndData->fTerminate )
351 {
352 WinPostMsg(hwndClient, UM_MIXERCHANGE, 0, 0);
353 }
354
355 hevTemp = NULLHANDLE;
356 ulDataLen = sizeof(hevTemp);
357 DosDevIOCtl(pWndData->hDev, 0x90, CALLBACKREG,
358 NULL, 0, NULL, &hevTemp, ulDataLen, &ulDataLen);
359 }
360
361 DosCloseEventSem(pWndData->hevMixerChange);
362 pWndData->hevMixerChange = NULLHANDLE;
363 }
364}
365
366
367
368
369/************************************************************************/
370/* */
371/* Dialog Page #1 */
372/* */
373/************************************************************************/
374
375//----------------------------------------------------------------------//
376// Dialog Procedure //
377//----------------------------------------------------------------------//
378
379MRESULT EXPENTRY DlgPage1Proc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
380{
381 PCMI_DATA pWndData = (PCMI_DATA)WinQueryWindowPtr(hwnd, QWL_USER);
382 ULONG ulOnBits, ulOffBits, ulVol;
383 int i;
384 static BOOL fInit = FALSE;
385 static ULONG ulIDList[] =
386 {
387 ID_RADIO1, ID_RADIO2, ID_RADIO3, ID_RADIO4, ID_RADIO5, ID_RADIO6, ID_RADIO7,
388 ID_CHECK1, ID_CHECK2, ID_CHECK3, ID_SLIDER1, 0
389 };
390
391
392 switch( msg )
393 {
394 case WM_INITDLG :
395 pWndData = (PCMI_DATA)mp2;
396 WinSetWindowPtr(hwnd, QWL_USER, pWndData);
397
398 fInit = TRUE;
399
400 if( !pWndData || pWndData->hDev == (HFILE)-1 || !pWndData->fInfoOK )
401 {
402 for( i = 0; ulIDList[i]; i++ )
403 WinEnableControl(hwnd, ulIDList[i], FALSE);
404 }
405 else
406 {
407 if( pWndData->ulFlags & DO_SPDIF_LOOP )
408 (VOID)WinCheckButton(hwnd, ID_RADIO3, TRUE);
409 else if( pWndData->ulFlags & DO_SPDIF_OUT_ENABLE )
410 (VOID)WinCheckButton(hwnd, ID_RADIO2, TRUE);
411 else
412 (VOID)WinCheckButton(hwnd, ID_RADIO1, TRUE);
413
414 (VOID)WinCheckButton(hwnd, ID_CHECK1, (pWndData->ulFlags & DO_SPDIF_MONITOR) != 0);
415 (VOID)WinCheckButton(hwnd, ID_CHECK2, (pWndData->ulFlags & DO_SPDIF_COPYRIGHT) != 0);
416 (VOID)WinCheckButton(hwnd, ID_CHECK3, (pWndData->ulFlags & DO_SPDIF_5V) == 0);
417
418 (VOID)WinCheckButton(hwnd, ( pWndData->ulFlags & DO_SPDIF_INVERSE ) ? ID_RADIO5 : ID_RADIO4, TRUE);
419 (VOID)WinCheckButton(hwnd, ( pWndData->ulFlags & DO_SPDIF_INPUT2 ) ? ID_RADIO7 : ID_RADIO6, TRUE);
420
421 WinSendDlgItemMsg(hwnd, ID_SLIDER1, SLM_SETSLIDERINFO,
422 MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_INCREMENTVALUE),
423 MPFROMLONG(pWndData->ulMasterVol));
424 }
425
426 fInit = FALSE;
427 return (MRESULT)TRUE;
428
429 case WM_CONTROL :
430 if( !fInit && pWndData && pWndData->hDev != (HFILE)-1 )
431 {
432 if( SHORT1FROMMP(mp1) == ID_SLIDER1 )
433 {
434 if( SHORT2FROMMP(mp1) == SLN_CHANGE ||
435 SHORT2FROMMP(mp1) == SLN_SLIDERTRACK )
436 {
437 pWndData->ulMasterVol = (ULONG)
438 WinSendDlgItemMsg(hwnd, ID_SLIDER1, SLM_QUERYSLIDERINFO,
439 MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_INCREMENTVALUE),
440 MPVOID);
441
442 CMISetMasterVolume(pWndData->hDev, pWndData->ulMasterVol, FALSE);
443 }
444 }
445 else
446 {
447 ulOnBits = ulOffBits = 0;
448
449 if( WinQueryButtonCheckstate(hwnd, ID_RADIO1) )
450 {
451 ulOffBits |= DO_SPDIF_OUT_ENABLE | DO_SPDIF_LOOP;
452 }
453 else if( WinQueryButtonCheckstate(hwnd, ID_RADIO2) )
454 {
455 ulOffBits |= DO_SPDIF_LOOP; ulOnBits |= DO_SPDIF_OUT_ENABLE;
456 }
457 else if( WinQueryButtonCheckstate(hwnd, ID_RADIO3) )
458 {
459 ulOffBits |= DO_SPDIF_OUT_ENABLE; ulOnBits |= DO_SPDIF_LOOP;
460 }
461
462 if( WinQueryButtonCheckstate(hwnd, ID_CHECK1) ) ulOnBits |= DO_SPDIF_MONITOR;
463 else ulOffBits |= DO_SPDIF_MONITOR;
464
465 if( WinQueryButtonCheckstate(hwnd, ID_CHECK2) ) ulOnBits |= DO_SPDIF_COPYRIGHT;
466 else ulOffBits |= DO_SPDIF_COPYRIGHT;
467
468 if( !WinQueryButtonCheckstate(hwnd, ID_CHECK3) ) ulOnBits |= DO_SPDIF_5V;
469 else ulOffBits |= DO_SPDIF_5V;
470
471 if( WinQueryButtonCheckstate(hwnd, ID_RADIO5) ) ulOnBits |= DO_SPDIF_INVERSE;
472 else ulOffBits |= DO_SPDIF_INVERSE;
473
474 if( WinQueryButtonCheckstate(hwnd, ID_RADIO7) ) ulOnBits |= DO_SPDIF_INPUT2;
475 else ulOffBits |= DO_SPDIF_INPUT2;
476
477 pWndData->ulFlags = CMISetFlags(pWndData->hDev, ulOnBits, ulOffBits);
478 }
479 }
480 return (MRESULT)0;
481
482 case UM_MIXERCHANGE :
483 ulVol = CMIQueryMasterVolume(pWndData->hDev);
484//printf("ulVol: %u, old: %u\n", ulVol, pWndData->ulMasterVol);
485 if( ulVol != pWndData->ulMasterVol )
486 {
487 pWndData->ulMasterVol = ulVol;
488
489 fInit = TRUE;
490 WinSendDlgItemMsg(hwnd, ID_SLIDER1, SLM_SETSLIDERINFO,
491 MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_INCREMENTVALUE),
492 MPFROMLONG(pWndData->ulMasterVol));
493 fInit = FALSE;
494
495 return (MRESULT)TRUE;
496 }
497 return (MRESULT)FALSE;
498 }
499
500 return WinDefDlgProc(hwnd, msg, mp1, mp2);
501}
502
503
504
505
506/************************************************************************/
507/* */
508/* Dialog Page #2 */
509/* */
510/************************************************************************/
511
512typedef struct
513{
514 PCHAR pchLabel;
515 PCHAR pchText;
516 CHAR achBuffer[1];
517} PAGE2CNRDATA, *PPAGE2CNRDATA;
518
519
520//----------------------------------------------------------------------//
521// Helper //
522//----------------------------------------------------------------------//
523
524void Page2InitContainer(HWND hwndCnr)
525{
526 CNRINFO CnrInfo;
527 FIELDINFOINSERT FldInsert;
528 INT nIdx, nStructOffset;
529 PFIELDINFO pFirstFieldInfo, pFieldInfo;
530
531 memset(&CnrInfo, 0, sizeof(CnrInfo));
532 memset(&FldInsert, 0, sizeof(FldInsert));
533
534 pFirstFieldInfo = (PFIELDINFO)WinSendMsg(hwndCnr,
535 CM_ALLOCDETAILFIELDINFO,
536 MPFROMLONG(2), NULL);
537 nIdx = 0;
538 pFieldInfo = pFirstFieldInfo;
539 nStructOffset = sizeof(MINIRECORDCORE);
540 while( pFieldInfo )
541 {
542 pFieldInfo->offStruct = nStructOffset;
543 pFieldInfo->flTitle = CFA_LEFT | CFA_FITITLEREADONLY;
544 pFieldInfo->flData = CFA_LEFT | CFA_STRING | CFA_HORZSEPARATOR;
545// pFieldInfo->cxWidth = 0;
546// pFieldInfo->pTitleData = "";
547
548 switch( nIdx++ )
549 {
550 case 0 : pFieldInfo->flData |= CFA_SEPARATOR;
551 break;
552
553 case 1 :
554 break;
555 }
556
557 nStructOffset += sizeof(PCHAR);
558
559 pFieldInfo = pFieldInfo->pNextFieldInfo;
560 }
561
562 FldInsert.cb = sizeof(FldInsert);
563 FldInsert.pFieldInfoOrder = (PFIELDINFO)CMA_FIRST;
564 FldInsert.cFieldInfoInsert = nIdx;
565 FldInsert.fInvalidateFieldInfo = TRUE;
566 WinSendMsg(hwndCnr, CM_INSERTDETAILFIELDINFO,
567 MPFROMP(pFirstFieldInfo), MPFROMP(&FldInsert));
568
569 CnrInfo.cb = sizeof(CnrInfo);
570 CnrInfo.flWindowAttr = CV_DETAIL;
571 WinSendMsg(hwndCnr, CM_SETCNRINFO,
572 MPFROMP(&CnrInfo), MPFROMLONG(CMA_FLWINDOWATTR));
573}
574
575
576//----------------------------------------------------------------------//
577// Helper //
578//----------------------------------------------------------------------//
579
580void Page2InsertRecord(HWND hwndCnr, PCHAR pchText)
581{
582 INT cbExtra;
583 PMINIRECORDCORE pRecord;
584 PPAGE2CNRDATA pCnrData;
585 RECORDINSERT RcdInsert;
586
587 cbExtra = strlen(pchText) + sizeof(PAGE2CNRDATA);
588
589 pRecord = (PMINIRECORDCORE)WinSendMsg(hwndCnr,
590 CM_ALLOCRECORD,
591 MPFROMSHORT(cbExtra), MPFROMSHORT(1));
592 if( pRecord )
593 {
594 pCnrData = (PPAGE2CNRDATA)((PCHAR)pRecord + pRecord->cb);
595
596 strcpy(pCnrData->achBuffer, pchText);
597
598 if( (pchText = strchr(pCnrData->achBuffer, '|')) != NULL )
599 {
600 *pchText++ = '\0';
601 pCnrData->pchLabel = pCnrData->achBuffer;
602 pCnrData->pchText = pchText;
603 }
604 else
605 {
606 pCnrData->pchLabel = "";
607 pCnrData->pchText = pCnrData->achBuffer;
608 }
609
610 memset(&RcdInsert, 0, sizeof(RcdInsert));
611 RcdInsert.cb = sizeof(RcdInsert);
612 RcdInsert.cRecordsInsert = 1;
613 RcdInsert.fInvalidateRecord = TRUE;;
614 RcdInsert.pRecordOrder = (PRECORDCORE)CMA_END;
615 WinSendMsg(hwndCnr, CM_INSERTRECORD,
616 MPFROMP(pRecord), MPFROMP(&RcdInsert));
617 }
618}
619
620
621//----------------------------------------------------------------------//
622// Dialog Procedure //
623//----------------------------------------------------------------------//
624
625MRESULT EXPENTRY DlgPage2Proc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
626{
627 CHAR achTemp[256];
628 PCMI_DATA pWndData;
629 HWND hwndCnr;
630
631 switch( msg )
632 {
633 case WM_INITDLG :
634 pWndData = (PCMI_DATA)mp2;
635
636 hwndCnr = WinWindowFromID(hwnd, ID_CONTAINER1);
637 Page2InitContainer(hwndCnr);
638
639 if( pWndData && pWndData->fInfoOK )
640 {
641 sprintf(achTemp, "PCI ID|0x%04x : 0x%04x",
642 pWndData->arInfo[0] >> 16, pWndData->arInfo[0] & 0xffff);
643 Page2InsertRecord(hwndCnr, achTemp);
644
645 sprintf(achTemp, "I/O Base|0x%04x", pWndData->arInfo[1]);
646 Page2InsertRecord(hwndCnr, achTemp);
647
648 sprintf(achTemp, "IRQ No.|%d", pWndData->arInfo[2]);
649 Page2InsertRecord(hwndCnr, achTemp);
650
651 sprintf(achTemp, "Chip Rev.|%d", pWndData->arInfo[3]);
652 Page2InsertRecord(hwndCnr, achTemp);
653
654 sprintf(achTemp, "Chip Caps|0x%08lx", pWndData->arInfo[4]);
655 Page2InsertRecord(hwndCnr, achTemp);
656 }
657 else
658 {
659 sprintf(achTemp, "Error|Unable to query information !");
660 Page2InsertRecord(hwndCnr, achTemp);
661 }
662
663 return (MRESULT)FALSE;
664
665 case WM_COMMAND :
666 return (MRESULT)0;
667 }
668
669 return WinDefDlgProc(hwnd, msg, mp1, mp2);
670}
671
672
673//----------------------------------------------------------------------//
674// Notizbuch initialisieren //
675//----------------------------------------------------------------------//
676
677VOID InitNotebook(HAB hab, HWND hwndNotebook,
678 PVOID pPageParam, PRECTL prcNotebook)
679{
680 ULONG ulPageID, ulIdx;
681 CHAR achTemp[256];
682 HWND hwndPage;
683 RECTL rcPage;
684 static struct
685 {
686 ULONG ulDlgID;
687 ULONG ulTabTextID;
688 PFNWP pfnDlgProc;
689 } arPageInfo[] =
690 {
691 { IDD_PAGE1, ID_STATIC1, DlgPage1Proc },
692 { IDD_PAGE2, ID_STATIC1, DlgPage2Proc },
693 { 0, 0, NULL }
694 };
695
696 WinSendMsg(hwndNotebook, BKM_SETDIMENSIONS,
697 MPFROM2SHORT(0, 0), MPFROMSHORT(BKA_MINORTAB));
698
699 WinSendMsg(hwndNotebook, BKM_SETDIMENSIONS,
700 MPFROM2SHORT(100, 25), MPFROMSHORT(BKA_MAJORTAB));
701
702 WinSendMsg(hwndNotebook, BKM_SETDIMENSIONS,
703 MPFROM2SHORT(18, 18), MPFROMSHORT(BKA_PAGEBUTTON));
704
705 WinSendMsg(hwndNotebook, BKM_SETNOTEBOOKCOLORS,
706 MPFROMLONG(CLR_PALEGRAY), MPFROMLONG(BKA_BACKGROUNDPAGECOLORINDEX));
707
708 WinSendMsg(hwndNotebook, BKM_SETNOTEBOOKCOLORS,
709 MPFROMLONG(CLR_WHITE), MPFROMLONG(BKA_BACKGROUNDMAJORCOLORINDEX));
710
711
712 memset(prcNotebook, 0, sizeof(*prcNotebook));
713
714 for( ulIdx = 0; arPageInfo[ulIdx].ulDlgID; ulIdx++ )
715 {
716 hwndPage = WinLoadDlg(hwndNotebook, hwndNotebook,
717 arPageInfo[ulIdx].pfnDlgProc, NULLHANDLE,
718 arPageInfo[ulIdx].ulDlgID, pPageParam);
719 if( hwndPage )
720 {
721 ulPageID = (ULONG)WinSendMsg(hwndNotebook, BKM_INSERTPAGE,
722 0, MPFROM2SHORT(BKA_AUTOPAGESIZE | BKA_MAJOR, BKA_LAST));
723
724 WinQueryWindowRect(hwndPage, &rcPage);
725 WinUnionRect(hab, prcNotebook, prcNotebook, &rcPage);
726
727 WinQueryDlgItemText(hwndPage,
728 arPageInfo[ulIdx].ulTabTextID, sizeof(achTemp), achTemp);
729 WinSendMsg(hwndNotebook, BKM_SETTABTEXT,
730 MPFROMLONG(ulPageID), MPFROMP(achTemp));
731
732 WinSendMsg(hwndNotebook, BKM_SETPAGEWINDOWHWND,
733 MPFROMLONG(ulPageID), MPFROMLONG(hwndPage));
734 }
735 }
736
737 WinSendMsg(hwndNotebook, BKM_CALCPAGERECT,
738 MPFROMP(prcNotebook), MPFROMSHORT(FALSE));
739}
740
741
742
743//----------------------------------------------------------------------//
744// Window Procedure //
745//----------------------------------------------------------------------//
746
747MRESULT EXPENTRY ClientWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
748{
749 PCMI_DATA pWndData = (PCMI_DATA)WinQueryWindowPtr(hwnd, QWL_USER);
750 ULONG ulPageID;
751 HWND hwndPage;
752 BOOL fChanged;
753 SWP swp;
754
755 switch( msg )
756 {
757 case WM_ACTIVATE :
758 if( SHORT1FROMMP(mp1) )
759 WinSendMsg(hwnd, UM_MIXERCHANGE, MPVOID, MPVOID);
760 break;
761
762 case WM_CREATE :
763 pWndData = (PCMI_DATA)malloc(sizeof(CMI_DATA));
764 if( pWndData )
765 {
766 memset(pWndData, 0, sizeof(CMI_DATA));
767 pWndData->hDev = CMIOpenDevice();
768 if( pWndData->hDev != (HFILE)-1 )
769 {
770 pWndData->fInfoOK = CMIQueryInfo(pWndData->hDev, pWndData->arInfo, 5);
771 pWndData->ulFlags = CMIQueryFlags(pWndData->hDev);
772 pWndData->ulMasterVol = CMIQueryMasterVolume(pWndData->hDev);
773
774 // Register callback
775 pWndData->tidCallback =
776#if defined(__BORLANDC__) || __WATCOMC__ < 110
777 _beginthread((THREAD)CMICallbackThread, 16384, pWndData);
778#else
779 _beginthread((THREAD)CMICallbackThread, NULL, 16384, pWndData);
780#endif
781
782 // Override record source
783 CMISetRecordSource(pWndData->hDev, I90SRC_SPDIF);
784 }
785 }
786
787 WinSetWindowPtr(hwnd, QWL_USER, pWndData);
788 return (MRESULT)0;
789
790 case UM_MIXERCHANGE :
791 fChanged = FALSE;
792 ulPageID = (ULONG)WinSendMsg(hwnd, BKM_QUERYPAGEID,
793 MPVOID, MPFROM2SHORT(BKA_FIRST, 0));
794 while( ulPageID )
795 {
796 hwndPage = (HWND)WinSendMsg(hwnd, BKM_QUERYPAGEWINDOWHWND,
797 MPFROMLONG(ulPageID), MPVOID);
798 if( hwndPage )
799 fChanged |= (BOOL)WinSendMsg(hwndPage, UM_MIXERCHANGE, 0, 0);
800
801 ulPageID = (ULONG)WinSendMsg(hwnd, BKM_QUERYPAGEID,
802 MPFROMLONG(ulPageID),
803 MPFROM2SHORT(BKA_NEXT, 0));
804 }
805
806 if( fChanged )
807 CMISetMasterVolume(pWndData->hDev, pWndData->ulMasterVol, TRUE);
808
809 return (MRESULT)0;
810
811 case WM_CLOSE :
812/*
813 ulPageID = (ULONG)WinSendMsg(hwnd, BKM_QUERYPAGEID,
814 0, MPFROM2SHORT(BKA_TOP, 0));
815 ulPageIdx = (ULONG)WinSendMsg(hwnd, BKM_QUERYPAGEDATA,
816 MPFROMLONG(ulPageID), 0);
817 PrfWriteProfileString(HINI_USERPROFILE, APP_NAME,
818 INIKEY_PAGENO, ultoa(ulPageIdx, achTemp, 10));
819*/
820 if( pWndData )
821 {
822 if( pWndData->hDev != (HFILE)-1 )
823 {
824 // terminate callback thread
825 if( pWndData->tidCallback && pWndData->hevMixerChange )
826 {
827 pWndData->fTerminate = TRUE;
828 DosPostEventSem(pWndData->hevMixerChange);
829 DosWaitThread(&pWndData->tidCallback, DCWW_WAIT);
830 }
831
832 // disable SPDIF monitoring
833 CMISetFlags(pWndData->hDev, 0, DO_SPDIF_MONITOR);
834
835 // release record src override
836 CMISetRecordSource(pWndData->hDev, 0);
837
838 CMICloseDevice(pWndData->hDev);
839 }
840
841 WinSetWindowPtr(hwnd, QWL_USER, NULL);
842 free(pWndData);
843 }
844 break;
845
846 case WM_SIZE :
847 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
848 if( pWndData && !(swp.fl & (SWP_MINIMIZE | SWP_MAXIMIZE)) )
849 {
850 pWndData->szWinPos.cx = swp.cx; pWndData->szWinPos.cy = swp.cy;
851 }
852 break;
853
854 case WM_MOUSEMOVE :
855 WinDefWindowProc(hwnd, msg, mp1, mp2);
856 return (MRESULT)TRUE;
857
858 case WM_COMMAND :
859/* switch( SHORT1FROMMP(mp1) )
860 {
861 case IDM_ABOUT :
862 WinDlgBox(HWND_DESKTOP, WinQueryWindow(hwnd, QW_PARENT),
863 WinDefDlgProc, NULLHANDLE, IDD_ABOUT, NULL);
864 break;
865
866 default:
867 DosBeep(1000, 100);
868 }
869*/
870 return (MRESULT)0;
871 }
872
873 return (*pfnOldClientProc)(hwnd, msg, mp1, mp2);
874}
875
876
877
878//----------------------------------------------------------------------//
879// H A U P T P R O G R A M M //
880//----------------------------------------------------------------------//
881
882int main(/*int argc, char *argv[]*/void)
883{
884 HAB hab;
885 HMQ hmq;
886 QMSG qmsg;
887 SWP swp;
888 SIZEL szWin;
889 RECTL rcTemp;
890 PVOID pPageParam;
891 ULONG ulFrameCreationFlags;
892
893 hab = WinInitialize(0);
894 hmq = WinCreateMsgQueue(hab, 0);
895
896 ulFrameCreationFlags = FCF_STANDARD & ~FCF_ACCELTABLE & ~FCF_MENU;
897 hwndFrame = WinCreateStdWindow(HWND_DESKTOP,
898 0,
899 &ulFrameCreationFlags,
900 WC_NOTEBOOK,
901 APP_NAME,
902 BKS_SPIRALBIND | BKS_TABBEDDIALOG |
903 BKS_MAJORTABTOP | BKS_BACKPAGESTR |
904 BKS_STATUSTEXTLEFT | BKS_TABTEXTCENTER,
905 NULLHANDLE,
906 IDW_CLIENT,
907 &hwndClient);
908 if( hwndFrame )
909 {
910 WinSetPresParam(hwndClient, PP_FONTNAMESIZE, 7, "8.Helv");
911 pfnOldClientProc = WinSubclassWindow(hwndClient, ClientWndProc);
912
913 // Simulate WM_CREATE ...
914 ClientWndProc(hwndClient, WM_CREATE, MPVOID, MPVOID);
915
916// InitFrame(hab, hwndFrame);
917 pPageParam = WinQueryWindowPtr(hwndClient, QWL_USER);
918 InitNotebook(hab, hwndClient, pPageParam, &rcTemp);
919
920 rcTemp.yTop += WinQuerySysValue(HWND_DESKTOP, SV_CYTITLEBAR) +
921 2 * WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER);
922 rcTemp.xRight += 2 * WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER);
923
924 szWin.cx = szWin.cy = 0;
925// szWin.cx = PrfQueryProfileInt(HINI_USERPROFILE, APP_NAME, INIKEY_CX, 0);
926// szWin.cy = PrfQueryProfileInt(HINI_USERPROFILE, APP_NAME, INIKEY_CY, 0);
927 if( !szWin.cx ) szWin.cx = rcTemp.xRight - rcTemp.xLeft;
928 if( !szWin.cy ) szWin.cy = rcTemp.yTop - rcTemp.yBottom;
929
930 WinQueryTaskSizePos(hab, 0, &swp);
931 if( swp.cx > szWin.cx ) swp.x += szWin.cx / 2;
932 if( swp.cy > szWin.cy ) swp.y += szWin.cy / 2;
933
934 WinSetWindowPos(hwndFrame, NULLHANDLE,
935 swp.x, swp.y, szWin.cx, szWin.cy,
936 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ACTIVATE);
937 WinSetFocus(HWND_DESKTOP, hwndClient);
938
939 while( WinGetMsg(hab, &qmsg, 0, 0, 0) ) WinDispatchMsg(hab, &qmsg);
940 }
941
942 WinDestroyMsgQueue(hmq);
943 WinTerminate(hab);
944
945 return 0;
946}
947
948
949
Note: See TracBrowser for help on using the repository browser.