| """Interpret sun audio headers.""" |
| |
| MAGIC = b'.snd' |
| |
| class error(Exception): |
| pass |
| |
| |
| def get_long_be(s): |
| """Convert a 4-byte value to integer.""" |
| return (s[0]<<24) | (s[1]<<16) | (s[2]<<8) | s[3] |
| |
| |
| def gethdr(fp): |
| """Read a sound header from an open file.""" |
| if fp.read(4) != MAGIC: |
| raise error('gethdr: bad magic word') |
| hdr_size = get_long_be(fp.read(4)) |
| data_size = get_long_be(fp.read(4)) |
| encoding = get_long_be(fp.read(4)) |
| sample_rate = get_long_be(fp.read(4)) |
| channels = get_long_be(fp.read(4)) |
| excess = hdr_size - 24 |
| if excess < 0: |
| raise error('gethdr: bad hdr_size') |
| if excess > 0: |
| info = fp.read(excess) |
| else: |
| info = b'' |
| return (data_size, encoding, sample_rate, channels, info) |
| |
| |
| def printhdr(file): |
| """Read and print the sound header of a named file.""" |
| f = open(file, 'rb') |
| try: |
| hdr = gethdr(f) |
| finally: |
| f.close() |
| data_size, encoding, sample_rate, channels, info = hdr |
| while info.endswith(b'\0'): |
| info = info[:-1] |
| print('File name: ', file) |
| print('Data size: ', data_size) |
| print('Encoding: ', encoding) |
| print('Sample rate:', sample_rate) |
| print('Channels: ', channels) |
| print('Info: ', repr(info)) |