QAudioOutput constructor hangs in PyQt6
ekhumoro
ekhumoro at gmx.com
Sat Apr 11 15:50:47 BST 2026
On 11/04/2026 10:56, Phil Thompson wrote:
> It's not clear from your description as to exactly what's happening and what you expect to happen. Also your Python and
> C++ code are not equivalent as they interact with the event loop in different ways.
Sorry, I forgot to add the output. The examples *are* equivalent. The code is just factored slightly differently so the
relevant part can be run with a timer in Python (since without that it will hang). I have added the output from my Linux
system below. Please note that the warning message does not affect the *playing* of audio in any way. With the examples
that don't hang, the audio plays just fine. However, I do suspect that there may be a problem with *reading* that
message in the PyQt6 examples. Without the timer (or *with* the qt-message-handler), it seems that the PyQt6 code
somehow gets stuck waiting for the output to be read, whereas the C++ example is totally unaffected.
#####
C++ - no timer / with qt-message-handler (this works exactly as expected):
$ ./test
INFO: Using Qt multimedia with FFmpeg version n8.1 GPL version 3 or later
DEBUG: creating audio output...
WARNING: spaVisitChoice: parse error ... <elided>
DEBUG: audio output created
INFO: cancelled: no source file provided
#####
Python - without timer / without qt-message-handler (this hangs):
$ ./test_pyqt.py
Press Ctrl+C to quit
qt.multimedia.ffmpeg: Using Qt multimedia with FFmpeg version n8.1 GPL version 3 or later
creating audio output...
^C
#####
Python - with single-shot timer / without qt-message-handler (this does not hang):
Press Ctrl+C to quit
qt.multimedia.ffmpeg: Using Qt multimedia with FFmpeg version n8.1 GPL version 3 or later
creating audio output...
spaVisitChoice: parse error ... <elided>
audio output created
DEBUG: cancelled: no audio source provided
#####
Python - with single-shot timer / with qt-message-handler (this hangs):
Press Ctrl+C to quit
INFO: Using Qt multimedia with FFmpeg version n8.1 GPL version 3 or later
DEBUG: creating audio output...
^C
#####
It may be that there's something odd about that specific warning message, which is quite long and displayed all on one
line in the terminal:
spaVisitChoice: parse error "Object: size 144, type Spa:Pod:Object:Param:Format (262147), id
Spa:Enum:ParamId:EnumFormat (3)" " Prop: key Spa:Pod:Object:Param:Format:mediaType (1), flags 00000000" " Id 1
(Spa:Enum:MediaType:audio)" " Prop: key Spa:Pod:Object:Param:Format:mediaSubtype (2), flags 00000000" " Id 3
(Spa:Enum:MediaSubtype:iec958)" " Prop: key Spa:Pod:Object:Param:Format:Audio:iec958Codec (65542), flags 00000000" "
Choice: type Spa:Enum:Choice:Enum, flags 00000000 24 4" " Id 1 (Spa:Enum:AudioIEC958Codec:PCM)" " Id
1 (Spa:Enum:AudioIEC958Codec:PCM)" " Prop: key Spa:Pod:Object:Param:Format:Audio:rate (65539), flags 00000000" "
Choice: type Spa:Enum:Choice:Range, flags 00000000 28 4" " Int 48000" " Int 32000" " Int 48000"
The main reason for installing a qt message handler is to prevent any unwanted messages like these being shown to the
user. I can work around the issue by uninstalling the message-handler before creating the audio-output object and then
reinstalling it again afterwards. However, this requires additional low-level code to redirect stdout/stderr whilst the
audio-object is being created, which is far from ideal.
More information about the PyQt
mailing list