client_process.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:6k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "client_process.h"
  2. #include <stdio.h>
  3. #include <SDL_thread.h>
  4. #include "player_session.h"
  5. #include "player_util.h"
  6. #include "wmp4client.h"
  7. static int c_msg_send (void *ud)
  8. {
  9. CClientProcess *cp = (CClientProcess *)ud;
  10. cp->msg_send_thread();
  11. return 0;
  12. }
  13. CClientProcess::CClientProcess(void)
  14. {
  15. m_map_file = NULL;
  16. m_map_file_read = NULL;
  17. m_from_gui_event = NULL;
  18. m_from_gui_resp_event = NULL;
  19. m_to_gui_event = NULL;
  20. m_to_gui_resp_event = NULL;
  21. m_thread_created = FALSE;
  22. m_msg_queue_sem = NULL;
  23. m_send_thread = NULL;
  24. m_stop_send_thread = 0;
  25. }
  26. #define CLOSE_AND_CLEAR(a) if ((a) != NULL) { CloseHandle(a); (a) = NULL; }
  27. CClientProcess::~CClientProcess(void)
  28. {
  29. if (m_send_thread != NULL) {
  30. m_stop_send_thread = 1;
  31. SDL_SemPost(m_msg_queue_sem);
  32. SDL_WaitThread(m_send_thread, NULL);
  33. m_send_thread = NULL;
  34. }
  35. SDL_DestroySemaphore(m_msg_queue_sem);
  36. if (m_map_file_read != NULL) {
  37. UnmapViewOfFile(m_map_file_read);
  38. m_map_file_read = NULL;
  39. }
  40. CLOSE_AND_CLEAR(m_map_file);
  41. CLOSE_AND_CLEAR(m_from_gui_event);
  42. CLOSE_AND_CLEAR(m_from_gui_resp_event);
  43. CLOSE_AND_CLEAR(m_to_gui_event);
  44. CLOSE_AND_CLEAR(m_to_gui_resp_event);
  45. }
  46. int CClientProcess::enable_communication(void)
  47. {
  48. m_map_file = OpenFileMapping(FILE_MAP_ALL_ACCESS, 
  49. FALSE,                    
  50. "MP4ThreadToEventFileMap");
  51. if (m_map_file == NULL) 
  52. printf("Could not open file-mapping object.n"); 
  53. return -1;
  54.  
  55.     m_map_file_read = MapViewOfFile(m_map_file,
  56. FILE_MAP_ALL_ACCESS, 
  57. 0,
  58. 0,
  59. 0);
  60. if (m_map_file_read == NULL) 
  61. printf("Could not map view of file.n");
  62. return -1;
  63. }  
  64.  
  65. m_from_gui_event = OpenEvent(EVENT_ALL_ACCESS, FALSE, "MP4GuiToClient");
  66. if (m_from_gui_event == NULL) {
  67. printf("Can't get eventn");
  68. return -1;
  69. }
  70. m_from_gui_resp_event = OpenEvent(EVENT_ALL_ACCESS, FALSE, "MP4GuiToClientResp");
  71. if (m_from_gui_resp_event == NULL) {
  72. printf("Can't get event (from resp)n");
  73. return -1;
  74. }
  75. m_to_gui_event = OpenEvent(EVENT_ALL_ACCESS, FALSE, "MP4ClientToGui");
  76. if (m_to_gui_event == NULL) {
  77. printf("Can't get event (to gui)n");
  78. return -1;
  79. }
  80. m_to_gui_resp_event = OpenEvent(EVENT_ALL_ACCESS, FALSE, "MP4ClientToGuiResp");
  81. if (m_to_gui_resp_event == NULL) {
  82. printf("Can't get event (to gui resp)n");
  83. return -1;
  84. }
  85. m_msg_queue_sem = SDL_CreateSemaphore(0);
  86. m_send_thread = SDL_CreateThread(c_msg_send, this);
  87. return 0;
  88. }
  89. void CClientProcess::initial_response (int code, 
  90.    CPlayerSession *psptr,
  91.    const char *errmsg)
  92. {
  93. char temp;
  94. int len;
  95. if (errmsg == NULL) {
  96. temp = '';
  97. errmsg = &temp;
  98. }
  99.     msg_mbox_t *msg_mbox = (msg_mbox_t *)m_map_file_read;
  100. msg_mbox->from_client_response = code;
  101. len = strlen(errmsg);
  102. msg_initial_resp_t *msg_resp;
  103. msg_resp = (msg_initial_resp_t *)msg_mbox->to_client_mbox;
  104. if (psptr == NULL) {
  105. memset(msg_resp, 0, sizeof(msg_initial_resp_t));
  106. } else {
  107. msg_resp->has_audio = psptr->session_has_audio();
  108. msg_resp->session_is_seekable = psptr->session_is_seekable();
  109. msg_resp->max_time = psptr->get_max_time();
  110. }
  111. char *next = msg_mbox->to_client_mbox + sizeof(msg_initial_resp_t);
  112. memcpy(next,
  113. errmsg,
  114. MIN(len, (MBOX_SIZE - sizeof(msg_initial_resp_t))));
  115. SetEvent(m_from_gui_resp_event);
  116. }
  117. int CClientProcess::receive_messages (CPlayerSession *psptr)
  118. {
  119. int retval;
  120. int our_ret = 0;
  121. retval = WaitForSingleObject(m_from_gui_event, 0);
  122. if (retval == WAIT_OBJECT_0) {
  123. msg_mbox_t *msg_mbox = (msg_mbox_t *)m_map_file_read;
  124. switch (msg_mbox->to_client_command) {
  125. case CLIENT_MSG_TERMINATE:
  126. our_ret = 1;
  127. msg_mbox->from_client_response = 0;
  128. break;
  129. case CLIENT_MSG_SET_SCREEN_SIZE: 
  130. {
  131. int size = *(int *)msg_mbox->to_client_mbox;
  132. if (size == 0) size = 1;
  133. else size *= 2;
  134. psptr->set_screen_size(size);
  135. break;
  136. }
  137. case CLIENT_READ_CONFIG_FILE:
  138. set_configs();
  139. break;
  140. case CLIENT_MSG_PLAY: 
  141. {
  142. client_msg_play_t *cmp = 
  143. (client_msg_play_t *)msg_mbox->to_client_mbox;
  144. player_debug_message("play command received %d %g", 
  145. cmp->start_from_begin, cmp->start_time);
  146. psptr->play_all_media(cmp->start_from_begin, 
  147.   cmp->start_time);
  148. }
  149. break;
  150. case CLIENT_MSG_PAUSE:
  151. psptr->pause_all_media();
  152. player_debug_message("Pause message received");
  153. break;
  154. case CLIENT_MSG_GET_CURRENT_TIME:
  155. msg_mbox->from_client_response = 
  156. psptr->get_playing_time();
  157. break;
  158. }
  159. msg_mbox->to_client_command = BLANK_MSG;
  160. SetEvent(m_from_gui_resp_event);
  161. }
  162. return (our_ret);
  163. }
  164. int CClientProcess::send_message (uint32_t msg, uint32_t param)
  165. {
  166. return m_msg_queue.send_message(msg, param, m_msg_queue_sem);
  167. }
  168. int CClientProcess::send_message (uint32_t message,
  169.    void *msg_body,
  170.    int msg_len)
  171. {
  172. return m_msg_queue.send_message(message, 
  173. (unsigned char *)msg_body, 
  174. msg_len, 
  175. m_msg_queue_sem);
  176. }
  177. int CClientProcess::send_string (uint32_t message,
  178.  const char *string)
  179. {
  180. char value = '';
  181. if (string == NULL) { 
  182. string = &value;
  183. }
  184. return (m_msg_queue.send_message(message, 
  185.  (unsigned char *)string,
  186.  strlen(string) + 1,
  187.  m_msg_queue_sem));
  188. }
  189. void CClientProcess::msg_send_thread (void)
  190. {
  191. msg_mbox_t *pmbox = (msg_mbox_t *)m_map_file_read;
  192. CMsg *msg;
  193. while (1) {
  194. SDL_SemWait(m_msg_queue_sem);
  195. if (m_stop_send_thread != 0) return;
  196. while ((msg = m_msg_queue.get_message()) != NULL) {
  197. pmbox->to_gui_command = msg->get_value();
  198. if (msg->has_param()) {
  199. uint32_t param = msg->get_param();
  200. memcpy(pmbox->to_gui_mbox,
  201.    &param,
  202.    sizeof(param));
  203. } else {
  204. uint32_t msg_len;
  205. const unsigned char *foo;
  206. foo = msg->get_message(msg_len);
  207. if (msg_len > 0) {
  208. memcpy(pmbox->to_gui_mbox,
  209.    foo,
  210.    MIN(msg_len, MBOX_SIZE));
  211. }
  212. }
  213. pmbox->from_gui_response = MBOX_RESP_EMPTY;
  214. ResetEvent(m_to_gui_resp_event);
  215. SetEvent(m_to_gui_event);
  216. // Now wait for response.
  217. WaitForSingleObject(m_to_gui_resp_event, 2 * 1000);
  218. if (pmbox->from_gui_response != MBOX_RESP_EMPTY) {
  219. }
  220. delete msg;
  221. }
  222. }
  223. }