def core(self, repeats=1, w=None, data=None): self.timestamps['core'] = prectime() sleep_msec = 1.0 self.timestamps['before'] = [] self.timestamps['after'] = [] preplay_done = False subs = [slice(None),slice(None)] nsamp = Base.samples(data) start = 0 while repeats != 0: start %= nsamp while start < nsamp: while True: if not self.keepgoing or self.timedout(): self.keepgoing=False; break towrite = self.stream.get_write_available() nleft = (float(nsamp) - float(start)) / float(self.speed) if towrite >= nleft: break if towrite >= self.buffersize: break sleep(sleep_msec/1000.0) if not self.keepgoing: break speed = float(self.speed) if speed == 1.0: start = int(round(start)) stop = start + towrite if repeats == 1: stop = min(nsamp, stop) subs[across_samples] = slice(start,stop) dd = data[subs] else: start = float(start) stop = start + float(speed) * float(towrite) if repeats == 1: stop = min(float(nsamp), stop) xi = numpy.linspace(start=start, stop=stop, endpoint=False, num=towrite) xi %= float(nsamp) dd = Base.interpsamples(data, xi) vols = float(self.vol) * Base.panhelper(self.pan, nchan=dd, norm=self.norm) dd = dd * vols # *= won't work for broadcasting here raw = w.dat2str(data=dd) if not preplay_done and self.preplay != None and self.preplay['func'] != None: self.preplay['func'](*self.preplay['pargs'], **self.preplay['kwargs']) preplay_done = True if len(self.timestamps['before']) < 100: self.timestamps['before'].append(prectime()) self.stream.write(raw) if len(self.timestamps['after']) < 100: self.timestamps['after'].append(prectime()) start = stop if not self.keepgoing: break repeats -= 1 if self.postplay != None and self.postplay['func'] != None: self.postplay['func'](*self.postplay['pargs'], **self.postplay['kwargs']) self.__playing = False towrite = self.stream.get_write_available() bytes_per_frame = self.interface.get_sample_size(self.format) * self.stream._channels if towrite > 0: self.stream.write('\0' * towrite * bytes_per_frame) while self.stream.get_write_available() < self.stream._frames_per_buffer: sleep(0.001) sleep(float(self.stream._frames_per_buffer) / float(self.stream._rate) + self.stream.get_output_latency())
def core(self, repeats=1, w=None, data=None): self.timestamps['core'] = prectime() sleep_msec = 1.0 self.timestamps['before'] = [] self.timestamps['after'] = [] preplay_done = False subs = [slice(None),slice(None)] nsamp = Base.samples(data) start = 0 while repeats != 0: start %= nsamp while start < nsamp: while True: if not self.keepgoing or self.timedout(): self.keepgoing=False; break towrite = self.stream.get_write_available() nleft = (float(nsamp) - float(start)) / float(self.speed) if towrite >= nleft: break if towrite >= self.buffersize: break sleep(sleep_msec/1000.0) if not self.keepgoing: break speed = float(self.speed) if speed == 1.0: start = int(round(start)) stop = start + towrite if repeats == 1: stop = min(nsamp, stop) subs[across_samples] = slice(start,stop) dd = data[subs] else: start = float(start) stop = start + float(speed) * float(towrite) if repeats == 1: stop = min(float(nsamp), stop) xi = numpy.linspace(start=start, stop=stop, endpoint=False, num=towrite) xi %= float(nsamp) dd = Base.interpsamples(data, xi) vols = float(self.vol) * Base.panhelper(self.pan, nchan=dd, norm=self.norm) dd = dd * vols # *= won't work for broadcasting here raw = w.dat2str(data=dd) if not preplay_done and self.preplay != None and self.preplay['func'] != None: self.preplay['func'](*self.preplay['pargs'], **self.preplay['kwargs']) preplay_done = True if len(self.timestamps['before']) < 100: self.timestamps['before'].append(prectime()) self.stream.write(raw) if len(self.timestamps['after']) < 100: self.timestamps['after'].append(prectime()) start = stop if not self.keepgoing: break repeats -= 1 if self.postplay != None and self.postplay['func'] != None: self.postplay['func'](*self.postplay['pargs'], **self.postplay['kwargs']) self.playing = False towrite = self.stream.get_write_available() bytes_per_frame = self.interface.get_sample_size(self.format) * self.stream._channels if towrite > 0: self.stream.write('\0' * towrite * bytes_per_frame) while self.stream.get_write_available() < self.stream._frames_per_buffer: sleep(0.001) sleep(float(self.stream._frames_per_buffer) / float(self.stream._rate) + self.stream.get_output_latency())
def play(self, repeats=1, bg=True, w=None, data=None, timeout=None, vol=None, pan=None): """ plays a wav object w, which defaults to the currently loaded instance p.wav Set repeats=-1 to loop forever. Set bg=False to play synchronously. p.play(w=w2) sets p.wav = w2 and then plays it (which may involve closing and re-opening the stream if the bit depth, sampling rate or number of channels differs between w2 and the old p.wav). p.play(data=d) uses the raw data in numpy.array d instead of the default w.y, playing it at the sampling frequency and bit depth dictated by w. """### if self.playing: return self.timestamps['play'] = prectime() self.open(w) w = self.wav if w == None: return if data == None: data = w.y if Base.channels(data) != Base.channels(w): raise ValueError, 'data array and wav object have mismatched numbers of channels' self.timeout=timeout self.kwargs = {'w':w, 'data':data, 'repeats':repeats} if vol != None: self.vol = vol if pan != None: self.pan = pan self.__playing = True self.go(bg=bg)
def play(self, repeats=1, bg=True, w=None, data=None, timeout=None, vol=None, pan=None): """ plays a wav object w, which defaults to the currently loaded instance p.wav Set repeats=-1 to loop forever. Set bg=False to play synchronously. p.play(w=w2) sets p.wav = w2 and then plays it (which may involve closing and re-opening the stream if the bit depth, sampling rate or number of channels differs between w2 and the old p.wav). p.play(data=d) uses the raw data in numpy.array d instead of the default w.y, playing it at the sampling frequency and bit depth dictated by w. """### if self.playing: return self.timestamps['play'] = prectime() self.open(w) w = self.wav if w == None: return if data == None: data = w.y if Base.channels(data) != Base.channels(w): raise ValueError, 'data array and wav object have mismatched numbers of channels' self.timeout = timeout self.kwargs = {'w': w, 'data': data, 'repeats': repeats} if vol != None: self.vol = vol if pan != None: self.pan = pan self.__playing = True self.go(bg=bg)