Здравствуйте. Может кто-нибудь знает, как корректно отдавать поток звука на

карту? Возникают щелчки из-за задержки между пакетами. Один пакет (звук 200мс) система воспроизводит сразу и между воспроизведением следующего(поступает через 200мс) происходит этот самый щелчок. На одной машине реализовал через временную задержку для выдачи первого пакета на карту и она как надо все воспроизводила без какого-либо шума в виде щелчков. А на этой запустил - все те же щелчки. Буффер в QAudioOutput только усугубляет ситуацию

13 ответов

14 просмотров

ивент луп задействован или еще какой-то не детерминируемый по исполнению код?

DI- Автор вопроса

покажи какой код

DI
Нет. Все в основном потоке

кросс платформа нужна прям обязательно?

DI- Автор вопроса
Sergey
кросс платформа нужна прям обязательно?

Как я понял, только для поддержки unix-систем

DI
Как я понял, только для поддержки unix-систем

я бы посмотрел функции общения с драйверами в режиме нотификации при завершении операции, чтоб следующий кусок отправлялся по колбэку, когда драйвер завершил обработку. Не писал звуковые штуки, но я бы смотрел в этом направлении

DI- Автор вопроса
IVAN MALAKHOV
покажи какой код

void Oscilloscope::connect(){ QObject::connect(_connector, &CfiConnector::audioDataReceived, this, &Oscilloscope::updateLine); if (_configs->getOutToCard()) QObject::connect(_connector, &CfiConnector::audioDataReceived, this, &Oscilloscope::writeToAudiocard); } void CfiConnector::onReadyRead(){ while (_localSocket.hasPendingDatagrams()){ auto datagram = _localSocket.receiveDatagram(); if(datagram.senderAddress() != _remoteAddress && datagram.senderPort() != _remotePort) return; auto data = datagram.data(); switch(data.at(0)){ case 0x03: emit audioDataReceived(data); break; default: break; } } } void Oscilloscope::writeToAudiocard(const QByteArray &bytes){ QVector<qint16> linear; linear.reserve(2000); std::transform(bytes.begin() + 16, bytes.end(), std::back_inserter(linear), [](char byte)->qint16 { return Oscilloscope::indexTo(byte); }); _audioOut->writeData(reinterpret_cast<const char*>(linear.data()), 4000); } qint64 AudioOut::writeData(const char *data, qint64 maxlen){ //_buffer.writeData(QByteArray(data, maxlen)); _ioDevice->write(data, maxlen); return 0; } Вот 4 связанные между собой функции

DI- Автор вопроса
Sergey
я бы посмотрел функции общения с драйверами в режи...

Ох. Тогда надо лезть в библиотеки драйвера Хорошо. Чекну, спасибо

DI
void Oscilloscope::connect(){ QObject::connect...

ну ивентлуп в полный рост у тебя тут

DI- Автор вопроса
IVAN MALAKHOV
ну ивентлуп в полный рост у тебя тут

Ну эти никуда не убрать, пожалуй. Разве что на месте приеме передавать на карту, посмотрю чуть позже

DI- Автор вопроса

Если кто-нибудь будет долбится об такую же хрень, оставлю здесь: qint64 AudioOut::writeData(const char *data, qint64 maxlen){ std::vector<char> vData(data, data+maxlen); _buffer.insert(_buffer.end(), vData.begin(), vData.end()); _writeFunction(this); return 0; } void AudioOut::delayWriteToCard() { _sink->setNotifyInterval(100); connect(_sink, &QAudioOutput::notify, this, &AudioOut::writeToCard); QTimer::singleShot(DELAY_TIME, this, &AudioOut::writeToCard); _writeFunction = &AudioOut::writeToCard; } void AudioOut::writeToCard(){ int min = qMin((int)_buffer.size(), _sink->bytesFree()); qDebug() << "AudioOut::writeToCard" << min << _sink->bytesFree() << _buffer.size(); if (_sink->bytesFree() > 0){ _ioDevice->write(_buffer.data(), min); _buffer.erase(_buffer.begin(), _buffer.begin() + min); } } void AudioOut::start() { if (_sink->state() == QAudio::StoppedState){ _sink->stop(); _writeFunction = &AudioOut::delayWriteToCard; //_buffer.reset(); _ioDevice = _sink->start(); } } void AudioOut::stop() { disconnect(_sink, &QAudioOutput::notify, this, &AudioOut::writeToCard); _sink->stop(); }

DI
Если кто-нибудь будет долбится об такую же хрень, ...

лучше сделай простую демку и выложи где-то, чтобы потом кто-то мог собрать и попробовать.

DI- Автор вопроса

Похожие вопросы

Обсуждают сегодня

40 тысяч в час / 3600 = 11,11 в секунду... Вам точно нужна очередь? (я просто не знаю "контекста") Такое количество запросов любое приложение замечательно "прожует" и не попер...
Igor Mitin
5
Всем салют, заинтересовался odoo, хотел бы поинтересоваться на счёт этой ERP , прогеры которые работают над проектами вы используете odoo как серверную платформу работая с RES...
⚔️
8
А как асинхрон иначе реализован? Пардон:)
Ivan K 🏄🏻‍♂️
6
вопрос: кто как решает вопрос с динамической подгрузкой скриптов для отдельных страниц с включенным turbo router?
Sergei Toroptsev
25
Сonst magicTgHTML = (text, entities) => { let processedText = text; let offsetShift = 0; entities.forEach(entity => { const { offset, length, type, url, ...
Андрей
1
Друзья, за кем?
Magic
12
Почему Telegram пишет, что объект media не найден, хотя на самом деле я его передаю? Делаю на urllib, без зависимостей, так надо. Вызываю метод sendMediaGroup с таким JSON: ...
Alexey S
1
Это что теперь, любой бот сможет принимать платежи без ебли с юр лицами?
Lencore
8
Ой а правда когда vcard появился? Вообще отличали просто по иду
Magic
2
Не догоняю немного каким боком тут эппл Вот есть веб (мини) апп, который по факту веб сайт, просто в телеге веб вью и если там оплата, то нежно вот эти приседания?
e\\/gen
7
Карта сайта