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