QAudioDeviceInfo::availableDevices crashes in debug mode



  • Hello,

    The static method QAudioDeviceInfo::availableDevices(QAudio::AudioOutput) crashes in debug mode for MinGW on Windows 7.

    Kit: Desktop Qt 5.5.0 MinGW 32 bit
    Compiler: MinGW 4.9.2 32bit
    Debugger: GNU gdb 7.8 for MinGW 4.9.2 32bit
    Qt version: Qt 5.5.0 MinGW 32 bit

    OS: Windows 7 Professional 64 bits

    It does not crash in release mode.

    The problem appeared when I have installed a driver for a Voice Modem: USR5637Voice64bit.EXE.
    I have uninstalled this driver, and the problem is remained.

    I have reinstalled Qt 5.5.0, and the problem is still there.

    Thanks for helping.

    Claude


  • Lifetime Qt Champion

    Hi,

    Can you get a stack trace of that crash ?



  • Hello,

    The problem occurs in this method:

    void BroadcastThread::CreateAudioOutput()
    {
        SysLog *pSysLog = MySysLog::Instance();
        QString msg;
        QTextStream stream(&msg);
    
        QList<QAudioDeviceInfo> audioOutputDevices = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);
    

    When crashing, I got this back trace:

    Thread 3 (Thread 5900.0x8c8):
    #0  BroadcastThread::CreateAudioOutput (this=0xef94f90) at BroadcastThread.cpp:70
            pSysLog = 0xd8679d0
            msg = {static null = {<No data fields>}, d = 0x6bab0800 <QArrayData::shared_null>}
            stream = {_vptr.QTextStream = 0x6bc68b18 <vtable for QTextStream+8>, d_ptr = {d = 0xef90f30}}
            audioOutputDevices = {<QListSpecialMethods<QAudioDeviceInfo>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = -1}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x6b9006fa <QObject::QObject(QObject*)+264>}, d = 0x6b9006fa <QObject::QObject(QObject*)+264>}}
            isAudioOutputDeviceDetected = 15
    #1  0x0040ad10 in BroadcastThread::run (this=0xef94f90) at BroadcastThread.cpp:50
    No locals.
    #2  0x6b799bb8 in QThreadPrivate::start(void*)@4 (arg=0xef94f90) at thread\qthread_win.cpp:344
            thr = 0xef94f90
            data = 0xef94fe8
    #3  0x762e1287 in msvcrt!_itow_s () from C:\Windows\syswow64\msvcrt.dll
    No symbol table info available.
    #4  0x762e1328 in msvcrt!_endthreadex () from C:\Windows\syswow64\msvcrt.dll
    No symbol table info available.
    #5  0x7797338a in KERNEL32!BaseThreadInitThunk () from C:\Windows\syswow64\kernel32.dll
    No symbol table info available.
    #6  0x77e9a242 in ntdll!RtlInitializeExceptionChain () from C:\Windows\SysWOW64\ntdll.dll
    No symbol table info available.
    #7  0x77e9a215 in ntdll!RtlInitializeExceptionChain () from C:\Windows\SysWOW64\ntdll.dll
    No symbol table info available.
    #8  0x00000000 in ?? ()
    No symbol table info available.
    
    
    

    In the Application Output pane, I got this error message:

    **ASSERT: "!isEmpty()" in file C:\work\build\qt5_workdir\w\s\qtbase\include/QtCore/../../src/corelib/tools/qlist.h, line 316**
    
    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
    Debugging has finished
    
    

    Thanks

    Claude


  • Lifetime Qt Champion

    What code do you have after creating audioOutputDevices ?



  • Hi,

    Here is the complete method:

    void BroadcastThread::CreateAudioOutput()
    {
        SysLog *pSysLog = MySysLog::Instance();
        QString msg;
        QTextStream stream(&msg);
    
        QList<QAudioDeviceInfo> audioOutputDevices = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);
    
        stream << m_audioName << ": Number of audio ouput devices = <" << audioOutputDevices.size() << ">";
        pSysLog->SysLogInfo("BRDC", msg);
    
        for(int i=0; i < audioOutputDevices.size(); ++i)
        {
            msg.clear();
            stream << m_audioName << ": Detecting audio ouput device: <" << audioOutputDevices.at(i).deviceName() << ">";
            pSysLog->SysLogInfo("BRDC", msg);
        }
    
        bool isAudioOutputDeviceDetected = false;
        for(int i=0; i < audioOutputDevices.size(); ++i)
        {
            const QAudioDeviceInfo &audioDeviceInfo = audioOutputDevices.at(i);
            if (audioDeviceInfo.deviceName().startsWith(m_audioName))
            {
                isAudioOutputDeviceDetected = true;
    
                msg.clear();
                stream << m_audioName << ": Setting audio ouput device: <" << audioDeviceInfo.deviceName() << ">";
                pSysLog->SysLogInfo("BRDC", msg);
    
                QAudioFormat format;
                format.setSampleRate(22000);
                format.setChannelCount(1);
                format.setSampleSize(16);
                format.setCodec("audio/pcm");
                format.setByteOrder(QAudioFormat::LittleEndian);
                format.setSampleType(QAudioFormat::UnSignedInt);
    
                if (!audioDeviceInfo.isFormatSupported(format))
                {
                    msg.clear();
                    stream << m_audioName << ": Raw audio format not supported by backend, cannot play audio";
                    pSysLog->SysLogWarning("BRDC", msg);
                    format = audioDeviceInfo.nearestFormat(format);
                }
    
                m_audioOutput.reset(new QAudioOutput(audioDeviceInfo, format), &QAudioOutput::deleteLater);
                connect(qobject_cast<QAudioOutput *>(m_audioOutput.data()), SIGNAL(stateChanged(QAudio::State)),
                        this, SLOT(onStateChanged(QAudio::State)));
                break;
            }
        }
    
        // Validate that the audio output device has been detected
        if (!isAudioOutputDeviceDetected)
        {
            msg.clear();
            stream << m_audioName << ": No audio output device name beginning by: <" << m_audioName << ">";
            pSysLog->SysLogError("BRDC", msg);
        }
    }
    


  • I found the cause of a Qt bug in debug mode only.

    This is related to the use of the voice modem "USR5637" from USRobotics.

    When plugging the voice modem in the computer, an entry appears in the section “Sound, video and game controllers” of the Windows Device Manager.

    The entry name is “Unimodem Half-Duplex Audio Device”.

    In order to solve the crashing problem, in debug mode, of the method:

    QList<QAudioDeviceInfo> audioOutputDevices = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);

    we have to right-click “Unimodem Half-Duplex Audio Device” and select “Uninstall”.

    This is a Qt bug in debug mode because the bug does not exist in release mode.

    In the QList returned by the method, there is an element with the name “Modem #0 Line Playback” that makes the method crashing in debug mode.


  • Lifetime Qt Champion

    Does it happen only if the device is plugged or also when not present ?



  • @SGaist It happens also when the device is not present.

    Once the device has been installed, the entry appears in the Device Manager. If we remove physically the device from the USB port, the entry disappears from the Device Manager but the bug is still there.

    There is still an element with the name “Modem #0 Line Playback” in the QList returned by the method.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.