diff options
Diffstat (limited to 'examples/charts/audio/audio.py')
-rw-r--r-- | examples/charts/audio/audio.py | 117 |
1 files changed, 59 insertions, 58 deletions
diff --git a/examples/charts/audio/audio.py b/examples/charts/audio/audio.py index ccb6b2e9a..2d313dd8c 100644 --- a/examples/charts/audio/audio.py +++ b/examples/charts/audio/audio.py @@ -43,86 +43,87 @@ import sys from PySide6.QtCharts import QChart, QChartView, QLineSeries, QValueAxis -from PySide6.QtCore import QPointF +from PySide6.QtCore import QPointF, Slot from PySide6.QtMultimedia import (QAudioDeviceInfo, QAudioFormat, - QAudioInput) + QAudioInput, QMediaDevices) from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox -sampleCount = 2000 -resolution = 4 + +SAMPLE_COUNT = 2000 + + +RESOLUTION = 4 class MainWindow(QMainWindow): def __init__(self, device): super().__init__() - self.series = QLineSeries() - self.chart = QChart() - self.chart.addSeries(self.series) - self.axisX = QValueAxis() - self.axisX.setRange(0, sampleCount) - self.axisX.setLabelFormat("%g") - self.axisX.setTitleText("Samples") - self.axisY = QValueAxis() - self.axisY.setRange(-1, 1) - self.axisY.setTitleText("Audio level") - self.chart.setAxisX(self.axisX, self.series) - self.chart.setAxisY(self.axisY, self.series) - self.chart.legend().hide() - self.chart.setTitle(f"Data from the microphone ({device.deviceName()})") - - formatAudio = QAudioFormat() - formatAudio.setSampleRate(8000) - formatAudio.setChannelCount(1) - formatAudio.setSampleSize(8) - formatAudio.setCodec("audio/pcm") - formatAudio.setByteOrder(QAudioFormat.LittleEndian) - formatAudio.setSampleType(QAudioFormat.UnSignedInt) - - self.audioInput = QAudioInput(device, formatAudio, self) - self.ioDevice = self.audioInput.start() - self.ioDevice.readyRead.connect(self._readyRead) - - self.chartView = QChartView(self.chart) - self.setCentralWidget(self.chartView) - - self.buffer = [QPointF(x, 0) for x in range(sampleCount)] - self.series.append(self.buffer) + self._series = QLineSeries() + self._chart = QChart() + self._chart.addSeries(self._series) + self._axis_x = QValueAxis() + self._axis_x.setRange(0, SAMPLE_COUNT) + self._axis_x.setLabelFormat("%g") + self._axis_x.setTitleText("Samples") + self._axis_y = QValueAxis() + self._axis_y.setRange(-1, 1) + self._axis_y.setTitleText("Audio level") + self._chart.setAxisX(self._axis_x, self._series) + self._chart.setAxisY(self._axis_y, self._series) + self._chart.legend().hide() + name = device.description() + self._chart.setTitle(f"Data from the microphone ({name})") + + format_audio = QAudioFormat() + format_audio.setSampleRate(8000) + format_audio.setChannelCount(1) + format_audio.setSampleFormat(QAudioFormat.UInt8) + + self._audio_input = QAudioInput(device, format_audio, self) + self._io_device = self._audio_input.start() + self._io_device.readyRead.connect(self._readyRead) + + self._chart_view = QChartView(self._chart) + self.setCentralWidget(self._chart_view) + + self._buffer = [QPointF(x, 0) for x in range(SAMPLE_COUNT)] + self._series.append(self._buffer) def closeEvent(self, event): - if self.audioInput is not None: - self.audioInput.stop() + if self._audio_input is not None: + self._audio_input.stop() event.accept() + @Slot() def _readyRead(self): - data = self.ioDevice.readAll() - availableSamples = data.size() // resolution + data = self._io_device.readAll() + available_samples = data.size() // RESOLUTION start = 0 - if (availableSamples < sampleCount): - start = sampleCount - availableSamples + if (available_samples < SAMPLE_COUNT): + start = SAMPLE_COUNT - available_samples for s in range(start): - self.buffer[s].setY(self.buffer[s + availableSamples].y()) + self._buffer[s].setY(self._buffer[s + available_samples].y()) - dataIndex = 0 - for s in range(start, sampleCount): - value = (ord(data[dataIndex]) - 128) / 128 - self.buffer[s].setY(value) - dataIndex = dataIndex + resolution - self.series.replace(self.buffer) + data_index = 0 + for s in range(start, SAMPLE_COUNT): + value = (ord(data[data_index]) - 128) / 128 + self._buffer[s].setY(value) + data_index = data_index + RESOLUTION + self._series.replace(self._buffer) if __name__ == '__main__': app = QApplication(sys.argv) - inputDevice = QAudioDeviceInfo.defaultInputDevice() - if (inputDevice.isNull()): + input_devices = QMediaDevices.audioInputs() + if not input_devices: QMessageBox.warning(None, "audio", "There is no audio input device available.") sys.exit(-1) - - mainWin = MainWindow(inputDevice) - mainWin.setWindowTitle("audio") - availableGeometry = app.desktop().availableGeometry(mainWin) - size = availableGeometry.height() * 3 / 4 - mainWin.resize(size, size) - mainWin.show() + main_win = MainWindow(input_devices[0]) + main_win.setWindowTitle("audio") + available_geometry = main_win.screen().availableGeometry() + size = available_geometry.height() * 3 / 4 + main_win.resize(size, size) + main_win.show() sys.exit(app.exec()) |