- static const uint8_t halfrate[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 };
- static const int rate[] = { 32, 40, 48, 56, 64, 80, 96, 112,
- 128, 160, 192, 224, 256, 320, 384, 448,
- 512, 576, 640 };
- static const uint8_t lfeon[8] = { 0x10, 0x10, 0x04, 0x04,
- 0x04, 0x01, 0x04, 0x01 };
- int frmsizecod;
- int bitrate;
- int half;
- int acmod;
-
- if ((p_buf[0] != 0x0b) || (p_buf[1] != 0x77)) /* syncword */
- return 0;
-
- if (p_buf[5] >= 0x60) /* bsid >= 12 */
- return 0;
- half = halfrate[p_buf[5] >> 3];
-
- /* acmod, dsurmod and lfeon */
- acmod = p_buf[6] >> 5;
- if ( (p_buf[6] & 0xf8) == 0x50 )
- {
- /* Dolby surround = stereo + Dolby */
- *pi_channels = 2;
- *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT
- | AOUT_CHAN_DOLBYSTEREO;
- }
- else switch ( acmod )
- {
- case 0x0:
- /* Dual-mono = stereo + dual-mono */
- *pi_channels = 2;
- *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT
- | AOUT_CHAN_DUALMONO;
- break;
- case 0x1:
- /* Mono */
- *pi_channels = 1;
- *pi_channels_conf = AOUT_CHAN_CENTER;
- break;
- case 0x2:
- /* Stereo */
- *pi_channels = 2;
- *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
- break;
- case 0x3:
- /* 3F */
- *pi_channels = 3;
- *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT
- | AOUT_CHAN_CENTER;
- break;
- case 0x4:
- /* 2F1R */
- *pi_channels = 3;
- *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT
- | AOUT_CHAN_REARCENTER;
- break;
- case 0x5:
- /* 3F1R */
- *pi_channels = 4;
- *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
- | AOUT_CHAN_REARCENTER;
- break;
- case 0x6:
- /* 2F2R */
- *pi_channels = 4;
- *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT
- | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
- break;
- case 0x7:
- /* 3F2R */
- *pi_channels = 5;
- *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
- | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
- break;
- default:
- return 0;
- }