Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / tools / src / nas,5.n2.os.2 / lib / python / lib / python2.4 / toaiff.py
CommitLineData
86530b38
AT
1"""Convert "arbitrary" sound files to AIFF (Apple and SGI's audio format).
2
3Input may be compressed.
4Uncompressed file type may be AIFF, WAV, VOC, 8SVX, NeXT/Sun, and others.
5An exception is raised if the file is not of a recognized type.
6Returned filename is either the input filename or a temporary filename;
7in the latter case the caller must ensure that it is removed.
8Other temporary files used are removed by the function.
9"""
10
11import os
12import tempfile
13import pipes
14import sndhdr
15
16__all__ = ["error", "toaiff"]
17
18table = {}
19
20t = pipes.Template()
21t.append('sox -t au - -t aiff -r 8000 -', '--')
22table['au'] = t
23
24# XXX The following is actually sub-optimal.
25# XXX The HCOM sampling rate can be 22k, 22k/2, 22k/3 or 22k/4.
26# XXX We must force the output sampling rate else the SGI won't play
27# XXX files sampled at 5.5k or 7.333k; however this means that files
28# XXX sampled at 11k are unnecessarily expanded.
29# XXX Similar comments apply to some other file types.
30t = pipes.Template()
31t.append('sox -t hcom - -t aiff -r 22050 -', '--')
32table['hcom'] = t
33
34t = pipes.Template()
35t.append('sox -t voc - -t aiff -r 11025 -', '--')
36table['voc'] = t
37
38t = pipes.Template()
39t.append('sox -t wav - -t aiff -', '--')
40table['wav'] = t
41
42t = pipes.Template()
43t.append('sox -t 8svx - -t aiff -r 16000 -', '--')
44table['8svx'] = t
45
46t = pipes.Template()
47t.append('sox -t sndt - -t aiff -r 16000 -', '--')
48table['sndt'] = t
49
50t = pipes.Template()
51t.append('sox -t sndr - -t aiff -r 16000 -', '--')
52table['sndr'] = t
53
54uncompress = pipes.Template()
55uncompress.append('uncompress', '--')
56
57
58class error(Exception):
59 pass
60
61def toaiff(filename):
62 temps = []
63 ret = None
64 try:
65 ret = _toaiff(filename, temps)
66 finally:
67 for temp in temps[:]:
68 if temp != ret:
69 try:
70 os.unlink(temp)
71 except os.error:
72 pass
73 temps.remove(temp)
74 return ret
75
76def _toaiff(filename, temps):
77 if filename[-2:] == '.Z':
78 (fd, fname) = tempfile.mkstemp()
79 os.close(fd)
80 temps.append(fname)
81 sts = uncompress.copy(filename, fname)
82 if sts:
83 raise error, filename + ': uncompress failed'
84 else:
85 fname = filename
86 try:
87 ftype = sndhdr.whathdr(fname)
88 if ftype:
89 ftype = ftype[0] # All we're interested in
90 except IOError, msg:
91 if type(msg) == type(()) and len(msg) == 2 and \
92 type(msg[0]) == type(0) and type(msg[1]) == type(''):
93 msg = msg[1]
94 if type(msg) != type(''):
95 msg = repr(msg)
96 raise error, filename + ': ' + msg
97 if ftype == 'aiff':
98 return fname
99 if ftype is None or not ftype in table:
100 raise error, '%s: unsupported audio file type %r' % (filename, ftype)
101 (fd, temp) = tempfile.mkstemp()
102 os.close(fd)
103 temps.append(temp)
104 sts = table[ftype].copy(fname, temp)
105 if sts:
106 raise error, filename + ': conversion to aiff failed'
107 return temp