rtpSimple.cxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. static const char* const rtpSimple_cxx_Version =
  51.     "$Id: rtpSimple.cxx,v 1.10 2001/06/29 21:02:42 bko Exp $";
  52. #include <unistd.h>
  53. #include <fstream>
  54. #include "rtpTypes.h"
  55. #include "Rtp.hxx"
  56. #include "Rtcp.hxx"
  57. #include "RtpSession.hxx"
  58. #ifdef __vxworks
  59. #include "VThread.hxx"
  60. #endif
  61. #include <sys/types.h>
  62. #include <sys/stat.h>
  63. #include <fcntl.h>
  64. #include <errno.h>
  65. #include <deque>
  66. #include "SessionData.hxx"
  67. #include "support.hxx"
  68. class MultiSession
  69. {
  70.     public:
  71.         MultiSession();
  72.         void processControl();
  73.         void periodicProcess();
  74.         int setFds(fd_set* fdSet);
  75.         void processFds(fd_set* fdSet);
  76.     private:
  77.         deque < SessionData* > sessionList;
  78.         string cmdBuf;
  79. };
  80. MultiSession::MultiSession()
  81. {
  82.     SessionData* session;
  83.     session = new SessionData;
  84.     sessionList.push_back(session);
  85. }
  86. bool cmd_verify(const split_t& command_list,
  87.                 const char* cmd_name,
  88.                 unsigned int args)
  89. {
  90.     if (command_list.size() == args)
  91.     {
  92.         if ((command_list[0] == cmd_name))
  93.         {
  94.             return true;
  95.         }
  96.     }
  97.     return false;
  98. }
  99. void MultiSession::processControl()
  100. {
  101.     cout << "got bytes" << endl;
  102.     // this should do something
  103.     char buf[1024];
  104.     int bytesRead = read(0, buf, 1023);
  105.     buf[bytesRead] = '';
  106.     cmdBuf += buf;
  107.     // chomp out to the n
  108.     SessionData* session = sessionList.front();
  109.     while (1)
  110.     {
  111.         string::size_type pos = cmdBuf.find("n");
  112.         if (pos != string::npos)
  113.         {
  114.             // this is a command
  115.             string cmd;
  116.             cmd = cmdBuf.substr(0, pos);
  117.             split_t myCmd = split(cmd, " ");
  118.             if (cmd_verify(myCmd, "n", 4))
  119.             {
  120.                 cout << "new handle" << endl;
  121.                 session->newStack(myCmd[1], myCmd[2], myCmd[3]);
  122.             }
  123.             if (myCmd[0] == "v")
  124.             {
  125.                 // voice mail mode:
  126.                 // play first filename (greeting)
  127.                 // play second filename (beep)
  128.                 // record third filename
  129.                 split_t::iterator i = myCmd.begin();
  130.                 i++;
  131.                 while (i != myCmd.end())
  132.                 {
  133.                     session->addQueue(*i);
  134.                     i++;
  135.                 }
  136.                 session->shouldUseQueue(true);
  137.             }
  138.             if (cmd_verify(myCmd, "r", 2))
  139.             {
  140.                 session->setRecordFile(myCmd[1]);
  141.             }
  142.             if (cmd_verify(myCmd, "sr", 1))
  143.             {
  144.                 session->stopRecord();
  145.             }
  146.             if (cmd_verify(myCmd, "p", 2))
  147.             {
  148.                 // play file
  149.                 session->setPlayFile(myCmd[1]);
  150.             }
  151.             if (cmd_verify(myCmd, "d", 1))
  152.             {
  153.                 // delete stack
  154.                 session->closeStack();
  155.             }
  156.             if (cmd_verify(myCmd, "s", 2))
  157.             {
  158.                 session->setPktSize(atoi(myCmd[1].c_str()));
  159.             }
  160.             if (myCmd[0] == "q")
  161.             {
  162.                 session->closeStack();
  163.                 exit(0);
  164.             }
  165.             if ((pos + 1) < cmdBuf.length())
  166.             {
  167.                 cmdBuf
  168.                 = cmdBuf.substr(pos + 1,
  169.                                 cmdBuf.length() - (pos + 1));
  170.             }
  171.             else
  172.             {
  173.                 cmdBuf = "";
  174.             }
  175.         }
  176.         else
  177.         {
  178.             // no more cmd -- skip
  179.             break;
  180.         }
  181.     }
  182. }
  183. void MultiSession::periodicProcess()
  184. {
  185.     SessionData* session = sessionList.front();
  186.     session->periodicProcess();
  187. }
  188. int MultiSession::setFds(fd_set* fdSet)
  189. {
  190.     int maxFd = 0;
  191.     FD_SET(0, fdSet);   // stdin -- needed for stuff
  192.     SessionData* session = sessionList.front();
  193.     int sessionFd = session->getFd();
  194.     if (sessionFd >= 0)
  195.     {
  196.         FD_SET(sessionFd, fdSet);
  197.         maxFd = sessionFd;
  198.     }
  199.     return maxFd;
  200. }
  201. void MultiSession::processFds(fd_set* fdSet)
  202. {
  203.     if (FD_ISSET(0, fdSet))
  204.     {
  205.         processControl();
  206.     }
  207.     SessionData* session = sessionList.front();
  208.     int sessionFd = session->getFd();
  209.     if (sessionFd >= 0)
  210.     {
  211.         // handle selects
  212.         if (FD_ISSET(sessionFd, fdSet))
  213.         {
  214.             session->receivePacket();
  215.         }
  216.     }
  217. }
  218. void mainAudioLoop()
  219. {
  220.     MultiSession mySession;
  221.     // in the audio stack, handle appropriate stuff
  222.     while (1)
  223.     {
  224.         fd_set readfds;
  225.         struct timeval tv;
  226.         int retval;
  227.         int maxFd = 0;
  228.         // reset file descriptor
  229.         FD_ZERO(&readfds);
  230.         maxFd = mySession.setFds(&readfds);
  231.         maxFd++;
  232.         tv.tv_sec = 0;
  233.         tv.tv_usec = 1000;
  234.         retval = select(maxFd, &readfds, 0, 0, &tv);
  235.         if (retval < 0)
  236.         {
  237.             cout << "select() returned with an errorn";
  238.             return ;
  239.         }
  240.         if (retval > 0)
  241.         {
  242.             mySession.processFds(&readfds);
  243.         }
  244.         // check for too much time elapsing -- do I need to send a packet?
  245.         mySession.periodicProcess();
  246.     }
  247. }
  248. int main (int argc, char *argv[])
  249. {
  250.     mainAudioLoop();
  251.     //    stack.transmitRTCPBYE();
  252.     //    RtpTransmitter* tran = stack.getRtpTran();
  253.     return 0;
  254. }