dvb.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:7k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * dvb.c : functions to control a DVB card under Linux
  3.  *****************************************************************************
  4.  * Copyright (C) 1998-2001 VideoLAN
  5.  *
  6.  * Authors: Damien Lucas <nitrox@via.ecp.fr>
  7.  *          Johan Bilien <jobi@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.    See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA    02111, USA.
  22.  *****************************************************************************/
  23. #include <vlc/vlc.h>
  24. #include <sys/ioctl.h>
  25. #include <stdio.h>
  26. #ifdef HAVE_INTTYPES_H
  27. #   include <inttypes.h>                                       /* int16_t .. */
  28. #endif
  29. #include <sys/types.h>
  30. #include <sys/stat.h>
  31. #include <fcntl.h>
  32. #include <time.h>
  33. #include <unistd.h>
  34. #include <sys/types.h>
  35. #include <sys/stat.h>
  36. #include <sys/poll.h>
  37. /* DVB Card Drivers */
  38. #include <ost/sec.h>
  39. #include <ost/dmx.h>
  40. #include <ost/frontend.h>
  41. #include "dvb.h"
  42. /*****************************************************************************
  43.  * ioctl_SECControl : commands the SEC device
  44.  *****************************************************************************/
  45. int ioctl_SECControl( int sec_nb, int freq, int pol, int lnb_slof, int diseqc )
  46. {
  47.     struct secCommand scmd;
  48.     struct secCmdSequence scmds;
  49.     int sec;
  50.     char psz_sec[255];
  51.     snprintf(psz_sec, sizeof(psz_sec), SEC "%d", sec_nb);
  52.     if((sec = open(psz_sec, O_RDWR)) < 0)
  53.     {
  54.         return -1;
  55.     }
  56.     /* Set the frequency of the transponder, taking into account the
  57.        local frequencies of the LNB */
  58.     scmds.continuousTone = (freq<lnb_slof) ? SEC_TONE_OFF : SEC_TONE_ON;
  59.     /* Set the polarity of the transponder by setting the correct
  60.        voltage on the universal LNB */
  61.     scmds.voltage = (pol) ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13;
  62.     /* In case we have a DiSEqC, set it to the correct address */
  63.     scmd.type=0;
  64.     scmd.u.diseqc.addr=0x10;
  65.     scmd.u.diseqc.cmd=0x38;
  66.     scmd.u.diseqc.numParams=1;
  67.     scmd.u.diseqc.params[0] = 0xF0 | ((diseqc * 4) & 0x0F) | 
  68.             (scmds.continuousTone == SEC_TONE_ON ? 1 : 0) |
  69.             (scmds.voltage==SEC_VOLTAGE_18 ? 2 : 0);
  70.     scmds.miniCommand=SEC_MINI_NONE;
  71.     scmds.numCommands=1;
  72.     scmds.commands=&scmd;
  73.     /* Send the data to the SEC device to prepare the LNB for tuning  */
  74.     /*intf_Msg("Sec: Sending datan");*/
  75.     if (ioctl(sec, SEC_SEND_SEQUENCE, &scmds) < 0)
  76.     {
  77.         return -1;
  78.     }
  79.     close(sec);
  80.     return 0;
  81. }
  82. static int check_qpsk( int );
  83. /*****************************************************************************
  84.  * ioctl_SetQPSKFrontend : controls the FE device
  85.  *****************************************************************************/
  86. int ioctl_SetQPSKFrontend (int fe_nb, int freq, int srate, int fec,
  87.                         int lnb_lof1, int lnb_lof2, int lnb_slof)
  88. {
  89.     FrontendParameters fep;
  90.     int front;
  91.     int rc;
  92.     char psz_fe[255];
  93.     snprintf(psz_fe, sizeof(psz_fe), FRONTEND "%d", fe_nb);
  94.     /* Open the frontend device */
  95.     if((front = open(psz_fe, O_RDWR)) < 0)
  96.     {
  97.         return -1;
  98.     }
  99.     /* Set the frequency of the transponder, taking into account the
  100.        local frequencies of the LNB */
  101.     fep.Frequency = (freq < lnb_slof) ? freq - lnb_lof1 : freq - lnb_lof2; 
  102.  /* Set symbol rate and FEC */
  103.     fep.u.qpsk.SymbolRate = srate;
  104.     fep.u.qpsk.FEC_inner = FEC_AUTO;
  105.     /* Now send it all to the frontend device */
  106.     if (ioctl(front, FE_SET_FRONTEND, &fep) < 0)
  107.     {
  108.         return -1;
  109.     }
  110.     /* Check if it worked */
  111.     rc=check_qpsk(front);
  112.     /* Close front end device */
  113.     close(front);
  114.     
  115.     return rc;
  116. }
  117. /******************************************************************
  118.  * Check completion of the frontend control sequence
  119.  ******************************************************************/
  120. static int check_qpsk(int front)
  121. {
  122.     struct pollfd pfd[1];
  123.     FrontendEvent event; 
  124.     /* poll for QPSK event to check if tuning worked */
  125.     pfd[0].fd = front;
  126.     pfd[0].events = POLLIN;
  127.     if (poll(pfd,1,3000))
  128.     {
  129.         if (pfd[0].revents & POLLIN)
  130.         {
  131.             if ( ioctl(front, FE_GET_EVENT, &event) == -EBUFFEROVERFLOW)
  132.             {
  133.                 return -5;
  134.             }
  135.         
  136.             switch(event.type)
  137.             {
  138.                 case FE_UNEXPECTED_EV:
  139.                     return -2;
  140.                 case FE_FAILURE_EV:
  141.                     return -1;
  142.                 case FE_COMPLETION_EV:
  143.                     break;
  144.             }
  145.         }
  146.         else
  147.         {
  148.             /* should come here */
  149.             return -3;
  150.         }
  151.     }
  152.     else
  153.     {
  154.         return -4;
  155.     }
  156.     
  157.     return 0;
  158. }
  159. /*****************************************************************************
  160.  * ioctl_SetDMXAudioFilter : controls the demux to add a filter
  161.  *****************************************************************************/
  162. int ioctl_SetDMXFilter( int dmx_nb, int i_pid, int * pi_fd , int i_type ) 
  163. {
  164.     struct dmxPesFilterParams s_filter_params;
  165.     char psz_dmx[255];
  166.     snprintf(psz_dmx, sizeof(psz_dmx), DMX "%d", dmx_nb);
  167.     /* We first open the device */
  168.     if ((*pi_fd = open(psz_dmx, O_RDWR|O_NONBLOCK))  < 0)
  169.     {
  170.         return -1;
  171.     }
  172.     /* We fill the DEMUX structure : */
  173.     s_filter_params.pid     =   i_pid;
  174.     s_filter_params.input   =   DMX_IN_FRONTEND;
  175.     s_filter_params.output  =   DMX_OUT_TS_TAP;
  176.     switch ( i_type )
  177.     {
  178.         /* AFAIK you shouldn't use DMX_PES_VIDEO and DMX_PES_AUDIO
  179.          * unless you want to use a hardware decoder. In all cases
  180.          * I know DMX_PES_OTHER is quite enough for what we want to
  181.          * do. In case you have problems, you can still try to
  182.          * reenable them here : --Meuuh */
  183. #if 0
  184.         case 1:
  185.             s_filter_params.pesType =   DMX_PES_VIDEO;
  186.             break;
  187.         case 2:
  188.             s_filter_params.pesType =   DMX_PES_AUDIO;
  189.             break;
  190.         case 3:
  191. #endif
  192.         default:
  193.             s_filter_params.pesType =   DMX_PES_OTHER;
  194.             break;
  195.     }
  196.     s_filter_params.flags   =   DMX_IMMEDIATE_START;
  197.     /* We then give the order to the device : */
  198.     if (ioctl(*pi_fd, DMX_SET_PES_FILTER, &s_filter_params) < 0)
  199.     {
  200.         return -1;
  201.     }
  202.     return 0;
  203. }
  204. /*****************************************************************************
  205.  * ioctl_UnsetDMXFilter : removes a filter
  206.  *****************************************************************************/
  207. int ioctl_UnsetDMXFilter(int demux)
  208. {
  209.     ioctl(demux, DMX_STOP);
  210.     close(demux);
  211.     return 0;
  212. }
  213. /*****************************************************************************
  214.  * ioctl_SetBufferSize :
  215.  *****************************************************************************/
  216. int ioctl_SetBufferSize(int handle, size_t size)
  217. {
  218.     return ioctl(handle, DMX_SET_BUFFER_SIZE, size);
  219. }