diff --git a/.ci/vcpkg-configuration.json b/.ci/vcpkg-configuration.json new file mode 100644 index 00000000..b651f0d2 --- /dev/null +++ b/.ci/vcpkg-configuration.json @@ -0,0 +1,18 @@ +{ + "registries": [ + { + "name": "arm", + "kind": "artifact", + "location": "https://artifacts.tools.arm.com/vcpkg-registry" + } + ], + "requires": { + "arm:tools/open-cmsis-pack/cmsis-toolbox": "^2.12.0", + "arm:compilers/arm/armclang": "^6.24.0", + "arm:compilers/arm/arm-none-eabi-gcc": "^14.3.1", + "arm:compilers/arm/llvm-embedded": "21.1.1", + "arm:models/arm/avh-fvp": "11.30.29", + "arm:tools/kitware/cmake": "^3.31.5", + "arm:tools/ninja-build/ninja": "^1.13.2" + } +} \ No newline at end of file diff --git a/.github/workflows/Build_FVP_Audio.yml b/.github/workflows/Build_FVP_Audio.yml new file mode 100644 index 00000000..64686d37 --- /dev/null +++ b/.github/workflows/Build_FVP_Audio.yml @@ -0,0 +1,88 @@ +# Copyright 2026 Arm Limited and/or its affiliates. +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the License); you may +# not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: Build FVP_Audio Example +on: + + workflow_dispatch: + pull_request: + paths: + # Execute workflow when PR modifies this file + - .github/workflows/Build_FVP_Audio.yml + # Execute workflow when PR modifies example directory + - example/FVP_Audio/** + push: + # Execute workflow when main branch is updated + branches: [main] + + #schedule: + # - cron: '00 20 * * 6' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + Build: + strategy: + matrix: + context: [ + {proj: FVP_Audio, build_type: Debug, target_type: SSE-300}, + {proj: FVP_Audio, build_type: Release, target_type: SSE-300}, + + {proj: FVP_Audio, build_type: Debug, target_type: SSE-310}, + {proj: FVP_Audio, build_type: Release, target_type: SSE-310}, + + {proj: FVP_Audio, build_type: Debug, target_type: SSE-315}, + {proj: FVP_Audio, build_type: Release, target_type: SSE-315}, + + {proj: FVP_Audio, build_type: Debug, target_type: SSE-320}, + {proj: FVP_Audio, build_type: Release, target_type: SSE-320} + ] + toolchain: [AC6, GCC, CLANG] + + fail-fast: false + + runs-on: ubuntu-latest + + steps: + - name: Checkout current repository + uses: actions/checkout@v6 + + - name: Install tools + uses: ARM-software/cmsis-actions/vcpkg@v1 + with: + config: ".ci/vcpkg-configuration.json" + + - name: Activate Arm tool license + uses: ARM-software/cmsis-actions/armlm@v1 + + - name: Initialize CMSIS pack root folder + run: | + cpackget init https://www.keil.com/pack/index.pidx + cpackget update-index + + - name: Add local CMSIS packs + run: | + cpackget add ./ARM.AVH_FVP.pdsc + + - name: Build Test + working-directory: ./example/FVP_Audio + run: | + cbuild FVP_Audio.csolution.yml \ + --context .${{matrix.context.build_type}}+${{matrix.context.target_type}} \ + --toolchain ${{matrix.toolchain}} \ + --update-rte --rebuild --packs diff --git a/.github/workflows/Build_FVP_Video.yml b/.github/workflows/Build_FVP_Video.yml new file mode 100644 index 00000000..082591a3 --- /dev/null +++ b/.github/workflows/Build_FVP_Video.yml @@ -0,0 +1,88 @@ +# Copyright 2026 Arm Limited and/or its affiliates. +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the License); you may +# not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: Build FVP_Video Example +on: + + workflow_dispatch: + pull_request: + paths: + # Execute workflow when PR modifies this file + - .github/workflows/Build_FVP_Video.yml + # Execute workflow when PR modifies example directory + - example/FVP_Video/** + push: + # Execute workflow when main branch is updated + branches: [main] + + #schedule: + # - cron: '00 20 * * 6' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + Build: + strategy: + matrix: + context: [ + {proj: FVP_Video, build_type: Debug, target_type: SSE-300}, + {proj: FVP_Video, build_type: Release, target_type: SSE-300}, + + {proj: FVP_Video, build_type: Debug, target_type: SSE-310}, + {proj: FVP_Video, build_type: Release, target_type: SSE-310}, + + {proj: FVP_Video, build_type: Debug, target_type: SSE-315}, + {proj: FVP_Video, build_type: Release, target_type: SSE-315}, + + {proj: FVP_Video, build_type: Debug, target_type: SSE-320}, + {proj: FVP_Video, build_type: Release, target_type: SSE-320} + ] + toolchain: [AC6, GCC, CLANG] + + fail-fast: false + + runs-on: ubuntu-latest + + steps: + - name: Checkout current repository + uses: actions/checkout@v6 + + - name: Install tools + uses: ARM-software/cmsis-actions/vcpkg@v1 + with: + config: ".ci/vcpkg-configuration.json" + + - name: Activate Arm tool license + uses: ARM-software/cmsis-actions/armlm@v1 + + - name: Initialize CMSIS pack root folder + run: | + cpackget init https://www.keil.com/pack/index.pidx + cpackget update-index + + - name: Add local CMSIS packs + run: | + cpackget add ./ARM.AVH_FVP.pdsc + + - name: Build Test + working-directory: ./example/FVP_Video + run: | + cbuild FVP_Video.csolution.yml \ + --context .${{matrix.context.build_type}}+${{matrix.context.target_type}} \ + --toolchain ${{matrix.toolchain}} \ + --update-rte --rebuild --packs diff --git a/.github/workflows/Build_Run_FVP_Hello.yml b/.github/workflows/Build_Run_FVP_Hello.yml new file mode 100644 index 00000000..bec75d62 --- /dev/null +++ b/.github/workflows/Build_Run_FVP_Hello.yml @@ -0,0 +1,127 @@ +# Copyright 2026 Arm Limited and/or its affiliates. +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the License); you may +# not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: Build and Run FVP_Hello Example +on: + + workflow_dispatch: + pull_request: + paths: + # Execute workflow when PR modifies this file + - .github/workflows/Build_Run_FVP_Hello.yml + # Execute workflow when PR modifies example directory + - example/FVP_Hello/** + push: + # Execute workflow when main branch is updated + branches: [main] + + #schedule: + # - cron: '00 20 * * 6' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + Build_Run: + strategy: + matrix: + context: [ + {proj: FVP_Hello, build_type: Debug, target_type: SSE-300, model: FVP_Corstone_SSE-300, layer: Corstone-300, mps: mps3}, + {proj: FVP_Hello, build_type: Release, target_type: SSE-300, model: FVP_Corstone_SSE-300, layer: Corstone-300, mps: mps3}, + + {proj: FVP_Hello, build_type: Debug, target_type: SSE-310, model: FVP_Corstone_SSE-310, layer: Corstone-310, mps: mps3}, + {proj: FVP_Hello, build_type: Release, target_type: SSE-310, model: FVP_Corstone_SSE-310, layer: Corstone-310, mps: mps3}, + + {proj: FVP_Hello, build_type: Debug, target_type: SSE-315, model: FVP_Corstone_SSE-315, layer: Corstone-315, mps: mps4}, + {proj: FVP_Hello, build_type: Release, target_type: SSE-315, model: FVP_Corstone_SSE-315, layer: Corstone-315, mps: mps4}, + + {proj: FVP_Hello, build_type: Debug, target_type: SSE-320, model: FVP_Corstone_SSE-320, layer: Corstone-320, mps: mps4}, + {proj: FVP_Hello, build_type: Release, target_type: SSE-320, model: FVP_Corstone_SSE-320, layer: Corstone-320, mps: mps4} + ] + toolchain: [ + {name: AC6, ext: axf}, + {name: GCC, ext: elf}, + {name: CLANG, ext: elf} + ] + + fail-fast: false + + runs-on: ubuntu-latest + + steps: + - name: Checkout current repository + uses: actions/checkout@v6 + + - name: Install tools + uses: ARM-software/cmsis-actions/vcpkg@v1 + with: + config: ".ci/vcpkg-configuration.json" + + - name: Activate Arm tool license + uses: ARM-software/cmsis-actions/armlm@v1 + + - name: Initialize CMSIS pack root folder + run: | + cpackget init https://www.keil.com/pack/index.pidx + cpackget update-index + + - name: Add local CMSIS packs + run: | + cpackget add ./ARM.AVH_FVP.pdsc + + - name: Build example + working-directory: ./example/FVP_Hello + run: | + cbuild FVP_Hello.csolution.yml \ + --context .${{matrix.context.build_type}}+${{matrix.context.target_type}} \ + --toolchain ${{matrix.toolchain.name}} \ + --update-rte --rebuild --packs + + - name: Execute example + working-directory: ./example/FVP_Hello + run: | + ${{ matrix.context.model }} \ + -a ./out/${{matrix.context.proj}}/${{matrix.context.target_type}}/${{matrix.context.build_type}}/${{matrix.context.proj}}.${{matrix.toolchain.ext}} \ + -f ./board/${{matrix.context.layer}}/fvp_config.txt \ + -C ${{matrix.context.mps}}_board.uart0.out_file=${{matrix.context.proj}}_${{matrix.context.build_type}}_${{matrix.context.target_type}}_${{matrix.toolchain.name}}.log \ + --simlimit 30 + + - name: Show example output + working-directory: ./example/FVP_Hello + run: | + echo "FVP UART output:" + cat ${{matrix.context.proj}}_${{matrix.context.build_type}}_${{matrix.context.target_type}}_${{matrix.toolchain.name}}.log + + - name: Check example output + # Disable SSE-320 output check due to known issue with FVP UART output + if: matrix.context.target_type != 'SSE-320' + working-directory: ./example/FVP_Hello + run: | + echo "Check FVP UART output:" + COUNT=$(grep "Hello World" ${{matrix.context.proj}}_${{matrix.context.build_type}}_${{matrix.context.target_type}}_${{matrix.toolchain.name}}.log | wc -l) + if [ "$COUNT" -eq 10 ]; then + echo "Passed" + else + echo "Failed" + exit 1 + fi + + - name: Upload FVP UART output log + uses: actions/upload-artifact@v6 + with: + name: ${{matrix.context.proj}}_${{matrix.context.build_type}}_${{matrix.context.target_type}}_${{matrix.toolchain.name}}.log + path: ./example/FVP_Hello/${{matrix.context.proj}}_${{matrix.context.build_type}}_${{matrix.context.target_type}}_${{matrix.toolchain.name}}.log diff --git a/board/Corstone-300/vsi/python/vsi_audio.py b/board/Corstone-300/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/board/Corstone-300/vsi/python/vsi_audio.py +++ b/board/Corstone-300/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/board/Corstone-300/vsi/python/vsi_audio_server.py b/board/Corstone-300/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/board/Corstone-300/vsi/python/vsi_audio_server.py +++ b/board/Corstone-300/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/board/Corstone-300/vsi/python/vsi_video.py b/board/Corstone-300/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/board/Corstone-300/vsi/python/vsi_video.py +++ b/board/Corstone-300/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/board/Corstone-300/vsi/python/vsi_video_server.py b/board/Corstone-300/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/board/Corstone-300/vsi/python/vsi_video_server.py +++ b/board/Corstone-300/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/board/Corstone-310/vsi/python/vsi_audio.py b/board/Corstone-310/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/board/Corstone-310/vsi/python/vsi_audio.py +++ b/board/Corstone-310/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/board/Corstone-310/vsi/python/vsi_audio_server.py b/board/Corstone-310/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/board/Corstone-310/vsi/python/vsi_audio_server.py +++ b/board/Corstone-310/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/board/Corstone-310/vsi/python/vsi_video.py b/board/Corstone-310/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/board/Corstone-310/vsi/python/vsi_video.py +++ b/board/Corstone-310/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/board/Corstone-310/vsi/python/vsi_video_server.py b/board/Corstone-310/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/board/Corstone-310/vsi/python/vsi_video_server.py +++ b/board/Corstone-310/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/board/Corstone-315/vsi/python/vsi_audio.py b/board/Corstone-315/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/board/Corstone-315/vsi/python/vsi_audio.py +++ b/board/Corstone-315/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/board/Corstone-315/vsi/python/vsi_audio_server.py b/board/Corstone-315/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/board/Corstone-315/vsi/python/vsi_audio_server.py +++ b/board/Corstone-315/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/board/Corstone-315/vsi/python/vsi_video.py b/board/Corstone-315/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/board/Corstone-315/vsi/python/vsi_video.py +++ b/board/Corstone-315/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/board/Corstone-315/vsi/python/vsi_video_server.py b/board/Corstone-315/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/board/Corstone-315/vsi/python/vsi_video_server.py +++ b/board/Corstone-315/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/board/Corstone-320/vsi/python/vsi_audio.py b/board/Corstone-320/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/board/Corstone-320/vsi/python/vsi_audio.py +++ b/board/Corstone-320/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/board/Corstone-320/vsi/python/vsi_audio_server.py b/board/Corstone-320/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/board/Corstone-320/vsi/python/vsi_audio_server.py +++ b/board/Corstone-320/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/board/Corstone-320/vsi/python/vsi_video.py b/board/Corstone-320/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/board/Corstone-320/vsi/python/vsi_video.py +++ b/board/Corstone-320/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/board/Corstone-320/vsi/python/vsi_video_server.py b/board/Corstone-320/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/board/Corstone-320/vsi/python/vsi_video_server.py +++ b/board/Corstone-320/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/example/FVP_Audio/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_audio_in_config.h b/example/FVP_Audio/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_audio_in_config.h index 72953b07..1f60dfc4 100644 --- a/example/FVP_Audio/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_audio_in_config.h +++ b/example/FVP_Audio/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_audio_in_config.h @@ -54,7 +54,7 @@ // Defines the name of the audio file to be used for streaming. // Default: "" (use streaming device instead of file) #ifndef AUDIO_IN_FILENAME -#define AUDIO_IN_FILENAME "" +#define AUDIO_IN_FILENAME "./sample/audio_in.wav" #endif #endif diff --git a/example/FVP_Audio/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_audio_out_config.h b/example/FVP_Audio/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_audio_out_config.h index a8b6859e..8f87d002 100644 --- a/example/FVP_Audio/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_audio_out_config.h +++ b/example/FVP_Audio/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_audio_out_config.h @@ -54,7 +54,7 @@ // Defines the name of the audio file to be used for streaming. // Default: "" (use streaming device instead of file) #ifndef AUDIO_OUT_FILENAME -#define AUDIO_OUT_FILENAME "" +#define AUDIO_OUT_FILENAME "./sample/audio_out.wav" #endif #endif diff --git a/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_audio.py b/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_audio.py +++ b/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_audio_server.py b/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_audio_server.py +++ b/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_video.py b/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_video.py +++ b/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_video_server.py b/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_video_server.py +++ b/example/FVP_Audio/board/Corstone-300/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_audio.py b/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_audio.py +++ b/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_audio_server.py b/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_audio_server.py +++ b/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_video.py b/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_video.py +++ b/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_video_server.py b/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_video_server.py +++ b/example/FVP_Audio/board/Corstone-310/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_audio.py b/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_audio.py +++ b/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_audio_server.py b/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_audio_server.py +++ b/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_video.py b/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_video.py +++ b/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_video_server.py b/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_video_server.py +++ b/example/FVP_Audio/board/Corstone-315/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_audio.py b/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_audio.py +++ b/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_audio_server.py b/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_audio_server.py +++ b/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_video.py b/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_video.py +++ b/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_video_server.py b/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_video_server.py +++ b/example/FVP_Audio/board/Corstone-320/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/example/FVP_Audio/sample/audio_in.wav b/example/FVP_Audio/sample/audio_in.wav new file mode 100644 index 00000000..8d767f6e Binary files /dev/null and b/example/FVP_Audio/sample/audio_in.wav differ diff --git a/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_audio.py b/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_audio.py +++ b/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_audio_server.py b/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_audio_server.py +++ b/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_video.py b/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_video.py +++ b/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_video_server.py b/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_video_server.py +++ b/example/FVP_Hello/board/Corstone-300/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_audio.py b/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_audio.py +++ b/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_audio_server.py b/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_audio_server.py +++ b/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_video.py b/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_video.py +++ b/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_video_server.py b/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_video_server.py +++ b/example/FVP_Hello/board/Corstone-310/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_audio.py b/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_audio.py +++ b/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_audio_server.py b/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_audio_server.py +++ b/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_video.py b/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_video.py +++ b/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_video_server.py b/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_video_server.py +++ b/example/FVP_Hello/board/Corstone-315/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_audio.py b/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_audio.py +++ b/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_audio_server.py b/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_audio_server.py +++ b/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_video.py b/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_video.py +++ b/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_video_server.py b/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_video_server.py +++ b/example/FVP_Hello/board/Corstone-320/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/example/FVP_Video/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_video_in_config.h b/example/FVP_Video/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_video_in_config.h index fd1d7d06..2ff3a782 100644 --- a/example/FVP_Video/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_video_in_config.h +++ b/example/FVP_Video/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_video_in_config.h @@ -64,7 +64,7 @@ // Defines the name of the video file to be used for streaming. // Default: "" (use streaming device instead of file) #ifndef VIDEO_IN_FILENAME -#define VIDEO_IN_FILENAME "" +#define VIDEO_IN_FILENAME "./sample/video_in.mp4" #endif #endif diff --git a/example/FVP_Video/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_video_out_config.h b/example/FVP_Video/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_video_out_config.h index da9aa7e7..b72e7b22 100644 --- a/example/FVP_Video/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_video_out_config.h +++ b/example/FVP_Video/board/Corstone-300/RTE/CMSIS_Driver/SSE-300-MPS3/vstream_video_out_config.h @@ -57,7 +57,7 @@ // Defines the name of the video file to be used for streaming. // Default: "" (use streaming device instead of file) #ifndef VIDEO_OUT_FILENAME -#define VIDEO_OUT_FILENAME "" +#define VIDEO_OUT_FILENAME "./sample/video_out.mp4" #endif #endif diff --git a/example/FVP_Video/board/Corstone-300/vsi/python/vsi_audio.py b/example/FVP_Video/board/Corstone-300/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/example/FVP_Video/board/Corstone-300/vsi/python/vsi_audio.py +++ b/example/FVP_Video/board/Corstone-300/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Video/board/Corstone-300/vsi/python/vsi_audio_server.py b/example/FVP_Video/board/Corstone-300/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/example/FVP_Video/board/Corstone-300/vsi/python/vsi_audio_server.py +++ b/example/FVP_Video/board/Corstone-300/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/example/FVP_Video/board/Corstone-300/vsi/python/vsi_video.py b/example/FVP_Video/board/Corstone-300/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/example/FVP_Video/board/Corstone-300/vsi/python/vsi_video.py +++ b/example/FVP_Video/board/Corstone-300/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Video/board/Corstone-300/vsi/python/vsi_video_server.py b/example/FVP_Video/board/Corstone-300/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/example/FVP_Video/board/Corstone-300/vsi/python/vsi_video_server.py +++ b/example/FVP_Video/board/Corstone-300/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/example/FVP_Video/board/Corstone-310/vsi/python/vsi_audio.py b/example/FVP_Video/board/Corstone-310/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/example/FVP_Video/board/Corstone-310/vsi/python/vsi_audio.py +++ b/example/FVP_Video/board/Corstone-310/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Video/board/Corstone-310/vsi/python/vsi_audio_server.py b/example/FVP_Video/board/Corstone-310/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/example/FVP_Video/board/Corstone-310/vsi/python/vsi_audio_server.py +++ b/example/FVP_Video/board/Corstone-310/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/example/FVP_Video/board/Corstone-310/vsi/python/vsi_video.py b/example/FVP_Video/board/Corstone-310/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/example/FVP_Video/board/Corstone-310/vsi/python/vsi_video.py +++ b/example/FVP_Video/board/Corstone-310/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Video/board/Corstone-310/vsi/python/vsi_video_server.py b/example/FVP_Video/board/Corstone-310/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/example/FVP_Video/board/Corstone-310/vsi/python/vsi_video_server.py +++ b/example/FVP_Video/board/Corstone-310/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/example/FVP_Video/board/Corstone-315/vsi/python/vsi_audio.py b/example/FVP_Video/board/Corstone-315/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/example/FVP_Video/board/Corstone-315/vsi/python/vsi_audio.py +++ b/example/FVP_Video/board/Corstone-315/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Video/board/Corstone-315/vsi/python/vsi_audio_server.py b/example/FVP_Video/board/Corstone-315/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/example/FVP_Video/board/Corstone-315/vsi/python/vsi_audio_server.py +++ b/example/FVP_Video/board/Corstone-315/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/example/FVP_Video/board/Corstone-315/vsi/python/vsi_video.py b/example/FVP_Video/board/Corstone-315/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/example/FVP_Video/board/Corstone-315/vsi/python/vsi_video.py +++ b/example/FVP_Video/board/Corstone-315/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Video/board/Corstone-315/vsi/python/vsi_video_server.py b/example/FVP_Video/board/Corstone-315/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/example/FVP_Video/board/Corstone-315/vsi/python/vsi_video_server.py +++ b/example/FVP_Video/board/Corstone-315/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/example/FVP_Video/board/Corstone-320/vsi/python/vsi_audio.py b/example/FVP_Video/board/Corstone-320/vsi/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/example/FVP_Video/board/Corstone-320/vsi/python/vsi_audio.py +++ b/example/FVP_Video/board/Corstone-320/vsi/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Video/board/Corstone-320/vsi/python/vsi_audio_server.py b/example/FVP_Video/board/Corstone-320/vsi/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/example/FVP_Video/board/Corstone-320/vsi/python/vsi_audio_server.py +++ b/example/FVP_Video/board/Corstone-320/vsi/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/example/FVP_Video/board/Corstone-320/vsi/python/vsi_video.py b/example/FVP_Video/board/Corstone-320/vsi/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/example/FVP_Video/board/Corstone-320/vsi/python/vsi_video.py +++ b/example/FVP_Video/board/Corstone-320/vsi/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/example/FVP_Video/board/Corstone-320/vsi/python/vsi_video_server.py b/example/FVP_Video/board/Corstone-320/vsi/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/example/FVP_Video/board/Corstone-320/vsi/python/vsi_video_server.py +++ b/example/FVP_Video/board/Corstone-320/vsi/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/example/FVP_Video/sample/video_in.mp4 b/example/FVP_Video/sample/video_in.mp4 new file mode 100644 index 00000000..feb92175 Binary files /dev/null and b/example/FVP_Video/sample/video_in.mp4 differ diff --git a/interface/vstream/python/vsi_audio.py b/interface/vstream/python/vsi_audio.py index a71574af..b4243bca 100644 --- a/interface/vstream/python/vsi_audio.py +++ b/interface/vstream/python/vsi_audio.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -88,14 +88,14 @@ def setMode(self, mode): """ Set the mode of the audio stream (input/output). Args: - mode: 1 for input, 2 for output. + mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -214,13 +214,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Audio.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Audio.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Audio.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/interface/vstream/python/vsi_audio_server.py b/interface/vstream/python/vsi_audio_server.py index dafa5942..1eef5415 100644 --- a/interface/vstream/python/vsi_audio_server.py +++ b/interface/vstream/python/vsi_audio_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Arm Limited. All rights reserved. +# Copyright (c) 2025-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ supported_files = ['wav'] # Mode Input/Output -MODE_AUDIO_NONE = 0 -MODE_AUDIO_INPUT = 1 -MODE_AUDIO_OUTPUT = 2 +MODE_AUDIO_INPUT = 0 +MODE_AUDIO_OUTPUT = 1 class AudioServer: """Implements a TCP server for audio streaming and sample I/O. @@ -92,7 +91,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_AUDIO_INPUT self.active = False self.eos = False self.stream = None @@ -112,24 +111,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_AUDIO_INPUT: self.mode = MODE_AUDIO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_AUDIO_OUTPUT: self.mode = MODE_AUDIO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_AUDIO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,7 +310,7 @@ def _scan_audio_devices(self): except Exception as e: logger.warning(f"Error getting default devices: {e}") - if (self.mode == MODE_AUDIO_INPUT): + if self.mode == MODE_AUDIO_INPUT: # Log input devices logger.info("--- INPUT DEVICES ---") if input_devices: @@ -329,7 +325,7 @@ def _scan_audio_devices(self): rval = default_input['index'] - if (self.mode == MODE_AUDIO_OUTPUT): + if self.mode == MODE_AUDIO_OUTPUT: # Log output devices logger.debug("--- OUTPUT DEVICES ---") if output_devices: @@ -378,10 +374,6 @@ def _enableStream(self): Returns: None """ - if self.mode != MODE_AUDIO_INPUT and self.mode != MODE_AUDIO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -411,7 +403,7 @@ def _enableStream(self): ) self.stream.start_stream() - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: logger.debug("_enableStream: use speakers for output streaming") self.stream = self.pyaudio_obj.open( format=audio_format, @@ -446,7 +438,7 @@ def _enableStream(self): logger.info(f"_enableStream: input file properties: channels={file_channels}, rate={file_rate}, bits={file_bits}") - elif self.mode == MODE_AUDIO_OUTPUT: + if self.mode == MODE_AUDIO_OUTPUT: self.wave_file = wave.open(file, 'wb') self.wave_file.setnchannels(self.channels) self.wave_file.setsampwidth(self.sample_bits // 8) @@ -597,8 +589,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) @@ -633,6 +625,7 @@ def run(self): elif cmd == self.CLOSE_SERVER: self.stop() + def stop(self): """ Stop the audio server. diff --git a/interface/vstream/python/vsi_video.py b/interface/vstream/python/vsi_video.py index 47a2af2f..1f96ecbf 100644 --- a/interface/vstream/python/vsi_video.py +++ b/interface/vstream/python/vsi_video.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -89,12 +89,12 @@ def setMode(self, mode): Args: mode: 0 for input, 1 for output. Returns: - True if the mode is valid, False otherwise. + Current mode value (0=input, 1=output). """ self.conn.send([self.SET_MODE, mode]) - mode_valid = self.conn.recv() + current_mode = self.conn.recv() - return mode_valid + return current_mode def setDevice(self, device): """ @@ -213,13 +213,12 @@ def closeServer(self): CONTROL_ENABLE_Pos = 0 CONTROL_ENABLE_Msk = 1<> CONTROL_MODE_Pos) - if mode_valid: - logger.info("wrCONTROL: CONTROL register updated: MODE changed") + # MODE bit changed + if (value & CONTROL_MODE_Msk) != 0: + logger.info("wrCONTROL: CONTROL register updated: MODE bit set") + Video.setMode(CONTROL_MODE_OUT) else: - # Reset Mode - Video.setMode(0) - value &= ~CONTROL_MODE_Msk - logger.error("wrCONTROL: CONTROL register updated: MODE cleared") + logger.info("wrCONTROL: CONTROL register updated: MODE bit cleared") + Video.setMode(CONTROL_MODE_IN) if ((value ^ CONTROL) & CONTROL_ENABLE_Msk) != 0: # ENABLE bit changed diff --git a/interface/vstream/python/vsi_video_server.py b/interface/vstream/python/vsi_video_server.py index 3699eb3b..d2c278a4 100644 --- a/interface/vstream/python/vsi_video_server.py +++ b/interface/vstream/python/vsi_video_server.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2025 Arm Limited. All rights reserved. +# Copyright (c) 2023-2026 Arm Limited. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -53,9 +53,8 @@ video_fourcc = {'wmv' : 'WMV1', 'avi' : 'MJPG', 'mp4' : 'mp4v'} # Mode Input/Output -MODE_VIDEO_NONE = 0 -MODE_VIDEO_INPUT = 1 -MODE_VIDEO_OUTPUT = 2 +MODE_VIDEO_INPUT = 0 +MODE_VIDEO_OUTPUT = 1 class VideoServer: """Implements a TCP server for video streaming and frame I/O. @@ -98,7 +97,7 @@ def __init__(self, address, authkey): self.listener = Listener(address, authkey=authkey.encode('utf-8')) self.device = 0 self.filename = None - self.mode = None + self.mode = MODE_VIDEO_INPUT self.active = False self.video = True self.stream = None @@ -118,24 +117,21 @@ def _setMode(self, mode): Args: mode: The I/O mode (input or output). + Returns: + Current mode value. """ - mode_valid = False - if mode == MODE_VIDEO_INPUT: self.mode = MODE_VIDEO_INPUT logger.info("_setMode: set stream mode to Input") - mode_valid = True elif mode == MODE_VIDEO_OUTPUT: self.mode = MODE_VIDEO_OUTPUT logger.info("_setMode: set stream mode to Output") - mode_valid = True else: - self.mode = MODE_VIDEO_NONE - logger.error("_setMode: invalid mode") + logger.error(f"_setMode: invalid mode {mode}, keeping current mode") - return mode_valid + return self.mode def _setDevice(self, device): """ @@ -314,11 +310,6 @@ def _enableStream(self): Returns: None """ - - if self.mode != MODE_VIDEO_INPUT and self.mode != MODE_VIDEO_OUTPUT: - logger.error("_enableStream: invalid mode") - return - if self.active: logger.info("_enableStream: stream already active") return @@ -360,7 +351,7 @@ def _enableStream(self): self.frame_ratio = video_fps / self.frame_rate logger.debug(f"_enableStream: source/target frame ratio={self.frame_ratio}") - elif self.mode == MODE_VIDEO_OUTPUT: + if self.mode == MODE_VIDEO_OUTPUT: # Output mode: write to video file or display window if self.filename != None: # Filename specified: output to file @@ -686,8 +677,8 @@ def run(self): payload = recv[1:] # Payload if cmd == self.SET_MODE: - mode_valid = self._setMode(payload[0]) - conn.send(mode_valid) + current_mode = self._setMode(payload[0]) + conn.send(current_mode) elif cmd == self.SET_DEVICE: device_valid = self._setDevice(payload[0]) diff --git a/interface/vstream/source/vstream_audio_in.c b/interface/vstream/source/vstream_audio_in.c index b1e8fa62..3fc27d89 100644 --- a/interface/vstream/source/vstream_audio_in.c +++ b/interface/vstream/source/vstream_audio_in.c @@ -1,5 +1,5 @@ /*--------------------------------------------------------------------------- - * Copyright (c) 2025 Arm Limited (or its affiliates). + * Copyright (c) 2025-2026 Arm Limited (or its affiliates). * All rights reserved. * SPDX-License-Identifier: Apache-2.0 * @@ -44,12 +44,9 @@ /* CONTROL register definitions */ #define CONTROL_ENABLE_Pos 0U /* Cleared= Disabled, Set= Enabled */ #define CONTROL_ENABLE_Msk (1UL << CONTROL_ENABLE_Pos) -#define CONTROL_MODE_Pos 1U /* Bits 2:1 */ -#define CONTROL_MODE_Msk (3UL << CONTROL_MODE_Pos) /* 0= Disabled, 1= Input, 2= Output */ -#define CONTROL_MODE_NONE (0U << CONTROL_MODE_Pos) -#define CONTROL_MODE_IN (1U << CONTROL_MODE_Pos) -#define CONTROL_MODE_OUT (2U << CONTROL_MODE_Pos) -#define CONTROL_CONTINUOUS_Pos 3U /* Cleared= Single, Set= Continuous */ +#define CONTROL_MODE_Pos 1U /* Cleared= Input, Set= Output */ +#define CONTROL_MODE_Msk (1UL << CONTROL_MODE_Pos) +#define CONTROL_CONTINUOUS_Pos 2U /* Cleared= Single, Set= Continuous */ #define CONTROL_CONTINUOUS_Msk (1UL << CONTROL_CONTINUOUS_Pos) /* STATUS register definitions */ @@ -172,7 +169,7 @@ static int32_t Initialize (vStreamEvent_t event_cb) { AudioIn->DMA.Control = 0U; AudioIn->IRQ.Clear = IRQ_TIMER_OVERFLOW_Msk; AudioIn->IRQ.Enable = IRQ_TIMER_OVERFLOW_Msk; - AudioIn->CONTROL = CONTROL_MODE_IN; + AudioIn->CONTROL = 0U; /* Set audio configuration */ AudioIn->DEVICE = AUDIO_IN_DEVICE; diff --git a/interface/vstream/source/vstream_audio_out.c b/interface/vstream/source/vstream_audio_out.c index 3725b243..17f0ba73 100644 --- a/interface/vstream/source/vstream_audio_out.c +++ b/interface/vstream/source/vstream_audio_out.c @@ -1,5 +1,5 @@ /*--------------------------------------------------------------------------- - * Copyright (c) 2025 Arm Limited (or its affiliates). + * Copyright (c) 2025-2026 Arm Limited (or its affiliates). * All rights reserved. * SPDX-License-Identifier: Apache-2.0 * @@ -44,12 +44,9 @@ /* CONTROL register definitions */ #define CONTROL_ENABLE_Pos 0U /* Cleared= Disabled, Set= Enabled */ #define CONTROL_ENABLE_Msk (1UL << CONTROL_ENABLE_Pos) -#define CONTROL_MODE_Pos 1U /* Bits 2:1 */ -#define CONTROL_MODE_Msk (3UL << CONTROL_MODE_Pos) /* 0= Disabled, 1= Input, 2= Output */ -#define CONTROL_MODE_NONE (0U << CONTROL_MODE_Pos) -#define CONTROL_MODE_IN (1U << CONTROL_MODE_Pos) -#define CONTROL_MODE_OUT (2U << CONTROL_MODE_Pos) -#define CONTROL_CONTINUOUS_Pos 3U /* Cleared= Single, Set= Continuous */ +#define CONTROL_MODE_Pos 1U /* Cleared= Input, Set= Output */ +#define CONTROL_MODE_Msk (1UL << CONTROL_MODE_Pos) +#define CONTROL_CONTINUOUS_Pos 2U /* Cleared= Single, Set= Continuous */ #define CONTROL_CONTINUOUS_Msk (1UL << CONTROL_CONTINUOUS_Pos) /* STATUS register definitions */ @@ -172,7 +169,7 @@ static int32_t Initialize (vStreamEvent_t event_cb) { AudioOut->DMA.Control = 0U; AudioOut->IRQ.Clear = IRQ_TIMER_OVERFLOW_Msk; AudioOut->IRQ.Enable = IRQ_TIMER_OVERFLOW_Msk; - AudioOut->CONTROL = CONTROL_MODE_OUT; + AudioOut->CONTROL = CONTROL_MODE_Msk; /* Set audio configuration */ AudioOut->DEVICE = AUDIO_OUT_DEVICE; diff --git a/interface/vstream/source/vstream_video_in.c b/interface/vstream/source/vstream_video_in.c index 0af20931..e66a9546 100644 --- a/interface/vstream/source/vstream_video_in.c +++ b/interface/vstream/source/vstream_video_in.c @@ -1,5 +1,5 @@ /*--------------------------------------------------------------------------- - * Copyright (c) 2025 Arm Limited (or its affiliates). + * Copyright (c) 2025-2026 Arm Limited (or its affiliates). * All rights reserved. * SPDX-License-Identifier: Apache-2.0 * @@ -45,12 +45,9 @@ /* CONTROL register definitions */ #define CONTROL_ENABLE_Pos 0U /* Cleared= Disabled, Set= Enabled */ #define CONTROL_ENABLE_Msk (1UL << CONTROL_ENABLE_Pos) -#define CONTROL_MODE_Pos 1U /* Bits 2:1 */ -#define CONTROL_MODE_Msk (3UL << CONTROL_MODE_Pos) /* 0= Disabled, 1= Input, 2= Output */ -#define CONTROL_MODE_NONE (0U << CONTROL_MODE_Pos) -#define CONTROL_MODE_IN (1U << CONTROL_MODE_Pos) -#define CONTROL_MODE_OUT (2U << CONTROL_MODE_Pos) -#define CONTROL_CONTINUOUS_Pos 3U /* Cleared= Single, Set= Continuous */ +#define CONTROL_MODE_Pos 1U /* Cleared= Input, Set= Output */ +#define CONTROL_MODE_Msk (1UL << CONTROL_MODE_Pos) +#define CONTROL_CONTINUOUS_Pos 2U /* Cleared= Single, Set= Continuous */ #define CONTROL_CONTINUOUS_Msk (1UL << CONTROL_CONTINUOUS_Pos) /* STATUS register definitions */ @@ -174,7 +171,7 @@ static int32_t Initialize (vStreamEvent_t event_cb) { VideoIn->DMA.Control = 0U; VideoIn->IRQ.Clear = IRQ_TIMER_OVERFLOW_Msk; VideoIn->IRQ.Enable = IRQ_TIMER_OVERFLOW_Msk; - VideoIn->CONTROL = CONTROL_MODE_IN; + VideoIn->CONTROL = 0U; /* Set video configuration */ VideoIn->DEVICE = VIDEO_IN_DEVICE; diff --git a/interface/vstream/source/vstream_video_out.c b/interface/vstream/source/vstream_video_out.c index 1246cb18..cebfb2d9 100644 --- a/interface/vstream/source/vstream_video_out.c +++ b/interface/vstream/source/vstream_video_out.c @@ -1,5 +1,5 @@ /*--------------------------------------------------------------------------- - * Copyright (c) 2025 Arm Limited (or its affiliates). + * Copyright (c) 2025-2026 Arm Limited (or its affiliates). * All rights reserved. * SPDX-License-Identifier: Apache-2.0 * @@ -45,12 +45,9 @@ /* CONTROL register definitions */ #define CONTROL_ENABLE_Pos 0U /* Cleared= Disabled, Set= Enabled */ #define CONTROL_ENABLE_Msk (1UL << CONTROL_ENABLE_Pos) -#define CONTROL_MODE_Pos 1U /* Bits 2:1 */ -#define CONTROL_MODE_Msk (3UL << CONTROL_MODE_Pos) /* 0= Disabled, 1= Input, 2= Output */ -#define CONTROL_MODE_NONE (0U << CONTROL_MODE_Pos) -#define CONTROL_MODE_IN (1U << CONTROL_MODE_Pos) -#define CONTROL_MODE_OUT (2U << CONTROL_MODE_Pos) -#define CONTROL_CONTINUOUS_Pos 3U /* Cleared= Single, Set= Continuous */ +#define CONTROL_MODE_Pos 1U /* Cleared= Input, Set= Output */ +#define CONTROL_MODE_Msk (1UL << CONTROL_MODE_Pos) +#define CONTROL_CONTINUOUS_Pos 2U /* Cleared= Single, Set= Continuous */ #define CONTROL_CONTINUOUS_Msk (1UL << CONTROL_CONTINUOUS_Pos) /* STATUS register definitions */ @@ -173,7 +170,7 @@ static int32_t Initialize (vStreamEvent_t event_cb) { VideoOut->DMA.Control = 0U; VideoOut->IRQ.Clear = IRQ_TIMER_OVERFLOW_Msk; VideoOut->IRQ.Enable = IRQ_TIMER_OVERFLOW_Msk; - VideoOut->CONTROL = CONTROL_MODE_OUT; + VideoOut->CONTROL = CONTROL_MODE_Msk; /* Set video configuration */ VideoOut->FRAME_WIDTH = VIDEO_OUT_FRAME_WIDTH;