Blame iecset/iecbits.c

Packit Service a9274b
/*
Packit Service a9274b
   iecdump - dump IEC958 status bits on ALSA
Packit Service a9274b
   Copyright (C) 2003 by Takashi Iwai <tiwai@suse.de>
Packit Service a9274b
Packit Service a9274b
   This program is free software; you can redistribute it and/or
Packit Service a9274b
   modify it under the terms of the GNU General Public License
Packit Service a9274b
   as published by the Free Software Foundation; either version 2
Packit Service a9274b
   of the License, or (at your option) any later version.
Packit Service a9274b
   
Packit Service a9274b
   This program is distributed in the hope that it will be useful,
Packit Service a9274b
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service a9274b
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service a9274b
   GNU General Public License for more details.
Packit Service a9274b
   
Packit Service a9274b
   You should have received a copy of the GNU General Public License
Packit Service a9274b
   along with this program; if not, write to the Free Software
Packit Service a9274b
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Packit Service a9274b
 */
Packit Service a9274b
Packit Service a9274b
#include <stdio.h>
Packit Service a9274b
#include <alsa/asoundlib.h>
Packit Service a9274b
Packit Service a9274b
struct category_str {
Packit Service a9274b
	int val;
Packit Service a9274b
	const char *name;
Packit Service a9274b
};
Packit Service a9274b
Packit Service a9274b
static const struct category_str con_category[] = {
Packit Service a9274b
	{ IEC958_AES1_CON_GENERAL, "general" },
Packit Service a9274b
Packit Service a9274b
	{ IEC958_AES1_CON_IEC908_CD, "CD" },
Packit Service a9274b
	{ IEC958_AES1_CON_NON_IEC908_CD, "non-IEC908 CD" },
Packit Service a9274b
	{ IEC958_AES1_CON_MINI_DISC, "Mini-Disc" },
Packit Service a9274b
	{ IEC958_AES1_CON_DVD, "DVD" },
Packit Service a9274b
Packit Service a9274b
	{ IEC958_AES1_CON_PCM_CODER, "PCM coder" },
Packit Service a9274b
	{ IEC958_AES1_CON_MIXER, "digital signal mixer" },
Packit Service a9274b
	{ IEC958_AES1_CON_RATE_CONVERTER, "rate converter" },
Packit Service a9274b
	{ IEC958_AES1_CON_SAMPLER, "sampler" },
Packit Service a9274b
	{ IEC958_AES1_CON_DSP, "digital sound processor" },
Packit Service a9274b
Packit Service a9274b
	{ IEC958_AES1_CON_DAT, "DAT" },
Packit Service a9274b
	{ IEC958_AES1_CON_VCR, "VCR" },
Packit Service a9274b
	{ IEC958_AES1_CON_DCC, "DCC" },
Packit Service a9274b
	{ IEC958_AES1_CON_MAGNETIC_DISC, "magnetic disc" },
Packit Service a9274b
Packit Service a9274b
	{ IEC958_AES1_CON_DAB_JAPAN, "digital audio broadcast (Japan)" },
Packit Service a9274b
	{ IEC958_AES1_CON_DAB_EUROPE, "digital audio broadcast (Europe)" },
Packit Service a9274b
	{ IEC958_AES1_CON_DAB_USA, "digital audio broadcast (USA)" },
Packit Service a9274b
	{ IEC958_AES1_CON_SOFTWARE, "software delivery" },
Packit Service a9274b
Packit Service a9274b
	{ IEC958_AES1_CON_SYNTHESIZER, "synthesizer" },
Packit Service a9274b
	{ IEC958_AES1_CON_MICROPHONE, "microphone" },
Packit Service a9274b
Packit Service a9274b
	{ IEC958_AES1_CON_ADC, "ADC without copyright information" },
Packit Service a9274b
Packit Service a9274b
	{ IEC958_AES1_CON_ADC_COPYRIGHT, "ADC with copyright information" },
Packit Service a9274b
Packit Service a9274b
	{ IEC958_AES1_CON_SOLIDMEM_DIGITAL_RECORDER_PLAYER, "flash memory recorder/player" },
Packit Service a9274b
Packit Service a9274b
	{ IEC958_AES1_CON_EXPERIMENTAL, "experimental" },
Packit Service a9274b
};
Packit Service a9274b
Packit Service a9274b
Packit Service a9274b
#define ARRAY_SIZE(x) (int)(sizeof(x)/sizeof(x[0]))
Packit Service a9274b
Packit Service a9274b
void dump_iec958(snd_aes_iec958_t *iec)
Packit Service a9274b
{
Packit Service a9274b
	int i;
Packit Service a9274b
Packit Service a9274b
	if (! (iec->status[0] & IEC958_AES0_PROFESSIONAL)) {
Packit Service a9274b
		/* consumer */
Packit Service a9274b
		printf("Mode: consumer\n");
Packit Service a9274b
		printf("Data: ");
Packit Service a9274b
		if (!(iec->status[0] & IEC958_AES0_NONAUDIO)) {
Packit Service a9274b
			printf("audio\n");
Packit Service a9274b
		} else {
Packit Service a9274b
			printf("non-audio\n");
Packit Service a9274b
		}
Packit Service a9274b
		printf("Rate: ");
Packit Service a9274b
		switch (iec->status[3] & IEC958_AES3_CON_FS) {
Packit Service a9274b
		case IEC958_AES3_CON_FS_22050:
Packit Service a9274b
			printf("22050 Hz\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES3_CON_FS_24000:
Packit Service a9274b
			printf("24000 Hz\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES3_CON_FS_32000:
Packit Service a9274b
			printf("32000 Hz\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES3_CON_FS_44100:
Packit Service a9274b
			printf("44100 Hz\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES3_CON_FS_48000:
Packit Service a9274b
			printf("48000 Hz\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES3_CON_FS_88200:
Packit Service a9274b
			printf("88200 Hz\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES3_CON_FS_96000:
Packit Service a9274b
			printf("96000 Hz\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES3_CON_FS_176400:
Packit Service a9274b
			printf("176400 Hz\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES3_CON_FS_192000:
Packit Service a9274b
			printf("192000 Hz\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES3_CON_FS_768000:
Packit Service a9274b
			printf("768000 Hz\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES3_CON_FS_NOTID:
Packit Service a9274b
			printf("not indicated\n");
Packit Service a9274b
			break;
Packit Service a9274b
		default:
Packit Service a9274b
			printf("unknown\n");
Packit Service a9274b
			break;
Packit Service a9274b
		}
Packit Service a9274b
		printf("Copyright: ");
Packit Service a9274b
		if (iec->status[0] & IEC958_AES0_CON_NOT_COPYRIGHT) {
Packit Service a9274b
			printf("permitted\n");
Packit Service a9274b
		} else {
Packit Service a9274b
			printf("protected\n");
Packit Service a9274b
		}
Packit Service a9274b
		printf("Emphasis: ");
Packit Service a9274b
		if ((iec->status[0] & IEC958_AES0_CON_EMPHASIS) != IEC958_AES0_CON_EMPHASIS_5015) {
Packit Service a9274b
			printf("none\n");
Packit Service a9274b
		} else {
Packit Service a9274b
			printf("50/15us\n");
Packit Service a9274b
		}
Packit Service a9274b
		printf("Category: ");
Packit Service a9274b
		for (i = 0; i < ARRAY_SIZE(con_category); i++) {
Packit Service a9274b
			if ((iec->status[1] & IEC958_AES1_CON_CATEGORY) == con_category[i].val) {
Packit Service a9274b
				printf("%s\n", con_category[i].name);
Packit Service a9274b
				break;
Packit Service a9274b
			}
Packit Service a9274b
		}
Packit Service a9274b
		if (i >= ARRAY_SIZE(con_category)) {
Packit Service a9274b
			printf("unknown 0x%x\n", iec->status[1] & IEC958_AES1_CON_CATEGORY);
Packit Service a9274b
		}
Packit Service a9274b
		printf("Original: ");
Packit Service a9274b
		if (iec->status[1] & IEC958_AES1_CON_ORIGINAL) {
Packit Service a9274b
			printf("original\n");
Packit Service a9274b
		} else {
Packit Service a9274b
			printf("1st generation\n");
Packit Service a9274b
		}
Packit Service a9274b
		printf("Clock: ");
Packit Service a9274b
		switch (iec->status[3] & IEC958_AES3_CON_CLOCK) {
Packit Service a9274b
		case IEC958_AES3_CON_CLOCK_1000PPM:
Packit Service a9274b
			printf("1000 ppm\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES3_CON_CLOCK_50PPM:
Packit Service a9274b
			printf("50 ppm\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES3_CON_CLOCK_VARIABLE:
Packit Service a9274b
			printf("variable pitch\n");
Packit Service a9274b
			break;
Packit Service a9274b
		default:
Packit Service a9274b
			printf("unknown\n");
Packit Service a9274b
			break;
Packit Service a9274b
		}
Packit Service a9274b
	} else {
Packit Service a9274b
		printf("Mode: professional\n");
Packit Service a9274b
		printf("Data: ");
Packit Service a9274b
		if (!(iec->status[0] & IEC958_AES0_NONAUDIO)) {
Packit Service a9274b
			printf("audio\n");
Packit Service a9274b
		} else {
Packit Service a9274b
			printf("non-audio\n");
Packit Service a9274b
		}
Packit Service a9274b
		printf("Rate: ");
Packit Service a9274b
		switch (iec->status[0] & IEC958_AES0_PRO_FS) {
Packit Service a9274b
		case IEC958_AES0_PRO_FS_44100:
Packit Service a9274b
			printf("44100 Hz\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES0_PRO_FS_48000:
Packit Service a9274b
			printf("48000 Hz\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES0_PRO_FS_32000:
Packit Service a9274b
			printf("32000 Hz\n");
Packit Service a9274b
			break;
Packit Service a9274b
		default:
Packit Service a9274b
			printf("unknown\n");
Packit Service a9274b
			break;
Packit Service a9274b
		}
Packit Service a9274b
		printf("Rate Locked: ");
Packit Service a9274b
		if (iec->status[0] & IEC958_AES0_PRO_FREQ_UNLOCKED)
Packit Service a9274b
			printf("no\n");
Packit Service a9274b
		else
Packit Service a9274b
			printf("yes\n");
Packit Service a9274b
		printf("Emphasis: ");
Packit Service a9274b
		switch (iec->status[0] & IEC958_AES0_PRO_EMPHASIS) {
Packit Service a9274b
		case IEC958_AES0_PRO_EMPHASIS_CCITT:
Packit Service a9274b
			printf("CCITT J.17\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES0_PRO_EMPHASIS_NONE:
Packit Service a9274b
			printf("none\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES0_PRO_EMPHASIS_5015:
Packit Service a9274b
			printf("50/15us\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES0_PRO_EMPHASIS_NOTID:
Packit Service a9274b
		default:
Packit Service a9274b
			printf("unknown\n");
Packit Service a9274b
			break;
Packit Service a9274b
		}
Packit Service a9274b
		printf("Stereophonic: ");
Packit Service a9274b
		if ((iec->status[1] & IEC958_AES1_PRO_MODE) == IEC958_AES1_PRO_MODE_STEREOPHONIC) {
Packit Service a9274b
			printf("stereo\n");
Packit Service a9274b
		} else {
Packit Service a9274b
			printf("not indicated\n");
Packit Service a9274b
		}
Packit Service a9274b
		printf("Userbits: ");
Packit Service a9274b
		switch (iec->status[1] & IEC958_AES1_PRO_USERBITS) {
Packit Service a9274b
		case IEC958_AES1_PRO_USERBITS_192:
Packit Service a9274b
			printf("192bit\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES1_PRO_USERBITS_UDEF:
Packit Service a9274b
			printf("user-defined\n");
Packit Service a9274b
			break;
Packit Service a9274b
		default:
Packit Service a9274b
			printf("unknown\n");
Packit Service a9274b
			break;
Packit Service a9274b
		}
Packit Service a9274b
		printf("Sample Bits: ");
Packit Service a9274b
		switch (iec->status[2] & IEC958_AES2_PRO_SBITS) {
Packit Service a9274b
		case IEC958_AES2_PRO_SBITS_20:
Packit Service a9274b
			printf("20 bit\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES2_PRO_SBITS_24:
Packit Service a9274b
			printf("24 bit\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES2_PRO_SBITS_UDEF:
Packit Service a9274b
			printf("user defined\n");
Packit Service a9274b
			break;
Packit Service a9274b
		default:
Packit Service a9274b
			printf("unknown\n");
Packit Service a9274b
			break;
Packit Service a9274b
		}
Packit Service a9274b
		printf("Word Length: ");
Packit Service a9274b
		switch (iec->status[2] & IEC958_AES2_PRO_WORDLEN) {
Packit Service a9274b
		case IEC958_AES2_PRO_WORDLEN_22_18:
Packit Service a9274b
			printf("22 bit or 18 bit\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES2_PRO_WORDLEN_23_19:
Packit Service a9274b
			printf("23 bit or 19 bit\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES2_PRO_WORDLEN_24_20:
Packit Service a9274b
			printf("24 bit or 20 bit\n");
Packit Service a9274b
			break;
Packit Service a9274b
		case IEC958_AES2_PRO_WORDLEN_20_16:
Packit Service a9274b
			printf("20 bit or 16 bit\n");
Packit Service a9274b
			break;
Packit Service a9274b
		default:
Packit Service a9274b
			printf("unknown\n");
Packit Service a9274b
			break;
Packit Service a9274b
		}
Packit Service a9274b
	}
Packit Service a9274b
}
Packit Service a9274b