Hi, just a few changes to the current szap found in the CVS of linuxtv.org to support TV channels with AC3 audio channels. --------------------------* snip *-------------------------------- --- util/szap/szap.c +++ util/szap/szap.c 2005-12-06 16:29:57.000000000 +0100 @@ -46,6 +46,7 @@ #include <linux/dvb/frontend.h> #include <linux/dvb/dmx.h> +#include <linux/dvb/audio.h> #include "lnb.h" #ifndef TRUE @@ -65,6 +66,7 @@ #define FRONTENDDEVICE "/dev/dvb/adapter%d/frontend%d" #define DEMUXDEVICE "/dev/dvb/adapter%d/demux%d" +#define AUDIODEVICE "/dev/dvb/adapter%d/audio%d" static struct lnb_types_st lnb_type; @@ -80,6 +82,7 @@ " -f number : use given frontend (default 0)\n" " -d number : use given demux (default 0)\n" " -c file : read channels list from 'file'\n" + " -b : enable Audio Bypass (default no)\n" " -x : exit after tuning\n" " -r : set up /dev/dvb/adapterX/dvr0 for TS recording\n" " -l lnb-type (DVB-S Only) (use -l help to print types) or \n" @@ -292,10 +295,10 @@ int zap_to(unsigned int adapter, unsigned int frontend, unsigned int demux, unsigned int sat_no, unsigned int freq, unsigned int pol, unsigned int sr, unsigned int vpid, unsigned int apid, int sid, - int dvr, int rec_psi) + int dvr, int rec_psi, int bypass) { - char fedev[128], dmxdev[128]; - static int fefd, videofd, audiofd, patfd, pmtfd; + char fedev[128], dmxdev[128], auddev[128]; + static int fefd, dmxfd, audiofd, patfd, pmtfd; int pmtpid; uint32_t ifreq; int hiband, result; @@ -304,6 +307,7 @@ if (!fefd) { snprintf(fedev, sizeof(fedev), FRONTENDDEVICE, adapter, frontend); snprintf(dmxdev, sizeof(dmxdev), DEMUXDEVICE, adapter, demux); + snprintf(auddev, sizeof(auddev), AUDIODEVICE, adapter, demux); printf("using '%s' and '%s'\n", fedev, dmxdev); if ((fefd = open(fedev, O_RDWR | O_NONBLOCK)) < 0) { @@ -325,15 +329,15 @@ return FALSE; } - if ((videofd = open(dmxdev, O_RDWR)) < 0) { + if ((dmxfd = open(dmxdev, O_RDWR)) < 0) { perror("opening video demux failed"); close(fefd); return FALSE; } - if ((audiofd = open(dmxdev, O_RDWR)) < 0) { + if ((audiofd = open(auddev, O_RDWR)) < 0) { perror("opening audio demux failed"); - close(videofd); + close(dmxfd); close(fefd); return FALSE; } @@ -342,7 +346,7 @@ if ((patfd = open(dmxdev, O_RDWR)) < 0) { perror("opening audio demux failed"); close(audiofd); - close(videofd); + close(dmxfd); close(fefd); return FALSE; } @@ -351,7 +355,7 @@ perror("opening audio demux failed"); close(patfd); close(audiofd); - close(videofd); + close(dmxfd); close(fefd); return FALSE; } @@ -375,8 +379,9 @@ if (diseqc(fefd, sat_no, pol, hiband)) if (do_tune(fefd, ifreq, sr)) - if (set_demux(videofd, vpid, DMX_PES_VIDEO, dvr)) - if (set_demux(audiofd, apid, DMX_PES_AUDIO, dvr)) { + if (set_demux(dmxfd, vpid, DMX_PES_VIDEO, dvr)) + (void)ioctl(audiofd, AUDIO_SET_BYPASS_MODE, bypass); + if (set_demux(dmxfd, apid, DMX_PES_AUDIO, dvr)) { if (rec_psi) { pmtpid = get_pmt_pid(dmxdev, sid); if (pmtpid < 0) { @@ -400,7 +405,7 @@ close(patfd); close(pmtfd); close(audiofd); - close(videofd); + close(dmxfd); close(fefd); } @@ -411,7 +416,8 @@ static int read_channels(const char *filename, int list_channels, uint32_t chan_no, const char *chan_name, unsigned int adapter, unsigned int frontend, - unsigned int demux, int dvr, int rec_psi) + unsigned int demux, int dvr, int rec_psi, + int bypass) { FILE *cfp; char buf[4096]; @@ -504,6 +510,18 @@ if (!(field = strsep(&tmp, ":"))) goto syntax_err; + p = strchr(field, ';'); + + if (p) { + *p = '\0'; + p++; + if (bypass) { + if (!p || !*p) + goto syntax_err; + field = p; + } + } + apid = strtoul(field, NULL, 0); if (!apid) apid = 0x1fff; @@ -519,8 +537,8 @@ fclose(cfp); - ret = zap_to(adapter, frontend, demux, - sat_no, freq * 1000, pol, sr, vpid, apid, sid, dvr, rec_psi); + ret = zap_to(adapter, frontend, demux, sat_no, freq * 1000, + pol, sr, vpid, apid, sid, dvr, rec_psi, bypass); if (interactive) goto again; @@ -584,16 +602,20 @@ unsigned int chan_no = 0; const char *chan_name = NULL; unsigned int adapter = 0, frontend = 0, demux = 0, dvr = 0, rec_psi = 0; + int bypass = 0; int opt, copt = 0; lnb_type = *lnb_enum(0); - while ((opt = getopt(argc, argv, "hqrpn:a:f:d:c:l:xi")) != -1) { + while ((opt = getopt(argc, argv, "hqrpn:a:f:d:c:l:xib")) != -1) { switch (opt) { case '?': case 'h': default: bad_usage(argv[0], 0); + case 'b': + bypass = 1; + break; case 'q': list_channels = 1; break; @@ -669,7 +691,7 @@ dvr=1; if (!read_channels(chanfile, list_channels, chan_no, chan_name, - adapter, frontend, demux, dvr, rec_psi)) + adapter, frontend, demux, dvr, rec_psi, bypass)) return TRUE; return FALSE; --- util/szap/channels-conf/dvb-s/Astra-19.2E +++ util/szap/channels-conf/dvb-s/Astra-19.2E 2005-12-06 16:16:21.000000000 +0100 @@ -1,6 +1,6 @@ Das Erste:11837:h:0:27500:101:102:28106 -ZDF:11954:h:0:27500:110:120:28006 -3sat:11954:h:0:27500:210:220:28007 +ZDF:11954:h:0:27500:110:120;125:28006 +3sat:11954:h:0:27500:210:220;225:28007 EinsMuXx:12110:h:0:27500:301:302:28203 EinsFestival:12110:h:0:27500:201:202:28202 EinsExtra:12110:h:0:27500:101:102:28201 @@ -22,8 +22,8 @@ Phoenix:11837:h:0:27500:901:902:28114 DW-tv:10786:v:0:21997:305:306:9005 RTL Television:12188:h:0:27500:163:104:12003 -SAT.1:12480:v:0:27500:1791:1792:46 -ProSieben:12480:v:0:27500:255:256:898 +SAT.1:12480:v:0:27500:1791:1792;1795:46 +ProSieben:12480:v:0:27500:255:256;257:898 RTL2:12188:h:0:27500:166:128:12020 Super RTL:12188:h:0:27500:165:120:12040 KABEL1:12480:v:0:27500:511:512:899 --------------------------* snap *-------------------------------- Just to be able to test the new feature of the firmware 0x2622 without using VDR. Werner -- AC3 loop through sound card http://bitstreamout.sourceforge.net/ Howto http://www.vdr-portal.de/board/thread.php?threadid=1958 ------------------------------------------------------------------ "Having a smoking section in a restaurant is like having a peeing section in a swimming pool." -- Edward Burr