10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi"""Interpret sun audio headers."""
20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom warnings import warnpy3k
30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiwarnpy3k("the sunaudio module has been removed in Python 3.0; "
40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi         "use the sunau module instead", stacklevel=2)
50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidel warnpy3k
60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiMAGIC = '.snd'
90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass error(Exception):
110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    pass
120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef get_long_be(s):
150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Convert a 4-char value to integer."""
160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    return (ord(s[0])<<24) | (ord(s[1])<<16) | (ord(s[2])<<8) | ord(s[3])
170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef gethdr(fp):
200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Read a sound header from an open file."""
210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if fp.read(4) != MAGIC:
220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raise error, 'gethdr: bad magic word'
230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    hdr_size = get_long_be(fp.read(4))
240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    data_size = get_long_be(fp.read(4))
250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    encoding = get_long_be(fp.read(4))
260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    sample_rate = get_long_be(fp.read(4))
270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    channels = get_long_be(fp.read(4))
280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    excess = hdr_size - 24
290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if excess < 0:
300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raise error, 'gethdr: bad hdr_size'
310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if excess > 0:
320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        info = fp.read(excess)
330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    else:
340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        info = ''
350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    return (data_size, encoding, sample_rate, channels, info)
360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef printhdr(file):
390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Read and print the sound header of a named file."""
400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    hdr = gethdr(open(file, 'r'))
410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    data_size, encoding, sample_rate, channels, info = hdr
420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    while info[-1:] == '\0':
430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        info = info[:-1]
440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print 'File name:  ', file
450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print 'Data size:  ', data_size
460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print 'Encoding:   ', encoding
470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print 'Sample rate:', sample_rate
480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print 'Channels:   ', channels
490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print 'Info:       ', repr(info)
50