def draw_wave(self, stream, force=False):
# print stream.getnframes()
if self.wavepath:
self.scene().removeItem(self.wavepath)
self.fitInView(0, 0, 1, 1)
self.current_sampwidth = sampwidth = stream.getsampwidth()
self.current_sampwidth_int = delta = 2**(8*sampwidth)
if stream in self.cache and not force:
self.current_data, wavepath = self.cache[stream]
else:
stream.rewind()
frames = stream.getnframes()
ratio = frames / 64
if stream.getnchannels() == 2:
data = audioop.tomono(stream.readframes(float('inf')), sampwidth, self.main.left_spin.value(), self.main.right_spin.value())
else:
data = stream.readframes(float('inf'))
data = audioop.mul(data, sampwidth, self.main.gain)
self.current_data = data
wavepath = QtGui.QPainterPath()
try:
for frame_set in xrange(ratio):
frame_min = frame_max = 0
for frame in xrange(64):
try:
value = audioop.getsample(data, sampwidth, frame + frame_set * 64)
frame_min = min(frame_min, value)
frame_max = max(frame_max, value)
except:
break
if frame == 0:
break
wavepath.moveTo(frame_set, delta - frame_min)
wavepath.lineTo(frame_set, delta - frame_max)
except:
pass
self.cache[stream] = data, wavepath
self.wavepath = self.scene().addPath(wavepath)
self.wavepath.setPen(self.wave_pen)
self.wavepath.setY(-delta * .5)
self.wavepath.setX(self.left_margin*2)
self.fitInView(0, 0, self.zoom_values[self.zoom], delta)
if not force:
self.centerOn(self.wavepath)
self.right_margin_item.setX(len(self.current_data)/self.current_sampwidth/64)
visible = self.mapToScene(self.viewport().rect()).boundingRect()
if visible.width() > self.wavepath.boundingRect().width():
self.scene().setSceneRect(-self.left_margin, 0, visible.width(), delta)
else:
self.scene().setSceneRect(-self.left_margin, 0, self.wavepath.boundingRect().width(), delta)
评论列表
文章目录