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

DirextX编程

开发平台:

Visual C++

  1. // 
  2. // CMediaSocketClient.cpp
  3. // 
  4. #include "stdafx.h"
  5. #include "CMediaSocketClient.h"
  6. #include "CDataAdmin.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. //////////////////////////////////////////////////////////////////////////////
  13. CMediaSocketClient::CMediaSocketClient()
  14. {
  15. m_dwRecvCount   = 0;
  16. m_bGraphStarted = false;
  17. m_pDataList = NULL;
  18. m_hCountWnd = NULL;
  19. m_LocalFile = NULL;
  20. // m_LocalFile = new CFile("receive.mpg", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
  21. }
  22. CMediaSocketClient::~CMediaSocketClient()
  23. {
  24. if (m_LocalFile)
  25. {
  26. m_LocalFile->Close();
  27. delete m_LocalFile;
  28. m_LocalFile = NULL;
  29. }
  30. m_pDataList = NULL;
  31. }
  32. void CMediaSocketClient::ReceivingLoop(void)
  33. {
  34. int    nret     = 0;
  35. int    nMsgType = 0;
  36. int    nDataLen = 0;
  37. char   buff[sizeof(MSG_HEADER) + MPEG1_PACK_SIZE];
  38. while (m_bReceiving)
  39. {
  40. // Receive the message header
  41. while ((nret = Receive(buff, sizeof(MSG_HEADER))) == E_SOCKET_NOT_READY)
  42. {
  43. Sleep(100);
  44. }
  45. // When errors occur or socket closed, terminate this loop
  46. if (nret == E_SOCKET_FAIL || nret == E_SOCKET_CLOSE)
  47. break;
  48. // See what type the payload is...
  49. PMSG_HEADER  pMsg = (PMSG_HEADER) buff;
  50. nMsgType = pMsg->nMsgType;   // Payload type retrieved
  51. nDataLen = pMsg->nDataSize;  // Payload size retrieved
  52. // Continue to receive the payload
  53. if (nDataLen > 0)
  54. {
  55. while ((nret = Receive(buff, nDataLen)) == E_SOCKET_NOT_READY)
  56. {
  57. Sleep(100);
  58. }
  59. // When errors occur or socket closed, terminate this loop
  60. if (nret == E_SOCKET_FAIL || nret == E_SOCKET_CLOSE)
  61. break;
  62. }
  63. // Data processing
  64. switch (nMsgType)
  65. {
  66. case DATA_MEDIA: // Mpeg content data!!!
  67. // Write to file for debuging
  68. // if (m_LocalFile)
  69. // {
  70. // m_LocalFile->Write(buff, MPEG1_PACK_SIZE);
  71. // }
  72. // Add to buffer list for filter graph using
  73. if (m_pDataList)
  74. {
  75. PMPEG1_PACK pData = m_pDataList->GetWriteBuffer();
  76. if (pData == NULL && m_pDataList->GetListSize() < PACK_MAX_COUNT)
  77. {
  78. // Allocate more buffer
  79. pData = new MPEG1_PACK;
  80. }
  81. if (pData != NULL)
  82. {
  83. memcpy(pData, buff, nDataLen);
  84. m_pDataList->ReleaseWriteBuffer(pData);
  85. }
  86. // Receive data pack counting...
  87. m_dwRecvCount++;
  88. if ((m_dwRecvCount >= PACK_INIT_COUNT) && 
  89. !m_bGraphStarted)
  90. {
  91. ::SetEvent(m_pDataList->m_hBufEnough);
  92. m_bGraphStarted = true;
  93. }
  94. //#ifdef _DEBUG
  95. if (m_hCountWnd != NULL)
  96. {
  97. char buff[15];
  98. itoa(m_dwRecvCount, buff,10);
  99. ::SendMessage(m_hCountWnd, WM_SETTEXT, 0, (LPARAM)buff);
  100. }
  101. //#endif
  102. }
  103. break;
  104. case RECV_EXIT: // Exit this thread
  105. m_bReceiving = false;
  106. break;
  107. default:
  108. break;
  109. }
  110. }
  111. // If no more data receiving, flush data
  112. if (m_pDataList)
  113. {
  114. m_pDataList->SetFlushing();
  115. }
  116. }
  117. void CMediaSocketClient::SetRecvBuffer(CDataAdmin * inBuf)
  118. {
  119. if (m_pDataList == NULL)
  120. {
  121. m_pDataList = inBuf;
  122. }
  123. }
  124. void CMediaSocketClient::SetCountWnd(HWND inWnd)
  125. {
  126. m_hCountWnd = inWnd;
  127. }