twblue/src/sound_lib/recording.py

50 lines
1.4 KiB
Python

from __future__ import absolute_import
from .channel import Channel
from .external.pybass import *
from ctypes import string_at
import wave
from .main import bass_call, bass_call_0
class Recording(Channel):
def __init__(self, frequency=44100, channels=2, flags=BASS_RECORD_PAUSE, proc=None, user=None):
if not proc:
proc = lambda: True
self.callback = RECORDPROC(proc)
self._frequency = frequency
self._channels = channels
self._flags = flags
handle = bass_call(BASS_RecordStart, frequency, channels, flags, self.callback, user)
super(Recording, self).__init__(handle)
def free(self):
pass
class WaveRecording(Recording):
def __init__(self, filename=None, proc=None, *args, **kwargs):
callback = proc or self.recording_callback
super(WaveRecording, self).__init__(proc=callback, *args, **kwargs)
self.filename = filename
def recording_callback(self, handle, buffer, length, user):
buf = string_at(buffer, length)
self.file.writeframes(buf)
return True
def setup_file(self):
self.file = wave.open(self.filename, 'w')
self.file.setnchannels(self._channels)
self.file.setsampwidth(2)
self.file.setframerate(self._frequency)
def play(self, *args, **kwargs):
if not self.is_playing:
self.setup_file()
super(WaveRecording, self).play(*args, **kwargs)
def stop(self, *args, **kwargs):
super(WaveRecording, self).stop(*args, **kwargs)
self.file.close()