2016-10-12 4 views
0
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(&thr); 

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

    a->start(buffer); 

    system("pause"); 

    return b.exec(); 
} 

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

+0

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

+0

Это не сработало. Спасибо, в любом случае. –

+0

Возможно (прочитайте документы, они, вероятно, скажут), что вам нужно «QGuiApplication» или «QApplication» для работы аудио. Затем, как вы намерены прекратить свое приложение? Возможно, вы захотите подключить соответствующий звуковой сигнал к слоту 'quA()' qApp'. – hyde

ответ

0

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

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

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

СПАСИБО! Я был на грани сдачи. В течение 2 месяцев я не мог найти правильный способ генерации звука с консоли без каких-либо результатов. :) –

Смежные вопросы