The code below is supposed to just react on new data coming from input device.
However what is clear from the output, that the method IODevice::read
clearly doesn’t grab any data. I tried various options such as io=audio_source.start()
and using returned IODevice
. This version with buffer and array beneath it show that something is being written, however without hacks it is impossible to obtain it.
I can’t figure out why I can’t read
method doesn’t work.
<code>from PySide6.QtCore import (Qt, QDir, QUrl, QBuffer, QByteArray, QFile,
QObject, Slot, Signal, QTimer, QIODevice, QUrl,
QMicrophonePermission, QPermission)
from PySide6.QtMultimedia import (
QMediaCaptureSession,
QAudioInput,
QMediaRecorder,
QMediaFormat,
QAudioDecoder,
QAudioSource,
QAudioDevice,
QAudioBuffer,
QMediaDevices,
QAudioFormat,
QAudioSink,
QSoundEffect,
QAudio,
)
from PySide6.QtWidgets import QApplication, QPushButton
from pathlib import Path
import os
import sys
from typing import Optional
class AudioDecoder(QObject):
stateChanged = Signal() # add arg
newData = Signal(QByteArray, QAudioFormat)
def __init__(self,
format: Optional[QAudioFormat],
source_device: Optional[QAudioDevice],
parent: Optional[QObject] =None,
) -> None:
super().__init__(parent=parent)
if not format:
self.format = source_device.preferredFormat()
else:
self.format = format
if not source_device.isFormatSupported(self.format):
raise Exception("format not supported")
self.audio_source = QAudioSource(source_device, self.format, parent=self)
self.data_arr = QByteArray(10000, 0)
self.input_buf = QBuffer(self.data_arr)
def check_permissions(self, app: QApplication):
microphonePermission=QMicrophonePermission()
micPermissionStatus = app.checkPermission(microphonePermission)
if micPermissionStatus == Qt.PermissionStatus.Undetermined:
app.requestPermission(microphonePermission, self, self.check_permissions)
def start(self):
self.input_buf.open(QIODevice.OpenModeFlag.ReadWrite)
self.audio_source.start(self.input_buf)
def _newDataArrived(io=self.input_buf):
#data = self.input_buf.read(chunkLen)
print(f" Pos {io.pos()}", )
bytearray = QByteArray(4096, 0)
io.read(bytearray, 4096)
print(bytearray.size())
print(bytearray.data()[:10])
print(self.data_arr.data()[-10:])
self.input_buf.readyRead.connect(_newDataArrived)
def main():
app = QApplication([])
microphonePermission=QMicrophonePermission()
micPermissionStatus = app.checkPermission(microphonePermission)
if micPermissionStatus == Qt.PermissionStatus.Undetermined:
app.requestPermission(microphonePermission, app, None)
audioInputDevice = QMediaDevices.defaultAudioInput()
audioOutputDevice = QMediaDevices.defaultAudioOutput()
ad = AudioDecoder(format=None, source_device=audioInputDevice, parent=app)
ad.start()
sys.exit(app.exec())
if __name__ == "__main__":
main()
</code>
<code>from PySide6.QtCore import (Qt, QDir, QUrl, QBuffer, QByteArray, QFile,
QObject, Slot, Signal, QTimer, QIODevice, QUrl,
QMicrophonePermission, QPermission)
from PySide6.QtMultimedia import (
QMediaCaptureSession,
QAudioInput,
QMediaRecorder,
QMediaFormat,
QAudioDecoder,
QAudioSource,
QAudioDevice,
QAudioBuffer,
QMediaDevices,
QAudioFormat,
QAudioSink,
QSoundEffect,
QAudio,
)
from PySide6.QtWidgets import QApplication, QPushButton
from pathlib import Path
import os
import sys
from typing import Optional
class AudioDecoder(QObject):
stateChanged = Signal() # add arg
newData = Signal(QByteArray, QAudioFormat)
def __init__(self,
format: Optional[QAudioFormat],
source_device: Optional[QAudioDevice],
parent: Optional[QObject] =None,
) -> None:
super().__init__(parent=parent)
if not format:
self.format = source_device.preferredFormat()
else:
self.format = format
if not source_device.isFormatSupported(self.format):
raise Exception("format not supported")
self.audio_source = QAudioSource(source_device, self.format, parent=self)
self.data_arr = QByteArray(10000, 0)
self.input_buf = QBuffer(self.data_arr)
def check_permissions(self, app: QApplication):
microphonePermission=QMicrophonePermission()
micPermissionStatus = app.checkPermission(microphonePermission)
if micPermissionStatus == Qt.PermissionStatus.Undetermined:
app.requestPermission(microphonePermission, self, self.check_permissions)
def start(self):
self.input_buf.open(QIODevice.OpenModeFlag.ReadWrite)
self.audio_source.start(self.input_buf)
def _newDataArrived(io=self.input_buf):
#data = self.input_buf.read(chunkLen)
print(f" Pos {io.pos()}", )
bytearray = QByteArray(4096, 0)
io.read(bytearray, 4096)
print(bytearray.size())
print(bytearray.data()[:10])
print(self.data_arr.data()[-10:])
self.input_buf.readyRead.connect(_newDataArrived)
def main():
app = QApplication([])
microphonePermission=QMicrophonePermission()
micPermissionStatus = app.checkPermission(microphonePermission)
if micPermissionStatus == Qt.PermissionStatus.Undetermined:
app.requestPermission(microphonePermission, app, None)
audioInputDevice = QMediaDevices.defaultAudioInput()
audioOutputDevice = QMediaDevices.defaultAudioOutput()
ad = AudioDecoder(format=None, source_device=audioInputDevice, parent=app)
ad.start()
sys.exit(app.exec())
if __name__ == "__main__":
main()
</code>
from PySide6.QtCore import (Qt, QDir, QUrl, QBuffer, QByteArray, QFile,
QObject, Slot, Signal, QTimer, QIODevice, QUrl,
QMicrophonePermission, QPermission)
from PySide6.QtMultimedia import (
QMediaCaptureSession,
QAudioInput,
QMediaRecorder,
QMediaFormat,
QAudioDecoder,
QAudioSource,
QAudioDevice,
QAudioBuffer,
QMediaDevices,
QAudioFormat,
QAudioSink,
QSoundEffect,
QAudio,
)
from PySide6.QtWidgets import QApplication, QPushButton
from pathlib import Path
import os
import sys
from typing import Optional
class AudioDecoder(QObject):
stateChanged = Signal() # add arg
newData = Signal(QByteArray, QAudioFormat)
def __init__(self,
format: Optional[QAudioFormat],
source_device: Optional[QAudioDevice],
parent: Optional[QObject] =None,
) -> None:
super().__init__(parent=parent)
if not format:
self.format = source_device.preferredFormat()
else:
self.format = format
if not source_device.isFormatSupported(self.format):
raise Exception("format not supported")
self.audio_source = QAudioSource(source_device, self.format, parent=self)
self.data_arr = QByteArray(10000, 0)
self.input_buf = QBuffer(self.data_arr)
def check_permissions(self, app: QApplication):
microphonePermission=QMicrophonePermission()
micPermissionStatus = app.checkPermission(microphonePermission)
if micPermissionStatus == Qt.PermissionStatus.Undetermined:
app.requestPermission(microphonePermission, self, self.check_permissions)
def start(self):
self.input_buf.open(QIODevice.OpenModeFlag.ReadWrite)
self.audio_source.start(self.input_buf)
def _newDataArrived(io=self.input_buf):
#data = self.input_buf.read(chunkLen)
print(f" Pos {io.pos()}", )
bytearray = QByteArray(4096, 0)
io.read(bytearray, 4096)
print(bytearray.size())
print(bytearray.data()[:10])
print(self.data_arr.data()[-10:])
self.input_buf.readyRead.connect(_newDataArrived)
def main():
app = QApplication([])
microphonePermission=QMicrophonePermission()
micPermissionStatus = app.checkPermission(microphonePermission)
if micPermissionStatus == Qt.PermissionStatus.Undetermined:
app.requestPermission(microphonePermission, app, None)
audioInputDevice = QMediaDevices.defaultAudioInput()
audioOutputDevice = QMediaDevices.defaultAudioOutput()
ad = AudioDecoder(format=None, source_device=audioInputDevice, parent=app)
ad.start()
sys.exit(app.exec())
if __name__ == "__main__":
main()
Output:
<code>4096
b'x00x00x00x00x00x00x00x00x00x00'
b'x00x00x00x00x00x00x00x00x00x00'
Pos 12288
4096
b'x00x00x00x00x00x00x00x00x00x00'
b'Y7~x84xfc6x8f^x157'
Pos 16384
4096
b'x00x00x00x00x00x00x00x00x00x00'
b'x889xd6$xa39xedx05xa59'
Pos 20480
4096
b'x00x00x00x00x00x00x00x00x00x00'
b'x9fxb9x84xeaxa1xb9x97yx85xb9'
Pos 24576
4096
b'x00x00x00x00x00x00x00x00x00x00'
b'xf2xb9x0cYx00xbaxa6xa6x0fxba'
</code>
<code>4096
b'x00x00x00x00x00x00x00x00x00x00'
b'x00x00x00x00x00x00x00x00x00x00'
Pos 12288
4096
b'x00x00x00x00x00x00x00x00x00x00'
b'Y7~x84xfc6x8f^x157'
Pos 16384
4096
b'x00x00x00x00x00x00x00x00x00x00'
b'x889xd6$xa39xedx05xa59'
Pos 20480
4096
b'x00x00x00x00x00x00x00x00x00x00'
b'x9fxb9x84xeaxa1xb9x97yx85xb9'
Pos 24576
4096
b'x00x00x00x00x00x00x00x00x00x00'
b'xf2xb9x0cYx00xbaxa6xa6x0fxba'
</code>
4096
b'x00x00x00x00x00x00x00x00x00x00'
b'x00x00x00x00x00x00x00x00x00x00'
Pos 12288
4096
b'x00x00x00x00x00x00x00x00x00x00'
b'Y7~x84xfc6x8f^x157'
Pos 16384
4096
b'x00x00x00x00x00x00x00x00x00x00'
b'x889xd6$xa39xedx05xa59'
Pos 20480
4096
b'x00x00x00x00x00x00x00x00x00x00'
b'x9fxb9x84xeaxa1xb9x97yx85xb9'
Pos 24576
4096
b'x00x00x00x00x00x00x00x00x00x00'
b'xf2xb9x0cYx00xbaxa6xa6x0fxba'