Audio-FLAC-Header
view release on metacpan or search on metacpan
# Number of samples in the target frame
my $frameSamples = unpack('n', (substr($seekpoint,16,2)));
# add this point to our copy of the table
push (@$seektable, {
'sampleNumber' => $sampleNumber,
'streamOffset' => $streamOffset,
'frameSamples' => $frameSamples,
});
$offset += 18;
}
$self->{'seektable'} = $seektable;
return 1;
}
sub _parseAppBlock {
my ($self, $block) = @_;
# Parse out the tags from the metadata block
my $appID = unpack('N', substr($block->{'contents'}, 0, 4, ''));
$self->{'application'}->{$appID} = $block->{'contents'};
return 1;
}
# Take an offset as number of flac samples
# and return CD-DA style mm:ss:ff
sub _samplesToTime {
my $samples = shift;
my $samplerate = shift;
if ($samplerate == 0) {
warn "Couldn't find SAMPLERATE for time calculation!\n";
return;
}
my $totalSeconds = $samples / $samplerate;
if ($totalSeconds == 0) {
# handled specially to avoid division by zero errors
return "00:00:00";
}
my $trackMinutes = int(int($totalSeconds) / 60);
my $trackSeconds = int($totalSeconds % 60);
my $trackFrames = ($totalSeconds - int($totalSeconds)) * 75;
# Poor man's rounding. Needed to match the output of metaflac.
$trackFrames = int($trackFrames + 0.5);
my $formattedTime = sprintf("%02d:%02d:%02d", $trackMinutes, $trackSeconds, $trackFrames);
return $formattedTime;
}
sub _bin2dec {
# Freely swiped from Perl Cookbook p. 48 (May 1999)
return unpack ('N', pack ('B32', substr(0 x 32 . $_[0], -32)));
}
sub _packInt32 {
# Packs an integer into a little-endian 32-bit unsigned int
return pack('V', $_[0]);
}
sub _findMetadataIndex {
my $self = shift;
my $htype = shift;
my $idx = shift || 0;
my $found = 0;
# Loop through the metadata_blocks until one of $htype is found
while ($idx < @{$self->{'metadataBlocks'}}) {
# Check the type to see if it's a $htype block
if ($self->{'metadataBlocks'}[$idx]->{'blockType'} == $htype) {
$found++;
last;
}
$idx++;
}
# No streaminfo found. Error.
return -1 if $found == 0;
return $idx;
}
sub _addStringToComment {
my $self = shift;
my $addString = shift;
$$self .= _packInt32(length($addString));
$$self .= $addString;
}
sub _addNewMetadataBlock {
my $self = shift;
my $htype = shift;
my $contents = shift;
my $numBlocks = @{$self->{'metadataBlocks'}};
# create a new block
$self->{'metadataBlocks'}->[$numBlocks]->{'lastBlockFlag'} = 0;
$self->{'metadataBlocks'}->[$numBlocks]->{'blockType'} = $htype;
$self->{'metadataBlocks'}->[$numBlocks]->{'blockSize'} = length($contents);
$self->{'metadataBlocks'}->[$numBlocks]->{'contents'} = $contents;
}
sub _updateMetadataBlock {
my $self = shift;
my $blockIdx = shift;
my $contents = shift;
# Update the block
( run in 0.775 second using v1.01-cache-2.11-cpan-9581c071862 )