Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.236.111.234] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Цитата Доэкспериментировался - пришел к выводу что всегда достаточно двух буферов, если программа не успевает с двумя то делать их больше нет смысла - т.к. малые задержки на каждом буфере будут накапливаться до тех пока суммарная задержка не станет равна длине буфера и в этот момент в динамиках будет щелчек. Если буферов больше, чем 2(и они относительно "мелкие"), поток при получении управления, обрабатывает(может обработать) несколько мессаджей(буферов), которые пришли от звуковой подсистемы, пока поток "спал". Притом, что драйвер продолжает вовремя переключать относительно мелкие буферы. А вот если буферов всего 2, тогда будут разрывы, так как один буфер, допустим, обрабатывается приложением, а у драйвера в момент заполнения второго буфера не оказывается "резерва" для дальнейшей работы. Можно провести такой ээксперимент. Со входа звуковушки записываем в файл чистый синус. Запись при помощи wavein функций. Т.е., ставим сразу в очередь 100 буферов по 50 мс, дожидаемся, пока все они заполнятся и сбрасываем в файл. В редакторе смотрим, есть ли разрывы/глюки в записанном синусе. Уменьшаем длительность буферов и повторяем. И так до тех пор, пока не появятся разрывы. Одновременно смотрим на загрузку процессора, для наглядности. |
Сообщ.
#17
,
|
|
|
Действительной если нагрузка в системе очень неравномерна, то смысл есть, а для "чистой" работы программы (когда другие процессы не грузят систему) - она должна справляться с двумя буферами, если нет то надо оптимизировать код.
|
Сообщ.
#18
,
|
|
|
Цитата Действительной если нагрузка в системе очень неравномерна, Тут дело не столько в неравномерности, сколько в нереалтаймовости винды. Пока поток "спит", он ничего не может поделать с мессагами, приходящими в это время. Зато когда просыпается, может успеть за отведённое время разгрести "кучу бумаг", накопившихся, пока он спал. Добавлено Цитата она должна справляться с двумя буферами При достаточном размере буфера да. Почему я и рекомендовал 100 мс. Но потоковая модель работы с буферами не подразумевает в обязательном порядке, что в очереди "зациклены" n буферов одинакового размера. После обработки буфера он может уничтожаться, а в очередь по мере поступления могут добавляться новые(с выделением памяти, prepare), например прилетевшие по сети, причём вы заранее, допустим, не знаете, какой у них размер. |
Сообщ.
#19
,
|
|
|
Согласен случаи могут быть разными, отсюда и подходы разные.
|
Сообщ.
#20
,
|
|
|
...для статистики, в свей программе использую 20мс буферы (8кHz 16bit stereo) в количестве 50шт (1сек) - waveOut/In отрабатывают замечательно.
|
Сообщ.
#21
,
|
|
|
Цитата junkers1989 @ Доэкспериментировался - пришел к выводу что всегда достаточно двух буферов, если программа не успевает с двумя то делать их больше нет смысла - т.к. малые задержки на каждом буфере будут накапливаться до тех пока суммарная задержка не станет равна длине буфера и в этот момент в динамиках будет щелчек. Прошу прощения за ярый оффтоп, но у меня примерно такая-же ситуация. С той лишь разницей, что "щелчок" возникает при остановке воспроизведения аудио. Методом тыка удалось убрать эту проблему, но костыльным образом -- выводить программно звук в ноль, а потом уже останавливать. Мне стоит создать отдельную тему или эту ситуацию можно одним словом описать\решить? Добавлено Хотя наверное это уже некрофилизм темы, надеюсь простите |
Сообщ.
#22
,
|
|
|
Цитата Прошу прощения за ярый оффтоп, но у меня примерно такая-же ситуация. С той лишь разницей, что "щелчок" возникает при остановке воспроизведения аудио. Методом тыка удалось убрать эту проблему, но костыльным образом -- выводить программно звук в ноль, а потом уже останавливать. Мне стоит создать отдельную тему или эту ситуацию можно одним словом описать\решить? Такая же? А какая была у ТС? Имхо, стоит создать новую тему. Чтобы ответить, нужны подробности, с частью кода и пояснениями. А "щёлчок" можно записать и приаттачить. Может, никакого щелчка и нет. |
Сообщ.
#23
,
|
|
|
Хоть на словах, как происходит "остановка воспроизведения"?
|
Сообщ.
#24
,
|
|
|
Меня интересуют общие причины из-за чего такое может случаться. А дальше я сам додумаюсь как поправить. Именно по этому я решил не создавать новую тему. Одна из причин - неполный буфер, но не в моём случае.
Цитата Prince @ Хоть на словах, как происходит "остановка воспроизведения"? Общими словами сложно описать. Закрывается файловый стрим и очищается буфер. Отсюда: https://github.com/jphp-compiler/jphp-audio...oTrack.java#L74 Идёт сюда: https://github.com/jphp-compiler/jphp-audio...Player.java#L76 Затем сюда: https://github.com/jphp-compiler/jphp-audio...Output.java#L70 Но я не думаю что это вообще хоть как-то поможет, скорее наоборот. Добавлено Цитата Serafim @ Одна из причин - неполный буфер, но не в моём случае. Хотя вполне возможно, что буфер закрывается раньше, нежели вывод в Output и из-за этого туда влетает пустой фрагмент, который и фигачит таким образом. Но это скорее теория, хз |
Сообщ.
#25
,
|
|
|
Цитата Меня интересуют общие причины из-за чего такое может случаться. Сначала хотя бы понять, что такое "такое". Можете приаттачить щелчок(а лучше 2 щелчка, 3 щелчка... ), желательно вместе с "до щелчка" и "после щелчка". Цитата Но я не думаю что это вообще хоть как-то поможет, скорее наоборот. Пожалуй. Ни разу не waveout. |