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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. /*
  22.  * msg_queue.cpp - generic class to send/receive messages.  Uses SDL mutexs
  23.  * to protect queues
  24.  */
  25. #include <string.h>
  26. #include "msg_queue.h"
  27. /*****************************************************************************
  28.  * CMsg class methods.  Defines information about a single message
  29.  *****************************************************************************/
  30. CMsg::CMsg (uint32_t value, unsigned char *msg, uint32_t msg_len)
  31. {
  32.   m_value = value;
  33.   m_msg_len = 0;
  34.   m_has_param = 0;
  35.   m_next = NULL;
  36.   if (msg_len) {
  37.     m_msg = (unsigned char *)malloc(msg_len);
  38. if (m_msg) {
  39. memcpy(m_msg, msg, msg_len);
  40. m_msg_len = msg_len;
  41. }
  42.   } else {
  43. m_msg = msg;
  44.   }
  45. }
  46. CMsg::CMsg (uint32_t value, uint32_t param)
  47. {
  48. m_value = value;
  49. m_msg_len = 0;
  50. m_has_param = 1;
  51. m_param = param;
  52. }
  53. CMsg::~CMsg (void) 
  54. {
  55.   if (m_msg_len) {
  56.     free(m_msg);
  57.     m_msg = NULL;
  58.   }
  59. }
  60. const unsigned char *CMsg::get_message (uint32_t &len)
  61. {
  62.   len = m_msg_len;
  63.   return (m_msg);
  64. }
  65. /*****************************************************************************
  66.  * CMsgQueue class methods.  Defines information about a message queue
  67.  *****************************************************************************/
  68. CMsgQueue::CMsgQueue(void)
  69. {
  70.   m_msg_queue = NULL;
  71.   m_msg_queue_mutex = SDL_CreateMutex();
  72. }
  73. CMsgQueue::~CMsgQueue (void) 
  74. {
  75.   CMsg *p;
  76.   SDL_mutexP(m_msg_queue_mutex);
  77.   while (m_msg_queue != NULL) {
  78.     p = m_msg_queue->get_next();
  79.     delete m_msg_queue;
  80.     m_msg_queue = p;
  81.   }
  82.   SDL_DestroyMutex(m_msg_queue_mutex);
  83.   m_msg_queue_mutex = NULL;
  84. }
  85. int CMsgQueue::send_message (uint32_t msgval, 
  86.      unsigned char *msg, 
  87.      uint32_t msg_len, 
  88.      SDL_sem *sem)
  89. {
  90.   CMsg *newmsg = new CMsg(msgval, msg, msg_len);
  91.   if (newmsg == NULL) 
  92.     return (-1);
  93.   return (send_message(newmsg, sem));
  94. }
  95. int CMsgQueue::send_message (uint32_t msgval, uint32_t param, SDL_sem *sem)
  96. {
  97. CMsg *newmsg = new CMsg(msgval, param);
  98. if (newmsg == NULL) return -1;
  99. return (send_message(newmsg, sem));
  100. }
  101. int CMsgQueue::send_message(CMsg *newmsg, SDL_sem *sem)
  102. {
  103.   SDL_mutexP(m_msg_queue_mutex);
  104.   if (m_msg_queue == NULL) {
  105.     m_msg_queue = newmsg;
  106.   } else {
  107.     CMsg *p = m_msg_queue;
  108.     while (p->get_next() != NULL) p = p->get_next();
  109.     p->set_next(newmsg);
  110.   }
  111.   SDL_mutexV(m_msg_queue_mutex);
  112.   if (sem != NULL) {
  113.     SDL_SemPost(sem);
  114.   }
  115.   return (0);
  116. }
  117. CMsg *CMsgQueue::get_message (void) 
  118. {
  119.   CMsg *ret;
  120.   if (m_msg_queue == NULL) 
  121.     return(NULL);
  122.   SDL_mutexP(m_msg_queue_mutex);
  123.   if (m_msg_queue == NULL) 
  124.     ret = NULL;
  125.   else {
  126.     ret = m_msg_queue;
  127.     m_msg_queue = ret->get_next();
  128.   }
  129.   SDL_mutexV(m_msg_queue_mutex);
  130.   if (ret) {
  131.     ret->set_next(NULL);
  132.   }
  133.   return (ret);
  134. }
  135.   
  136. /* end file msg_queue.cpp */