"""Interpret sun audio headers."""

MAGIC = '.snd'

error = 'sunaudio sound header conversion error'


def get_long_be(s):
	"""Convert a 4-char value to integer."""
	return (ord(s[0])<<24) | (ord(s[1])<<16) | (ord(s[2])<<8) | ord(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 = ''
	return (data_size, encoding, sample_rate, channels, info)


def printhdr(file):
	"""Read and print the sound header of a named file."""
	hdr = gethdr(open(file, 'r'))
	data_size, encoding, sample_rate, channels, info = hdr
	while info[-1:] == '\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:       ', `info`
