Raspberry Pi 上的 Qt5.4 QAudioOutput 使用 3.5 毫米音频插孔上的 PulseAudio 不起作用,但 Qt 5.3 可以

Qt5.4 QAudioOutput on Raspberry Pi With PulseAudio on the 3.5mm Audio Jack Doesn't work but Qt 5.3 Does

Qt5.3 看到默认的 Raspberry Pi also_output.0.analog-单声道设备(3.5 毫米耳机插孔)和 5.3 的 QAudioOutput 成功地将音频写入该设备,我可以听到我耳机的音频。这一切都适用于默认 Raspbian,来自 apt-get 的 PulseAudio 2.0,并且没有额外的配置。 PulseAudio 运行 作为会话进程而不是系统守护进程模式。 Qt 5.4 看不到具有完全相同源代码和 Raspbian 的设备(除了与 Qt 5.4.0 而不是 Qt 5.3.2 交叉编译)并且也无法向其写入数据。

它给了我这个错误(请注意我已经手动分配了 sys default:CARD=ALSA 和 'default' 但它们都 return 相同的 'snd_pcm_hw_params' 错误):

Output Device name:  "sysdefault:CARD=ALSA"
Output Device name:  "default"
Default device is "default"
Output device is:  "default"
"QAudioOutput: snd_pcm_hw_params: err = -12"

Pactl 看到了:

pactl list sinks
Sink #0
    State: SUSPENDED
    Name: alsa_output.0.analog-mono
    Description: bcm2835 ALSA Analog Mono
    Driver: module-alsa-card.c
    Sample Specification: u8 1ch 8000Hz

我尝试在底部修改 /etc/pulse/default.pa 以强制输出设备:

load-module module-alsa-sink sink_name=alsa_output.0.analog-mono device=hw:0
set-default-sink alsa_output.0.analog-mono

这是我给出错误的设置代码:

        // Coordinator receives Audio data
        m_Format.setSampleRate(8000);
        m_Format.setChannelCount(1);
        m_Format.setSampleSize(8);
        m_Format.setCodec("audio/pcm");
        m_Format.setByteOrder(QAudioFormat::BigEndian);
        m_Format.setSampleType(QAudioFormat::UnSignedInt);

        QAudioDeviceInfo infoOut(QAudioDeviceInfo::defaultOutputDevice());

        foreach (const QAudioDeviceInfo &deviceInfo,  QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) {
            qDebug() << "Output Device name: " << deviceInfo.deviceName();
        }

        qDebug() << "Default device is" << infoOut.deviceName();

        if (!infoOut.isFormatSupported(m_Format))
        {
            qDebug()<< "Default format not supported - trying to use nearest";
            m_Format = infoOut.nearestFormat(m_Format);
        }

        qDebug() << "Output device is: " << infoOut.deviceName();
        m_AudioOutput = new QAudioOutput(infoOut, m_Format, this);

        // This data accumulates and dumps data to output
        m_DataForOutput.clear();

        // Now Start playing
        // m_Output gets written to to send data to speakers
        m_Output = m_AudioOutput->start();

这到底是怎么回事?为什么相同的配置适用于 5.3.2 而不是 5.4.1。分配默认音频设备不起作用...我可以在这里做什么以及如何让它工作?谢谢!

答案是 运行 在会话模式下(不是系统范围的 PulseAudio 守护进程)并编辑 default.pa 看起来像这样:

## Create the default output device
#load-module module-udev-detect tsched=0

load-module module-alsa-card device_id=0

#load-module module-alsa-card device_id=0 tsched=0 fragments=10 fragment_size=640 tsched_buffer_size=4194384 tsched_buffer_watermark=262144

#load-module module-alsa-card device_id=0 tsched=0 fragments=6 fragment_size=16 tsched_buffer_size=4194384 tsched_buffer_watermark=262144

load-module module-suspend-on-idle timeout=86400

### Load several protocols
load-module module-native-protocol-unix

### Make sure we always have a sink around, even if it is a null sink.
#load-module module-always-sink