Exemple #1
0
    def __onLoop(self, loop: bool) -> None:
        if self.__player_id is None:
            logger.warning("Player action without active player.")
            return

        self.call_async(
            self.project_client.update_player_state(
                self.__player_id,
                audioproc.PlayerState(loop_enabled=loop)))
Exemple #2
0
    def __onToggle(self) -> None:
        if self.__player_id is None:
            logger.warning("Player action without active player.")
            return

        self.call_async(
            self.project_client.update_player_state(
                self.__player_id,
                audioproc.PlayerState(playing=not self.__playing)))
Exemple #3
0
    async def setup(self) -> None:
        self.__player_id, self.__player_realm = await self.project_client.create_player(
            audioproc_address=self.audioproc_client.address)
        self.__player_status_listener = self.audioproc_client.player_state_changed.add(
            self.__player_realm, self.__player_state.updateFromProto)

        self.__track_list.setPlayerID(self.__player_id)
        self.__player_state.setPlayerID(self.__player_id)

        await self.project_client.update_player_state(
            self.__player_id,
            audioproc.PlayerState(
                current_time=self.__player_state.currentTimeProto(),
                loop_enabled=self.__player_state.loopEnabled(),
                loop_start_time=self.__player_state.loopStartTimeProto(),
                loop_end_time=self.__player_state.loopEndTimeProto()))

        self.__player_node_id = uuid.uuid4().hex
        await self.audioproc_client.add_node(
            'root',
            id=self.__player_node_id,
            child_realm=self.__player_realm,
            description=node_db.Builtins.ChildRealmDescription)
        await self.audioproc_client.connect_ports(
            'root',
            self.__player_node_id, 'out:left',
            'sink', 'in:left',
            node_db.PortDescription.AUDIO)
        await self.audioproc_client.connect_ports(
            'root',
            self.__player_node_id, 'out:right',
            'sink', 'in:right',
            node_db.PortDescription.AUDIO)

        self.__vumeter_node_id = uuid.uuid4().hex
        await self.audioproc_client.add_node(
            'root',
            id=self.__vumeter_node_id,
            description=self.project.get_node_description('builtin://vumeter'))
        await self.audioproc_client.connect_ports(
            'root',
            self.__player_node_id, 'out:left',
            self.__vumeter_node_id, 'in:left',
            node_db.PortDescription.AUDIO)
        await self.audioproc_client.connect_ports(
            'root',
            self.__player_node_id, 'out:right',
            self.__vumeter_node_id, 'in:right',
            node_db.PortDescription.AUDIO)

        self.__vumeter_listener = self.audioproc_client.node_messages.add(
            self.__vumeter_node_id, self.__vumeterMessage)
Exemple #4
0
    def mouseReleaseEvent(self, evt: QtGui.QMouseEvent) -> None:
        if self.__move_time and evt.button() == Qt.LeftButton:
            self.__move_time = False
            x = evt.pos().x() + self.xOffset()
            current_time = min(self.xToTime(x), self.projectEndTime())
            if self.shouldSnap(evt):
                current_time = self.snapTime(current_time)
            self.call_async(
                self.project_client.update_player_state(
                    self.__player_id,
                    audioproc.PlayerState(
                        playing=self.__old_player_state,
                        current_time=current_time.to_proto())))
            self.__player_state.setTimeMode(player_state_lib.TimeMode.Follow)
            evt.accept()
            return

        super().mouseReleaseEvent(evt)
Exemple #5
0
    def mousePressEvent(self, evt: QtGui.QMouseEvent) -> None:
        if (self.__player_id is not None and evt.button() == Qt.LeftButton
                and evt.modifiers() in (Qt.NoModifier, Qt.ShiftModifier)):
            self.__move_time = True
            self.__old_player_state = self.__player_state.playing()
            x = evt.pos().x() + self.xOffset()
            current_time = self.xToTime(x)
            if self.shouldSnap(evt):
                current_time = self.snapTime(current_time)
            self.call_async(
                self.project_client.update_player_state(
                    self.__player_id, audioproc.PlayerState(playing=False)))
            self.__player_state.setTimeMode(player_state_lib.TimeMode.Manual)
            self.__player_state.setCurrentTime(current_time)
            evt.accept()
            return

        super().mousePressEvent(evt)
Exemple #6
0
    def setCurrentTime(
            self, current_time: audioproc.MusicalTime, from_engine: bool = False) -> None:
        if current_time == self.__current_time:
            return

        self.__current_time = current_time
        if (self.__last_current_time_update is None
                or time_lib.time() - self.__last_current_time_update > 5):
            self.__set_session_value('current_time', current_time)
            self.__last_current_time_update = time_lib.time()

        if not from_engine:
            self.call_async(
                self.project_client.update_player_state(
                    self.__player_id,
                    audioproc.PlayerState(current_time=current_time.to_proto())))

        self.currentTimeChanged.emit(current_time)
    async def test_playback_demo(self):
        p = player.Player(  # type: ignore[call-arg]
            project=self.project,
            callback_address=self.callback_server.address,
            event_loop=self.loop,
            audioproc_client=self.audioproc_client_main,
            realm='root')
        try:
            logger.info("Setup player...")
            await p.setup()
            logger.info("Player setup complete.")

            logger.info("Wait until audioproc is ready...")
            # self.assertEqual(
            #     await self.callback_server.wait_for('pipeline_state'), 'starting')
            # self.assertEqual(
            #     await self.callback_server.wait_for('pipeline_state'), 'running')

            with self.track_frame_stats('playback_demo'):
                logger.info("Start playback...")
                await p.update_state(audioproc.PlayerState(playing=True))

                await self.callback_server.wait_for_player_state(
                    'playing', True)

                logger.info("Waiting for end...")

                await self.callback_server.wait_for_player_state(
                    'playing', False)
                logger.info("Playback finished.")

        except:
            logger.exception("")
            raise

        finally:
            await p.cleanup()
Exemple #8
0
 def onSetLoopEnd(self, loop_end_time: audioproc.MusicalTime) -> None:
     self.call_async(
         self.project_client.update_player_state(
             self.__player_id,
             audioproc.PlayerState(loop_end_time=loop_end_time.to_proto())))
Exemple #9
0
    async def run(self) -> None:
        try:
            await self.__setup_callback_stub()
            await self.__callback.call(
                'STATE', render_pb2.RenderStateRequest(state='setup'))

            await self.__setup_data_pump()
            await self.__setup_encoder_process()
            await self.__setup_datastream_pipe()
            await self.__setup_player()

            await self.__callback.call(
                'STATE', render_pb2.RenderStateRequest(state='render'))

            response = render_pb2.RenderProgressResponse()
            await self.__callback.call(
                'PROGRESS',
                render_pb2.RenderProgressRequest(numerator=0, denominator=1),
                response)
            if response.abort:
                self.__fail("Aborted.")

            await self.__player.update_state(
                audioproc.PlayerState(
                    playing=True,
                    loop_enabled=False,
                    current_time=audioproc.MusicalTime(0).to_proto()))
            await self.__player_started.wait()

            await self.__setup_progress_pump()

            await self.__wait_for_some(
                asyncio.wait([
                    self.__datastream_protocol.wait(),
                    self.__progress_pump_task,
                    self.__encoder.wait()
                ],
                             loop=self.__event_loop), self.__failed.wait())

            if self.__failed.is_set():
                raise RendererFailed()

            self.__data_queue.put_nowait(None)
            await asyncio.wait([self.__data_pump_task], loop=self.__event_loop)

            await self.__callback.call(
                'PROGRESS',
                render_pb2.RenderProgressRequest(numerator=1, denominator=1),
                render_pb2.RenderProgressResponse())
            await self.__callback.call(
                'STATE', render_pb2.RenderStateRequest(state='cleanup'))

            await self.__player.cleanup()
            self.__player = None

            await self.__callback.call(
                'STATE', render_pb2.RenderStateRequest(state='complete'))

        except RendererFailed:
            await self.__callback.call(
                'STATE', render_pb2.RenderStateRequest(state='failed'))

        finally:
            await self.__cleanup()