Added --zero option.
Added leadin for AC3 SPDIF.
#include "libac3/ac3.h"
#include "output.h"
-void
-init_spdif(void);
-int
-output_spdif(uint_8 *data_start, uint_8 *data_end, int quiet);
+void init_spdif(void);
+int output_spdif_zero(int frames);
+int output_spdif_leadin(void);
+int output_spdif(uint_8 *data_start, uint_8 *data_end, int quiet);
static int end_flag = 0;
static int quiet = 0;
printf(" -C,--iec958c raw IEC958 (S/PDIF) consumer mode\n");
printf(" -P,--iec958p raw IEC958 (S/PDIF) professional mode\n");
printf(" -R,--iec958r raw IEC958 (S/PDIF) PCM\n");
+ printf(" -Z,--zero=# add # zero-AC3-frames before stream\n");
printf(" -q,--quit quit mode\n");
}
{"spdif", 0, NULL, 'C'},
{"iec958p", 0, NULL, 'P'},
{"iec958r", 0, NULL, 'R'},
+ {"zero", 1, NULL, 'Z'},
{"quit", 0, NULL, 'q'},
{NULL, 0, NULL, 0},
};
ac3_config_t ac3_config;
output_t out_config;
int morehelp, loop = 0;
+ int zero = 0;
bzero(&ac3_config, sizeof(ac3_config));
ac3_config.fill_buffer_callback = fill_buffer;
while (1) {
int c;
- if ((c = getopt_long(argc, argv, "hvcD:46CPRq", long_option, NULL)) < 0)
+ if ((c = getopt_long(argc, argv, "hvcD:46CPRZq", long_option, NULL)) < 0)
break;
switch (c) {
case 'h':
ac3_config.num_output_ch = 2;
out_config.spdif = SPDIF_PCM;
break;
+ case 'Z':
+ zero = atoi(optarg);
+ break;
case 'q':
ac3_config.flags |= AC3_QUIET;
out_config.quiet = 1;
signal(SIGINT, ac3dec_signal_handler);
signal(SIGTERM, ac3dec_signal_handler);
signal(SIGABRT, ac3dec_signal_handler);
+ if (zero > 0)
+ output_spdif_zero(zero);
+ else
+ output_spdif_leadin();
while (fill_buffer(&start, &end) > 0)
if (output_spdif(start, end, quiet) < 0)
break;
done_banner = 0;
}
+int
+output_spdif_zero(int frames)
+{
+ int res;
+
+ buf[0] = 0x72; buf[1] = 0xf8; // spdif syncword
+ buf[2] = 0x1f; buf[3] = 0x4e; // ..............
+ buf[4] = 0x00; // null frame (no data)
+ buf[5] = 7 << 5; // stream = 7
+ buf[6] = 0x00; buf[7] = 0x00; // frame size
+ memset(&buf[8], 0, BLOCK_SIZE - 8);
+ while (frames-- > 0) {
+ res = output_play((short *)buf, BLOCK_SIZE / 2 / 2); /* 2 channels, 16-bit samples */
+ if (res < 0)
+ return res;
+ }
+ return 0;
+}
+
+int
+output_spdif_leadin(void)
+{
+ memset(buf, 0, 8);
+ return output_play((short *)buf, 8);
+}
+
int
output_spdif(uint8_t *data_start, uint8_t *data_end, int quiet)
{
- unsigned short *sbuf = (unsigned short *)buf;
int ret = 0, res;
while(buffer_syncframe(&syncinfo, &data_start, data_end))
{
- sbuf[0] = 0xf872; //spdif syncword
- sbuf[1] = 0x4e1f; // .............
- sbuf[2] = 0x0001; // AC3 data
- sbuf[3] = syncinfo.frame_size * 16;
- sbuf[4] = 0x0b77; // AC3 syncwork
-
- if (!done_banner) {
+ buf[0] = 0x72; buf[1] = 0xf8; // spdif syncword
+ buf[2] = 0x1f; buf[3] = 0x4e; // ..............
+ buf[4] = 0x01; // AC3 data
+ buf[5] = buf[10] >> 5; // bsmod, stream = 0
+ buf[6] = (syncinfo.frame_size * 16) & 0xff;
+ buf[7] = ((syncinfo.frame_size * 16) >> 8) & 0xff;
+ buf[8] = 0x77; buf[9] = 0x0b; // AC3 syncwork
+
+ if (!done_banner && !quiet) {
fprintf(stdout,"AC3 Stream ");
fprintf(stdout,"%2.1f KHz",syncinfo.sampling_rate * 1e-3);
fprintf(stdout,"%4d kbps",syncinfo.bit_rate);
done_banner = 1;
}
+#ifndef WORDS_BIGENDIAN
// extract_ac3 seems to write swabbed data
swab(&buf[10], &buf[10], syncinfo.frame_size * 2 - 2);
- res = output_play(sbuf, BLOCK_SIZE / 2 / 2); /* 2 channels, 16-bit samples */
+#endif
+ res = output_play((short *)buf, BLOCK_SIZE / 2 / 2); /* 2 channels, 16-bit samples */
ret = ret < 0 ? ret : res;
bzero(buf,BLOCK_SIZE);
}
@BOTTOM@
+
/* Architecture defines */
#undef __i386__
#undef __alpha__
#undef __ppc__
#undef __sparc__
+
+/* Big-Endian */
+#undef WORDS_BIGENDIAN
/* config.h.in. Generated automatically from configure.in by autoheader. */
+/* Define if your processor stores words with the most significant
+ byte first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
+/* Define if you have the asound library (-lasound). */
+#undef HAVE_LIBASOUND
+
/* Name of package */
#undef PACKAGE
/* Version number of package */
#undef VERSION
+
/* Architecture defines */
#undef __i386__
#undef __alpha__
#undef __ppc__
#undef __sparc__
+
+/* Big-Endian */
+#undef WORDS_BIGENDIAN
AC_PROG_GCC_TRADITIONAL
AC_PROG_RANLIB
-AC_CHECK_LIB(ossaudio, _oss_ioctl, LIBS="$LIBS -lossaudio")
+AC_C_BIGENDIAN
AM_PATH_ALSA(0.9.0)
#!/bin/sh
aclocal $ACLOCAL_FLAGS
+autoheader
automake --add-missing
autoconf
./configure $*