1e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum"""Interpret sun audio headers."""
21e8fba729e218bc4b2e1ed3104f8cdbd88fdb21aBrett Cannonfrom warnings import warnpy3k
31e8fba729e218bc4b2e1ed3104f8cdbd88fdb21aBrett Cannonwarnpy3k("the sunaudio module has been removed in Python 3.0; "
41e8fba729e218bc4b2e1ed3104f8cdbd88fdb21aBrett Cannon         "use the sunau module instead", stacklevel=2)
51e8fba729e218bc4b2e1ed3104f8cdbd88fdb21aBrett Cannondel warnpy3k
61e8fba729e218bc4b2e1ed3104f8cdbd88fdb21aBrett Cannon
7217a5fa3c33ae58c1fe420f94eeb7e806961c3c1Guido van Rossum
8217a5fa3c33ae58c1fe420f94eeb7e806961c3c1Guido van RossumMAGIC = '.snd'
9217a5fa3c33ae58c1fe420f94eeb7e806961c3c1Guido van Rossum
109b8d801c37fa29420848ebc1b50c601893b36287Fred Drakeclass error(Exception):
11495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    pass
12217a5fa3c33ae58c1fe420f94eeb7e806961c3c1Guido van Rossum
13217a5fa3c33ae58c1fe420f94eeb7e806961c3c1Guido van Rossum
14d482e8ad4a11c7cbe9374f449da036ad21a5ee55Guido van Rossumdef get_long_be(s):
15495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    """Convert a 4-char value to integer."""
16495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    return (ord(s[0])<<24) | (ord(s[1])<<16) | (ord(s[2])<<8) | ord(s[3])
17217a5fa3c33ae58c1fe420f94eeb7e806961c3c1Guido van Rossum
18217a5fa3c33ae58c1fe420f94eeb7e806961c3c1Guido van Rossum
19217a5fa3c33ae58c1fe420f94eeb7e806961c3c1Guido van Rossumdef gethdr(fp):
20495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    """Read a sound header from an open file."""
21495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    if fp.read(4) != MAGIC:
22495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters        raise error, 'gethdr: bad magic word'
23495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    hdr_size = get_long_be(fp.read(4))
24495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    data_size = get_long_be(fp.read(4))
25495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    encoding = get_long_be(fp.read(4))
26495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    sample_rate = get_long_be(fp.read(4))
27495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    channels = get_long_be(fp.read(4))
28495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    excess = hdr_size - 24
29495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    if excess < 0:
30495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters        raise error, 'gethdr: bad hdr_size'
31495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    if excess > 0:
32495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters        info = fp.read(excess)
33495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    else:
34495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters        info = ''
35495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    return (data_size, encoding, sample_rate, channels, info)
36217a5fa3c33ae58c1fe420f94eeb7e806961c3c1Guido van Rossum
37217a5fa3c33ae58c1fe420f94eeb7e806961c3c1Guido van Rossum
38217a5fa3c33ae58c1fe420f94eeb7e806961c3c1Guido van Rossumdef printhdr(file):
39495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    """Read and print the sound header of a named file."""
40495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    hdr = gethdr(open(file, 'r'))
41495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    data_size, encoding, sample_rate, channels, info = hdr
42495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    while info[-1:] == '\0':
43495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters        info = info[:-1]
44495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    print 'File name:  ', file
45495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    print 'Data size:  ', data_size
46495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    print 'Encoding:   ', encoding
47495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    print 'Sample rate:', sample_rate
48495ad3c8ccb9ed3554177a3e8687676c78e667deTim Peters    print 'Channels:   ', channels
4970a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald    print 'Info:       ', repr(info)
50