CDataAdmin.cpp
上传用户:hhs829
上传日期:2022-06-17
资源大小:586k
文件大小:3k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. // 
  2. // CDataAdmin.cpp
  3. //
  4. #include "stdafx.h"
  5. #include "CDataAdmin.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. ///////////////////////////////////////////////////////////////////
  12. CDataAdmin::CDataAdmin()
  13. {
  14. m_bFlushing = false;
  15. // Allocate buffers
  16. m_pMutex = new CMutex(FALSE, NULL);
  17. for (int i = 0; i < PACK_TOTAL_COUNT; i++)
  18. PoolList.AddTail(new MPEG1_PACK); 
  19. // Initialize thread event
  20. m_hBufEnough = ::CreateEvent(NULL,    // pointer to security attributes 
  21.      TRUE,      // flag for manual-reset event 
  22. FALSE,     // flag for initial state 
  23. NULL);     // pointer to event-object name
  24. }
  25. CDataAdmin::~CDataAdmin()
  26. {
  27. // Free data buffers
  28. PMPEG1_PACK  pData;
  29. POSITION pos = DataList.GetHeadPosition();
  30. while (pos)
  31. {
  32. pData = (PMPEG1_PACK) DataList.GetNext(pos);
  33. delete pData;
  34. }
  35. pos = PoolList.GetHeadPosition();
  36.     while (pos)
  37. {
  38. pData = (PMPEG1_PACK) PoolList.GetNext(pos);
  39. delete pData;
  40. }
  41. PoolList.RemoveAll();
  42. DataList.RemoveAll();
  43. // Free mutex memory
  44. if (m_pMutex != NULL)
  45. {
  46. delete m_pMutex;
  47. m_pMutex = NULL;
  48. }
  49. if (m_hBufEnough)
  50. {
  51. CloseHandle(m_hBufEnough);
  52. m_hBufEnough = NULL;
  53. }
  54. }
  55. int CDataAdmin::ResetList(void)
  56. {
  57. // Initialize the buffer pool
  58. CSingleLock lock(m_pMutex);
  59. lock.Lock(1000);
  60. if (lock.IsLocked())
  61. {
  62. while (!DataList.IsEmpty())
  63. {
  64. PoolList.AddTail(DataList.RemoveHead());
  65. }
  66. lock.Unlock();
  67. }
  68. return 1;
  69. }
  70. int CDataAdmin::GetListSize(void)
  71. {
  72. return (DataList.GetCount() + PoolList.GetCount());
  73. }
  74. // Point to the data list head 
  75. PMPEG1_PACK CDataAdmin::PointToDataHead(void)
  76. {
  77. if (!DataList.IsEmpty())
  78. return DataList.GetHead();
  79. return NULL;
  80. }
  81. // Roll back the data buffer
  82. int CDataAdmin::RollBackDataHead(PMPEG1_PACK pData)
  83. {
  84. PMPEG1_PACK pPack = GetDataBuffer();
  85. if (pPack != NULL)
  86. ReleaseDataBuffer(pPack);
  87. return 1;
  88. }
  89. // Get a data buffer to read from...
  90. PMPEG1_PACK CDataAdmin::GetDataBuffer(void)
  91. {
  92. CSingleLock lock(m_pMutex);
  93. PMPEG1_PACK Result = NULL;
  94. lock.Lock(1000);
  95. if (lock.IsLocked())
  96. {
  97. if (!DataList.IsEmpty())
  98. Result = DataList.RemoveHead();
  99. lock.Unlock();
  100. }
  101. return Result;
  102. }
  103. // Replace the buffer to pool list to receive data...
  104. int CDataAdmin::ReleaseDataBuffer(PMPEG1_PACK pData)
  105. {
  106. CSingleLock lock(m_pMutex);
  107. int         nResult = 0;
  108. lock.Lock(1000);
  109. if (lock.IsLocked())
  110. {
  111. if (pData != NULL)
  112. {
  113. PoolList.AddTail(pData);
  114. nResult = 1;
  115. }
  116. lock.Unlock();
  117. }
  118. return nResult;
  119. }
  120. // Get a pool buffer to receive data...
  121. PMPEG1_PACK CDataAdmin::GetWriteBuffer(void)
  122. {
  123. CSingleLock lock(m_pMutex);
  124. PMPEG1_PACK Result = NULL;
  125. lock.Lock(1000);
  126. if (lock.IsLocked())
  127. {
  128. if (!PoolList.IsEmpty())
  129. Result = PoolList.RemoveHead();
  130. lock.Unlock();
  131. }
  132. return Result;
  133. }
  134. // Place the buffer to data list after receiving data...
  135. int CDataAdmin::ReleaseWriteBuffer(PMPEG1_PACK pData)
  136. {
  137. CSingleLock lock(m_pMutex);
  138. int         nResult = 0;
  139. lock.Lock(1000);
  140. if (lock.IsLocked())
  141. {
  142. if (pData != NULL)
  143. {
  144. DataList.AddTail(pData);
  145. nResult = 1;
  146. }
  147. lock.Unlock();
  148. }
  149. return nResult;
  150. }
  151. // If no more data available, waiting...
  152. DWORD CDataAdmin::WaitForNext(DWORD  inTimeOut)
  153. {
  154. return ::WaitForSingleObject(m_hBufEnough, inTimeOut);
  155. }
  156. void CDataAdmin::SetFlushing(bool inFlush)
  157. {
  158. m_bFlushing = inFlush;
  159. }
  160. bool CDataAdmin::IsFlushing(void)
  161. {
  162. return m_bFlushing;
  163. }