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