Advertisement
HYROLEAN

BonD_FSHybrid-20201009_mod10_to_BonD_FSHybrid-20201009_mod10.1.CP932.patch.diff

Aug 11th, 2022 (edited)
458
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 22.47 KB | None | 0 0
  1. diff -uPr BonD_FSHybrid-20201009_mod10/readme_mod_FSHybrid.txt BonD_FSHybrid-20201009_mod10.1/readme_mod_FSHybrid.txt
  2. --- BonD_FSHybrid-20201009_mod10/readme_mod_FSHybrid.txt    2022-05-03 14:52:34.000000000 +0900
  3. +++ BonD_FSHybrid-20201009_mod10.1/readme_mod_FSHybrid.txt  2022-08-11 13:28:35.000000000 +0900
  4. @@ -1,4 +1,4 @@
  5. -BonDriver_FSHybrid.dll MOD @ 2022/5/3
  6. +BonDriver_FSHybrid.dll MOD @ 2022/8/11
  7.  
  8.  ■KEIAN/Digibest系3つの機能を同時に有するハイブリッド型BonDriver.dll
  9.  
  10. @@ -34,6 +34,11 @@
  11.  
  12.  ■更新履歴
  13.  
  14. +2022/5/3 からの変更点
  15. +
  16. +  ・アイソクロナス転送有効時に、チャンネルを切り替えたあとに稀にストリームが
  17. +    ストール(停止)することのある現象を修正
  18. +
  19.  2021/12/7 からの変更点
  20.  
  21.    ・各々のBonDriverをIBonTransponderインターフェイスに対応
  22. diff -uPr BonD_FSHybrid-20201009_mod10/src/BonDriver_FSHybrid/BonDriver.rc BonD_FSHybrid-20201009_mod10.1/src/BonDriver_FSHybrid/BonDriver.rc
  23. --- BonD_FSHybrid-20201009_mod10/src/BonDriver_FSHybrid/BonDriver.rc    2022-05-03 14:49:07.000000000 +0900
  24. +++ BonD_FSHybrid-20201009_mod10.1/src/BonDriver_FSHybrid/BonDriver.rc  2022-08-11 13:28:36.000000000 +0900
  25. @@ -2,8 +2,8 @@
  26.  
  27.  LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
  28.  1 VERSIONINFO
  29. - FILEVERSION 0,2022,5,3
  30. - PRODUCTVERSION 0,2022,5,3
  31. + FILEVERSION 0,2022,8,11
  32. + PRODUCTVERSION 0,2022,8,11
  33.   FILEFLAGSMASK 0x17L
  34.  #ifdef _DEBUG
  35.   FILEFLAGS 0x1L
  36. @@ -19,7 +19,7 @@
  37.          BLOCK "041104b0"
  38.          BEGIN
  39.              VALUE "CompanyName", "hyrolean-dtv inspired by trinity19683"
  40. -            VALUE "FileVersion", "0,2022,5,3"
  41. +            VALUE "FileVersion", "0,2022,8,11"
  42.  #ifdef INCLUDE_ISOCH_XFER
  43.              VALUE "FileDescription", "Hybrid BonDriver for FSUSB2N/FSUSB2i/uSUNpTV (isoch support)"
  44.              VALUE "InternalName", "BonDriver_FSHybrid_isoch.dll"
  45. @@ -32,7 +32,7 @@
  46.              VALUE "ProductName", "BonDriver_FSHybrid"
  47.  #endif
  48.              VALUE "LegalCopyright", "hyrolean-dtv 2019-2022 inspired by trinity19683 2015-2016"
  49. -            VALUE "ProductVersion", "0,2022,5,3"
  50. +            VALUE "ProductVersion", "0,2022,8,11"
  51.          END
  52.      END
  53.      BLOCK "VarFileInfo"
  54. diff -uPr BonD_FSHybrid-20201009_mod10/src/BonDriver_FSUSB2N/BonDriver.rc BonD_FSHybrid-20201009_mod10.1/src/BonDriver_FSUSB2N/BonDriver.rc
  55. --- BonD_FSHybrid-20201009_mod10/src/BonDriver_FSUSB2N/BonDriver.rc 2022-05-03 14:49:07.000000000 +0900
  56. +++ BonD_FSHybrid-20201009_mod10.1/src/BonDriver_FSUSB2N/BonDriver.rc   2022-08-11 13:28:36.000000000 +0900
  57. @@ -4,8 +4,8 @@
  58.  
  59.  LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
  60.  1 VERSIONINFO
  61. - FILEVERSION 0,2022,5,3
  62. - PRODUCTVERSION 0,2022,5,3
  63. + FILEVERSION 0,2022,8,11
  64. + PRODUCTVERSION 0,2022,8,11
  65.   FILEFLAGSMASK 0x17L
  66.  #ifdef _DEBUG
  67.   FILEFLAGS 0x1L
  68. @@ -21,7 +21,7 @@
  69.          BLOCK "041104b0"
  70.          BEGIN
  71.              VALUE "CompanyName", "hyrolean-dtv inspired by WPjeGg6tSA"
  72. -            VALUE "FileVersion", "0,2022,5,3"
  73. +            VALUE "FileVersion", "0,2022,8,11"
  74.  #ifdef INCLUDE_ISOCH_XFER
  75.              VALUE "FileDescription", "BonDriver for FSUSB2N (isoch support)"
  76.              VALUE "InternalName", "BonDriver_FSUSB2N_isoch.dll"
  77. @@ -34,7 +34,7 @@
  78.              VALUE "ProductName", "BonDriver_FSUSB2N"
  79.  #endif
  80.              VALUE "LegalCopyright", "hyrolean-dtv 2014-2022 inspired by WPjeGg6tSA 2009-2012"
  81. -            VALUE "ProductVersion", "0,2022,5,3"
  82. +            VALUE "ProductVersion", "0,2022,8,11"
  83.          END
  84.      END
  85.      BLOCK "VarFileInfo"
  86. diff -uPr BonD_FSHybrid-20201009_mod10/src/BonDriver_FSUSB2i/BonDriver.rc BonD_FSHybrid-20201009_mod10.1/src/BonDriver_FSUSB2i/BonDriver.rc
  87. --- BonD_FSHybrid-20201009_mod10/src/BonDriver_FSUSB2i/BonDriver.rc 2022-05-03 14:49:07.000000000 +0900
  88. +++ BonD_FSHybrid-20201009_mod10.1/src/BonDriver_FSUSB2i/BonDriver.rc   2022-08-11 13:28:36.000000000 +0900
  89. @@ -2,8 +2,8 @@
  90.  
  91.  LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
  92.  1 VERSIONINFO
  93. - FILEVERSION 0,2022,5,3
  94. - PRODUCTVERSION 0,2022,5,3
  95. + FILEVERSION 0,2022,8,11
  96. + PRODUCTVERSION 0,2022,8,11
  97.   FILEFLAGSMASK 0x17L
  98.  #ifdef _DEBUG
  99.   FILEFLAGS 0x1L
  100. @@ -20,12 +20,12 @@
  101.          BEGIN
  102.              VALUE "CompanyName", "hyrolean-dtv inspired by trinity19683"
  103.              VALUE "FileDescription", "BonDriver for FSUSB2i"
  104. -            VALUE "FileVersion", "0,2022,5,3"
  105. +            VALUE "FileVersion", "0,2022,8,11"
  106.              VALUE "InternalName", "BonDriver_FSUSB2i.dll"
  107.              VALUE "LegalCopyright", "hyrolean-dtv 2018-2022 inspired by trinity19683 2015-2016"
  108.              VALUE "OriginalFilename", "BonDriver_FSUSB2i.dll"
  109.              VALUE "ProductName", "BonDriver_FSUSB2i"
  110. -            VALUE "ProductVersion", "0,2022,5,3"
  111. +            VALUE "ProductVersion", "0,2022,8,11"
  112.          END
  113.      END
  114.      BLOCK "VarFileInfo"
  115. diff -uPr BonD_FSHybrid-20201009_mod10/src/BonDriver_uSUNpTV/BonDriver.rc BonD_FSHybrid-20201009_mod10.1/src/BonDriver_uSUNpTV/BonDriver.rc
  116. --- BonD_FSHybrid-20201009_mod10/src/BonDriver_uSUNpTV/BonDriver.rc 2022-05-03 14:49:08.000000000 +0900
  117. +++ BonD_FSHybrid-20201009_mod10.1/src/BonDriver_uSUNpTV/BonDriver.rc   2022-08-11 13:28:36.000000000 +0900
  118. @@ -2,8 +2,8 @@
  119.  
  120.  LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
  121.  1 VERSIONINFO
  122. - FILEVERSION 0,2022,5,3
  123. - PRODUCTVERSION 0,2022,5,3
  124. + FILEVERSION 0,2022,8,11
  125. + PRODUCTVERSION 0,2022,8,11
  126.   FILEFLAGSMASK 0x17L
  127.  #ifdef _DEBUG
  128.   FILEFLAGS 0x1L
  129. @@ -19,7 +19,7 @@
  130.          BLOCK "041104b0"
  131.          BEGIN
  132.              VALUE "CompanyName", "hyrolean-dtv inspired by trinity19683"
  133. -            VALUE "FileVersion", "0,2022,5,3"
  134. +            VALUE "FileVersion", "0,2022,8,11"
  135.  #ifdef INCLUDE_ISOCH_XFER
  136.              VALUE "FileDescription", "BonDriver for uSUNpTV (isoch support)"
  137.              VALUE "InternalName", "BonDriver_uSUNpTV_isoch.dll"
  138. @@ -32,7 +32,7 @@
  139.              VALUE "ProductName", "BonDriver_uSUNpTV"
  140.  #endif
  141.              VALUE "LegalCopyright", "hyrolean-dtv 2019-2022 inspired by trinity19683 2016"
  142. -            VALUE "ProductVersion", "0,2022,5,3"
  143. +            VALUE "ProductVersion", "0,2022,8,11"
  144.          END
  145.      END
  146.      BLOCK "VarFileInfo"
  147. diff -uPr BonD_FSHybrid-20201009_mod10/src/tsthread.c BonD_FSHybrid-20201009_mod10.1/src/tsthread.c
  148. --- BonD_FSHybrid-20201009_mod10/src/tsthread.c 2022-05-03 14:57:52.000000000 +0900
  149. +++ BonD_FSHybrid-20201009_mod10.1/src/tsthread.c   2022-08-11 13:39:37.000000000 +0900
  150. @@ -16,6 +16,7 @@
  151.  #include "tsbuff.h"
  152.  #include "tsthread.h"
  153.  
  154. +
  155.  #define STRICTLY_CHECK_EVENT_SIGNALS
  156.  //#<OFF>#define STRICTLY_CHECK_EMPTY_FRAMES
  157.  //#<OFF>#define STRICTLY_CHECK_EMPTY_FRAMES_ALL
  158. @@ -46,6 +47,7 @@
  159.  DWORD USBPIPEPOLICY_PIPE_TRANSFER_TIMEOUT = 5000UL ;
  160.  BOOL USBPIPEPOLICY_RESET_PIPE_ON_RESUME = FALSE ;
  161.  
  162. +#define ISOCH_IO_INDEX_DROP_MASK 0x40000000
  163.  
  164.  struct TSIO_CONTEXT {
  165.  #ifdef INCLUDE_ISOCH_XFER
  166. @@ -60,8 +62,8 @@
  167.     HANDLE hThreads[2];    //# handles to thread data
  168.     unsigned char loop_flags ; //# ( 1: reap, 2: submit, 3: both ) <<2: init
  169.     unsigned char volatile  flags;
  170. -   /* if 0x01 flagged, issue a new request.
  171. -      if 0x02 flagged, cancel requests and stop thread.
  172. +   /* if 0x01U flagged, issue a new request.
  173. +      if 0x02U flagged, cancel requests and stop thread.
  174.     */
  175.     const struct usb_endpoint_st*  pUSB;
  176.     char* buffer;    //# data buffer (in heap memory)
  177. @@ -95,7 +97,7 @@
  178.  };
  179.  
  180.    static int __inline isCritical(struct tsthread_param* const ps) {
  181. -   return !(ps->flags & 0x01)||HasSignal(ps->hTsRestart) ;
  182. +   return !(ps->flags & 0x01U)||HasSignal(ps->hTsRestart) ;
  183.    }
  184.  
  185.    static void __inline lockWinUsb(struct tsthread_param* const ps,int lock) {
  186. @@ -137,8 +139,19 @@
  187.             ps->ri = ps->si ;
  188.  
  189.         }
  190. -   }
  191.  
  192. +   }else { //# Isochronous
  193. +
  194. +       if(ps->total_submit>0) {
  195. +           for (i = 0;i < ps->io_num;i++) {
  196. +               struct TSIO_CONTEXT* pContext = &ps->ioContext[i];
  197. +               if(pContext->index>=0) {
  198. +                   pContext->index |= ISOCH_IO_INDEX_DROP_MASK ;
  199. +               }
  200. +           }
  201. +       }
  202. +
  203. +   }
  204.  
  205.     #if 1
  206.     if(ps->tsfifo) {
  207. @@ -158,7 +171,7 @@
  208.     #endif
  209.  
  210.     WinUsb_FlushPipe(ps->pUSB->fd, ps->pUSB->endpoint & 0xFF);
  211. -   ps->flags &= ~0x10; //# reset isochronous continuous status
  212. +   ps->flags &= ~0x10U; //# reset isochronous continuous status
  213.  
  214.     lockWinUsb(ps,0);
  215.     LeaveCriticalSection(&ps->csTsExclusive);
  216. @@ -220,19 +233,19 @@
  217.     assert( !isWBack || (isWBack && !hasWThrough) ) ;
  218.  
  219.     //# bulk loop
  220. -   while(!(ps->flags&0x02)) {
  221. +   while(!(ps->flags&0x02U)) {
  222.  
  223.  #ifndef INCLUDE_ISOCH_XFER
  224.         //# shutdown ( isoch is not supported )
  225.         if (ps->pUSB->endpoint & 0x100) { //# Isochronous
  226. -           if(ps->flags & 0x01) {
  227. +           if(ps->flags & 0x01U) {
  228.                 tsthread_stop(ps);
  229.                 continue ;
  230.             }
  231.         }
  232.  #endif
  233.         //# stop
  234. -       if (!(ps->flags & 0x01)) {
  235. +       if (!(ps->flags & 0x01U)) {
  236.             EnterCriticalSection(&ps->csTsExclusive);
  237.             ps->loop_flags |= loop_model ;  //# loop deactivate 0 -> 1
  238.             if((ps->loop_flags&3)==3) {
  239. @@ -246,28 +259,35 @@
  240.  
  241.         //# restart
  242.         if(HasSignal(ps->hTsRestart)) {
  243. +           BOOL wait = FALSE ;
  244.             EnterCriticalSection(&ps->csTsExclusive);
  245. -           ps->loop_flags |= loop_model ;  //# loop deactivate 0 -> 1
  246. -           if((loop_model&2)&&(ps->loop_flags&3)==3) {
  247. -               tsthread_purgeURB(ps) ;
  248. -               ResetEvent(ps->hTsRestart) ;
  249. -               SetEvent(ps->hTsAvailable) ;
  250. -               LeaveCriticalSection(&ps->csTsExclusive);
  251. -           }else {
  252. -               LeaveCriticalSection(&ps->csTsExclusive);
  253. -               HRWaitForSingleObject(ps->hTsAvailable, TSTHREAD_POLL_TIMEOUT,0) ;
  254. +           if(ps->flags & 0x01U) {
  255. +               ps->loop_flags |= loop_model ;  //# loop deactivate 0 -> 1
  256. +               if((loop_model&2)&&(ps->loop_flags&3)==3) {
  257. +                   tsthread_purgeURB(ps) ;
  258. +                   ResetEvent(ps->hTsRestart) ;
  259. +                   SetEvent(ps->hTsAvailable) ;
  260. +               }else
  261. +                   wait = TRUE ;
  262.             }
  263. +           LeaveCriticalSection(&ps->csTsExclusive);
  264. +           if(wait) HRWaitForSingleObject(ps->hTsAvailable, TSTHREAD_POLL_TIMEOUT,0) ;
  265.             continue;
  266.         }else if(ps->loop_flags&loop_model) {
  267. +           BOOL sig = TRUE ;
  268.             EnterCriticalSection(&ps->csTsExclusive);
  269. -           ps->loop_flags &= ~loop_model ; //# loop activate 1 -> 0
  270. +           if(ps->flags & 0x01U) {
  271. +               sig = HasSignal(ps->hTsRestart) ;
  272. +               if(!sig) ps->loop_flags &= ~loop_model ; //# loop activate 1 -> 0
  273. +           }
  274.             LeaveCriticalSection(&ps->csTsExclusive);
  275. +           if(sig) continue;
  276.         }
  277.  
  278.         //# reaping loop model
  279.         if( loop_model&1 ) {
  280.  
  281. -           if(duplex && ps->total_submit<(ps->flags&0x10?ps->io_limit:MIN_IOLIMIT)) {
  282. +           if(duplex && ps->total_submit<(ps->flags&0x10U?ps->io_limit:MIN_IOLIMIT)) {
  283.                 HANDLE events[2];
  284.                 events[0]=ps->hTsSubmit;
  285.                 events[1]=ps->hTsRestart ;
  286. @@ -375,12 +395,14 @@
  287.                             {
  288.                                 //# failed
  289.                                 bytesRead = 0;
  290. -                               //ps->flags &= ~0x10;
  291. +                               ps->flags &= ~0x10U;
  292.                                 warn_msg(dRet, "reapURB%u failed", ps->ri);
  293.                             }
  294.                         }
  295.                         if(pContext->index>=0) {
  296.                             if (ps->pUSB->endpoint & 0x100) {
  297. +                               BOOL drop = (pContext->index & ISOCH_IO_INDEX_DROP_MASK) ? TRUE : FALSE ;
  298. +                               if(drop) pContext->index &= ~ISOCH_IO_INDEX_DROP_MASK ;
  299.  #ifdef INCLUDE_ISOCH_XFER
  300.                                 EnterCriticalSection(&ps->csTsExclusive) ;
  301.                                 if(hasWThrough && pContext->index==ps->buff_pop) {
  302. @@ -400,7 +422,7 @@
  303.                                         if(n&&sz==ps->buff_unitSize)
  304.                                             amount+=sz ;
  305.                                         else {
  306. -                                           if(amount+sz>0)
  307. +                                           if(amount+sz>0 && !drop)
  308.                                                 pTSFifo->writeThrough(p, amount+sz, pTSFifo->arg) ;
  309.                                             p+=amount+ps->buff_unitSize, amount=0 ;
  310.                                         }
  311. @@ -426,55 +448,59 @@
  312.                                 }else {
  313.                                     LeaveCriticalSection(&ps->csTsExclusive) ;
  314.  #if defined(_WIN32) && !defined(_WIN64)
  315. -
  316. -                                   int stride = (char*) &pContext->isochFrameDesc[1]
  317. -                                       - (char*) &pContext->isochFrameDesc[0] ;
  318. -                                   void* sp_ = &pContext->isochFrameDesc[0].Length ;
  319. -                                   void* dp_ = &ps->actual_length[pContext->index] ;
  320. -                                   int dx_ = (char*) &pContext->isochFrameDesc[0].Status
  321. -                                       - (char*) &pContext->isochFrameDesc[0].Length ;
  322. -                                   int errors = 0 ;
  323. -                                   _asm {
  324. -                                       mov ecx, frames
  325. -                                       mov edi, dp_
  326. -                                       cld
  327. -                                       cmp bRet, 0
  328. -                                       je lb3
  329. -                                       xor ebx, ebx
  330. -                                       mov esi, sp_
  331. -                                       mov eax, stride
  332. -                                       mov edx, dx_
  333. -                                   lb1:
  334. -                                       cmp dword ptr [esi+edx], 0
  335. -                                       jne lb2
  336. -                                       movsd
  337. -                                       lea esi, [esi+eax-4]
  338. -                                       dec ecx
  339. -                                       jnz lb1
  340. -                                       jmp lb4
  341. -                                   lb2:
  342. -                                       mov dword ptr [edi], 0
  343. -                                       lea edi, [edi+4]
  344. -                                       lea esi, [esi+eax]
  345. -                                       inc ebx
  346. -                                       dec ecx
  347. -                                       jnz lb1
  348. -                                       jmp lb4
  349. -                                   lb3:
  350. -                                       mov ebx, ecx
  351. -                                       xor eax, eax
  352. -                                       rep stosd
  353. -                                   lb4:
  354. -                                       mov errors, ebx
  355. +                                   if(drop) {
  356. +                                       register int *pLen = &ps->actual_length[pContext->index];
  357. +                                       __stosd(pLen,0,frames);
  358. +                                   }else {
  359. +                                       int stride = (char*) &pContext->isochFrameDesc[1]
  360. +                                           - (char*) &pContext->isochFrameDesc[0] ;
  361. +                                       void* sp_ = &pContext->isochFrameDesc[0].Length ;
  362. +                                       void* dp_ = &ps->actual_length[pContext->index] ;
  363. +                                       int dx_ = (char*) &pContext->isochFrameDesc[0].Status
  364. +                                           - (char*) &pContext->isochFrameDesc[0].Length ;
  365. +                                       int errors = 0 ;
  366. +                                       _asm {
  367. +                                           mov ecx, frames
  368. +                                           mov edi, dp_
  369. +                                           cld
  370. +                                           cmp bRet, 0
  371. +                                           je lb3
  372. +                                           xor ebx, ebx
  373. +                                           mov esi, sp_
  374. +                                           mov eax, stride
  375. +                                           mov edx, dx_
  376. +                                       lb1:
  377. +                                           cmp dword ptr [esi+edx], 0
  378. +                                           jne lb2
  379. +                                           movsd
  380. +                                           lea esi, [esi+eax-4]
  381. +                                           dec ecx
  382. +                                           jnz lb1
  383. +                                           jmp lb4
  384. +                                       lb2:
  385. +                                           mov dword ptr [edi], 0
  386. +                                           lea edi, [edi+4]
  387. +                                           lea esi, [esi+eax]
  388. +                                           inc ebx
  389. +                                           dec ecx
  390. +                                           jnz lb1
  391. +                                           jmp lb4
  392. +                                       lb3:
  393. +                                           mov ebx, ecx
  394. +                                           xor eax, eax
  395. +                                           rep stosd
  396. +                                       lb4:
  397. +                                           mov errors, ebx
  398. +                                       }
  399. +                                       if(errors>0)
  400. +                                           warn_msg(dRet, "reapURB%u(%u)",ps->ri, errors);
  401.                                     }
  402. -                                   if(errors>0)
  403. -                                       warn_msg(dRet, "reapURB%u(%u)",ps->ri, errors);
  404.  #else
  405.                                     register int n,*pLen = &ps->actual_length[pContext->index];
  406.                                     register const USBD_ISO_PACKET_DESCRIPTOR *pDesc=&pContext->isochFrameDesc[frames-1];
  407. -                                   if(!bRet) {
  408. +                                   if(!bRet||drop) {
  409.                                         __stosd(pLen,0,frames);
  410. -                                       warn_msg(dRet, "reapURB%u(%u)",ps->ri, frames);
  411. +                                       if(!drop) warn_msg(dRet, "reapURB%u(%u)",ps->ri, frames);
  412.                                     }
  413.                                     else for (n = frames ; n ; n--, pDesc--) {
  414.                                         if (pDesc->Status) {
  415. @@ -486,7 +512,7 @@
  416.                                     }
  417.  #endif
  418.                                 }
  419. -                               if(bRet) SetEvent(ps->hTsAvailable) ;
  420. +                               if(bRet&&!drop) SetEvent(ps->hTsAvailable) ;
  421.  #endif
  422.                             }else {
  423.                                 if (isWBack)
  424. @@ -540,7 +566,7 @@
  425.         //# submitting loop model
  426.         if( loop_model&2 ) {
  427.  
  428. -           if( duplex && ps->total_submit>=(ps->flags&0x10?ps->io_num:MIN_IOLIMIT) ) {
  429. +           if( duplex && ps->total_submit>=(ps->flags&0x10U?ps->io_num:MIN_IOLIMIT) ) {
  430.                 HANDLE events[2];
  431.                 events[0]=ps->hTsReap;
  432.                 events[1]=ps->hTsRestart ;
  433. @@ -553,9 +579,9 @@
  434.             if (HasSignal(ps->hTsRestart)) continue;
  435.  
  436.             //# submit
  437. -           if( ps->total_submit<ps->io_num && (ps->flags & 0x01) ) {
  438. +           if( ps->total_submit<ps->io_num && (ps->flags & 0x01U) ) {
  439.                 DWORD tick = GetTickCount() ;
  440. -               int fulfill = duplex || !(ps->flags&0x10) ;
  441. +               int fulfill = duplex || !(ps->flags&0x10U) ;
  442.                 void *buffer;
  443.                 DWORD lnTransfered;
  444.                 int num_empties=0,max_empties=ps->io_num;
  445. @@ -662,14 +688,14 @@
  446.                     if(isCritical(ps)) {
  447.                         bRet=FALSE ;
  448.                         dRet=ERROR_OPERATION_ABORTED ;
  449. -                   }else{
  450. +                   }else {
  451.                         if (ps->pUSB->endpoint & 0x100) { //# Isochronous
  452.  #ifdef INCLUDE_ISOCH_XFER
  453.                             bRet = WinUsb_ReadIsochPipeAsap(
  454.                                 ps->hIsochBuffer,
  455.                                 ps->buff_push * ps->buff_unitSize, /*offset*/
  456.                                 frames * ps->buff_unitSize,  /*length*/
  457. -                               ps->flags & 0x10 ? TRUE: FALSE, /*continuous*/
  458. +                               ps->flags & 0x10U ? TRUE: FALSE, /*continuous*/
  459.                                 frames, pContext->isochFrameDesc,
  460.                                 &(pContext->ol));
  461.                             dRet = GetLastError();
  462. @@ -691,7 +717,7 @@
  463.                             ps->actual_length[ps->buff_push] = last_state;
  464.                         ResetEvent(ps->hTsEvents[ps->si]);
  465.                         pContext->index = -1;
  466. -                       if(ps->flags&0x10) ps->flags &= ~0x10; //# not cont
  467. +                       if(ps->flags&0x10U) ps->flags &= ~0x10U; //# not cont
  468.                     }else {
  469.                         //# submitting succeeded
  470.                         if(!isWBack) {
  471. @@ -726,7 +752,7 @@
  472.                         if(duplex) LeaveCriticalSection(&ps->csTsExclusive) ;
  473.                         SetEvent(ps->hTsSubmit) ;
  474.                         submitted=TRUE;
  475. -                       if(!(ps->flags&0x10)) ps->flags |= 0x10; //# cont
  476. +                       if(!(ps->flags&0x10U)) ps->flags |= 0x10U; //# cont
  477.                     }
  478.                     //# check submitting failed or not
  479.                     if(!submitted) break ;
  480. @@ -847,7 +873,7 @@
  481.             ps->tsfifo = NULL ;
  482.     }
  483.     ps->pUSB = pusbep;
  484. -   ps->flags = 0;
  485. +   ps->flags = 0x00U;
  486.     ps->buff_push = 0;
  487.     ps->buff_pop = 0;
  488.     ps->total_submit = 0;
  489. @@ -855,8 +881,20 @@
  490.     ps->si = 0;
  491.  #ifdef INCLUDE_ISOCH_XFER
  492.     ps->hIsochBuffer = NULL;
  493. -   if (pusbep->endpoint & 0x100)
  494. +   if (pusbep->endpoint & 0x100) { //# Isochronous
  495.         DBGOUT("-*- ISOCHRONOUS TRANSFER MODE -*-\n") ;
  496. +       if (!WinUsb_RegisterIsochBuffer(ps->pUSB->fd, ps->pUSB->endpoint & 0xFF,
  497. +           ps->buffer, ps->buff_size, &(ps->hIsochBuffer))) {
  498. +           DWORD dwRet = GetLastError();
  499. +           ps->hIsochBuffer = NULL;
  500. +           warn_info(dwRet, "WinUsb_RegisterIsochBuffer failed");
  501. +           DBGOUT("-*- Isoch Buffer Creation Failed -*-\n") ;
  502. +       }else {
  503. +           DBGOUT(
  504. +               "Isoch buffer size = %d (unit size = %d, unit num = %d)\n",
  505. +               ps->buff_size, ps->buff_unitSize, ps->buff_num);
  506. +       }
  507. +   }
  508.  #else
  509.     if (pusbep->endpoint & 0x100) { //# Isochronous
  510.         warn_msg(0, "Please change to BULK transfer mode :-P");
  511. @@ -944,77 +982,69 @@
  512.  void tsthread_destroy(const tsthread_ptr ptr)
  513.  {
  514.     int i;
  515. -   struct tsthread_param* const p = ptr;
  516. +   struct tsthread_param* const ps = ptr;
  517.  
  518.     tsthread_stop(ptr);
  519. -   p->flags |= 0x02;    //# canceled = T
  520. -   SetEvent(p->hTsRead);
  521. -   SetEvent(p->hTsAvailable);
  522. -   SetEvent(p->hTsReap);
  523. -   SetEvent(p->hTsSubmit);
  524. +   ps->flags |= 0x02U;    //# canceled = T
  525. +   SetEvent(ps->hTsRead);
  526. +   SetEvent(ps->hTsAvailable);
  527. +   SetEvent(ps->hTsReap);
  528. +   SetEvent(ps->hTsSubmit);
  529.     for(i=0;i<2;i++) {
  530. -       if(p->hThreads[i]!=INVALID_HANDLE_VALUE) {
  531. -           if (HRWaitForSingleObject(p->hThreads[i],
  532. +       if(ps->hThreads[i]!=INVALID_HANDLE_VALUE) {
  533. +           if (HRWaitForSingleObject(ps->hThreads[i],
  534.                     USBPIPEPOLICY_PIPE_TRANSFER_TIMEOUT,0) != WAIT_OBJECT_0) {
  535.                 warn_msg(GetLastError(), "tsthread_destroy timeout(%d)",i);
  536. -               TerminateThread(p->hThreads[i], 0);
  537. +               TerminateThread(ps->hThreads[i], 0);
  538.             }
  539. -           CloseHandle(p->hThreads[i]);
  540. +           CloseHandle(ps->hThreads[i]);
  541.         }
  542.     }
  543. -   for (i = 0; i < p->io_num; i++)
  544. -       CloseHandle(p->hTsEvents[i]);
  545. -   CloseHandle(p->hTsAvailable);
  546. -   CloseHandle(p->hTsRead);
  547. -   CloseHandle(p->hTsRestart);
  548. -   CloseHandle(p->hTsStopped);
  549. -   CloseHandle(p->hTsLoopIn);
  550. -   CloseHandle(p->hTsReap);
  551. -   CloseHandle(p->hTsSubmit);
  552. +   for (i = 0; i < ps->io_num; i++)
  553. +       CloseHandle(ps->hTsEvents[i]);
  554. +   CloseHandle(ps->hTsAvailable);
  555. +   CloseHandle(ps->hTsRead);
  556. +   CloseHandle(ps->hTsRestart);
  557. +   CloseHandle(ps->hTsStopped);
  558. +   CloseHandle(ps->hTsLoopIn);
  559. +   CloseHandle(ps->hTsReap);
  560. +   CloseHandle(ps->hTsSubmit);
  561.  #ifdef INCLUDE_ISOCH_XFER
  562. -   if(p->hIsochBuffer) {
  563. -       WinUsb_UnregisterIsochBuffer( p->hIsochBuffer );
  564. -       p->hIsochBuffer = NULL;
  565. +   if(ps->hIsochBuffer) {
  566. +       WinUsb_UnregisterIsochBuffer( ps->hIsochBuffer );
  567. +       ps->hIsochBuffer = NULL;
  568.     }
  569.  #endif
  570. -   DeleteCriticalSection(&p->csTsExclusive);
  571. +   DeleteCriticalSection(&ps->csTsExclusive);
  572.  
  573. -   uHeapFree(p->buffer);
  574. +   uHeapFree(ps->buffer);
  575.  }
  576.  
  577.  void tsthread_start(const tsthread_ptr ptr)
  578.  {
  579.     struct tsthread_param* const ps = ptr;
  580. +   BOOL stopped;
  581.  
  582.     EnterCriticalSection(&ps->csTsExclusive) ;
  583.     lockWinUsb(ps,1);
  584.  
  585. -   WinUsb_FlushPipe(ps->pUSB->fd, ps->pUSB->endpoint & 0xFF);
  586. -   ps->flags &= ~0x10 ; //# reset isochronous continuous status
  587. +   ResetEvent(ps->hTsStopped);
  588. +   ps->flags &= ~0x01U;    //# continue = F
  589.  
  590. -#ifdef INCLUDE_ISOCH_XFER
  591. -   if( (ps->pUSB->endpoint & 0x100) && !ps->hIsochBuffer) { //# Isochronous
  592. -       if (!WinUsb_RegisterIsochBuffer(ps->pUSB->fd, ps->pUSB->endpoint & 0xFF,
  593. -           ps->buffer, ps->buff_size, &(ps->hIsochBuffer))) {
  594. -           DWORD dwRet = GetLastError();
  595. -           ps->hIsochBuffer = NULL;
  596. -           warn_info(dwRet, "WinUsb_RegisterIsochBuffer failed");
  597. -           DBGOUT("-*- Isoch Buffer Creation Failed -*-\n") ;
  598. -       }else {
  599. -           DBGOUT(
  600. -               "Isoch buffer size = %d (unit size = %d, unit num = %d)\n",
  601. -               ps->buff_size, ps->buff_unitSize, ps->buff_num);
  602. -       }
  603. -   }
  604. -#endif
  605. +   lockWinUsb(ps,0);
  606. +   LeaveCriticalSection(&ps->csTsExclusive) ;
  607.  
  608. -   SetEvent(ps->hTsRestart);
  609. +   stopped = HRWaitForSingleObject(ps->hTsStopped,USBPIPEPOLICY_PIPE_TRANSFER_TIMEOUT,0) == WAIT_OBJECT_0 ? TRUE : FALSE ;
  610. +
  611. +   EnterCriticalSection(&ps->csTsExclusive) ;
  612. +   lockWinUsb(ps,1);
  613.  
  614. -   ps->flags |= 0x01;    //# continue = T
  615.     if (ps->pUSB->startstopFunc)
  616.         ps->pUSB->startstopFunc(ps->pUSB->dev, 1);
  617.  
  618. -   SetEvent(ps->hTsAvailable);
  619. +   ps->flags |= 0x01U;    //# continue = T
  620. +   if(!stopped) SetEvent(ps->hTsRestart);
  621. +   else SetEvent(ps->hTsAvailable);
  622.  
  623.     lockWinUsb(ps,0);
  624.     LeaveCriticalSection(&ps->csTsExclusive) ;
  625. @@ -1023,34 +1053,29 @@
  626.  void tsthread_stop(const tsthread_ptr ptr)
  627.  {
  628.     struct tsthread_param* const ps = ptr;
  629. +   BOOL stopped;
  630.  
  631.     EnterCriticalSection(&ps->csTsExclusive) ;
  632. -   lockWinUsb(ps,1);
  633.  
  634.     ResetEvent(ps->hTsStopped);
  635.     ps->flags &= ~0x01U;    //# continue = F
  636.  
  637. -   if(ps->pUSB->startstopFunc)
  638. -       ps->pUSB->startstopFunc(ps->pUSB->dev, 0);
  639. -#ifdef INCLUDE_ISOCH_XFER
  640. -   if(ps->hIsochBuffer) {
  641. -       WinUsb_UnregisterIsochBuffer( ps->hIsochBuffer );
  642. -       ps->hIsochBuffer = NULL;
  643. -   }
  644. -#endif
  645. +   LeaveCriticalSection(&ps->csTsExclusive) ;
  646. +
  647. +   stopped = HRWaitForSingleObject(ps->hTsStopped,USBPIPEPOLICY_PIPE_TRANSFER_TIMEOUT,0) == WAIT_OBJECT_0 ? TRUE : FALSE ;
  648. +
  649. +   EnterCriticalSection(&ps->csTsExclusive) ;
  650. +   lockWinUsb(ps,1);
  651.  
  652. -   if(!(ps->pUSB->endpoint & 0x100) ) { //# Bulk
  653. +   if(!(ps->pUSB->endpoint & 0x100) && stopped) { //# Bulk
  654.         WinUsb_AbortPipe(ps->pUSB->fd, ps->pUSB->endpoint & 0xFF);
  655.     }
  656.  
  657. -   SetEvent(ps->hTsRestart) ;
  658. +   if(ps->pUSB->startstopFunc)
  659. +       ps->pUSB->startstopFunc(ps->pUSB->dev, 0);
  660.  
  661.     lockWinUsb(ps,0);
  662.     LeaveCriticalSection(&ps->csTsExclusive) ;
  663. -
  664. -   if(!(ps->pUSB->endpoint & 0x100) ) { //# Bulk
  665. -       HRWaitForSingleObject(ps->hTsStopped,USBPIPEPOLICY_PIPE_TRANSFER_TIMEOUT,0);
  666. -   }
  667.  }
  668.  
  669.  int tsthread_read(const tsthread_ptr tptr, void ** const ptr)
  670.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement