📄 client_process.cpp
字号:
#include "client_process.h"
#include <stdio.h>
#include <SDL_thread.h>
#include "player_session.h"
#include "player_util.h"
#include "wmp4client.h"
static int c_msg_send (void *ud)
{
CClientProcess *cp = (CClientProcess *)ud;
cp->msg_send_thread();
return 0;
}
CClientProcess::CClientProcess(void)
{
m_map_file = NULL;
m_map_file_read = NULL;
m_from_gui_event = NULL;
m_from_gui_resp_event = NULL;
m_to_gui_event = NULL;
m_to_gui_resp_event = NULL;
m_thread_created = FALSE;
m_msg_queue_sem = NULL;
m_send_thread = NULL;
m_stop_send_thread = 0;
}
#define CLOSE_AND_CLEAR(a) if ((a) != NULL) { CloseHandle(a); (a) = NULL; }
CClientProcess::~CClientProcess(void)
{
if (m_send_thread != NULL) {
m_stop_send_thread = 1;
SDL_SemPost(m_msg_queue_sem);
SDL_WaitThread(m_send_thread, NULL);
m_send_thread = NULL;
}
SDL_DestroySemaphore(m_msg_queue_sem);
if (m_map_file_read != NULL) {
UnmapViewOfFile(m_map_file_read);
m_map_file_read = NULL;
}
CLOSE_AND_CLEAR(m_map_file);
CLOSE_AND_CLEAR(m_from_gui_event);
CLOSE_AND_CLEAR(m_from_gui_resp_event);
CLOSE_AND_CLEAR(m_to_gui_event);
CLOSE_AND_CLEAR(m_to_gui_resp_event);
}
int CClientProcess::enable_communication(void)
{
m_map_file = OpenFileMapping(FILE_MAP_ALL_ACCESS,
FALSE,
"MP4ThreadToEventFileMap");
if (m_map_file == NULL)
{
printf("Could not open file-mapping object.\n");
return -1;
}
m_map_file_read = MapViewOfFile(m_map_file,
FILE_MAP_ALL_ACCESS,
0,
0,
0);
if (m_map_file_read == NULL)
{
printf("Could not map view of file.\n");
return -1;
}
m_from_gui_event = OpenEvent(EVENT_ALL_ACCESS, FALSE, "MP4GuiToClient");
if (m_from_gui_event == NULL) {
printf("Can't get event\n");
return -1;
}
m_from_gui_resp_event = OpenEvent(EVENT_ALL_ACCESS, FALSE, "MP4GuiToClientResp");
if (m_from_gui_resp_event == NULL) {
printf("Can't get event (from resp)\n");
return -1;
}
m_to_gui_event = OpenEvent(EVENT_ALL_ACCESS, FALSE, "MP4ClientToGui");
if (m_to_gui_event == NULL) {
printf("Can't get event (to gui)\n");
return -1;
}
m_to_gui_resp_event = OpenEvent(EVENT_ALL_ACCESS, FALSE, "MP4ClientToGuiResp");
if (m_to_gui_resp_event == NULL) {
printf("Can't get event (to gui resp)\n");
return -1;
}
m_msg_queue_sem = SDL_CreateSemaphore(0);
m_send_thread = SDL_CreateThread(c_msg_send, this);
return 0;
}
void CClientProcess::initial_response (int code,
CPlayerSession *psptr,
const char *errmsg)
{
char temp;
int len;
if (errmsg == NULL) {
temp = '\0';
errmsg = &temp;
}
msg_mbox_t *msg_mbox = (msg_mbox_t *)m_map_file_read;
msg_mbox->from_client_response = code;
len = strlen(errmsg);
msg_initial_resp_t *msg_resp;
msg_resp = (msg_initial_resp_t *)msg_mbox->to_client_mbox;
if (psptr == NULL) {
memset(msg_resp, 0, sizeof(msg_initial_resp_t));
} else {
msg_resp->has_audio = psptr->session_has_audio();
msg_resp->session_is_seekable = psptr->session_is_seekable();
msg_resp->max_time = psptr->get_max_time();
}
char *next = msg_mbox->to_client_mbox + sizeof(msg_initial_resp_t);
memcpy(next,
errmsg,
MIN(len, (MBOX_SIZE - sizeof(msg_initial_resp_t))));
SetEvent(m_from_gui_resp_event);
}
int CClientProcess::receive_messages (CPlayerSession *psptr)
{
int retval;
int our_ret = 0;
retval = WaitForSingleObject(m_from_gui_event, 0);
if (retval == WAIT_OBJECT_0) {
msg_mbox_t *msg_mbox = (msg_mbox_t *)m_map_file_read;
switch (msg_mbox->to_client_command) {
case CLIENT_MSG_TERMINATE:
our_ret = 1;
msg_mbox->from_client_response = 0;
break;
case CLIENT_MSG_SET_SCREEN_SIZE:
{
int size = *(int *)msg_mbox->to_client_mbox;
if (size == 0) size = 1;
else size *= 2;
psptr->set_screen_size(size);
break;
}
case CLIENT_READ_CONFIG_FILE:
set_configs();
break;
case CLIENT_MSG_PLAY:
{
client_msg_play_t *cmp =
(client_msg_play_t *)msg_mbox->to_client_mbox;
player_debug_message("play command received %d %g",
cmp->start_from_begin, cmp->start_time);
psptr->play_all_media(cmp->start_from_begin,
cmp->start_time);
}
break;
case CLIENT_MSG_PAUSE:
psptr->pause_all_media();
player_debug_message("Pause message received");
break;
case CLIENT_MSG_GET_CURRENT_TIME:
msg_mbox->from_client_response =
psptr->get_playing_time();
break;
}
msg_mbox->to_client_command = BLANK_MSG;
SetEvent(m_from_gui_resp_event);
}
return (our_ret);
}
int CClientProcess::send_message (uint32_t msg, uint32_t param)
{
return m_msg_queue.send_message(msg, param, m_msg_queue_sem);
}
int CClientProcess::send_message (uint32_t message,
void *msg_body,
int msg_len)
{
return m_msg_queue.send_message(message,
(unsigned char *)msg_body,
msg_len,
m_msg_queue_sem);
}
int CClientProcess::send_string (uint32_t message,
const char *string)
{
char value = '\0';
if (string == NULL) {
string = &value;
}
return (m_msg_queue.send_message(message,
(unsigned char *)string,
strlen(string) + 1,
m_msg_queue_sem));
}
void CClientProcess::msg_send_thread (void)
{
msg_mbox_t *pmbox = (msg_mbox_t *)m_map_file_read;
CMsg *msg;
while (1) {
SDL_SemWait(m_msg_queue_sem);
if (m_stop_send_thread != 0) return;
while ((msg = m_msg_queue.get_message()) != NULL) {
pmbox->to_gui_command = msg->get_value();
if (msg->has_param()) {
uint32_t param = msg->get_param();
memcpy(pmbox->to_gui_mbox,
¶m,
sizeof(param));
} else {
uint32_t msg_len;
const unsigned char *foo;
foo = msg->get_message(msg_len);
if (msg_len > 0) {
memcpy(pmbox->to_gui_mbox,
foo,
MIN(msg_len, MBOX_SIZE));
}
}
pmbox->from_gui_response = MBOX_RESP_EMPTY;
ResetEvent(m_to_gui_resp_event);
SetEvent(m_to_gui_event);
// Now wait for response.
WaitForSingleObject(m_to_gui_resp_event, 2 * 1000);
if (pmbox->from_gui_response != MBOX_RESP_EMPTY) {
}
delete msg;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -