iecbits.c (6833B)
1 /* 2 iecdump - dump IEC958 status bits on ALSA 3 Copyright (C) 2003 by Takashi Iwai <tiwai@suse.de> 4 5 This program is free software; you can redistribute it and/or 6 modify it under the terms of the GNU General Public License 7 as published by the Free Software Foundation; either version 2 8 of the License, or (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 */ 19 20 #include <stdio.h> 21 #include <alsa/asoundlib.h> 22 23 struct category_str { 24 int val; 25 const char *name; 26 }; 27 28 static const struct category_str con_category[] = { 29 { IEC958_AES1_CON_GENERAL, "general" }, 30 31 { IEC958_AES1_CON_IEC908_CD, "CD" }, 32 { IEC958_AES1_CON_NON_IEC908_CD, "non-IEC908 CD" }, 33 { IEC958_AES1_CON_MINI_DISC, "Mini-Disc" }, 34 { IEC958_AES1_CON_DVD, "DVD" }, 35 36 { IEC958_AES1_CON_PCM_CODER, "PCM coder" }, 37 { IEC958_AES1_CON_MIXER, "digital signal mixer" }, 38 { IEC958_AES1_CON_RATE_CONVERTER, "rate converter" }, 39 { IEC958_AES1_CON_SAMPLER, "sampler" }, 40 { IEC958_AES1_CON_DSP, "digital sound processor" }, 41 42 { IEC958_AES1_CON_DAT, "DAT" }, 43 { IEC958_AES1_CON_VCR, "VCR" }, 44 { IEC958_AES1_CON_DCC, "DCC" }, 45 { IEC958_AES1_CON_MAGNETIC_DISC, "magnetic disc" }, 46 47 { IEC958_AES1_CON_DAB_JAPAN, "digital audio broadcast (Japan)" }, 48 { IEC958_AES1_CON_DAB_EUROPE, "digital audio broadcast (Europe)" }, 49 { IEC958_AES1_CON_DAB_USA, "digital audio broadcast (USA)" }, 50 { IEC958_AES1_CON_SOFTWARE, "software delivery" }, 51 52 { IEC958_AES1_CON_SYNTHESIZER, "synthesizer" }, 53 { IEC958_AES1_CON_MICROPHONE, "microphone" }, 54 55 { IEC958_AES1_CON_ADC, "ADC without copyright information" }, 56 57 { IEC958_AES1_CON_ADC_COPYRIGHT, "ADC with copyright information" }, 58 59 { IEC958_AES1_CON_SOLIDMEM_DIGITAL_RECORDER_PLAYER, "flash memory recorder/player" }, 60 61 { IEC958_AES1_CON_EXPERIMENTAL, "experimental" }, 62 }; 63 64 65 #define ARRAY_SIZE(x) (int)(sizeof(x)/sizeof(x[0])) 66 67 void dump_iec958(snd_aes_iec958_t *iec) 68 { 69 int i; 70 71 if (! (iec->status[0] & IEC958_AES0_PROFESSIONAL)) { 72 /* consumer */ 73 printf("Mode: consumer\n"); 74 printf("Data: "); 75 if (!(iec->status[0] & IEC958_AES0_NONAUDIO)) { 76 printf("audio\n"); 77 } else { 78 printf("non-audio\n"); 79 } 80 printf("Rate: "); 81 switch (iec->status[3] & IEC958_AES3_CON_FS) { 82 case IEC958_AES3_CON_FS_22050: 83 printf("22050 Hz\n"); 84 break; 85 case IEC958_AES3_CON_FS_24000: 86 printf("24000 Hz\n"); 87 break; 88 case IEC958_AES3_CON_FS_32000: 89 printf("32000 Hz\n"); 90 break; 91 case IEC958_AES3_CON_FS_44100: 92 printf("44100 Hz\n"); 93 break; 94 case IEC958_AES3_CON_FS_48000: 95 printf("48000 Hz\n"); 96 break; 97 case IEC958_AES3_CON_FS_88200: 98 printf("88200 Hz\n"); 99 break; 100 case IEC958_AES3_CON_FS_96000: 101 printf("96000 Hz\n"); 102 break; 103 case IEC958_AES3_CON_FS_176400: 104 printf("176400 Hz\n"); 105 break; 106 case IEC958_AES3_CON_FS_192000: 107 printf("192000 Hz\n"); 108 break; 109 case IEC958_AES3_CON_FS_768000: 110 printf("768000 Hz\n"); 111 break; 112 case IEC958_AES3_CON_FS_NOTID: 113 printf("not indicated\n"); 114 break; 115 default: 116 printf("unknown\n"); 117 break; 118 } 119 printf("Copyright: "); 120 if (iec->status[0] & IEC958_AES0_CON_NOT_COPYRIGHT) { 121 printf("permitted\n"); 122 } else { 123 printf("protected\n"); 124 } 125 printf("Emphasis: "); 126 if ((iec->status[0] & IEC958_AES0_CON_EMPHASIS) != IEC958_AES0_CON_EMPHASIS_5015) { 127 printf("none\n"); 128 } else { 129 printf("50/15us\n"); 130 } 131 printf("Category: "); 132 for (i = 0; i < ARRAY_SIZE(con_category); i++) { 133 if ((iec->status[1] & IEC958_AES1_CON_CATEGORY) == con_category[i].val) { 134 printf("%s\n", con_category[i].name); 135 break; 136 } 137 } 138 if (i >= ARRAY_SIZE(con_category)) { 139 printf("unknown 0x%x\n", iec->status[1] & IEC958_AES1_CON_CATEGORY); 140 } 141 printf("Original: "); 142 if (iec->status[1] & IEC958_AES1_CON_ORIGINAL) { 143 printf("original\n"); 144 } else { 145 printf("1st generation\n"); 146 } 147 printf("Clock: "); 148 switch (iec->status[3] & IEC958_AES3_CON_CLOCK) { 149 case IEC958_AES3_CON_CLOCK_1000PPM: 150 printf("1000 ppm\n"); 151 break; 152 case IEC958_AES3_CON_CLOCK_50PPM: 153 printf("50 ppm\n"); 154 break; 155 case IEC958_AES3_CON_CLOCK_VARIABLE: 156 printf("variable pitch\n"); 157 break; 158 default: 159 printf("unknown\n"); 160 break; 161 } 162 } else { 163 printf("Mode: professional\n"); 164 printf("Data: "); 165 if (!(iec->status[0] & IEC958_AES0_NONAUDIO)) { 166 printf("audio\n"); 167 } else { 168 printf("non-audio\n"); 169 } 170 printf("Rate: "); 171 switch (iec->status[0] & IEC958_AES0_PRO_FS) { 172 case IEC958_AES0_PRO_FS_44100: 173 printf("44100 Hz\n"); 174 break; 175 case IEC958_AES0_PRO_FS_48000: 176 printf("48000 Hz\n"); 177 break; 178 case IEC958_AES0_PRO_FS_32000: 179 printf("32000 Hz\n"); 180 break; 181 default: 182 printf("unknown\n"); 183 break; 184 } 185 printf("Rate Locked: "); 186 if (iec->status[0] & IEC958_AES0_PRO_FREQ_UNLOCKED) 187 printf("no\n"); 188 else 189 printf("yes\n"); 190 printf("Emphasis: "); 191 switch (iec->status[0] & IEC958_AES0_PRO_EMPHASIS) { 192 case IEC958_AES0_PRO_EMPHASIS_CCITT: 193 printf("CCITT J.17\n"); 194 break; 195 case IEC958_AES0_PRO_EMPHASIS_NONE: 196 printf("none\n"); 197 break; 198 case IEC958_AES0_PRO_EMPHASIS_5015: 199 printf("50/15us\n"); 200 break; 201 case IEC958_AES0_PRO_EMPHASIS_NOTID: 202 default: 203 printf("unknown\n"); 204 break; 205 } 206 printf("Stereophonic: "); 207 if ((iec->status[1] & IEC958_AES1_PRO_MODE) == IEC958_AES1_PRO_MODE_STEREOPHONIC) { 208 printf("stereo\n"); 209 } else { 210 printf("not indicated\n"); 211 } 212 printf("Userbits: "); 213 switch (iec->status[1] & IEC958_AES1_PRO_USERBITS) { 214 case IEC958_AES1_PRO_USERBITS_192: 215 printf("192bit\n"); 216 break; 217 case IEC958_AES1_PRO_USERBITS_UDEF: 218 printf("user-defined\n"); 219 break; 220 default: 221 printf("unknown\n"); 222 break; 223 } 224 printf("Sample Bits: "); 225 switch (iec->status[2] & IEC958_AES2_PRO_SBITS) { 226 case IEC958_AES2_PRO_SBITS_20: 227 printf("20 bit\n"); 228 break; 229 case IEC958_AES2_PRO_SBITS_24: 230 printf("24 bit\n"); 231 break; 232 case IEC958_AES2_PRO_SBITS_UDEF: 233 printf("user defined\n"); 234 break; 235 default: 236 printf("unknown\n"); 237 break; 238 } 239 printf("Word Length: "); 240 switch (iec->status[2] & IEC958_AES2_PRO_WORDLEN) { 241 case IEC958_AES2_PRO_WORDLEN_22_18: 242 printf("22 bit or 18 bit\n"); 243 break; 244 case IEC958_AES2_PRO_WORDLEN_23_19: 245 printf("23 bit or 19 bit\n"); 246 break; 247 case IEC958_AES2_PRO_WORDLEN_24_20: 248 printf("24 bit or 20 bit\n"); 249 break; 250 case IEC958_AES2_PRO_WORDLEN_20_16: 251 printf("20 bit or 16 bit\n"); 252 break; 253 default: 254 printf("unknown\n"); 255 break; 256 } 257 } 258 } 259