yum-archive/TaSTT-Whisper
High-performance GPGPU inference of OpenAI's Whisper automatic speech recognition (ASR) model
git clone https://git.yummers.dev/yum-archive/TaSTT-Whisper
8c4603c
master
1// Windows Template Library - WTL version 10.0 2// Copyright (C) Microsoft Corporation, WTL Team. All rights reserved. 3// 4// This file is a part of the Windows Template Library. 5// The use and distribution terms for this software are covered by the 6// Microsoft Public License (http://opensource.org/licenses/MS-PL) 7// which can be found in the file MS-PL.txt at the root folder. 8 9#ifndef __ATLDDX_H__ 10#define __ATLDDX_H__ 11 12#pragma once 13 14#ifndef __ATLAPP_H__ 15#error atlddx.h requires atlapp.h to be included first 16#endif 17 18#include <float.h> 19 20 21/////////////////////////////////////////////////////////////////////////////// 22// Classes in this file: 23// 24// CWinDataExchange<T> 25 26 27namespace WTL 28{ 29 30// Constants 31#define DDX_LOAD FALSE 32#define DDX_SAVE TRUE 33 34// DDX map macros 35#define BEGIN_DDX_MAP (thisClass ) \ 36 BOOL DoDataExchange(BOOL bSaveAndValidate = FALSE, UINT nCtlID = (UINT)-1) \ 37 { \ 38 (bSaveAndValidate); \ 39 (nCtlID); 40 41#define DDX_TEXT (nID ,var ) \ 42 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 43 { \ 44 if(!DDX_Text(nID, var, sizeof(var), bSaveAndValidate)) \ 45 return FALSE; \ 46 } 47 48#define DDX_TEXT_LEN (nID ,var ,len ) \ 49 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 50 { \ 51 if(!DDX_Text(nID, var, sizeof(var), bSaveAndValidate, TRUE, len)) \ 52 return FALSE; \ 53 } 54 55#define DDX_INT (nID ,var ) \ 56 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 57 { \ 58 if(!DDX_Int(nID, var, TRUE, bSaveAndValidate)) \ 59 return FALSE; \ 60 } 61 62#define DDX_INT_RANGE (nID ,var ,min ,max ) \ 63 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 64 { \ 65 if(!DDX_Int(nID, var, TRUE, bSaveAndValidate, TRUE, min, max)) \ 66 return FALSE; \ 67 } 68 69#define DDX_UINT (nID ,var ) \ 70 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 71 { \ 72 if(!DDX_Int(nID, var, FALSE, bSaveAndValidate)) \ 73 return FALSE; \ 74 } 75 76#define DDX_UINT_RANGE (nID ,var ,min ,max ) \ 77 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 78 { \ 79 if(!DDX_Int(nID, var, FALSE, bSaveAndValidate, TRUE, min, max)) \ 80 return FALSE; \ 81 } 82 83#define DDX_FLOAT (nID ,var ) \ 84 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 85 { \ 86 if(!DDX_Float(nID, var, bSaveAndValidate)) \ 87 return FALSE; \ 88 } 89 90#define DDX_FLOAT_RANGE (nID ,var ,min ,max ) \ 91 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 92 { \ 93 if(!DDX_Float(nID, var, bSaveAndValidate, TRUE, min, max)) \ 94 return FALSE; \ 95 } 96#define DDX_FLOAT_P (nID ,var ,precision ) \ 97 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 98 { \ 99 if(!DDX_Float(nID, var, bSaveAndValidate, FALSE, 0, 0, precision)) \ 100 return FALSE; \ 101 } 102 103#define DDX_FLOAT_P_RANGE (nID ,var ,min ,max ,precision ) \ 104 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 105 { \ 106 if(!DDX_Float(nID, var, bSaveAndValidate, TRUE, min, max, precision)) \ 107 return FALSE; \ 108 } 109 110#define DDX_CONTROL (nID ,obj ) \ 111 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 112 DDX_Control(nID, obj, bSaveAndValidate); 113 114#define DDX_CONTROL_HANDLE (nID ,obj ) \ 115 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 116 DDX_Control_Handle(nID, obj, bSaveAndValidate); 117 118#define DDX_CHECK (nID ,var ) \ 119 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 120 DDX_Check(nID, var, bSaveAndValidate); 121 122#define DDX_RADIO (nID ,var ) \ 123 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 124 DDX_Radio(nID, var, bSaveAndValidate); 125 126#define END_DDX_MAP () \ 127 return TRUE; \ 128 } 129 130// DDX support for Tab, Combo, ListBox and ListView selection index 131// Note: Specialized versions require atlctrls.h to be included first 132 133#define DDX_INDEX (CtrlClass ,nID ,var ) \ 134 if((nCtlID == (UINT)-1) || (nCtlID == nID)) \ 135 DDX_Index<CtrlClass>(nID, var, bSaveAndValidate); 136 137#ifdef __ATLCTRLS_H__ 138#define DDX_TAB_INDEX (nID ,var ) DDX_INDEX(WTL::CTabCtrl, nID, var) 139#define DDX_COMBO_INDEX (nID ,var ) DDX_INDEX(WTL::CComboBox, nID, var) 140#define DDX_LISTBOX_INDEX (nID ,var ) DDX_INDEX(WTL::CListBox, nID, var) 141#define DDX_LISTVIEW_INDEX (nID ,var ) DDX_INDEX(WTL::CListViewCtrl, nID, var) 142#endif // __ATLCTRLS_H__ 143 144 145/////////////////////////////////////////////////////////////////////////////// 146// CWinDataExchange - provides support for DDX 147 148template < class T > 149class CWinDataExchange 150{ 151public : 152// Data exchange method - override in your derived class 153BOOL DoDataExchange (BOOL /*bSaveAndValidate*/ = FALSE,UINT /*nCtlID*/ = (UINT )- 1 ) 154 { 155// this one should never be called, override it in 156// your derived class by implementing DDX map 157ATLASSERT (FALSE); 158return FALSE; 159 } 160 161// Helpers for validation error reporting 162enum _XDataType 163 { 164ddxDataNull = 0 , 165ddxDataText = 1 , 166ddxDataInt = 2 , 167ddxDataFloat = 3 , 168ddxDataDouble = 4 169 }; 170 171struct _XTextData 172 { 173int nLength ; 174int nMaxLength ; 175 }; 176 177struct _XIntData 178 { 179long nVal ; 180long nMin ; 181long nMax ; 182 }; 183 184struct _XFloatData 185 { 186double nVal ; 187double nMin ; 188double nMax ; 189 }; 190 191struct _XData 192 { 193_XDataType nDataType ; 194union 195 { 196_XTextData textData ; 197_XIntData intData ; 198_XFloatData floatData ; 199 }; 200 }; 201 202// Text exchange 203BOOL DDX_Text (UINT nID ,LPTSTR lpstrText ,int cbSize ,BOOL bSave ,BOOL bValidate = FALSE,int nLength = 0 ) 204 { 205T * pT = static_cast < T *> (this ); 206BOOL bSuccess = TRUE; 207 208if (bSave ) 209 { 210HWND hWndCtrl = pT -> GetDlgItem (nID ); 211int nRetLen = ::GetWindowText (hWndCtrl ,lpstrText ,cbSize /sizeof (TCHAR )); 212if (nRetLen < ::GetWindowTextLength (hWndCtrl )) 213bSuccess = FALSE; 214 } 215else 216 { 217ATLASSERT (!bValidate || (lstrlen (lpstrText ) <=nLength )); 218bSuccess = pT -> SetDlgItemText (nID ,lpstrText ); 219 } 220 221if (!bSuccess ) 222 { 223pT -> OnDataExchangeError (nID ,bSave ); 224 } 225else if (bSave && bValidate )// validation 226 { 227ATLASSERT (nLength > 0 ); 228if (lstrlen (lpstrText )> nLength ) 229 { 230_XData data = {ddxDataText }; 231data .textData .nLength = lstrlen (lpstrText ); 232data .textData .nMaxLength = nLength ; 233pT -> OnDataValidateError (nID ,bSave ,data ); 234bSuccess = FALSE; 235 } 236 } 237return bSuccess ; 238 } 239 240BOOL DDX_Text (UINT nID ,BSTR & bstrText ,int /*cbSize*/ ,BOOL bSave ,BOOL bValidate = FALSE,int nLength = 0 ) 241 { 242T * pT = static_cast < T *> (this ); 243BOOL bSuccess = TRUE; 244 245if (bSave ) 246 { 247bSuccess = pT -> GetDlgItemText (nID ,bstrText ); 248 } 249else 250 { 251USES_CONVERSION ; 252LPTSTR lpstrText = OLE2T (bstrText ); 253ATLASSERT (!bValidate || (lstrlen (lpstrText ) <=nLength )); 254bSuccess = pT -> SetDlgItemText (nID ,lpstrText ); 255 } 256 257if (!bSuccess ) 258 { 259pT -> OnDataExchangeError (nID ,bSave ); 260 } 261else if (bSave && bValidate )// validation 262 { 263ATLASSERT (nLength > 0 ); 264if ((int )::SysStringLen (bstrText )> nLength ) 265 { 266_XData data = {ddxDataText }; 267data .textData .nLength = (int )::SysStringLen (bstrText ); 268data .textData .nMaxLength = nLength ; 269pT -> OnDataValidateError (nID ,bSave ,data ); 270bSuccess = FALSE; 271 } 272 } 273return bSuccess ; 274 } 275 276BOOL DDX_Text (UINT nID ,ATL ::CComBSTR & bstrText ,int /*cbSize*/ ,BOOL bSave ,BOOL bValidate = FALSE,int nLength = 0 ) 277 { 278T * pT = static_cast < T *> (this ); 279BOOL bSuccess = TRUE; 280 281if (bSave ) 282 { 283bSuccess = pT -> GetDlgItemText (nID , (BSTR & )bstrText ); 284 } 285else 286 { 287USES_CONVERSION ; 288LPTSTR lpstrText = OLE2T (bstrText ); 289ATLASSERT (!bValidate || (lstrlen (lpstrText ) <=nLength )); 290bSuccess = pT -> SetDlgItemText (nID ,lpstrText ); 291 } 292 293if (!bSuccess ) 294 { 295pT -> OnDataExchangeError (nID ,bSave ); 296 } 297else if (bSave && bValidate )// validation 298 { 299ATLASSERT (nLength > 0 ); 300if ((int )bstrText .Length ()> nLength ) 301 { 302_XData data = {ddxDataText }; 303data .textData .nLength = (int )bstrText .Length (); 304data .textData .nMaxLength = nLength ; 305pT -> OnDataValidateError (nID ,bSave ,data ); 306bSuccess = FALSE; 307 } 308 } 309return bSuccess ; 310 } 311 312#ifdef __ATLSTR_H__ 313BOOL DDX_Text (UINT nID ,ATL ::CString & strText ,int /*cbSize*/ ,BOOL bSave ,BOOL bValidate = FALSE,int nLength = 0 ) 314 { 315T * pT = static_cast < T *> (this ); 316BOOL bSuccess = TRUE; 317 318if (bSave ) 319 { 320HWND hWndCtrl = pT -> GetDlgItem (nID ); 321int nLen = ::GetWindowTextLength (hWndCtrl ); 322int nRetLen = -1 ; 323LPTSTR lpstr = strText .GetBufferSetLength (nLen ); 324if (lpstr != NULL ) 325 { 326nRetLen = ::GetWindowText (hWndCtrl ,lpstr ,nLen + 1 ); 327strText .ReleaseBuffer (); 328 } 329if (nRetLen < nLen ) 330bSuccess = FALSE; 331 } 332else 333 { 334bSuccess = pT -> SetDlgItemText (nID ,strText ); 335 } 336 337if (!bSuccess ) 338 { 339pT -> OnDataExchangeError (nID ,bSave ); 340 } 341else if (bSave && bValidate )// validation 342 { 343ATLASSERT (nLength > 0 ); 344if (strText .GetLength ()> nLength ) 345 { 346_XData data = {ddxDataText }; 347data .textData .nLength = strText .GetLength (); 348data .textData .nMaxLength = nLength ; 349pT -> OnDataValidateError (nID ,bSave ,data ); 350bSuccess = FALSE; 351 } 352 } 353return bSuccess ; 354 } 355#endif // __ATLSTR_H__ 356 357// Numeric exchange 358template < class Type > 359BOOL DDX_Int (UINT nID ,Type & nVal ,BOOL bSigned ,BOOL bSave ,BOOL bValidate = FALSE,Type nMin = 0 ,Type nMax = 0 ) 360 { 361T * pT = static_cast < T *> (this ); 362BOOL bSuccess = TRUE; 363 364if (bSave ) 365 { 366nVal = (Type )pT -> GetDlgItemInt (nID ,& bSuccess ,bSigned ); 367 } 368else 369 { 370ATLASSERT (!bValidate || ((nVal >=nMin )&& (nVal <=nMax ))); 371bSuccess = pT -> SetDlgItemInt (nID ,nVal ,bSigned ); 372 } 373 374if (!bSuccess ) 375 { 376pT -> OnDataExchangeError (nID ,bSave ); 377 } 378else if (bSave && bValidate )// validation 379 { 380ATLASSERT (nMin != nMax ); 381if ((nVal < nMin )|| (nVal > nMax )) 382 { 383_XData data = {ddxDataInt }; 384data .intData .nVal = (long )nVal ; 385data .intData .nMin = (long )nMin ; 386data .intData .nMax = (long )nMax ; 387pT -> OnDataValidateError (nID ,bSave ,data ); 388bSuccess = FALSE; 389 } 390 } 391return bSuccess ; 392 } 393 394// Float exchange 395static BOOL _AtlSimpleFloatParse (LPCTSTR lpszText ,double & d ) 396 { 397ATLASSERT (lpszText != NULL ); 398while ((* lpszText == _T (' ' ))|| (* lpszText == _T ('\t' ))) 399lpszText ++ ; 400 401TCHAR chFirst = lpszText [0 ]; 402d = _tcstod (lpszText , (LPTSTR * )& lpszText ); 403if ((d == 0.0 )&& (chFirst != _T ('0' ))) 404return FALSE;// could not convert 405while ((* lpszText == _T (' ' ))|| (* lpszText == _T ('\t' ))) 406lpszText ++ ; 407 408if (* lpszText != _T ('\0' )) 409return FALSE;// not terminated properly 410 411return TRUE; 412 } 413 414BOOL DDX_Float (UINT nID ,float & nVal ,BOOL bSave ,BOOL bValidate = FALSE,float nMin = 0.F ,float nMax = 0.F ,int nPrecision = FLT_DIG ) 415 { 416T * pT = static_cast < T *> (this ); 417BOOL bSuccess = TRUE; 418const int cchBuff = 32 ; 419TCHAR szBuff [cchBuff ]= {}; 420 421if (bSave ) 422 { 423pT -> GetDlgItemText (nID ,szBuff ,cchBuff ); 424double d = 0 ; 425if (_AtlSimpleFloatParse (szBuff ,d )) 426nVal = (float )d ; 427else 428bSuccess = FALSE; 429 } 430else 431 { 432ATLASSERT (!bValidate || ((nVal >=nMin )&& (nVal <=nMax ))); 433_stprintf_s (szBuff ,cchBuff ,_T ("%.*g" ),nPrecision ,nVal ); 434bSuccess = pT -> SetDlgItemText (nID ,szBuff ); 435 } 436 437if (!bSuccess ) 438 { 439pT -> OnDataExchangeError (nID ,bSave ); 440 } 441else if (bSave && bValidate )// validation 442 { 443ATLASSERT (nMin != nMax ); 444if ((nVal < nMin )|| (nVal > nMax )) 445 { 446_XData data = {ddxDataFloat }; 447data .floatData .nVal = (double )nVal ; 448data .floatData .nMin = (double )nMin ; 449data .floatData .nMax = (double )nMax ; 450pT -> OnDataValidateError (nID ,bSave ,data ); 451bSuccess = FALSE; 452 } 453 } 454return bSuccess ; 455 } 456 457BOOL DDX_Float (UINT nID ,double & nVal ,BOOL bSave ,BOOL bValidate = FALSE,double nMin = 0. ,double nMax = 0. ,int nPrecision = DBL_DIG ) 458 { 459T * pT = static_cast < T *> (this ); 460BOOL bSuccess = TRUE; 461const int cchBuff = 32 ; 462TCHAR szBuff [cchBuff ]= {}; 463 464if (bSave ) 465 { 466pT -> GetDlgItemText (nID ,szBuff ,cchBuff ); 467double d = 0 ; 468if (_AtlSimpleFloatParse (szBuff ,d )) 469nVal = d ; 470else 471bSuccess = FALSE; 472 } 473else 474 { 475ATLASSERT (!bValidate || ((nVal >=nMin )&& (nVal <=nMax ))); 476_stprintf_s (szBuff ,cchBuff ,_T ("%.*g" ),nPrecision ,nVal ); 477bSuccess = pT -> SetDlgItemText (nID ,szBuff ); 478 } 479 480if (!bSuccess ) 481 { 482pT -> OnDataExchangeError (nID ,bSave ); 483 } 484else if (bSave && bValidate )// validation 485 { 486ATLASSERT (nMin != nMax ); 487if ((nVal < nMin )|| (nVal > nMax )) 488 { 489_XData data = {ddxDataFloat }; 490data .floatData .nVal = nVal ; 491data .floatData .nMin = nMin ; 492data .floatData .nMax = nMax ; 493pT -> OnDataValidateError (nID ,bSave ,data ); 494bSuccess = FALSE; 495 } 496 } 497return bSuccess ; 498 } 499 500// Full control subclassing (for CWindowImpl derived controls) 501template < class TControl > 502void DDX_Control (UINT nID ,TControl & ctrl ,BOOL bSave ) 503 { 504if (!bSave && (ctrl .m_hWnd == NULL )) 505 { 506T * pT = static_cast < T *> (this ); 507ctrl .SubclassWindow (pT -> GetDlgItem (nID )); 508 } 509 } 510 511// Simple control attaching (for HWND wrapper controls) 512template < class TControl > 513void DDX_Control_Handle (UINT nID ,TControl & ctrl ,BOOL bSave ) 514 { 515if (!bSave && (ctrl .m_hWnd == NULL )) 516 { 517T * pT = static_cast < T *> (this ); 518ctrl = pT -> GetDlgItem (nID ); 519 } 520 } 521 522// Control state 523void DDX_Check (UINT nID ,int & nValue ,BOOL bSave ) 524 { 525T * pT = static_cast < T *> (this ); 526HWND hWndCtrl = pT -> GetDlgItem (nID ); 527if (bSave ) 528 { 529nValue = (int )::SendMessage (hWndCtrl ,BM_GETCHECK ,0 ,0L ); 530ATLASSERT ((nValue >=0 )&& (nValue <=2 )); 531 } 532else 533 { 534if ((nValue < 0 )|| (nValue > 2 )) 535 { 536ATLTRACE2 (atlTraceUI ,0 ,_T ("ATL: Warning - dialog data checkbox value (%d) out of range.\n" ),nValue ); 537nValue = 0 ;// default to off 538 } 539 ::SendMessage (hWndCtrl ,BM_SETCHECK ,nValue ,0L ); 540 } 541 } 542 543// variant that supports bool (checked/not-checked, no intermediate state) 544void DDX_Check (UINT nID ,bool & bCheck ,BOOL bSave ) 545 { 546int nValue = bCheck ?1 :0 ; 547DDX_Check (nID ,nValue ,bSave ); 548 549if (bSave ) 550 { 551if (nValue == 2 ) 552ATLTRACE2 (atlTraceUI ,0 ,_T ("ATL: Warning - checkbox state (%d) out of supported range.\n" ),nValue ); 553bCheck = (nValue == 1 ); 554 } 555 } 556 557void DDX_Radio (UINT nID ,int & nValue ,BOOL bSave ) 558 { 559T * pT = static_cast < T *> (this ); 560HWND hWndCtrl = pT -> GetDlgItem (nID ); 561ATLASSERT (hWndCtrl != NULL ); 562 563// must be first in a group of auto radio buttons 564ATLASSERT (::GetWindowLong (hWndCtrl ,GWL_STYLE )& WS_GROUP ); 565ATLASSERT (::SendMessage (hWndCtrl ,WM_GETDLGCODE ,0 ,0L )& DLGC_RADIOBUTTON ); 566 567if (bSave ) 568nValue = -1 ;// value if none found 569 570// walk all children in group 571int nButton = 0 ; 572do 573 { 574if (::SendMessage (hWndCtrl ,WM_GETDLGCODE ,0 ,0L )& DLGC_RADIOBUTTON ) 575 { 576// control in group is a radio button 577if (bSave ) 578 { 579if (::SendMessage (hWndCtrl ,BM_GETCHECK ,0 ,0L )!= 0 ) 580 { 581ATLASSERT (nValue == -1 );// only set once 582nValue = nButton ; 583 } 584 } 585else 586 { 587// select button 588 ::SendMessage (hWndCtrl ,BM_SETCHECK , (nButton == nValue ),0L ); 589 } 590nButton ++ ; 591 } 592else 593 { 594ATLTRACE2 (atlTraceUI ,0 ,_T ("ATL: Warning - skipping non-radio button in group.\n" )); 595 } 596hWndCtrl = ::GetWindow (hWndCtrl ,GW_HWNDNEXT ); 597 } 598while ((hWndCtrl != NULL )&& !(GetWindowLong (hWndCtrl ,GWL_STYLE )& WS_GROUP )); 599 } 600 601// DDX support for Tab, Combo, ListBox and ListView selection index 602template < class TCtrl > 603INT _getSel (TCtrl & tCtrl ) 604 { 605return tCtrl .GetCurSel (); 606 } 607 608template < class TCtrl > 609void _setSel (TCtrl & tCtrl ,INT iSel ) 610 { 611if (iSel < 0 ) 612tCtrl .SetCurSel (-1 ); 613else 614tCtrl .SetCurSel (iSel ); 615 } 616 617#ifdef __ATLCTRLS_H__ 618// ListViewCtrl specialization 619template <> 620INT _getSel (WTL ::CListViewCtrl & tCtrl ) 621 { 622return tCtrl .GetSelectedIndex (); 623 } 624 625template <> 626void _setSel (WTL ::CListViewCtrl & tCtrl ,INT iSel ) 627 { 628if (iSel < 0 ) 629tCtrl .SelectItem (-1 ); 630else 631tCtrl .SelectItem (iSel ); 632 } 633#endif // __ATLCTRLS_H__ 634 635template < class TCtrl > 636void DDX_Index (UINT nID ,INT & nVal ,BOOL bSave ) 637 { 638T * pT = static_cast < T *> (this ); 639TCtrl ctrl (pT -> GetDlgItem (nID )); 640 641if (bSave ) 642nVal = _getSel (ctrl ); 643else 644_setSel (ctrl ,nVal ); 645 } 646 647// Overrideables 648void OnDataExchangeError (UINT nCtrlID ,BOOL /*bSave*/ ) 649 { 650// Override to display an error message 651 ::MessageBeep ((UINT )- 1 ); 652T * pT = static_cast < T *> (this ); 653 ::SetFocus (pT -> GetDlgItem (nCtrlID )); 654 } 655 656void OnDataValidateError (UINT nCtrlID ,BOOL /*bSave*/ ,_XData & /*data*/ ) 657 { 658// Override to display an error message 659 ::MessageBeep ((UINT )- 1 ); 660T * pT = static_cast < T *> (this ); 661 ::SetFocus (pT -> GetDlgItem (nCtrlID )); 662 } 663}; 664 665}// namespace WTL 666 667#endif // __ATLDDX_H__