Make frame size changes from UI work again.

looper
Ben Niemann 6 years ago
parent ae364ab265
commit 29f0c5ce4a

@ -8,9 +8,6 @@
- buffer conversion methods?
- different buffer types for events (native, atom, ...)
- auto convert as needed
- frame_size is a property of the backend
- only PyAudioBackend supports it
- audioproc cmd 'SET_BACKEND_PROPERTY'
* Loop start/end move around when BPM is changed :BUG:
because they're tracked in sample time, not music time

@ -71,13 +71,13 @@ class AudioProcClientMixin(object):
'DISCONNECT_PORTS', self._session_id,
node1_id, port1_name, node2_id, port2_name)
async def set_backend(self, name, **args):
async def set_backend(self, name, **parameters):
return await self._stub.call(
'SET_BACKEND', self._session_id, name, args)
'SET_BACKEND', self._session_id, name, parameters)
async def set_frame_size(self, frame_size):
async def set_backend_parameters(self, **parameters):
return await self._stub.call(
'SET_FRAME_SIZE', self._session_id, frame_size)
'SET_BACKEND_PARAMETERS', self._session_id, parameters)
async def play_file(self, path):
return await self._stub.call(

@ -104,7 +104,7 @@ class AudioProcProcessMixin(object):
self.server.add_command_handler(
'SET_BACKEND', self.handle_set_backend)
self.server.add_command_handler(
'SET_FRAME_SIZE', self.handle_set_frame_size)
'SET_BACKEND_PARAMETERS', self.handle_set_backend_parameters)
self.server.add_command_handler(
'PLAY_FILE', self.handle_play_file)
self.server.add_command_handler(
@ -287,17 +287,17 @@ class AudioProcProcessMixin(object):
mutations.DisconnectPorts(
node1.outputs[port1_name], node2.inputs[port2_name]))
def handle_set_backend(self, session_id, name, args):
def handle_set_backend(self, session_id, name, parameters):
self.get_session(session_id)
result = None
if name == 'pyaudio':
be = backend.PyAudioBackend(**args)
be = backend.PyAudioBackend(parameters)
elif name == 'null':
be = backend.NullBackend(**args)
be = backend.NullBackend(parameters)
elif name == 'ipc':
be = backend.IPCBackend(**args)
be = backend.IPCBackend(parameters)
result = be.address
elif name is None:
be = None
@ -307,9 +307,9 @@ class AudioProcProcessMixin(object):
self.__vm.set_backend(be)
return result
def handle_set_frame_size(self, session_id, frame_size):
def handle_set_backend_parameters(self, session_id, parameters):
self.get_session(session_id)
self.__vm.set_frame_size(frame_size)
self.__vm.set_backend_parameters(parameters)
def perf_data_callback(self, perf_data):
self.event_loop.call_soon_threadsafe(

@ -20,6 +20,8 @@ from . import frame_data_capnp
logger = logging.getLogger(__name__)
UNSET = object()
class Backend(object):
def __init__(self):
@ -33,6 +35,9 @@ class Backend(object):
def cleanup(self):
pass
def set_parameters(self):
pass
@property
def sample_rate(self):
return self.__sample_rate
@ -77,9 +82,17 @@ class Backend(object):
class NullBackend(Backend):
def __init__(self, *, frame_size=512):
def __init__(self, parameters):
super().__init__()
self.__frame_size = frame_size
self.__frame_size = 512
self.set_parameters(**parameters)
def set_parameters(self, *, frame_size=UNSET, **parameters):
super().set_parameters(**parameters)
if frame_size is not UNSET:
self.__frame_size = frame_size
def begin_frame(self, ctxt):
ctxt.duration = self.__frame_size
@ -92,7 +105,7 @@ class NullBackend(Backend):
class PyAudioBackend(Backend):
def __init__(self, *, frame_size=512):
def __init__(self, parameters):
super().__init__()
self.__audio = None
@ -103,9 +116,17 @@ class PyAudioBackend(Backend):
self.__need_more = threading.Event()
self.__bytes_per_sample = 2 * 2
self.__buffer_threshold = 4096 * self.__bytes_per_sample
self.__frame_size = frame_size
self.__frame_size = 512
self.__outputs = {}
self.set_parameters(**parameters)
def set_parameters(self, *, frame_size=UNSET, **parameters):
super().set_parameters(**parameters)
if frame_size is not UNSET:
self.__frame_size = frame_size
def setup(self, sample_rate):
super().setup(sample_rate)
@ -203,7 +224,7 @@ class PyAudioBackend(Backend):
class IPCBackend(Backend):
def __init__(self, socket_dir=None):
def __init__(self, parameters, socket_dir=None):
super().__init__()
if socket_dir is None:
@ -217,6 +238,8 @@ class IPCBackend(Backend):
self.__out_frame = None
self.__entities = None
self.set_parameters(**parameters)
def setup(self, sample_rate):
super().setup(sample_rate)
self.__stream.setup()

@ -186,11 +186,13 @@ class PipelineVM(object):
if backend is not None:
self.setup_backend(backend)
def set_frame_size(self, frame_size):
logger.info("frame_size=%d", frame_size)
def set_backend_parameters(self, parameters):
logger.info(
"%s backend: set_parameters(%s)",
type(self.__backend).__name__, parameters)
with self.writer_lock():
self.__frame_size = frame_size
self.update_spec()
if self.__backend is not None:
self.__backend.set_parameters(**parameters)
@property
def nodes(self):
@ -264,7 +266,10 @@ class PipelineVM(object):
break
if ctxt.duration != self.__frame_size:
self.set_frame_size(ctxt.duration)
logger.info("frame_size=%d", ctxt.duration)
with self.writer_lock():
self.__frame_size = ctxt.duration
self.update_spec()
with self.reader_lock():
if self.__spec is not None:

@ -372,10 +372,9 @@ class EditorApp(BaseEditorApp):
await self.audioproc_client.connect(
self.audioproc_process, {'perf_data'})
await self.audioproc_client.set_frame_size(
2 ** int(self.settings.value('audio/frame_size', 10)))
await self.audioproc_client.set_backend(
self.settings.value('audio/backend', 'pyaudio'))
self.settings.value('audio/backend', 'pyaudio'),
frame_size=2 ** int(self.settings.value('audio/frame_size', 10)))
def onPipelineStatus(self, status):
if 'perf_data' in status:

@ -171,7 +171,9 @@ class AudioPage(Page):
backend = self._backends[index]
self.call_async(
self.app.audioproc_client.set_backend(backend),
self.app.audioproc_client.set_backend(
backend,
frame_size=2 ** int(self.app.settings.value('audio/frame_size', 10))),
callback=functools.partial(
self._set_backend_done, backend=backend))
@ -180,7 +182,8 @@ class AudioPage(Page):
def frameSizeChanged(self, frame_size):
self.call_async(
self.app.audioproc_client.set_frame_size(2 ** frame_size),
self.app.audioproc_client.set_backend_parameters(
frame_size=2 ** frame_size),
callback=functools.partial(
self._set_frame_size_done, frame_size=frame_size))

Loading…
Cancel
Save