Mp3File constructor
Mp3File(
- 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;
}
}
}
}
}
}