From 9bfcbeea97f62b39d8bcc0134117e7f056caa91b Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 24 Dec 2009 15:10:08 -0800 Subject: [PATCH] when we are doing producing, also notify that we are finished... disable a bunch of debugging print's... document why we need to keep a pauseProducing, bug in twisted... [git-p4: depot-paths = "//depot/": change = 1423] --- audioraw.py | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/audioraw.py b/audioraw.py index 46b6fdb..dc7c518 100644 --- a/audioraw.py +++ b/audioraw.py @@ -1,5 +1,6 @@ #!/usr/bin/env python # Copyright 2009 John-Mark Gurney + '''Audio Raw Converter''' from DIDLLite import AudioItem, Album, Resource, ResourceList @@ -38,17 +39,25 @@ class DecoderProducer: implements(IPullProducer) def __init__(self, consumer, decoder, tbytes, skipbytes): + '''skipbytes should always be small. It is here in case + someone requests the middle of a sample.''' + self.decoder = decoder self.consumer = consumer self.tbytes = tbytes self.skipbytes = skipbytes + #print 'DPregP', `self`, `self.tbytes`, `self.skipbytes` consumer.registerProducer(self, False) + self.resumeProducing() def pauseProducing(self): - print 'DPpP, doing nothing' + # XXX - bug in Twisted 8.2.0 on pipelined requests this is + # called: http://twistedmatrix.com/trac/ticket/3919 + pass def resumeProducing(self): - r = self.decoder.read(8*1024) + #print 'DPrP', `self` + r = self.decoder.read(oneblk=True) if r: #print 'DPrP:', len(r) if self.skipbytes: @@ -60,16 +69,19 @@ class DecoderProducer: r = r[:send] self.tbytes -= len(r) self.consumer.write(r) + #print 'write %d bytes, remaining %d' % (len(r), self.tbytes) if self.tbytes: return - print 'DPurP' + #print 'DPurP', `self` self.consumer.unregisterProducer() + self.consumer.finish() def stopProducing(self): - print 'DPsP' + #print 'DPsP', `self` self.decoder.close() self.decoder = None + self.consumer = None class AudioResource(resource.Resource): isLeaf = True @@ -95,6 +107,7 @@ class AudioResource(resource.Resource): return start, end - start + 1 def render(self, request): + #print 'render:', `request` decoder = self.dec(self.f) request.setHeader('content-type', makemtfromdec(decoder)) bytespersample = decoder.channels * decoder.bitspersample / 8 @@ -105,15 +118,15 @@ class AudioResource(resource.Resource): request.setHeader('accept-ranges', 'bytes') if request.requestHeaders.hasHeader('range'): - print 'range req:', `request.requestHeaders.getRawHeaders('range')` + #print 'range req:', `request.requestHeaders.getRawHeaders('range')` start, cnt = self.calcrange( request.requestHeaders.getRawHeaders('range')[0], tbytes) skipbytes = start % bytespersample - print 'going:', start / bytespersample + #print 'going:', start / bytespersample decoder.goto(self.start + start / bytespersample) - print 'there' + #print 'there' request.setHeader('content-length', cnt) request.setHeader('content-range', 'bytes %s-%s/%s' % @@ -126,7 +139,7 @@ class AudioResource(resource.Resource): return '' DecoderProducer(request, decoder, tbytes, skipbytes) - print 'producing render' + #print 'producing render', `decoder`, `tbytes`, `skipbytes` # and make sure the connection doesn't get closed return server.NOT_DONE_YET @@ -149,10 +162,10 @@ class AudioDisc(FSObject, Album): # XXX - exclude track 1 pre-gap? kwargs['content'] = AudioResource(self.file, kwargs.pop('decoder'), 0, kwargs['samples']) - print 'doing construction' + #print 'doing construction' Album.__init__(self, *args, **kwargs) - print 'adding resource' + #print 'adding resource' self.url = '%s/%s' % (self.cd.urlbase, self.id) self.res = ResourceList() r = Resource(self.url, 'http-get:*:%s:*' % makeaudiomt(bitsps, @@ -164,7 +177,7 @@ class AudioDisc(FSObject, Album): r.bitsPerSample = bitsps r.nrAudioChannels = nchan self.res.append(r) - print 'completed' + #print 'completed' def sort(self, fun=lambda x, y: cmp(int(x.title), int(y.title))): return list.sort(self, fun) @@ -173,7 +186,7 @@ class AudioDisc(FSObject, Album): r = [ str(x['number']) for x in self.cuesheet['tracks_array'] if x['number'] not in (170, 255) ] - print 'gC:', `r` + #print 'gC:', `r` return r def findtrackidx(self, trk):