.. -*- coding: utf-8; mode: rst -*-

.. _dvb_examples:

********
Examples
********

In this section we would like to present some examples for using the DVB
API.

.. note::

   This section is out of date, and the code below won't even
   compile. Please refer to the
   `libdvbv5 <https://linuxtv.org/docs/libdvbv5/index.html>`__ for
   updated/recommended examples.


.. _tuning:

Example: Tuning
===============

We will start with a generic tuning subroutine that uses the frontend
and SEC, as well as the demux devices. The example is given for QPSK
tuners, but can easily be adjusted for QAM.


.. code-block:: c

     #include <sys/ioctl.h>
     #include <stdio.h>
     #include <stdint.h>
     #include <sys/types.h>
     #include <sys/stat.h>
     #include <fcntl.h>
     #include <time.h>
     #include <unistd.h>

     #include <linux/dvb/dmx.h>
     #include <linux/dvb/frontend.h>
     #include <linux/dvb/sec.h>
     #include <sys/poll.h>

     #define DMX "/dev/dvb/adapter0/demux1"
     #define FRONT "/dev/dvb/adapter0/frontend1"
     #define SEC "/dev/dvb/adapter0/sec1"

     /* routine for checking if we have a signal and other status information*/
     int FEReadStatus(int fd, fe_status_t *stat)
     {
	 int ans;

	 if ( (ans = ioctl(fd,FE_READ_STATUS,stat) < 0)){
	     perror("FE READ STATUS: ");
	     return -1;
	 }

	 if (*stat & FE_HAS_POWER)
	     printf("FE HAS POWER\\n");

	 if (*stat & FE_HAS_SIGNAL)
	     printf("FE HAS SIGNAL\\n");

	 if (*stat & FE_SPECTRUM_INV)
	     printf("SPEKTRUM INV\\n");

	 return 0;
     }


     /* tune qpsk */
     /* freq:             frequency of transponder                      */
     /* vpid, apid, tpid: PIDs of video, audio and teletext TS packets  */
     /* diseqc:           DiSEqC address of the used LNB                */
     /* pol:              Polarisation                                  */
     /* srate:            Symbol Rate                                   */
     /* fec.              FEC                                           */
     /* lnb_lof1:         local frequency of lower LNB band             */
     /* lnb_lof2:         local frequency of upper LNB band             */
     /* lnb_slof:         switch frequency of LNB                       */

     int set_qpsk_channel(int freq, int vpid, int apid, int tpid,
	     int diseqc, int pol, int srate, int fec, int lnb_lof1,
	     int lnb_lof2, int lnb_slof)
     {
	 struct secCommand scmd;
	 struct secCmdSequence scmds;
	 struct dmx_pes_filter_params pesFilterParams;
	 FrontendParameters frp;
	 struct pollfd pfd[1];
	 FrontendEvent event;
	 int demux1, demux2, demux3, front;

	 frequency = (uint32_t) freq;
	 symbolrate = (uint32_t) srate;

	 if((front = open(FRONT,O_RDWR)) < 0){
	     perror("FRONTEND DEVICE: ");
	     return -1;
	 }

	 if((sec = open(SEC,O_RDWR)) < 0){
	     perror("SEC DEVICE: ");
	     return -1;
	 }

	 if (demux1 < 0){
	     if ((demux1=open(DMX, O_RDWR|O_NONBLOCK))
		 < 0){
		 perror("DEMUX DEVICE: ");
		 return -1;
	     }
	 }

	 if (demux2 < 0){
	     if ((demux2=open(DMX, O_RDWR|O_NONBLOCK))
		 < 0){
		 perror("DEMUX DEVICE: ");
		 return -1;
	     }
	 }

	 if (demux3 < 0){
	     if ((demux3=open(DMX, O_RDWR|O_NONBLOCK))
		 < 0){
		 perror("DEMUX DEVICE: ");
		 return -1;
	     }
	 }

	 if (freq < lnb_slof) {
	     frp.Frequency = (freq - lnb_lof1);
	     scmds.continuousTone = SEC_TONE_OFF;
	 } else {
	     frp.Frequency = (freq - lnb_lof2);
	     scmds.continuousTone = SEC_TONE_ON;
	 }
	 frp.Inversion = INVERSION_AUTO;
	 if (pol) scmds.voltage = SEC_VOLTAGE_18;
	 else scmds.voltage = SEC_VOLTAGE_13;

	 scmd.type=0;
	 scmd.u.diseqc.addr=0x10;
	 scmd.u.diseqc.cmd=0x38;
	 scmd.u.diseqc.numParams=1;
	 scmd.u.diseqc.params[0] = 0xF0 | ((diseqc * 4) & 0x0F) |
	     (scmds.continuousTone == SEC_TONE_ON ? 1 : 0) |
	     (scmds.voltage==SEC_VOLTAGE_18 ? 2 : 0);

	 scmds.miniCommand=SEC_MINI_NONE;
	 scmds.numCommands=1;
	 scmds.commands=&scmd;
	 if (ioctl(sec, SEC_SEND_SEQUENCE, &scmds) < 0){
	     perror("SEC SEND: ");
	     return -1;
	 }

	 if (ioctl(sec, SEC_SEND_SEQUENCE, &scmds) < 0){
	     perror("SEC SEND: ");
	     return -1;
	 }

	 frp.u.qpsk.SymbolRate = srate;
	 frp.u.qpsk.FEC_inner = fec;

	 if (ioctl(front, FE_SET_FRONTEND, &frp) < 0){
	     perror("QPSK TUNE: ");
	     return -1;
	 }

	 pfd[0].fd = front;
	 pfd[0].events = POLLIN;

	 if (poll(pfd,1,3000)){
	     if (pfd[0].revents & POLLIN){
		 printf("Getting QPSK event\\n");
		 if ( ioctl(front, FE_GET_EVENT, &event)

		      == -EOVERFLOW){
		     perror("qpsk get event");
		     return -1;
		 }
		 printf("Received ");
		 switch(event.type){
		 case FE_UNEXPECTED_EV:
		     printf("unexpected event\\n");
		     return -1;
		 case FE_FAILURE_EV:
		     printf("failure event\\n");
		     return -1;

		 case FE_COMPLETION_EV:
		     printf("completion event\\n");
		 }
	     }
	 }


	 pesFilterParams.pid     = vpid;
	 pesFilterParams.input   = DMX_IN_FRONTEND;
	 pesFilterParams.output  = DMX_OUT_DECODER;
	 pesFilterParams.pes_type = DMX_PES_VIDEO;
	 pesFilterParams.flags   = DMX_IMMEDIATE_START;
	 if (ioctl(demux1, DMX_SET_PES_FILTER, &pesFilterParams) < 0){
	     perror("set_vpid");
	     return -1;
	 }

	 pesFilterParams.pid     = apid;
	 pesFilterParams.input   = DMX_IN_FRONTEND;
	 pesFilterParams.output  = DMX_OUT_DECODER;
	 pesFilterParams.pes_type = DMX_PES_AUDIO;
	 pesFilterParams.flags   = DMX_IMMEDIATE_START;
	 if (ioctl(demux2, DMX_SET_PES_FILTER, &pesFilterParams) < 0){
	     perror("set_apid");
	     return -1;
	 }

	 pesFilterParams.pid     = tpid;
	 pesFilterParams.input   = DMX_IN_FRONTEND;
	 pesFilterParams.output  = DMX_OUT_DECODER;
	 pesFilterParams.pes_type = DMX_PES_TELETEXT;
	 pesFilterParams.flags   = DMX_IMMEDIATE_START;
	 if (ioctl(demux3, DMX_SET_PES_FILTER, &pesFilterParams) < 0){
	     perror("set_tpid");
	     return -1;
	 }

	 return has_signal(fds);
     }

The program assumes that you are using a universal LNB and a standard
DiSEqC switch with up to 4 addresses. Of course, you could build in some
more checking if tuning was successful and maybe try to repeat the
tuning process. Depending on the external hardware, i.e. LNB and DiSEqC
switch, and weather conditions this may be necessary.


.. _the_dvr_device:

Example: The DVR device
========================

The following program code shows how to use the DVR device for
recording.


.. code-block:: c

     #include <sys/ioctl.h>
     #include <stdio.h>
     #include <stdint.h>
     #include <sys/types.h>
     #include <sys/stat.h>
     #include <fcntl.h>
     #include <time.h>
     #include <unistd.h>

     #include <linux/dvb/dmx.h>
     #include <linux/dvb/video.h>
     #include <sys/poll.h>
     #define DVR "/dev/dvb/adapter0/dvr1"
     #define AUDIO "/dev/dvb/adapter0/audio1"
     #define VIDEO "/dev/dvb/adapter0/video1"

     #define BUFFY (188*20)
     #define MAX_LENGTH (1024*1024*5) /* record 5MB */


     /* switch the demuxes to recording, assuming the transponder is tuned */

     /* demux1, demux2: file descriptor of video and audio filters */
     /* vpid, apid:     PIDs of video and audio channels           */

     int switch_to_record(int demux1, int demux2, uint16_t vpid, uint16_t apid)
     {
	 struct dmx_pes_filter_params pesFilterParams;

	 if (demux1 < 0){
	     if ((demux1=open(DMX, O_RDWR|O_NONBLOCK))
		 < 0){
		 perror("DEMUX DEVICE: ");
		 return -1;
	     }
	 }

	 if (demux2 < 0){
	     if ((demux2=open(DMX, O_RDWR|O_NONBLOCK))
		 < 0){
		 perror("DEMUX DEVICE: ");
		 return -1;
	     }
	 }

	 pesFilterParams.pid = vpid;
	 pesFilterParams.input = DMX_IN_FRONTEND;
	 pesFilterParams.output = DMX_OUT_TS_TAP;
	 pesFilterParams.pes_type = DMX_PES_VIDEO;
	 pesFilterParams.flags = DMX_IMMEDIATE_START;
	 if (ioctl(demux1, DMX_SET_PES_FILTER, &pesFilterParams) < 0){
	     perror("DEMUX DEVICE");
	     return -1;
	 }
	 pesFilterParams.pid = apid;
	 pesFilterParams.input = DMX_IN_FRONTEND;
	 pesFilterParams.output = DMX_OUT_TS_TAP;
	 pesFilterParams.pes_type = DMX_PES_AUDIO;
	 pesFilterParams.flags = DMX_IMMEDIATE_START;
	 if (ioctl(demux2, DMX_SET_PES_FILTER, &pesFilterParams) < 0){
	     perror("DEMUX DEVICE");
	     return -1;
	 }
	 return 0;
     }

     /* start recording MAX_LENGTH , assuming the transponder is tuned */

     /* demux1, demux2: file descriptor of video and audio filters */
     /* vpid, apid:     PIDs of video and audio channels           */
     int record_dvr(int demux1, int demux2, uint16_t vpid, uint16_t apid)
     {
	 int i;
	 int len;
	 int written;
	 uint8_t buf[BUFFY];
	 uint64_t length;
	 struct pollfd pfd[1];
	 int dvr, dvr_out;

	 /* open dvr device */
	 if ((dvr = open(DVR, O_RDONLY|O_NONBLOCK)) < 0){
		 perror("DVR DEVICE");
		 return -1;
	 }

	 /* switch video and audio demuxes to dvr */
	 printf ("Switching dvr on\\n");
	 i = switch_to_record(demux1, demux2, vpid, apid);
	 printf("finished: ");

	 printf("Recording %2.0f MB of test file in TS format\\n",
	    MAX_LENGTH/(1024.0*1024.0));
	 length = 0;

	 /* open output file */
	 if ((dvr_out = open(DVR_FILE,O_WRONLY|O_CREAT
		      |O_TRUNC, S_IRUSR|S_IWUSR
		      |S_IRGRP|S_IWGRP|S_IROTH|
		      S_IWOTH)) < 0){
	     perror("Can't open file for dvr test");
	     return -1;
	 }

	 pfd[0].fd = dvr;
	 pfd[0].events = POLLIN;

	 /* poll for dvr data and write to file */
	 while (length < MAX_LENGTH ) {
	     if (poll(pfd,1,1)){
		 if (pfd[0].revents & POLLIN){
		     len = read(dvr, buf, BUFFY);
		     if (len < 0){
			 perror("recording");
			 return -1;
		     }
		     if (len > 0){
			 written = 0;
			 while (written < len)
			     written +=
				 write (dvr_out,
				    buf, len);
			 length += len;
			 printf("written %2.0f MB\\r",
			    length/1024./1024.);
		     }
		 }
	     }
	 }
	 return 0;
     }
