iec->byteswap = format != SND_PCM_FORMAT_IEC958_SUBFRAME;
}
}
- /* FIXME: needs to adjust status_bits according to the format
- * and sample rate
- */
+
+ if ((iec->status[0] & IEC958_AES0_PROFESSIONAL) == 0) {
+ if ((iec->status[3] & IEC958_AES3_CON_FS) == IEC958_AES3_CON_FS_NOTID) {
+ unsigned int rate = 0;
+ unsigned char fs;
+
+ err = INTERNAL(snd_pcm_hw_params_get_rate)(params, &rate, 0);
+ if (err < 0)
+ rate = 0;
+
+ switch (rate) {
+ case 22050:
+ fs = IEC958_AES3_CON_FS_22050;
+ break;
+ case 24000:
+ fs = IEC958_AES3_CON_FS_24000;
+ break;
+ case 32000:
+ fs = IEC958_AES3_CON_FS_32000;
+ break;
+ case 44100:
+ fs = IEC958_AES3_CON_FS_44100;
+ break;
+ case 48000:
+ fs = IEC958_AES3_CON_FS_48000;
+ break;
+ case 88200:
+ fs = IEC958_AES3_CON_FS_88200;
+ break;
+ case 96000:
+ fs = IEC958_AES3_CON_FS_96000;
+ break;
+ case 176400:
+ fs = IEC958_AES3_CON_FS_176400;
+ break;
+ case 192000:
+ fs = IEC958_AES3_CON_FS_192000;
+ break;
+ case 768000:
+ fs = IEC958_AES3_CON_FS_768000;
+ break;
+ default:
+ fs = IEC958_AES3_CON_FS_NOTID;
+ break;
+ }
+
+ iec->status[3] &= ~IEC958_AES3_CON_FS;
+ iec->status[3] |= fs;
+ }
+
+ if ((iec->status[4] & IEC958_AES4_CON_WORDLEN) == IEC958_AES4_CON_WORDLEN_NOTID) {
+ unsigned char ws;
+ switch (snd_pcm_format_width(format)) {
+ case 16:
+ ws = IEC958_AES4_CON_WORDLEN_20_16;
+ break;
+ case 18:
+ ws = IEC958_AES4_CON_WORDLEN_22_18;
+ break;
+ case 20:
+ ws = IEC958_AES4_CON_WORDLEN_20_16 | IEC958_AES4_CON_MAX_WORDLEN_24;
+ break;
+ case 24:
+ case 32: /* Assume 24-bit width for 32-bit samples. */
+ ws = IEC958_AES4_CON_WORDLEN_24_20 | IEC958_AES4_CON_MAX_WORDLEN_24;
+ break;
+ default:
+ ws = IEC958_AES4_CON_WORDLEN_NOTID;
+ break;
+ }
+ iec->status[4] &= ~(IEC958_AES4_CON_MAX_WORDLEN_24 | IEC958_AES4_CON_WORDLEN);
+ iec->status[4] |= ws;
+ }
+ }
return 0;
}
IEC958_AES0_CON_EMPHASIS_NONE,
IEC958_AES1_CON_ORIGINAL | IEC958_AES1_CON_PCM_CODER,
0,
- IEC958_AES3_CON_FS_48000
+ IEC958_AES3_CON_FS_NOTID, /* will be set in hwparams */
+ IEC958_AES4_CON_WORDLEN_NOTID /* will be set in hwparams */
};
assert(pcmp && slave);