Example #1
0
def test_stream_between_remote_nodes():
    # this is done at Manager level the manager do known the connection
    man = create_manager(auto_close_at_exit = False)
    nodegroup = man.create_nodegroup()
    
    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes', 'FakeSender' )
    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes', 'FakeReceiver' )
    
    # create ndoes
    sender = nodegroup.create_node('FakeSender', name = 'sender')
    stream_spec = dict(protocol = 'tcp', interface = '127.0.0.1', port = '*',
                        transfertmode = 'plaindata', streamtype = 'analogsignal',
                        dtype = 'float32', shape = (-1, 16), compression ='',
                        scale = None, offset = None, units = '' )
    sender.configure(sample_interval = 0.001)
    sender.outputs['signals'].configure(**stream_spec)
    sender.initialize()
    
    receiver = nodegroup.create_node('FakeReceiver', name = 'receiver')
    receiver.configure()
    receiver.inputs['signals'].connect(sender.outputs['signals'])
    receiver.initialize()
    
    # start them for a while
    sender.start()
    receiver.start()
    print(nodegroup.any_node_running())
    
    time.sleep(2.)
    
    sender.stop()
    receiver.stop()
    print(nodegroup.any_node_running())
    
    man.close()
Example #2
0
def test_npbufferdevice():
    man = create_manager(auto_close_at_exit=False)
    nodegroup = man.create_nodegroup()

    dev = nodegroup.create_node('NumpyDeviceBuffer', name='dev')
    dev.configure(nb_channel=7, sample_interval=0.0001)
    dev.output.configure(protocol='tcp',
                         interface='127.0.0.1',
                         transfertmode='plaindata')
    dev.initialize()

    # create stream
    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes',
                                             'FakeReceiver')
    receivers = [
        nodegroup.create_node('FakeReceiver', name='receiver{}'.format(i))
        for i in range(3)
    ]
    for receiver in receivers:
        receiver.configure()
        receiver.input.connect(dev.output)
        receiver.initialize()

    nodegroup.start_all_nodes()

    print(nodegroup.any_node_running())
    time.sleep(1.)

    nodegroup.stop_all_nodes()
    print(nodegroup.any_node_running())

    man.close()
Example #3
0
def test_stream_between_remote_nodes():
    # this is done at Manager level the manager do known the connection
    man = create_manager(auto_close_at_exit=False)
    nodegroup = man.create_nodegroup('nodegroup')
    
    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes', 'FakeSender')
    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes', 'FakeReceiver')
    
    # create ndoes
    sender = nodegroup.create_node('FakeSender', name='sender')
    stream_spec = dict(protocol='tcp', interface='127.0.0.1', port='*',
                       transfermode='plaindata', streamtype='analogsignal',
                       dtype='float32', shape=(-1, 16), compression='',
                       scale=None, offset=None, units='')
    sender.configure(sample_interval=0.001)
    sender.outputs['signals'].configure(**stream_spec)
    sender.initialize()
    
    receiver = nodegroup.create_node('FakeReceiver', name='receiver')
    receiver.configure()
    receiver.inputs['signals'].connect(sender.outputs['signals'])
    receiver.initialize()
    
    # start them for a while
    sender.start()
    receiver.start()
    #~ print(nodegroup.any_node_running())
    
    time.sleep(2.)
    
    sender.stop()
    receiver.stop()
    #~ print(nodegroup.any_node_running())
    
    man.close()
Example #4
0
def test_play_sinus():
    # play a buffer to audio out

    sr = 44100.0
    nb_channel = 2
    chunksize = 4096

    man = create_manager(auto_close_at_exit=False)
    nodegroup = man.create_nodegroup()

    audioin = nodegroup.create_node("NumpyDeviceBuffer", name="audioin")
    audioout = nodegroup.create_node("PyAudio", name="audioout")

    audioin.configure(sample_interval=1.0 / sr, chunksize=chunksize, nb_channel=nb_channel)
    audioin.output.configure(protocol="inproc", transfertmode="plaindata")
    audioin.initialize()

    audioout.configure(
        nb_channel=nb_channel,
        sample_rate=sr,
        input_device_index=None,
        output_device_index=0,
        format="float32",
        chunksize=chunksize,
    )
    audioout.input.connect(audioin.output)
    audioout.initialize()

    audioout.start()
    audioin.start()

    time.sleep(2.0)

    man.close()
Example #5
0
def test_npbufferdevice():
    man = create_manager(auto_close_at_exit=False)
    nodegroup = man.create_nodegroup()
    
    #~ sigs = None
    sigs = np.random.randn(2560, 7).astype('float64')
    
    dev = nodegroup.create_node('NumpyDeviceBuffer', name='dev')
    dev.configure(nb_channel=7, sample_interval=0.0001, chunksize=256, buffer=sigs)
    dev.output.configure(protocol='tcp', interface='127.0.0.1', transfermode='plaindata')
    dev.initialize()
    
    # create stream
    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes', 'FakeReceiver')
    receivers = [nodegroup.create_node('FakeReceiver', name='receiver{}'.format(i)) for i in range(3)]
    for receiver in receivers:
        receiver.configure()
        receiver.input.connect(dev.output)
        receiver.initialize()
    
    channel_info = receivers[0].input.params['channel_info']
    assert len(channel_info) == 7
    
    nodegroup.start_all_nodes()
    
    #~ print(nodegroup.any_node_running())
    time.sleep(1.)
    
    nodegroup.stop_all_nodes()
    #~ print(nodegroup.any_node_running())
    
    man.close()
Example #6
0
def test_play_sinus():
    # play a buffer to audio out

    sr = 44100.
    nb_channel = 2
    chunksize = 4096

    man = create_manager(auto_close_at_exit=False)
    nodegroup = man.create_nodegroup()

    audioin = nodegroup.create_node('NumpyDeviceBuffer', name='audioin')
    audioout = nodegroup.create_node('PyAudio', name='audioout')

    audioin.configure(sample_interval=1. / sr,
                      chunksize=chunksize,
                      nb_channel=nb_channel)
    audioin.output.configure(protocol='inproc', transfertmode='plaindata')
    audioin.initialize()

    audioout.configure(nb_channel=nb_channel,
                       sample_rate=sr,
                       input_device_index=None,
                       output_device_index=0,
                       format='float32',
                       chunksize=chunksize)
    audioout.input.connect(audioin.output)
    audioout.initialize()

    audioout.start()
    audioin.start()

    time.sleep(2.)

    man.close()
Example #7
0
def dev_remote_viewer_local():
    man = create_manager()

    # this create the dev in a separate process (NodeGroup)
    nodegroup = man.create_nodegroup()

    dev = nodegroup.create_node('WebCamAV', name='cam0')
    dev.configure(camera_num=0)
    dev.output.configure(protocol='tcp',
                         interface='127.0.0.1',
                         transfertmode='plaindata')
    dev.initialize()

    #view is a Node in local QApp
    app = pg.mkQApp()

    viewer = ImageViewer()
    viewer.configure()
    viewer.input.connect(dev.output)
    viewer.initialize()
    viewer.show()

    dev.start()
    viewer.start()

    app.exec_()
def test_npbufferdevice():
    man = create_manager(auto_close_at_exit = False)
    nodegroup = man.create_nodegroup()
    
    dev = nodegroup.create_node('NumpyDeviceBuffer', name = 'dev')
    dev.configure( nb_channel = 7, sample_interval = 0.0001)
    stream_dict = dict(protocol = 'tcp', interface = '127.0.0.1', port = '*',
                        transfertmode = 'plaindata', streamtype = 'analogsignal',
                        dtype = 'float32', shape = (-1, 16), compression ='',
                        scale = None, offset = None, units = '' )
    dev.output.configure(protocol = 'tcp', interface = '127.0.0.1', transfertmode = 'plaindata')
    dev.initialize()
    
    # create stream
    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes', 'FakeReceiver' )
    receivers = [ nodegroup.create_node('FakeReceiver', name = 'receiver{}'.format(i)) for i in range(3) ]
    for receiver in receivers:
        receiver.configure()
        receiver.input.connect(dev.output)
        receiver.initialize()
    
    nodegroup.start_all_nodes()
    
    print(nodegroup.any_node_running())
    time.sleep(1.)
    
    nodegroup.stop_all_nodes()
    print(nodegroup.any_node_running())
    
    man.close()
Example #9
0
def dev_remote_viewer_remote():
    # no QApp all Nodes are remoted even the viewer.
    # note that dev and viewer are in the same NodeGroup
    # so they are in the same process

    man = create_manager()
    nodegroup = man.create_nodegroup()

    dev = nodegroup.create_node('WebCamAV', name='cam0')
    dev.configure(camera_num=0)
    dev.output.configure(protocol='tcp',
                         interface='127.0.0.1',
                         transfertmode='plaindata')
    dev.initialize()

    viewer = nodegroup.create_node('ImageViewer', name='viewer0')
    viewer.configure()
    viewer.input.connect(dev.output)
    viewer.initialize()
    viewer.show()

    dev.start()
    viewer.start()

    time.sleep(10.)
Example #10
0
def test_play_sinus():
    # play a buffer to audio out
    
    sr = 44100.
    nb_channel = 2
    chunksize = 4096
    
    man = create_manager(auto_close_at_exit=False)
    nodegroup = man.create_nodegroup()
    
    audioin = nodegroup.create_node('NumpyDeviceBuffer', name='audioin')
    audioout = nodegroup.create_node('PyAudio', name='audioout')
    
    audioin.configure(sample_interval=1./sr, chunksize=chunksize, nb_channel=nb_channel)
    audioin.output.configure(protocol='inproc', transfertmode='plaindata')
    audioin.initialize()
    
    audioout.configure(nb_channel=nb_channel, sample_rate=sr,
                    input_device_index=None, output_device_index=0,
                    format='float32', chunksize=chunksize)
    audioout.input.connect(audioin.output)
    audioout.initialize()
    
    audioout.start()
    audioin.start()
    
    time.sleep(2.)
    
    man.close()
Example #11
0
def lauch_qtimefreq(transfermode, axisorder, localworker):
    # TODO test with other axis order

    #~ man = create_manager(auto_close_at_exit = True)
    man = create_manager(auto_close_at_exit=False)
    ng = man.create_nodegroup()

    app = pg.mkQApp()

    dev = ng.create_node('NumpyDeviceBuffer')
    dev.configure(nb_channel=nb_channel,
                  sample_interval=1. / sample_rate,
                  chunksize=chunksize,
                  buffer=buffer)
    if transfermode == 'sharedmem':
        buffer_size = int(62. * sample_rate)
    else:
        buffer_size = 0
    dev.output.configure(protocol='tcp',
                         interface='127.0.0.1',
                         transfermode=transfermode,
                         buffer_size=buffer_size,
                         double=True)
    dev.initialize()

    if localworker:
        nodegroup_friends = None
    else:
        nodegroup_friends = [man.create_nodegroup() for _ in range(4)]

    viewer = QTimeFreq()
    viewer.configure(with_user_dialog=True,
                     nodegroup_friends=nodegroup_friends)
    viewer.input.connect(dev.output)
    viewer.initialize()
    viewer.show()

    viewer.params['nb_column'] = 4
    viewer.params['refresh_interval'] = 1000

    def terminate():
        viewer.stop()
        dev.stop()
        viewer.close()
        dev.close()
        app.quit()

    dev.start()

    viewer.start()

    # start for a while
    timer = QtCore.QTimer(singleShot=True, interval=3000)
    timer.timeout.connect(terminate)
    timer.start()

    app.exec_()

    man.close()
Example #12
0
def test_register_node_type_from_module():
    man = create_manager(auto_close_at_exit=False)
    nodegroup = man.create_nodegroup('nodegroup')
    
    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes', 'NoneRegisteredClass')
    node = nodegroup.create_node('NoneRegisteredClass')
    
    man.close()
Example #13
0
def lauch_qoscilloscope(transfermode, axisorder):

    man = create_manager(auto_close_at_exit=False)
    ng = man.create_nodegroup()

    app = pg.mkQApp()

    length = int(sample_rate * 20)
    t = np.arange(length) / sample_rate
    buffer = np.random.rand(length, nb_channel) * .3
    buffer += np.sin(2 * np.pi * 1.2 * t)[:, None] * .5
    buffer = buffer.astype('float32')

    #~ dev =NumpyDeviceBuffer()
    dev = ng.create_node('NumpyDeviceBuffer')
    dev.configure(nb_channel=nb_channel,
                  sample_interval=1. / sample_rate,
                  chunksize=chunksize,
                  buffer=buffer)
    if transfermode == 'plaindata':
        dev.output.configure(protocol='tcp',
                             interface='127.0.0.1',
                             transfermode='plaindata')
    elif transfermode == 'sharedmem':
        dev.output.configure(protocol='tcp',
                             interface='127.0.0.1',
                             transfermode='sharedmem',
                             buffer_size=int(sample_rate * 62.),
                             axisorder=axisorder,
                             double=True)
    dev.initialize()

    viewer = QOscilloscope()
    viewer.configure(with_user_dialog=True)
    viewer.input.connect(dev.output)
    viewer.initialize()
    viewer.show()
    viewer.params['decimation_method'] = 'min_max'

    def terminate():
        viewer.stop()
        dev.stop()
        viewer.close()
        dev.close()
        app.quit()

    dev.start()
    viewer.start()

    # start for a while
    timer = QtCore.QTimer(singleShot=True, interval=2000)
    timer.timeout.connect(terminate)
    timer.start()

    app.exec_()

    man.close()
Example #14
0
def test_register_node_type_from_module():
    man = create_manager(auto_close_at_exit=False)
    nodegroup = man.create_nodegroup('nodegroup')

    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes',
                                             'NoneRegisteredClass')
    node = nodegroup.create_node('NoneRegisteredClass')

    man.close()
Example #15
0
def test_visual_node_both_in_main_qapp_and_remote_qapp():
    man = create_manager(auto_close_at_exit = False)
    nodegroup = man.create_nodegroup()
    
    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes', 'FakeSender' )
    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes', 'ReceiverWidget' )


    # create ndoes
    sender = nodegroup.create_node('FakeSender', name = 'sender')
    stream_spec = dict(protocol = 'tcp', interface = '127.0.0.1', port = '*',
                        transfertmode = 'plaindata', streamtype = 'analogsignal',
                        dtype = 'float32', shape = (-1, 16), compression ='',
                        scale = None, offset = None, units = '' )
    sender.configure(sample_interval = 0.001)
    sender.output.configure(**stream_spec)
    sender.initialize()
    
    #receiver0 is in remote QApp (in nodegroup)
    receiver0 = nodegroup.create_node('ReceiverWidget', name = 'receiver0', tag ='<b>I am in distant QApp</b>')
    receiver0.configure()
    receiver0.input.connect(sender.output)
    receiver0.initialize()
    receiver0.show()
    
    
    #receiver1 is in local QApp
    app = pg.mkQApp()
    receiver1 = ReceiverWidget(name = 'receiver1', tag ='<b>I am in local QApp</b>')
    receiver1.configure()
    receiver1.input.connect(sender.output)
    receiver1.initialize()
    receiver1.show()
    
    # start them for a while
    sender.start()
    receiver0.start()
    receiver1.start()
    print(nodegroup.any_node_running())

    def terminate():
        sender.stop()
        receiver0.stop()
        receiver1.stop()
        receiver1.close()
        app.quit()
        
    timer = QtCore.QTimer(singleShot = True, interval = 1000)
    timer.timeout.connect(terminate)
    timer.start()
    
    app.exec_()
    
    receiver0.close()
    man.close()
Example #16
0
def test_visual_node_both_in_main_qapp_and_remote_qapp():
    man = create_manager(auto_close_at_exit=False)
    nodegroup = man.create_nodegroup('nodegroup')
    
    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes', 'FakeSender')
    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes', 'ReceiverWidget')


    # create ndoes
    sender = nodegroup.create_node('FakeSender', name='sender')
    stream_spec = dict(protocol='tcp', interface='127.0.0.1', port='*',
                        transfermode='plaindata', streamtype='analogsignal',
                        dtype='float32', shape=(-1, 16), compression ='',
                        scale = None, offset = None, units = '')
    sender.configure(sample_interval=0.001)
    sender.output.configure(**stream_spec)
    sender.initialize()
    
    # receiver0 is in remote QApp (in nodegroup)
    receiver0 = nodegroup.create_node('ReceiverWidget', name='receiver0', tag='<b>I am in distant QApp</b>')
    receiver0.configure()
    receiver0.input.connect(sender.output)
    receiver0.initialize()
    receiver0.show()
    
    
    # receiver1 is in local QApp
    app = pg.mkQApp()
    receiver1 = ReceiverWidget(name='receiver1', tag='<b>I am in local QApp</b>')
    receiver1.configure()
    receiver1.input.connect(sender.output)
    receiver1.initialize()
    receiver1.show()
    
    # start them for a while
    sender.start()
    receiver0.start()
    receiver1.start()

    def terminate():
        sender.stop()
        receiver0.stop()
        receiver1.stop()
        receiver1.close()
        app.quit()
        
    timer = QtCore.QTimer(singleShot=True, interval=2000)
    timer.timeout.connect(terminate)
    timer.start()
    
    app.exec_()
    
    receiver0.close()
    man.close()
Example #17
0
def lauch_qoscilloscope(transfermode, axisorder):
    
    man = create_manager(auto_close_at_exit=False)
    ng = man.create_nodegroup()
    
    app = pg.mkQApp()
    
    length = int(sample_rate*20)
    t = np.arange(length)/sample_rate
    buffer = np.random.rand(length, nb_channel)*.3
    buffer += np.sin(2*np.pi*1.2*t)[:,None]*.5
    # add offset 
    buffer += np.random.randn(nb_channel)[None, :]*50
    buffer[:, -1] = 0
    buffer = buffer.astype('float32')

    #~ dev =NumpyDeviceBuffer()
    dev = ng.create_node('NumpyDeviceBuffer')
    dev.configure(nb_channel=nb_channel, sample_interval=1./sample_rate, chunksize=chunksize, buffer=buffer)
    if transfermode== 'plaindata':
        dev.output.configure(protocol='tcp', interface='127.0.0.1', transfermode='plaindata')
    elif transfermode== 'sharedmem':
        dev.output.configure(protocol='tcp', interface='127.0.0.1', transfermode='sharedmem',
                    buffer_size=int(sample_rate*62.), axisorder=axisorder, double=True)
    dev.initialize()

    
    viewer = QOscilloscope()
    viewer.configure(with_user_dialog=True)
    viewer.input.connect(dev.output)
    viewer.initialize()
    viewer.show()
    viewer.params['decimation_method'] = 'min_max'
    #~ viewer.params['scale_mode'] = 'by_channel'


    def terminate():
        viewer.stop()
        dev.stop()
        viewer.close()
        dev.close()
        app.quit()
    
    dev.start()
    viewer.start()
    
    # start for a while
    timer = QtCore.QTimer(singleShot=True, interval=2000)
    timer.timeout.connect(terminate)
    timer.start()
    
    app.exec_()

    man.close()
Example #18
0
def lauch_qtimefreq(transfermode, axisorder, localworker):
    # TODO test with other axis order
    
    #~ man = create_manager(auto_close_at_exit = True)
    man = create_manager(auto_close_at_exit=False)
    ng = man.create_nodegroup()
    
    app = pg.mkQApp()
    
    dev = ng.create_node('NumpyDeviceBuffer')
    dev.configure(nb_channel=nb_channel, sample_interval=1./sample_rate, chunksize=chunksize, buffer=buffer)
    if transfermode=='sharedmem':
        buffer_size = int(62.*sample_rate)
    else:
        buffer_size = 0
    dev.output.configure(protocol='tcp', interface='127.0.0.1', transfermode=transfermode,
                    buffer_size=buffer_size, double=True)
    dev.initialize()
    
    if localworker:
        nodegroup_friends = None
    else:
        nodegroup_friends = [man.create_nodegroup() for _ in range(4)]
    
    viewer = QTimeFreq()
    viewer.configure(with_user_dialog=True, nodegroup_friends=nodegroup_friends)
    viewer.input.connect(dev.output)
    viewer.initialize()
    viewer.show()
    
    viewer.params['nb_column'] = 4
    viewer.params['refresh_interval'] = 1000
    
    
    def terminate():
        viewer.stop()
        dev.stop()
        viewer.close()
        dev.close()
        app.quit()
    
    dev.start()

    viewer.start()
    
    # start for a while
    timer = QtCore.QTimer(singleShot=True, interval=3000)
    timer.timeout.connect(terminate)
    timer.start()
    
    app.exec_()
    
    man.close()
Example #19
0
def test_TimeFreqWorker():
    # test only one worker
    man = create_manager(auto_close_at_exit=False)
    #~ man = create_manager(auto_close_at_exit = True)
    
    ng = man.create_nodegroup()

    dev = ng.create_node('NumpyDeviceBuffer')
    dev.configure(nb_channel=nb_channel, sample_interval=1./sample_rate, chunksize=chunksize,
                    buffer=buffer.transpose(), timeaxis=1,)
    dev.output.configure(protocol='tcp', interface='127.0.0.1', transfermode='sharedarray',
                            sharedarray_shape=(nb_channel, 2048*50), ring_buffer_method = 'double')
    dev.initialize()
    
    workers = []
    for i in range(nb_channel):
        worker = ng.create_node('TimeFreqWorker')
        worker.configure(max_xsize=30., channel=i, local=False)
        worker.input.connect(dev.output)
        worker.output.configure()
        worker.initialize()
        workers.append(worker)
    
    # compute wavelet : 3 s. of signal at 500Hz
    import scipy.signal
    xsize, wf_size, sub_sr= 3., 2048, 500.
    wavelet_fourrier = generate_wavelet_fourier(wf_size, 1., 100., 2.5, sub_sr, 2.5, 0)
    filter_b = scipy.signal.firwin(9, 1. / 20., window='hamming')
    filter_a = np.array([1.])
    
    dev.start()
    
    time.sleep(.5)
    for worker in workers:
        worker.start()
    
    # change the wavelet on fly
    for worker in workers:
        worker.on_fly_change_wavelet(wavelet_fourrier=wavelet_fourrier, downsample_factor=20,
            sig_chunk_size=2048*20,
            plot_length=int(sub_sr*xsize), filter_a=filter_a, filter_b=filter_b)
    
    head = 0
    for i in range(4):
        time.sleep(.5)
        head += int(sample_rate*.5)
        for worker in workers:
            worker.compute_one_map(head)
    
    dev.stop()
    
    man.close()
Example #20
0
def test_stream_between_local_and_remote_nodes():
    # this is done at Manager level the manager do known the connection
    man = create_manager(auto_close_at_exit=False)
    nodegroup = man.create_nodegroup('nodegroup')

    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes',
                                             'FakeSender')

    # create ndoes
    sender = nodegroup.create_node('FakeSender', name='sender')
    stream_spec = dict(protocol='tcp',
                       interface='127.0.0.1',
                       port='*',
                       transfertmode='plaindata',
                       streamtype='analogsignal',
                       dtype='float32',
                       shape=(-1, 16),
                       compression='',
                       scale=None,
                       offset=None,
                       units='')
    sender.configure(sample_interval=0.001)
    sender.output.configure(**stream_spec)
    sender.initialize()

    # create local nodes in QApplication
    app = pg.mkQApp()

    receiver = FakeReceiver()
    receiver.configure()
    receiver.input.connect(sender.output)
    receiver.initialize()

    # start them for a while
    sender.start()
    receiver.start()

    def terminate():
        sender.stop()
        receiver.stop()
        app.quit()

    timer = QtCore.QTimer(singleShot=True, interval=2000)
    timer.timeout.connect(terminate)
    timer.start()

    app.exec_()

    man.close()
Example #21
0
def test_qtimefreq_distributed_worker():
    #logger.level = logging.DEBUG
    man = create_manager(auto_close_at_exit=False)

    nodegroup_friends = [man.create_nodegroup() for _ in range(4)]

    app = pg.mkQApp()

    ng = man.create_nodegroup()
    dev = ng.create_node('NumpyDeviceBuffer')
    dev.configure(nb_channel=nb_channel,
                  sample_interval=1. / sample_rate,
                  chunksize=chunksize,
                  buffer=buffer)
    dev.output.configure(protocol='tcp',
                         interface='127.0.0.1',
                         transfermode='plaindata')
    dev.initialize()

    viewer = QTimeFreq()
    viewer.configure(with_user_dialog=True,
                     nodegroup_friends=nodegroup_friends)
    viewer.input.connect(dev.output)
    viewer.initialize()
    viewer.show()

    viewer.params['nb_column'] = 4
    viewer.params['refresh_interval'] = 1000

    def terminate():
        viewer.stop()
        dev.stop()
        viewer.close()
        dev.close()
        app.quit()

    dev.start()

    viewer.start()

    # start for a while
    timer = QtCore.QTimer(singleShot=True, interval=3000)
    timer.timeout.connect(terminate)
    timer.start()

    app.exec_()

    man.close()
Example #22
0
def test_qtimefreq_local_worker():
    
    #~ man = create_manager(auto_close_at_exit = True)
    man = create_manager(auto_close_at_exit=False)
    ng = man.create_nodegroup()
    
    app = pg.mkQApp()
    
    dev = ng.create_node('NumpyDeviceBuffer')
    dev.configure(nb_channel=nb_channel, sample_interval=1./sample_rate, chunksize=chunksize,
                    buffer=buffer)
    dev.output.configure(protocol='tcp', interface='127.0.0.1', transfermode='plaindata')
    dev.initialize()
    
    
    
    viewer = QTimeFreq()
    viewer.configure(with_user_dialog=True)
    viewer.input.connect(dev.output)
    viewer.initialize()
    viewer.show()
    
    viewer.params['nb_column'] = 4
    viewer.params['refresh_interval'] = 1000
    
    
    def terminate():
        viewer.stop()
        dev.stop()
        viewer.close()
        dev.close()
        app.quit()
    
    dev.start()

    viewer.start()
    
    # start for a while
    timer = QtCore.QTimer(singleShot=True, interval=3000)
    timer.timeout.connect(terminate)
    timer.start()
    
    app.exec_()
    
    man.close()
Example #23
0
def test_qtimefreq_distributed_worker():
    # ~ man = create_manager(auto_close_at_exit = True)
    man = create_manager(auto_close_at_exit=False)

    nodegroup_friends = [man.create_nodegroup() for _ in range(4)]

    app = pg.mkQApp()

    ng = man.create_nodegroup()
    dev = ng.create_node("NumpyDeviceBuffer")
    dev.configure(nb_channel=nb_channel, sample_interval=1.0 / sample_rate, chunksize=chunksize, buffer=buffer)
    dev.output.configure(protocol="tcp", interface="127.0.0.1", transfermode="plaindata")
    dev.initialize()

    viewer = QTimeFreq()
    viewer.configure(with_user_dialog=True, nodegroup_friends=nodegroup_friends)
    viewer.input.connect(dev.output)
    viewer.initialize()
    viewer.show()

    viewer.params["nb_column"] = 4
    viewer.params["refresh_interval"] = 1000

    def terminate():
        viewer.stop()
        dev.stop()
        viewer.close()
        dev.close()
        app.quit()

    dev.start()

    viewer.start()

    # start for a while
    timer = QtCore.QTimer(singleShot=True, interval=3000)
    timer.timeout.connect(terminate)
    timer.start()

    app.exec_()

    man.close()
Example #24
0
def test_stream_between_local_and_remote_nodes():
    # this is done at Manager level the manager do known the connection
    man = create_manager(auto_close_at_exit = False)
    nodegroup = man.create_nodegroup()
    
    nodegroup.register_node_type_from_module('pyacq.core.tests.fakenodes', 'FakeSender' )
    
    # create ndoes
    sender = nodegroup.create_node('FakeSender', name = 'sender')
    stream_spec = dict(protocol = 'tcp', interface = '127.0.0.1', port = '*',
                        transfertmode = 'plaindata', streamtype = 'analogsignal',
                        dtype = 'float32', shape = (-1, 16), compression ='',
                        scale = None, offset = None, units = '' )
    sender.configure(sample_interval = 0.001)
    sender.output.configure(**stream_spec)
    sender.initialize()
    
    # create local nodes in QApplication
    app = pg.mkQApp()
    
    receiver = FakeReceiver()
    receiver.configure()
    receiver.input.connect(sender.output)
    receiver.initialize()
    
    # start them for a while
    sender.start()
    receiver.start()

    def terminate():
        sender.stop()
        receiver.stop()
        app.quit()
        
    timer = QtCore.QTimer(singleShot = True, interval = 2000)
    timer.timeout.connect(terminate)
    timer.start()
    
    app.exec_()
    
    man.close()
Example #25
0
def dev_remote_viewer_local():
    man = create_manager()

    # this create the dev in a separate process (NodeGroup)
    nodegroup = man.create_nodegroup()
    
    dev = nodegroup.create_node('WebCamAV', name = 'cam0')
    dev.configure(camera_num = 0)
    dev.output.configure(protocol = 'tcp', interface = '127.0.0.1', transfermode = 'plaindata')
    dev.initialize()

    #view is a Node in local QApp
    app = pg.mkQApp()

    viewer = ImageViewer()
    viewer.configure()
    viewer.input.connect(dev.output)
    viewer.initialize()
    viewer.show()

    dev.start()
    viewer.start()

    app.exec_()
Example #26
0
def dev_remote_viewer_remote():
    # no QApp all Nodes are remoted even the viewer.
    # note that dev and viewer are in the same NodeGroup
    # so they are in the same process
    
    man = create_manager()
    nodegroup = man.create_nodegroup()
    
    dev = nodegroup.create_node('WebCamAV', name = 'cam0')
    dev.configure(camera_num = 0)
    dev.output.configure(protocol = 'tcp', interface = '127.0.0.1', transfermode = 'plaindata')
    dev.initialize()
    
    viewer = nodegroup.create_node('ImageViewer', name = 'viewer0')
    viewer.configure()
    viewer.input.connect(dev.output)
    viewer.initialize()
    viewer.show()

    dev.start()
    viewer.start()
    
    
    time.sleep(10.)
Example #27
0
import pyacq

# get sigs
localdir, filenames, params = tdc.download_dataset(name='olfactory_bulb')
filename = filenames[0]  #only first file
sigs = np.fromfile(filename,
                   dtype=params['dtype']).reshape(-1, params['total_channel'])
sigs = sigs.astype('float32')
sample_rate = params['sample_rate']

# This will impact the latency
chunksize = 1024

# Here a convinient fonction to create a fake device in background
# by playing signal more or less at the good speed
man = pyacq.create_manager(auto_close_at_exit=True)
ng0 = man.create_nodegroup()  # process in background
dev = tridesclous.online.make_pyacq_device_from_buffer(sigs,
                                                       sample_rate,
                                                       nodegroup=ng0,
                                                       chunksize=chunksize)

# The device have 16 channel, take some take 2 tetrodes only
# In fcat this dataset is absolutly not 2 tetrodes but for the demo, it is OK :)
channel_groups = {
    0: {
        'channels': [5, 6, 7, 8]
    },
    1: {
        'channels': [1, 2, 3, 4]
    },
    tau_level=0.005,
    smooth_time=0.0005,
    level_step=1.,
    level_max=120.,
    calibration=93.979400086720375,
    loss_params=loss_params,
    chunksize=chunksize,
    backward_chunksize=backward_chunksize,
    debug_mode=False,
)

stream_spec = dict(protocol='tcp',
                   interface='127.0.0.1',
                   transfertmode='plaindata')

man = pyacq.create_manager()
ng0 = man.create_nodegroup()  # process for device
ng1 = man.create_nodegroup()  # process for processing

dev = ng0.create_node('PyAudio')
dev.configure(nb_channel=nb_channel,
              sample_rate=sample_rate,
              input_device_index=10,
              output_device_index=10,
              format='float32',
              chunksize=chunksize)
dev.output.configure(**stream_spec)
dev.initialize()

ng1.register_node_type_from_module('hearinglosssimulator', 'InvCGCNode')
node = ng1.create_node('HLSNode')
Example #29
0
"""
Simple webcam viewer

Streams video frames from a WebCamAV Node to an ImageViewer Node.
"""
from pyacq import create_manager, ImageViewer
from pyqtgraph.Qt import QtCore, QtGui


man = create_manager()

# this create the dev in a separate process (NodeGroup)
nodegroup = man.create_nodegroup()
dev = nodegroup.create_node('WebCamAV', name = 'cam0')
dev.configure(camera_num = 0)
dev.output.configure(protocol = 'tcp', interface = '127.0.0.1', transfermode = 'plaindata')
dev.initialize()

#view is a Node in local QApp
app = QtGui.QApplication([])

viewer = ImageViewer()
viewer.configure()
viewer.input.connect(dev.output)
viewer.initialize()
viewer.show()

dev.start()
viewer.start()

app.exec_()
Example #30
0
def test_OnlinePeeler():
    dataio = DataIO(dirname='test_onlinepeeler')
    catalogueconstructor = CatalogueConstructor(dataio=dataio)
    catalogue = catalogueconstructor.load_catalogue()
    #~ print(catalogue)
    
    #~ def print_dict(d):
        #~ for k, v in d.items():
            #~ if type(v) is dict:
                #~ print('k', k, 'dict')
                #~ print_dict(v)
            #~ else:
                #~ print('k', k, type(v))
        
    #~ print_dict(catalogue)
    
    #~ from pyacq.core.rpc.serializer import MsgpackSerializer
    #~ serializer = MsgpackSerializer()
    #~ serializer.dumps(catalogue)
    #~ exit()
    
    sigs = dataio.datasource.array_sources[0]
    
    sigs = sigs.astype('float32')
    sample_rate = dataio.sample_rate
    in_group_channels = dataio.channel_groups[0]['channels']
    #~ print(channel_group)
    
    chunksize = 1024
    
    
    # Device node
    man = pyacq.create_manager(auto_close_at_exit=True)
    ng0 = man.create_nodegroup()
    #~ ng0 = None
    ng1 = man.create_nodegroup()
    #~ ng1 = None
    
    
    dev = make_pyacq_device_from_buffer(sigs, sample_rate, nodegroup=ng0, chunksize=chunksize)
    

    
    app = pg.mkQApp()
    
    dev.start()
    
    # Node QOscilloscope
    oscope = QOscilloscope()
    oscope.configure(with_user_dialog=True)
    oscope.input.connect(dev.output)
    oscope.initialize()
    oscope.show()
    oscope.start()
    oscope.params['decimation_method'] = 'min_max'
    oscope.params['mode'] = 'scan'    

    # Node Peeler
    if ng1 is None:
        peeler = OnlinePeeler()
    else:
        ng1.register_node_type_from_module('tridesclous.online', 'OnlinePeeler')
        peeler = ng1.create_node('OnlinePeeler')
    
    peeler.configure(catalogue=catalogue, in_group_channels=in_group_channels, chunksize=chunksize)
    
    peeler.input.connect(dev.output)
    stream_params = dict(protocol='tcp', interface='127.0.0.1', transfermode='plaindata')
    peeler.outputs['signals'].configure(**stream_params)
    peeler.outputs['spikes'].configure(**stream_params)
    peeler.initialize()
    peeler.start()
    
    # Node traceviewer
    tviewer = OnlineTraceViewer()
    tviewer.configure(peak_buffer_size = 1000, catalogue=catalogue)
    tviewer.inputs['signals'].connect(peeler.outputs['signals'])
    tviewer.inputs['spikes'].connect(peeler.outputs['spikes'])
    tviewer.initialize()
    tviewer.show()
    tviewer.start()
    tviewer.params['xsize'] = 3.
    tviewer.params['decimation_method'] = 'min_max'
    tviewer.params['mode'] = 'scan'
    #~ tviewer.params['mode'] = 'scroll'
    
    tviewer.auto_gain_and_offset(mode=1)
    #~ tviewer.gain_zoom(.3)
    tviewer.gain_zoom(.1)
    
    
    
    def ajust_yrange():
        oscope.auto_gain_and_offset(mode=1)
    
    timer = QtCore.QTimer(interval=1000, singleShot=True)
    timer.timeout.connect(ajust_yrange)
    timer.start()
    
    def terminate():
        dev.stop()
        oscope.stop()
        peeler.stop()
        tviewer.stop()
        app.quit()
    
    app.exec_()
Example #31
0
def test_TdcOnlineWindow():
    # get sigs
    localdir, filenames, params = download_dataset(name='olfactory_bulb')
    filename = filenames[0]  #only first file
    sigs = np.fromfile(filename,
                       dtype=params['dtype']).reshape(-1,
                                                      params['total_channel'])
    sigs = sigs.astype('float32')
    sample_rate = params['sample_rate']

    chunksize = 1024

    # Device node
    man = pyacq.create_manager(auto_close_at_exit=True)
    #~ ng0 = man.create_nodegroup()
    ng0 = None
    dev = make_pyacq_device_from_buffer(sigs,
                                        sample_rate,
                                        nodegroup=ng0,
                                        chunksize=chunksize)

    channel_groups = {
        0: {
            'channels': [5, 6, 7, 8]
        },
        1: {
            'channels': [1, 2, 3, 4]
        },
        2: {
            'channels': [9, 10, 11]
        },
    }

    workdir = 'test_tdconlinewindow'

    #~ if os.path.exists(workdir):
    #~ shutil.rmtree(workdir)

    app = pg.mkQApp()

    # nodegroup_firend
    #~ nodegroup_friends = [man.create_nodegroup() for chan_grp in channel_groups]
    nodegroup_friends = None

    w = TdcOnlineWindow()
    w.configure(channel_groups=channel_groups,
                chunksize=chunksize,
                workdir=workdir,
                nodegroup_friends=nodegroup_friends)

    w.input.connect(dev.output)
    w.initialize()
    w.show()

    w.start()

    dev.start()

    #~ def terminate():
    #~ dev.stop()
    #~ w.stop()
    #~ app.quit()
    #~ man.close()

    if __name__ == '__main__':
        app.exec_()
Example #32
0
def test_TimeFreqWorker():
    # test only one worker
    man = create_manager(auto_close_at_exit=False)
    #~ man = create_manager(auto_close_at_exit = True)

    ng = man.create_nodegroup()

    dev = ng.create_node('NumpyDeviceBuffer')
    dev.configure(
        nb_channel=nb_channel,
        sample_interval=1. / sample_rate,
        chunksize=chunksize,
        buffer=buffer.transpose(),
        timeaxis=1,
    )
    dev.output.configure(protocol='tcp',
                         interface='127.0.0.1',
                         transfermode='sharedarray',
                         sharedarray_shape=(nb_channel, 2048 * 50),
                         ring_buffer_method='double')
    dev.initialize()

    workers = []
    for i in range(nb_channel):
        worker = ng.create_node('TimeFreqWorker')
        worker.configure(max_xsize=30., channel=i, local=False)
        worker.input.connect(dev.output)
        worker.output.configure()
        worker.initialize()
        workers.append(worker)

    # compute wavelet : 3 s. of signal at 500Hz
    import scipy.signal
    xsize, wf_size, sub_sr = 3., 2048, 500.
    wavelet_fourrier = generate_wavelet_fourier(wf_size, 1., 100., 2.5, sub_sr,
                                                2.5, 0)
    filter_b = scipy.signal.firwin(9, 1. / 20., window='hamming')
    filter_a = np.array([1.])

    dev.start()

    time.sleep(.5)
    for worker in workers:
        worker.start()

    # change the wavelet on fly
    for worker in workers:
        worker.on_fly_change_wavelet(wavelet_fourrier=wavelet_fourrier,
                                     downsample_factor=20,
                                     sig_chunk_size=2048 * 20,
                                     plot_length=int(sub_sr * xsize),
                                     filter_a=filter_a,
                                     filter_b=filter_b)

    head = 0
    for i in range(4):
        time.sleep(.5)
        head += int(sample_rate * .5)
        for worker in workers:
            worker.compute_one_map(head)

    dev.stop()

    man.close()
def tridesclous_onlinepeeler():
    dataio = DataIO(dirname='tridesclous_onlinepeeler')
    catalogue = dataio.load_catalogue(chan_grp=0)

    #~ catalogue.pop('clusters')
    #~ def print_dict(d):
    #~ for k, v in d.items():
    #~ if type(v) is dict:
    #~ print('k', k, 'dict')
    #~ print_dict(v)
    #~ else:
    #~ print('k', k, type(v))

    #~ print_dict(catalogue)

    #~ from pyacq.core.rpc.serializer import MsgpackSerializer
    #~ serializer = MsgpackSerializer()
    #~ b = serializer.dumps(catalogue)
    #~ catalogue2 = serializer.loads(b)
    #~ print(catalogue2['clusters'])
    #~ exit()

    sigs = dataio.datasource.array_sources[0]

    sigs = sigs.astype('float32').copy()

    sample_rate = dataio.sample_rate
    in_group_channels = dataio.channel_groups[0]['channels']
    #~ print(channel_group)

    chunksize = 1024

    # Device node
    man = pyacq.create_manager(auto_close_at_exit=True)
    ng0 = man.create_nodegroup()
    #~ ng0 = None
    ng1 = man.create_nodegroup()
    #~ ng1 = None
    ng2 = man.create_nodegroup()
    #~ ng2 = None

    dev = make_pyacq_device_from_buffer(sigs,
                                        sample_rate,
                                        nodegroup=ng0,
                                        chunksize=chunksize)
    #~ print(type(dev))
    #~ exit()
    #~ print(dev.output.params)
    #~ exit()

    app = pg.mkQApp()

    dev.start()

    # Node QOscilloscope
    oscope = QOscilloscope()
    oscope.configure(with_user_dialog=True)
    oscope.input.connect(dev.output)
    oscope.initialize()
    oscope.show()
    oscope.start()
    oscope.params['decimation_method'] = 'min_max'
    oscope.params['mode'] = 'scan'
    oscope.params['scale_mode'] = 'by_channel'

    # Node Peeler
    if ng1 is None:
        peeler = OnlinePeeler()
    else:
        ng1.register_node_type_from_module('tridesclous.online',
                                           'OnlinePeeler')
        peeler = ng1.create_node('OnlinePeeler')

    peeler.configure(catalogue=catalogue,
                     in_group_channels=in_group_channels,
                     chunksize=chunksize)
    #~ print(dev.output.params)
    #~ print(peeler.input.connect)
    #~ exit()
    peeler.input.connect(dev.output)
    #~ exit()
    stream_params = dict(protocol='tcp',
                         interface='127.0.0.1',
                         transfermode='plaindata')
    peeler.outputs['signals'].configure(**stream_params)
    peeler.outputs['spikes'].configure(**stream_params)
    peeler.initialize()
    peeler.start()

    # Node traceviewer
    if ng2 is None:
        tviewer = OnlineTraceViewer()
    else:
        ng2.register_node_type_from_module('tridesclous.online',
                                           'OnlineTraceViewer')
        tviewer = ng2.create_node('OnlineTraceViewer')

    tviewer.configure(catalogue=catalogue)
    tviewer.inputs['signals'].connect(peeler.outputs['signals'])
    tviewer.inputs['spikes'].connect(peeler.outputs['spikes'])
    tviewer.initialize()
    tviewer.show()
    tviewer.start()
    tviewer.params['xsize'] = 3.
    tviewer.params['decimation_method'] = 'min_max'
    tviewer.params['mode'] = 'scan'
    tviewer.params['scale_mode'] = 'same_for_all'
    #~ tviewer.params['mode'] = 'scroll'

    tfr_viewer = QTimeFreq()
    tfr_viewer.configure(with_user_dialog=True, nodegroup_friends=None)
    tfr_viewer.input.connect(dev.output)
    tfr_viewer.initialize()
    tfr_viewer.show()
    tfr_viewer.params['refresh_interval'] = 300
    tfr_viewer.params['timefreq', 'f_start'] = 1
    tfr_viewer.params['timefreq', 'f_stop'] = 100.
    tfr_viewer.params['timefreq', 'deltafreq'] = 5
    tfr_viewer.start()

    def ajust_yrange():
        oscope.auto_scale()
        tviewer.auto_scale()
        tviewer.params_controller.apply_ygain_zoom(.3)

    timer = QtCore.QTimer(interval=1000, singleShot=True)
    timer.timeout.connect(ajust_yrange)
    timer.start()

    def terminate():
        dev.stop()
        oscope.stop()
        peeler.stop()
        tviewer.stop()
        app.quit()

    app.exec_()
Example #34
0
"""
Simple webcam viewer

Streams video frames from a WebCamAV Node to an ImageViewer Node.
"""
from pyacq import create_manager, ImageViewer
from pyqtgraph.Qt import QtCore, QtGui

man = create_manager()

# this create the dev in a separate process (NodeGroup)
nodegroup = man.create_nodegroup()
dev = nodegroup.create_node('WebCamAV', name='cam0')
dev.configure(camera_num=0)
dev.output.configure(protocol='tcp',
                     interface='127.0.0.1',
                     transfermode='plaindata')
dev.initialize()

#view is a Node in local QApp
app = QtGui.QApplication([])

viewer = ImageViewer()
viewer.configure()
viewer.input.connect(dev.output)
viewer.initialize()
viewer.show()

dev.start()
viewer.start()
Example #35
0
def test_RawRecorder():

    man = create_manager(auto_close_at_exit=False)
    ng0 = man.create_nodegroup()
    ng1 = man.create_nodegroup()

    app = pg.mkQApp()

    #~ transfermode

    sample_rates = [100., 1000., 10000.]
    nb_channels = [16, 32, 1]
    dtypes = ['float32', 'int16', 'float64']
    chunksizes = [25, 250, 2000]

    devices = []
    for i in range(3):
        sample_rate, nb_channel = sample_rates[i], nb_channels[i]
        chunksize, dtype = chunksizes[i], dtypes[i]

        length = int(sample_rate * 3)
        length = length - length % chunksize
        t = np.arange(length) / sample_rate
        buffer = np.random.rand(length, nb_channel) * .3
        buffer += np.sin(2 * np.pi * 1.2 * t)[:, None] * .5
        buffer = buffer.astype(dtype)

        dev = ng0.create_node('NumpyDeviceBuffer', name='dev{}'.format(i))
        #~ dev = NumpyDeviceBuffer()
        dev.configure(nb_channel=nb_channel,
                      sample_interval=1. / sample_rate,
                      chunksize=chunksize,
                      buffer=buffer)
        dev.output.configure(protocol='tcp',
                             interface='127.0.0.1',
                             transfermode='plaindata')
        dev.initialize()
        devices.append(dev)

    dirname = './test_rec'
    if os.path.exists(dirname):
        shutil.rmtree(dirname)

    rec = RawRecorder()
    #~ rec = ng1.create_node('RawRecorder')
    rec.configure(streams=[dev.output for dev in devices],
                  autoconnect=True,
                  dirname=dirname)
    rec.initialize()

    rec.add_annotations(yep='abc', yop=12.5, yip=1)

    def terminate():

        for dev in devices:
            dev.stop()
            dev.close()
        rec.stop()
        rec.close()

        app.quit()

    rec.start()
    for dev in devices:
        dev.start()

    # start for a while
    timer = QtCore.QTimer(singleShot=True, interval=2000)
    timer.timeout.connect(terminate)
    timer.start()

    app.exec_()

    man.close()
Example #36
0
def test_RawRecorder():
    
    man = create_manager(auto_close_at_exit=False)
    ng0 = man.create_nodegroup()
    ng1 = man.create_nodegroup()
    
    app = pg.mkQApp()
    
    #~ transfermode
    
    
    sample_rates = [100., 1000., 10000.]
    nb_channels = [16, 32, 1]
    dtypes = ['float32', 'int16', 'float64']
    chunksizes = [25, 250, 2000]
    
    devices = []
    for i in  range(3):
        sample_rate, nb_channel = sample_rates[i], nb_channels[i]
        chunksize, dtype = chunksizes[i],  dtypes[i]
        
        length = int(sample_rate*3)
        length = length - length%chunksize
        t = np.arange(length)/sample_rate
        buffer = np.random.rand(length, nb_channel)*.3
        buffer += np.sin(2*np.pi*1.2*t)[:,None]*.5
        buffer = buffer.astype(dtype)

        dev = ng0.create_node('NumpyDeviceBuffer', name='dev{}'.format(i))
        #~ dev = NumpyDeviceBuffer()
        dev.configure(nb_channel=nb_channel, sample_interval=1./sample_rate, chunksize=chunksize, buffer=buffer)
        dev.output.configure(protocol='tcp', interface='127.0.0.1', transfermode='plaindata')
        dev.initialize()
        devices.append(dev)


    dirname = './test_rec'
    if os.path.exists(dirname):
        shutil.rmtree(dirname)
    
    rec = RawRecorder()
    #~ rec = ng1.create_node('RawRecorder')
    rec.configure(streams=[dev.output for dev in devices], autoconnect=True, dirname=dirname)
    rec.initialize()
    
    rec.add_annotations(yep='abc', yop=12.5, yip=1)

    def terminate():
        
        for dev in devices:
            dev.stop()
            dev.close()
        rec.stop()
        rec.close()
        
        app.quit()
    

    rec.start()
    for dev in devices:
        dev.start()
    
    # start for a while
    timer = QtCore.QTimer(singleShot=True, interval=2000)
    timer.timeout.connect(terminate)
    timer.start()
    
    app.exec_()

    man.close()