Audio-Scan
view release on metacpan or search on metacpan
src/common.c view on Meta::CPAN
int32_t
skip_id3v2(PerlIO* infile) {
unsigned char buf[10];
uint32_t has_footer;
int32_t size;
// seek to first byte of mpc data
if (PerlIO_seek(infile, 0, SEEK_SET) < 0)
return 0;
PerlIO_read(infile, &buf, sizeof(buf));
// check id3-tag
if (memcmp(buf, "ID3", 3) != 0)
return 0;
// read flags
has_footer = buf[5] & 0x10;
if (buf[5] & 0x0F)
return -1;
if ((buf[6] | buf[7] | buf[8] | buf[9]) & 0x80)
return -1;
// read header size (syncsave: 4 * $0xxxxxxx = 28 significant bits)
size = buf[6] << 21;
size += buf[7] << 14;
size += buf[8] << 7;
size += buf[9] ;
size += 10;
if (has_footer)
size += 10;
return size;
}
uint32_t
_bitrate(uint32_t audio_size, uint32_t song_length_ms)
{
return ( (audio_size * 1.0) / song_length_ms ) * 8000;
}
off_t
_file_size(PerlIO *infile)
{
#ifdef _MSC_VER
// Win32 doesn't work right with fstat
off_t file_size;
PerlIO_seek(infile, 0, SEEK_END);
file_size = PerlIO_tell(infile);
PerlIO_seek(infile, 0, SEEK_SET);
return file_size;
#else
struct stat buf;
if ( !fstat( PerlIO_fileno(infile), &buf ) ) {
return buf.st_size;
}
warn("Unable to stat: %s\n", strerror(errno));
return 0;
#endif
}
int
_env_true(const char *name)
{
char *value;
value = getenv(name);
if ( value == NULL || value[0] == '0' ) {
return 0;
}
return 1;
}
// from http://jeremie.com/frolic/base64/
int
_decode_base64(char *s)
{
char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int bit_offset, byte_offset, idx, i, n;
unsigned char *d = (unsigned char *)s;
char *p;
n = i = 0;
while (*s && (p=strchr(b64,*s))) {
idx = (int)(p - b64);
byte_offset = (i*6)/8;
bit_offset = (i*6)%8;
d[byte_offset] &= ~((1<<(8-bit_offset))-1);
if (bit_offset < 3) {
d[byte_offset] |= (idx << (2-bit_offset));
n = byte_offset+1;
}
else {
d[byte_offset] |= (idx >> (bit_offset-2));
d[byte_offset+1] = 0;
d[byte_offset+1] |= (idx << (8-(bit_offset-2))) & 0xFF;
n = byte_offset+2;
}
s++;
i++;
}
/* null terminate */
d[n] = 0;
return n;
}
( run in 2.399 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )