Mp3File constructor

Mp3File(
  1. AudioFile _audioFile
)

Implementation

Mp3File(this._audioFile) {
  final rawData = _audioFile._rawData;
  int mpegFrameIndex = findFirstMpegFrame(rawData);

  if (mpegFrameIndex > 10) {
    List<int> head = rawData.sublist(0, 10);

    if (head[0] == 'I'.codeUnitAt(0) &&
        head[1] == 'D'.codeUnitAt(0) &&
        head[2] == '3'.codeUnitAt(0)) {
      int version = head[3];
      int tagSize = 0;

      if (version == 2) {
        tagSize =
            (head[6] << 24) | (head[7] << 16) | (head[8] << 8) | head[9];
      } else {
        tagSize =
            (head[6] << 21) | (head[7] << 14) | (head[8] << 7) | head[9];
      }

      if (tagSize != 0) {
        List<int> tagData = rawData.sublist(10, 10 + tagSize);
        int i = 0;
        while (i < tagData.length - 10) {
          if (tagData[i] == 0) break;
          int frameSize = 0;
          if (version == 2) {
            frameSize =
                (tagData[i + 3] << 16) |
                (tagData[i + 4] << 8) |
                tagData[i + 5];
            _frames.add(
              ID3Frame(
                tagData.sublist(i, i + 3),
                tagData.sublist(i + 6, i + 6 + frameSize),
              ),
            );
            i += frameSize + 6;
          } else if (version == 3) {
            frameSize =
                (tagData[i + 4] << 24) |
                (tagData[i + 5] << 16) |
                (tagData[i + 6] << 8) |
                tagData[i + 7];
            _frames.add(
              ID3Frame(
                tagData.sublist(i, i + 4),
                tagData.sublist(i + 10, i + 10 + frameSize),
              ),
            );
            i += frameSize + 10;
          } else if (version == 4) {
            frameSize =
                (tagData[i + 4] << 21) |
                (tagData[i + 5] << 14) |
                (tagData[i + 6] << 7) |
                tagData[i + 7];
            _frames.add(
              ID3Frame(
                tagData.sublist(i, i + 4),
                tagData.sublist(i + 10, i + 10 + frameSize),
              ),
            );
            i += frameSize + 10;
          }
        }
      }
    }
  }
}