From e334ec438c1500f2529a2d944db5f442274ef7af Mon Sep 17 00:00:00 2001 From: Abramo Bagnara Date: Sun, 22 Apr 2001 14:44:23 +0000 Subject: [PATCH] Added support for con/pro distinction. Fixed pcm_name use --- ac3dec/ac3dec.c | 29 +++++++++++++++++------------ ac3dec/output.c | 25 ++++++++++++++++++------- ac3dec/output.h | 2 +- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/ac3dec/ac3dec.c b/ac3dec/ac3dec.c index 15f7ec3..649939c 100644 --- a/ac3dec/ac3dec.c +++ b/ac3dec/ac3dec.c @@ -50,7 +50,8 @@ static void help(void) printf(" -D,--device=NAME select PCM by NAME\n"); printf(" -4,--4ch four channels mode\n"); printf(" -6,--6ch six channels mode\n"); - printf(" -I,--iec958 raw IEC958 (S/PDIF) mode\n"); + printf(" -C,--iec958c raw IEC958 (S/PDIF) consumer mode\n"); + printf(" -P,--iec958p raw IEC958 (S/PDIF) professional mode\n"); printf(" -q,--quit quit mode\n"); } @@ -84,15 +85,15 @@ int main(int argc,char *argv[]) {"device", 1, NULL, 'D'}, {"4ch", 0, NULL, '4'}, {"6ch", 0, NULL, '6'}, - {"iec958", 0, NULL, 'I'}, - {"spdif", 0, NULL, 'I'}, + {"iec958c", 0, NULL, 'C'}, + {"spdif", 0, NULL, 'C'}, + {"iec958p", 0, NULL, 'P'}, {"quit", 0, NULL, 'q'}, {NULL, 0, NULL, 0}, }; ac3_config_t ac3_config; output_t out_config; int morehelp, loop = 0; - char *pcm_name = NULL; bzero(&ac3_config, sizeof(ac3_config)); ac3_config.fill_buffer_callback = fill_buffer; @@ -103,13 +104,13 @@ int main(int argc,char *argv[]) out_config.bits = 16; out_config.rate = 48000; out_config.channels = 2; - out_config.spdif = 0; + out_config.spdif = SPDIF_NONE; morehelp = 0; while (1) { int c; - if ((c = getopt_long(argc, argv, "hvD:46Iq", long_option, NULL)) < 0) + if ((c = getopt_long(argc, argv, "hvD:46CPq", long_option, NULL)) < 0) break; switch (c) { case 'h': @@ -119,19 +120,23 @@ int main(int argc,char *argv[]) printf("ac3dec version " VERSION "\n"); return 1; case 'D': - pcm_name = optarg; + out_config.pcm_name = optarg; break; case '4': - if (!out_config.spdif) + if (out_config.spdif != SPDIF_NONE) ac3_config.num_output_ch = 4; break; case '6': - if (!out_config.spdif) + if (out_config.spdif != SPDIF_NONE) ac3_config.num_output_ch = 6; break; - case 'I': + case 'C': ac3_config.num_output_ch = 2; - out_config.spdif = 1; + out_config.spdif = SPDIF_CON; + break; + case 'P': + ac3_config.num_output_ch = 2; + out_config.spdif = SPDIF_PRO; break; case 'q': ac3_config.flags |= AC3_QUIET; @@ -163,7 +168,7 @@ int main(int argc,char *argv[]) optind++; loop++; } - if (!out_config.spdif) { + if (out_config.spdif == SPDIF_NONE) { ac3_frame_t *ac3_frame; ac3_init(&ac3_config); ac3_frame = ac3_decode_frame(); diff --git a/ac3dec/output.c b/ac3dec/output.c index c905582..36934c3 100644 --- a/ac3dec/output.c +++ b/ac3dec/output.c @@ -131,7 +131,7 @@ int output_open(output_t *output) goto __close; } - if (output->spdif) { + if (output->spdif != SPDIF_NONE) { snd_pcm_info_t *info; snd_ctl_elem_value_t *ctl; snd_ctl_t *ctl_handle; @@ -140,12 +140,23 @@ int output_open(output_t *output) snd_aes_iec958_t spdif; memset(&spdif, 0, sizeof(spdif)); - spdif.status[0] = IEC958_AES0_NONAUDIO | - IEC958_AES0_CON_EMPHASIS_NONE; - spdif.status[1] = IEC958_AES1_CON_ORIGINAL | - IEC958_AES1_CON_PCM_CODER; - spdif.status[2] = 0; - spdif.status[3] = IEC958_AES3_CON_FS_48000; + if (output->spdif == SPDIF_PRO) { + spdif.status[0] = (IEC958_AES0_PROFESSIONAL | + IEC958_AES0_NONAUDIO | + IEC958_AES0_PRO_EMPHASIS_NONE | + IEC958_AES0_PRO_FS_48000); + spdif.status[1] = (IEC958_AES1_PRO_MODE_NOTID | + IEC958_AES1_PRO_USERBITS_NOTID); + spdif.status[2] = IEC958_AES2_PRO_WORDLEN_NOTID; + spdif.status[3] = 0; + } else { + spdif.status[0] = (IEC958_AES0_NONAUDIO | + IEC958_AES0_CON_EMPHASIS_NONE); + spdif.status[1] = (IEC958_AES1_CON_ORIGINAL | + IEC958_AES1_CON_PCM_CODER); + spdif.status[2] = 0; + spdif.status[3] = IEC958_AES3_CON_FS_48000; + } snd_pcm_info_alloca(&info); if ((err = snd_pcm_info(pcm, info)) < 0) { fprintf(stderr, "pcm info error: %s", snd_strerror(err)); diff --git a/ac3dec/output.h b/ac3dec/output.h index 1600ed2..495d55a 100644 --- a/ac3dec/output.h +++ b/ac3dec/output.h @@ -29,8 +29,8 @@ typedef struct { int bits; int rate; int channels; - int spdif: 1; int quiet: 1; + enum {SPDIF_NONE = 0, SPDIF_CON, SPDIF_PRO} spdif; } output_t; int output_open(output_t *output); -- 2.47.1