QIODevice *start()
иvoid start(QIODevice *)
.Первый возвращает QIODevice, в который можно писать данные с момощью write, а второй стартует воспроизведение, считывая звук из переданного в него QIoDevice.
Ситуация:
По сокетам приходят звуковые буфера. Все вместе взятые она содержат непрерывный звук, ~по 0.5 секунды в каждом буфере. Но приходят они не точно раз в пол секунды, а неравномерно. Когда пользовались первым способом, звук сильно разрывался, откуда можно сделать вывод, что такой способ некорректно добавляет данные к воспроизводимым.
Для того чтобы пользоваться вторым способом, должен быть все время заполненный QIODevice. Вот как сделал я:
QBuffer m_audioBuffer;
QAudioOutput *m_pAudioOutput;
qint64 buf_num = 0;
...
void MyClass::onReceiveSoundBuffer()
{
// Если накоплено 3 буфера и не идет воспроизведение - воспроизвести
// (фактически это простая реализация предварительного накопления)
if(buf_num > 2 && m_pAudioOutput->state() != QAudio::ActiveState)
m_pAudioOutput->start(&m_audioBuffer);
// Инкрементация счетчика итераций
buf_num++;
// Считываем звуковой буфер из сокета
QByteArray audio_data;
out >> audio_data;
// А вот такимим финтами добавляем звук
qint64 actPos = m_audioBuffer.pos();
m_audioBuffer.seek(m_audioBuffer.size());
m_audioBuffer.write(audio_data);
m_audioBuffer.seek(actPos);
}
Но судя по всему в этом случае будет наступать переполнение буфера. Вопросы:
1. Как избежать переполнения буфера
2. Как вообще нормальным способом непрерывно воспроизводить звук на Qt? (то есть сделать чтобы приходящий новый буфер либо шел сразу на воспроизведение, либо аппендился к уже воспроизводящемуся)