On Sat, Dec 10, 2005 at 07:56:20PM +0100, Johannes Stezenbach wrote: > On Wed, Dec 07, 2005, Dr. Werner Fink wrote: > > just a few changes to the current szap found in the CVS of > > linuxtv.org to support TV channels with AC3 audio channels. > > > + if ((audiofd = open(auddev, O_RDWR)) < 0) { > > perror("opening audio demux failed"); > > - close(videofd); > > + close(dmxfd); > > close(fefd); > > return FALSE; > > } > > It seems you open the audio device unconditionally which makes > this patch incompatible with budget cards. > > Can you fix that up? Hopefully it is OK to test for dvr == 0 and use audiofd == -1 to detect failed opening of the audio device. I've also added a patch for some cleanings to test_audio.c, test_front.c , test_switch.c, and test_video.c in a second patch. -------------------------------* snip *--------------------------------- --- util/szap/szap.c +++ util/szap/szap.c 2005-12-12 12:51:40.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 = -1, 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,24 +329,20 @@ 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) { - perror("opening audio demux failed"); - close(videofd); - close(fefd); - return FALSE; - } + if (dvr == 0) /* DMX_OUT_DECODER */ + audiofd = open(auddev, O_RDWR); if (rec_psi){ if ((patfd = open(dmxdev, O_RDWR)) < 0) { perror("opening audio demux failed"); close(audiofd); - close(videofd); + close(dmxfd); close(fefd); return FALSE; } @@ -351,7 +351,7 @@ perror("opening audio demux failed"); close(patfd); close(audiofd); - close(videofd); + close(dmxfd); close(fefd); return FALSE; } @@ -375,8 +375,10 @@ 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)) + if (audiofd >= 0) + (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) { @@ -399,8 +401,9 @@ if (!interactive) { close(patfd); close(pmtfd); - close(audiofd); - close(videofd); + if (audiofd >= 0) + close(audiofd); + close(dmxfd); close(fefd); } @@ -411,7 +414,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 +508,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 +535,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 +600,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 +689,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; -------------------------------* snap *--------------------------------- -------------------------------* snip *--------------------------------- --- test/test_audio.c +++ test/test_audio.c 2005-12-12 18:02:22.000000000 +0100 @@ -40,7 +40,7 @@ { int ans; - if ( (ans = ioctl(fd,AUDIO_STOP,0) < 0)){ + if ((ans = ioctl(fd,AUDIO_STOP,0)) < 0) { perror("AUDIO STOP: "); return -1; } @@ -52,7 +52,7 @@ { int ans; - if ( (ans = ioctl(fd,AUDIO_PLAY) < 0)){ + if ((ans = ioctl(fd,AUDIO_PLAY)) < 0) { perror("AUDIO PLAY: "); return -1; } @@ -65,7 +65,7 @@ { int ans; - if ( (ans = ioctl(fd,AUDIO_PAUSE) < 0)){ + if ((ans = ioctl(fd,AUDIO_PAUSE)) < 0) { perror("AUDIO PAUSE: "); return -1; } @@ -78,7 +78,7 @@ { int ans; - if ( (ans = ioctl(fd,AUDIO_CONTINUE) < 0)){ + if ((ans = ioctl(fd,AUDIO_CONTINUE)) < 0) { perror("AUDIO CONTINUE: "); return -1; } @@ -90,7 +90,7 @@ { int ans; - if ( (ans = ioctl(fd,AUDIO_SELECT_SOURCE, source) < 0)){ + if ((ans = ioctl(fd,AUDIO_SELECT_SOURCE, source)) < 0) { perror("AUDIO SELECT SOURCE: "); return -1; } @@ -104,7 +104,7 @@ { int ans; - if ( (ans = ioctl(fd,AUDIO_SET_MUTE, state) < 0)){ + if ((ans = ioctl(fd,AUDIO_SET_MUTE, state)) < 0) { perror("AUDIO SET MUTE: "); return -1; } @@ -116,7 +116,7 @@ { int ans; - if ( (ans = ioctl(fd,AUDIO_SET_AV_SYNC, state) < 0)){ + if ((ans = ioctl(fd,AUDIO_SET_AV_SYNC, state)) < 0) { perror("AUDIO SET AV SYNC: "); return -1; } @@ -128,8 +128,8 @@ { int ans; - if ( (ans = ioctl(fd,AUDIO_SET_BYPASS_MODE, mode) < 0)){ - perror("AUDIO SET BYPASS MODE: "); + if ((ans = ioctl(fd,AUDIO_SET_BYPASS_MODE, mode)) < 0) { + printf("AUDIO SET BYPASS MODE not implemented?\n"); return -1; } @@ -141,7 +141,7 @@ { int ans; - if ( (ans = ioctl(fd,AUDIO_CHANNEL_SELECT, select) < 0)){ + if ((ans = ioctl(fd,AUDIO_CHANNEL_SELECT, select)) < 0) { perror("AUDIO CHANNEL SELECT: "); return -1; } @@ -154,7 +154,7 @@ struct audio_status stat; int ans; - if ( (ans = ioctl(fd,AUDIO_GET_STATUS, &stat) < 0)){ + if ((ans = ioctl(fd,AUDIO_GET_STATUS, &stat)) < 0) { perror("AUDIO GET STATUS: "); return -1; } @@ -321,7 +321,7 @@ audioSetMute(fd,mute); - // audioSetBypassMode(fd,false); // not implemented + audioSetBypassMode(fd,false); //audioContinue(fd); audioSelectSource(fd,AUDIO_SOURCE_MEMORY); audioPlay(fd); --- test/test_front.c +++ test/test_front.c 2005-12-12 12:43:00.000000000 +0100 @@ -40,7 +40,7 @@ { int ans; - if ( (ans = ioctl(fd,OST_SELFTEST,0) < 0)){ + if ((ans = ioctl(fd,OST_SELFTEST,0)) < 0) { perror("OST SELF TEST: "); return -1; } @@ -52,7 +52,7 @@ { int ans; - if ( (ans = ioctl(fd,OST_SET_POWER_STATE,state) < 0)){ + if ((ans = ioctl(fd,OST_SET_POWER_STATE,state)) < 0) { perror("OST SET POWER STATE: "); return -1; } @@ -64,7 +64,7 @@ { int ans; - if ( (ans = ioctl(fd,OST_GET_POWER_STATE,state) < 0)){ + if ((ans = ioctl(fd,OST_GET_POWER_STATE,state)) < 0) { perror("OST GET POWER STATE: "); return -1; } @@ -95,7 +95,7 @@ int ans; feStatus stat; - if ( (ans = ioctl(fd,FE_READ_STATUS,&stat) < 0)){ + if ((ans = ioctl(fd,FE_READ_STATUS,&stat)) < 0) { perror("FE READ STATUS: "); return -1; } @@ -116,7 +116,7 @@ { int ans; - if ( (ans = ioctl(fd,FE_READ_BER, ber) < 0)){ + if ((ans = ioctl(fd,FE_READ_BER, ber)) < 0) { perror("FE READ_BER: "); return -1; } @@ -129,7 +129,7 @@ { int ans; - if ( (ans = ioctl(fd,FE_READ_SIGNAL_STRENGTH, strength) < 0)){ + if ((ans = ioctl(fd,FE_READ_SIGNAL_STRENGTH, strength)) < 0) { perror("FE READ SIGNAL STRENGTH: "); return -1; } @@ -142,7 +142,7 @@ { int ans; - if ( (ans = ioctl(fd,FE_READ_SNR, snr) < 0)){ + if ((ans = ioctl(fd,FE_READ_SNR, snr)) < 0) { perror("FE READ_SNR: "); return -1; } @@ -156,7 +156,7 @@ { int ans; - if ( (ans = ioctl(fd,FE_READ_UNCORRECTED_BLOCKS, ucb) < 0)){ + if ((ans = ioctl(fd,FE_READ_UNCORRECTED_BLOCKS, ucb)) < 0) { perror("FE READ UNCORRECTED BLOCKS: "); return -1; } @@ -169,7 +169,7 @@ { int ans; - if ( (ans = ioctl(fd,FE_GET_NEXT_FREQUENCY, nfr) < 0)){ + if ((ans = ioctl(fd,FE_GET_NEXT_FREQUENCY, nfr)) < 0) { perror("FE GET NEXT FREQUENCY: "); return -1; } @@ -182,7 +182,7 @@ { int ans; - if ( (ans = ioctl(fd,FE_GET_NEXT_SYMBOL_RATE, nsr) < 0)){ + if ((ans = ioctl(fd,FE_GET_NEXT_SYMBOL_RATE, nsr)) < 0) { perror("FE GET NEXT SYMBOL RATE: "); return -1; } @@ -195,7 +195,7 @@ { int ans; - if ( (ans = ioctl(fd,QPSK_TUNE, param) < 0)){ + if ((ans = ioctl(fd,QPSK_TUNE, param)) < 0) { perror("QPSK TUNE: "); return -1; } @@ -207,7 +207,7 @@ { int ans; - if ( (ans = ioctl(fd,QPSK_GET_EVENT, event) < 0)){ + if ((ans = ioctl(fd,QPSK_GET_EVENT, event)) < 0) { perror("QPSK GET EVENT: "); return -1; } @@ -219,7 +219,7 @@ { int ans; - if ( (ans = ioctl(fd,QPSK_FE_INFO, info) < 0)){ + if ((ans = ioctl(fd,QPSK_FE_INFO, info)) < 0) { perror("QPSK FE INFO: "); return -1; } @@ -238,7 +238,7 @@ { int ans; - if ( (ans = ioctl(fd,SEC_GET_STATUS, state) < 0)){ + if ((ans = ioctl(fd,SEC_GET_STATUS, state)) < 0) { perror("QPSK GET EVENT: "); return -1; } --- test/test_switch.c +++ test/test_switch.c 2005-12-12 12:43:19.000000000 +0100 @@ -248,7 +248,7 @@ { int ans; - if ( (ans = ioctl(fd,FE_READ_STATUS,stat) < 0)){ + if ((ans = ioctl(fd,FE_READ_STATUS,stat)) < 0) { perror("FE READ STATUS: "); return -1; } --- test/test_video.c +++ test/test_video.c 2005-12-12 12:43:34.000000000 +0100 @@ -40,7 +40,7 @@ { int ans; - if ( (ans = ioctl(fd,VIDEO_STOP,0) < 0)){ + if ((ans = ioctl(fd,VIDEO_STOP,0)) < 0) { perror("VIDEO STOP: "); return -1; } @@ -52,7 +52,7 @@ { int ans; - if ( (ans = ioctl(fd,VIDEO_PLAY) < 0)){ + if ((ans = ioctl(fd,VIDEO_PLAY)) < 0) { perror("VIDEO PLAY: "); return -1; } @@ -65,7 +65,7 @@ { int ans; - if ( (ans = ioctl(fd,VIDEO_FREEZE) < 0)){ + if ((ans = ioctl(fd,VIDEO_FREEZE)) < 0) { perror("VIDEO FREEZE: "); return -1; } @@ -78,7 +78,7 @@ { int ans; - if ( (ans = ioctl(fd,VIDEO_CONTINUE) < 0)){ + if ((ans = ioctl(fd,VIDEO_CONTINUE)) < 0) { perror("VIDEO CONTINUE: "); return -1; } @@ -90,7 +90,7 @@ { int ans; - if ( (ans = ioctl(fd,VIDEO_SELECT_SOURCE, source) < 0)){ + if ((ans = ioctl(fd,VIDEO_SELECT_SOURCE, source)) < 0) { perror("VIDEO SELECT SOURCE: "); return -1; } @@ -104,7 +104,7 @@ { int ans; - if ( (ans = ioctl(fd,VIDEO_SET_BLANK, state) < 0)){ + if ((ans = ioctl(fd,VIDEO_SET_BLANK, state)) < 0) { perror("VIDEO SET BLANK: "); return -1; } @@ -116,7 +116,7 @@ { int ans; - if ( (ans = ioctl(fd,VIDEO_FAST_FORWARD, nframes) < 0)){ + if ((ans = ioctl(fd,VIDEO_FAST_FORWARD, nframes)) < 0) { perror("VIDEO FAST FORWARD: "); return -1; } @@ -128,7 +128,7 @@ { int ans; - if ( (ans = ioctl(fd,VIDEO_SLOWMOTION, nframes) < 0)){ + if ((ans = ioctl(fd,VIDEO_SLOWMOTION, nframes)) < 0) { perror("VIDEO SLOWMOTION: "); return -1; } @@ -141,7 +141,7 @@ struct video_status stat; int ans; - if ( (ans = ioctl(fd,VIDEO_GET_STATUS, &stat) < 0)){ + if ((ans = ioctl(fd,VIDEO_GET_STATUS, &stat)) < 0) { perror("VIDEO GET STATUS: "); return -1; } @@ -213,7 +213,7 @@ { int ans; - if ( (ans = ioctl(fd,VIDEO_STILLPICTURE, sp) < 0)){ + if ((ans = ioctl(fd,VIDEO_STILLPICTURE, sp)) < 0) { perror("VIDEO STILLPICTURE: "); return -1; } -------------------------------* snap *--------------------------------- 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