'Raises LAMEError if parsing fails'

def __init__(self, xing, fileobj):

    payload = fileobj.read(27)
    if (len(payload) != 27):
        raise LAMEError('Not    enough    data')
    r = BitReader(cBytesIO(payload))
    revision = r.bits(4)
    if (revision != 0):
        raise LAMEError(('unsupported    header    revision    %d' % revision))
    self.vbr_method = r.bits(4)
    self.lowpass_filter = (r.bits(8) * 100)
    self.quality = ((100 - xing.vbr_scale) % 10)
    self.vbr_quality = ((100 - xing.vbr_scale) // 10)
    track_peak_data = r.bytes(4)
    if (track_peak_data == '\x00\x00\x00\x00'):
        self.track_peak = None
    else:
        self.track_peak = ((cdata.uint32_be(track_peak_data) - 0.5) / (2 ** 23))
    track_gain_type = r.bits(3)
    self.track_gain_origin = r.bits(3)
    sign = r.bits(1)
    gain_adj = (r.bits(9) / 10.0)
    if sign:
        gain_adj *= (-1)
    if (track_gain_type == 1):
        self.track_gain_adjustment = gain_adj
    else:
        self.track_gain_adjustment = None
    assert r.is_aligned()
    album_gain_type = r.bits(3)
    self.album_gain_origin = r.bits(3)
    sign = r.bits(1)
    album_gain_adj = (r.bits(9) / 10.0)
    if (album_gain_type == 2):
        self.album_gain_adjustment = album_gain_adj
    else:
        self.album_gain_adjustment = None
    self.encoding_flags = r.bits(4)
    self.ath_type = r.bits(4)
    self.bitrate = r.bits(8)
    self.encoder_delay_start = r.bits(12)
    self.encoder_padding_end = r.bits(12)
    self.source_sample_frequency_enum = r.bits(2)
    self.unwise_setting_used = r.bits(1)
    self.stereo_mode = r.bits(3)
    self.noise_shaping = r.bits(2)
    sign = r.bits(1)
    mp3_gain = r.bits(7)
    if sign:
        mp3_gain *= (-1)
    self.mp3_gain = mp3_gain
    r.skip(2)
    self.surround_info = r.bits(3)
    self.preset_used = r.bits(11)
    self.music_length = r.bits(32)
    self.music_crc = r.bits(16)
    self.header_crc = r.bits(16)
    assert r.is_aligned()
