0

QAudioOutput のバッファに 20ms ごとに書き込もうとしています。このコードを実行しようとすると、プロセスのサイズが毎秒約 4 ~ 8 kB 増加することがわかります。QIODevice または DAudioOuptut の内部バッファをクリアする関数を見つけようとしましたが、運がありませんでした。

Qt 5.2.1を使用しています

以下の例では、silence(zeros) のみが記述されていますが、同じ効果があります。

#include <QLibraryInfo>
#include <QtCore/QCoreApplication>
#include <windows.h> // for Sleep
#include <QAudioOutput>
#include <QAudioDeviceInfo>
#include <QAudioFormat>
#include <array>

class QAudioOutput;

int main(int argc, char *argv[])
{
    // Create QApplication
    QCoreApplication app(argc, argv);
    app.setApplicationName("Audiotest");
    //Initialize device
    QIODevice * _output;
    QAudioDeviceInfo _device = QAudioDeviceInfo::defaultOutputDevice();
    QAudioFormat _format;
    _format.setSampleRate(44100);
    _format.setChannelCount(2);
    _format.setSampleSize(16);
    _format.setCodec("audio/pcm");  // This codec should be supported on all platforms and plugin implementation
    _format.setByteOrder(QAudioFormat::LittleEndian);
    _format.setSampleType(QAudioFormat::SignedInt);
    if (!_device.isFormatSupported(_format)) {
        printf("Default format not supported - trying to use nearest.\n");
        _format = _device.nearestFormat(_format);
    }
    QAudioOutput * _audioOutput = new QAudioOutput(_device, _format);
    _output = _audioOutput->start();
    std::array<char, 32768> _buffer;
    _buffer.fill(0);


    for (;;) {
        const int periodSize = _audioOutput->periodSize();
        const int chunks = _audioOutput->bytesFree() / periodSize;
        for (int i = 0; i < chunks; ++i) {
            const qint64 len = periodSize;
            if (len && _output) {
                _output->write(_buffer.data(), len);
            }
            if (len != periodSize) {
                break;
            }
        }
        Sleep(20);
    }
    return 0;
}
4

2 に答える 2

0

独自のイベント ループを実行しないでください。代わりに、QAudioOutput のnotify信号を QObject の 1 つのスロットに接続し、そのスロットで write() を 1 回呼び出します。通知信号は、QAudioOutput が再生するオーディオ データをさらに必要とするたびに発行されます。

これはすべて QApplication::exec() 内で発生し、(main() の終わり近くで) 呼び出して、独自の for ループではなく、Qt イベント ループを実行する必要があります。

于 2016-06-23T15:45:03.040 に答える