QAudioInput :: byteReady () и QIODevice :: read (), дающие различное количество байтов - PullRequest
6 голосов
/ 12 марта 2012

У меня возникли сомнения по поводу следующего фрагмента кода…

const qint64 bytesReady = m_audioInput->bytesReady();
const qint64 bytesSpace = m_buffer.size() - m_dataLength;
const qint64 bytesToRead = qMin(bytesReady, bytesSpace);
const qint64 bytesRead = m_audioInputIODevice->read(m_buffer.data() + m_dataLength, bytesToRead);

Метод bytesReady () дает мне определенное количество байтов, и я передаю это число байтов read () QIODevice, которыйвернет мне количество прочитанных байтов.

Проблема в том, что bytesRead не равно bytesToRead.И я получаю фиксированное количество байтов от метода чтения, то есть 320, 640, 960, 1280 и т. Д., И это зависит от byteToRead.

Ответы [ 2 ]

7 голосов
/ 14 марта 2012

Нет прямой связи между QAudioInput::bytesReady() и QIODevice, на котором он записывает свои сэмплы.

QAudioInput поддерживает внутреннее устройство ввода-вывода (зависит от системы) для аудиосистемы, котораяявляется аналогом только для чтения QIODevice.Когда вы вызываете bytesReady, он возвращает количество байтов, доступных для чтения, аналогично QIODevice::bytesAvailable().Они не еще записаны в вывод QIODevice, поэтому, когда вы делаете m_audioInputIODevice->read сразу после него, без обработки событий, вы фактически получаете сэмплы, которые были написаны ранее, а нете, которые все еще находятся в аудио буфере.

Это, плюс буферизация IODevice, объясняет, почему числа могут отличаться, и я не вижу способа синхронизировать их вместе.

На самом деле, вы должны сделать:

const qint64 bytesRead = m_audioInputIODevice->read(m_buffer.data() + m_dataLength, bytesSpace);

, чтобы получить все, что доступно от IODevice, до вашего доступного буферного пространства.

2 голосов
/ 23 мая 2012

Еще лучше:

Используйте ->readAll(), который возвращает QByteArray "qba"

... затем используйте sz=qba.size(), который скажет вам, что вы получили (может быть ноль)

... затем сделайте что-нибудь с помощью sz и qba.data();

... кажется, без ошибок, в отличие от большинства QAudioInput, который невероятно нарушен, например, произвольный предел частоты дискретизации 48000 в Windows, но не в OSX, в режиме pull используется поток переднего плана, поэтому он будет постоянно прерываться Реальная ситуация, bytesReady() не имеет смысла ... Худшее. Qt. Рутинное. Evar!

...