У меня есть приложение для воспроизведения звука, которое работает на нескольких распределенных устройствах, каждое со своими часами. Я использую QAudioOutput для воспроизведения одного и того же звука на каждом устройстве и UDP-трансляцию с главного устройства для синхронизации других устройств, пока все хорошо.
Однако мне сложно получить точное представление о "что сейчас играет" из QAudioOutput. Я использую QAudioOutput bufferSize () и bytesFree () для оценки того, какой аудиокадр в настоящее время передается в звуковую систему, но значение bytesFree () изменяется в «коротком» виде, так что (bufferSize () - bytesFree () ) / bytesPerFrame не показывает количество кадров, оставшихся в буфере, но показывает меньшее число, которое отскакивает относительно него.
В результате я получаю то, что когда мой "индикатор дрейфа" обновляется, он будет работать около 0 в течение нескольких секунд, затем каждые несколько секунд будут получать показания в диапазоне от -15 до -35 мс в течение, возможно, 20 секунд, затем корректирующий скачок составит около + 120 мс. Хотя я мог бы попытаться проанализировать эту долгосрочную закономерность и определить истинную скорость дрейфа (может быть, пару миллисекунд в минуту), я бы предпочел работать с более прямой информацией, если она доступна.
способ прочитать истинное количество кадров, оставшихся в буфере QAudioOutput, пока он воспроизводит поток?
Я понимаю, что могу минимизировать свои проблемы, радикально уменьшив размер буфера и подавая QAudioOutput с процессом с высоким приоритетом, но я Я бы предпочел решение, использующее более длинные буферы и не столь требовательное к тому, на чем оно работает - целевые платформы варьируются от Windows 10 машин до Raspberry Pi Zero Ws, возможно, до Android телефонов.