Как мне заставить объект QAudioOutput воспроизводиться из буфера?

#c #qt

#c #qt

Вопрос:

 int main(int argc, char *argv[])
{
    QCoreApplication b(argc, argv);

    QBuffer *buffer;
    QAudioOutput *a;

    QAudioFormat format;
    format.setSampleRate(8000);
    format.setChannelCount(1);
    format.setSampleSize(8);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::UnSignedInt);

    QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
    if (info.isFormatSupported(format))
    {
        cout << "Format supported" << endl;
    }
    else
    {
        cout << "Format not supported" << endl;
    }

    char *data = (char*)malloc(32768 * sizeof(char));

    //generating a sound
    for (int i = 0; i<256;   i)
    {
        for (int j = 0; j<128;   j)
        {
            data[i * 128   j] = (char)j;
        }
    }

    cout << "Created samples" << endl;

    //copying into the buffer
    buffer = new QBuffer;
    buffer->open(QIODevice::ReadWrite);
    buffer->seek(0);
    buffer->write(data, 32768);
    cout << "Filled buffer" << endl;

    //playing
    QThread thr;
    a = new QAudioOutput(format);
    //a->moveToThread(amp;thr);

    //thr.start();
    //QMetaObject::invokeMethod(a, "start", Q_ARG(QIODevice*, buffer));

    a->start(buffer);

    system("pause");

    return b.exec();
}
  

Я пытаюсь заставить свое консольное приложение выводить звук, и я не могу понять, почему мой QAudioOutput объект этого не делает. Я разместил код выше. Можете ли вы сказать мне, что я сделал не так?
PS Если я запишу этот вектор в файл и воспроизведу его как необработанный звук, я услышу низкочастотный гул.

Комментарии:

1. Я не уверен, нужен ли вам для этого основной цикл. Но вы не должны «делать паузу» раньше exec . exec запустит внутренние основные потоки Qt. Так что это может быть из-за этого.

2. Это не сработало. В любом случае спасибо.

3. Возможно (читайте документы, они, вероятно, говорят об этом), что вам нужно QGuiApplication или QApplication для работы звука. Тогда как вы собираетесь завершить работу вашего приложения? Вероятно, вы хотите подключить соответствующий аудиосигнал к qApp quit() слоту.

4. Или, по крайней мере, цикл вращающихся событий.

Ответ №1:

Во-первых, у вас определенно не должно быть system("pause") перед вашим основным циклом, как упоминал @Hayt.

Во-вторых, вы должны искать начало после того, как вы записали данные.

 buffer->write(data, 32768);
buffer->seek(0);
  

Комментарии:

1. Спасибо! Я был на грани того, чтобы сдаться. В течение 2 месяцев я не мог найти правильный способ генерации звука с помощью консоли без какого-либо результата. 🙂