summaryrefslogtreecommitdiffstats
path: root/Demo/sgi/al/playaiff.py
diff options
context:
space:
mode:
Diffstat (limited to 'Demo/sgi/al/playaiff.py')
-rwxr-xr-xDemo/sgi/al/playaiff.py54
1 files changed, 54 insertions, 0 deletions
diff --git a/Demo/sgi/al/playaiff.py b/Demo/sgi/al/playaiff.py
new file mode 100755
index 0000000..f84a68c
--- /dev/null
+++ b/Demo/sgi/al/playaiff.py
@@ -0,0 +1,54 @@
+import aiff
+import al
+import sys
+import time
+
+def main():
+ v = 1
+ c = al.newconfig()
+ nchannels = c.getchannels()
+ nsampframes = 0 # ???
+ sampwidth = c.getwidth()
+ samprate = 0.0 # unknown
+ filename = sys.argv[1]
+ f = open(filename, 'r')
+ type, totalsize = aiff.read_chunk_header(f)
+ if type <> 'FORM':
+ raise aiff.Error, 'FORM chunk expected at start of file'
+ aiff.read_form_chunk(f)
+ while 1:
+ try:
+ type, size = aiff.read_chunk_header(f)
+ except EOFError:
+ break
+ if v: print 'header:', `type`, size
+ if type = 'COMM':
+ nchannels, nsampframes, sampwidth, samprate = \
+ aiff.read_comm_chunk(f)
+ if v: print nchannels, nsampframes, sampwidth, samprate
+ elif type = 'SSND':
+ offset, blocksize = aiff.read_ssnd_chunk(f)
+ if v: print offset, blocksize
+ data = f.read(size-8)
+ if size%2: void = f.read(1)
+ p = makeport(nchannels, sampwidth, samprate)
+ play(p, data, offset, blocksize)
+ elif type in aiff.skiplist:
+ aiff.skip_chunk(f, size)
+ else:
+ raise aiff.Error, 'bad chunk type ' + type
+
+def makeport(nchannels, sampwidth, samprate):
+ c = al.newconfig()
+ c.setchannels(nchannels)
+ c.setwidth(sampwidth/8)
+ # can't set the rate...
+ p = al.openport('', 'w', c)
+ return p
+
+def play(p, data, offset, blocksize):
+ data = data[offset:]
+ p.writesamps(data)
+ while p.getfilled() > 0: time.millisleep(10)
+
+main()