AV8Buffer.cpp
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:4k
源码类别:

VC书籍

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. // AV8Buffer.cpp
  3. #include "stdafx.h"
  4. #include "AV8Buffer.h"
  5. #include "PlayView.h"
  6. #include "winsock2.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. extern WSABUF stWSABuf;
  13. extern HWND hWnd;
  14. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  15. // CAV8Buffer()
  16. CAV8Buffer::CAV8Buffer(DWORD dwBlock, DWORD dwByte)
  17. {
  18. m_dwBlock = dwBlock;
  19. m_dwByte  = dwByte;
  20. m_pdwIndex  = (DWORD *)malloc(dwBlock * sizeof(DWORD));
  21. m_pdwLength = (DWORD *)malloc(dwBlock * sizeof(DWORD));
  22. m_pbFull    = (BOOL  *)malloc(dwBlock * sizeof(BOOL ));
  23. m_plpArray  = (LPSTR *)malloc(dwBlock * sizeof(LPSTR));
  24. for (DWORD dwIndex = 0; dwIndex < dwBlock; dwIndex++)
  25. {
  26. m_pdwIndex [dwIndex] = dwIndex;
  27. m_pdwLength[dwIndex] = 0;
  28. m_pbFull   [dwIndex] = FALSE;
  29. m_plpArray [dwIndex] = (LPSTR)malloc(dwByte * sizeof(char));
  30. }
  31. m_lEmptyBlock = -1;
  32. Flag = true;
  33. }
  34. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  35. // ~CAV8Buffer()
  36. CAV8Buffer::~CAV8Buffer()
  37. {
  38. for (DWORD dwIndex = 0; dwIndex < m_dwBlock; dwIndex++)
  39. free(m_plpArray[dwIndex]);
  40. free(m_pdwIndex);
  41. free(m_pdwLength);
  42. free(m_pbFull);
  43. free(m_plpArray);
  44. }
  45. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46. // PushIn()
  47. DWORD CAV8Buffer::PushIn(LPSTR lpData, DWORD dwLength)
  48. {
  49. //查询缓冲队列中空块的位置
  50. if (m_lEmptyBlock < 0)
  51. m_lEmptyBlock = QueryEmpty(); 
  52. //空块的长度
  53.     DWORD dwOldLength = m_pdwLength[m_lEmptyBlock];
  54. if (m_lEmptyBlock >= 0 && m_plpArray[m_lEmptyBlock])
  55. {
  56. memcpy((void *)(m_plpArray[m_lEmptyBlock] + dwOldLength), (const void *)lpData, min(dwLength, m_dwByte - dwOldLength));
  57. m_pdwLength[m_lEmptyBlock] += min(dwLength, m_dwByte - dwOldLength);
  58. if (m_pdwLength[m_lEmptyBlock] == m_dwByte)
  59. {
  60. m_pbFull[m_lEmptyBlock] = TRUE;
  61. OrderAll(m_lEmptyBlock);
  62. //缓冲区满,发送WM_READYSEND消息,启动数据发送线程
  63. if(Flag)
  64.   ::PostMessage(hWnd,WM_READYSEND,0,0);
  65. m_lEmptyBlock = -1;
  66. }
  67. if (dwLength > m_dwByte - dwOldLength)
  68. PushIn(lpData + (m_dwByte - dwOldLength), dwLength - (m_dwByte - dwOldLength));
  69. return min(dwLength, m_dwByte - dwOldLength);
  70. }
  71. return 0;
  72. }
  73. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  74. // PopOut()
  75. DWORD CAV8Buffer::PopOut(LPSTR lpData, DWORD dwLength)
  76. {
  77. for (DWORD dwIndex = 0; dwIndex < m_dwBlock; dwIndex++)
  78. {
  79. DWORD dwPopBlock = m_pdwIndex[dwIndex];
  80. DWORD dwOldLength = m_pdwLength[dwPopBlock];
  81. if (m_pbFull[dwPopBlock])
  82. {
  83. memcpy((void *)lpData, (const void *)m_plpArray[dwPopBlock], min(dwOldLength, dwLength));
  84. m_pdwLength[dwPopBlock] = 0;
  85. m_pbFull[dwPopBlock] = FALSE;
  86. return min(dwOldLength, dwLength);
  87. }
  88. }
  89. return 0;
  90. }
  91. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  92. // ClearAll()
  93. void CAV8Buffer::ClearAll()
  94. {
  95. for (DWORD dwIndex = 0; dwIndex < m_dwBlock; dwIndex++)
  96. {
  97. m_pdwIndex [dwIndex] = dwIndex;
  98. m_pdwLength[dwIndex] = 0;
  99. m_pbFull   [dwIndex] = FALSE;
  100. }
  101. }
  102. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  103. // QueryEmpty()
  104. LONG CAV8Buffer::QueryEmpty()
  105. {
  106. for (DWORD dwIndex = 0; dwIndex < m_dwBlock; dwIndex++)
  107. if (! m_pbFull[dwIndex])
  108. return (LONG)dwIndex;
  109. return -1;
  110. }
  111. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  112. // OrderAll()
  113. void CAV8Buffer::OrderAll(DWORD dwTheLast)
  114. {
  115. for (DWORD dwIndex = 0; dwIndex < m_dwBlock; dwIndex++)
  116. if (m_pdwIndex[dwIndex] == dwTheLast)
  117. break;
  118. for (; dwIndex < m_dwBlock - 1; dwIndex++)
  119. m_pdwIndex[dwIndex] = m_pdwIndex[dwIndex + 1];
  120. m_pdwIndex[dwIndex] = dwTheLast;
  121. }
  122. // The End ///////////////////////////////////////////////////////////////////////////////////////////////////////////////