На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование звука"
0) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с записью, обработкой, воспроизведением звука. Перед созданием темы подумайте, не будет ли она уместнее в разделах Разработка и тестирование программ, Наши исходники, а особенно Разовые заказы и подработки
1) На Раздел распространяются все Правила форума.Огромная просьба с ними внимательно ознакомиться.
2) Запрещается давать бессмысленные ответы вроде: "Снеси Мастдай", "ХП рулит", "Поставь Линукс" и т.д.
3) Запрещается создавать темы, в которых Вы намереваетесь получить ссылку на кряки, серийники и т.п. Также запрещено любое обсуждение p2p (peer-to-peer) сетей (BitTorrent, eDonkey и т.д.).
4) Реклама всякого рода пресекается беспощадно.
5) Используйте тэг [CODE] для выделения кода программы (непременно с указанием языка программирования - выбрать из списка. В противном случае бессмысленно!). Уважайте тех, кто будет читать ваш код!
6) Если решение вашей проблемы найдено, то не забываем помечать тему специальной функцией "Вопрос решён". Вам всего лишь требуется при написании последнего ответа поставить одну единственную галочку прямо над формой ответа.
7) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе

8) Если не прикрепляются/не скачиваются файлы, читаем Не прикрепляется / не скачивается файл. Любые обсуждения в данном разделе проблем с приложением файлов считаются оффтопиком! Со всеми вытекающими.

9) NEW! Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно. Попытки накрутки количества тематических сообщений за счёт поднятия древних неактуальных тем ("некрофилия") будут наказываться по велению левой пятки модераторского состава (см. пп.12, 13 Правил)



Нарушение Правил может повлечь наказание со стороны модераторов.



user posted imageFAQ Раздела user posted imageПоиск в Разделе user posted imageMSDN Library Online | Ваше мнение о модераторах: user posted imageBarazuk user posted imageRikkie
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Проблемы двойной буфферизации и WaveOut , Заикание звука
    Цитата
    Доэкспериментировался - пришел к выводу что всегда достаточно двух буферов, если программа не успевает с двумя то делать их больше нет смысла - т.к. малые задержки на каждом буфере будут накапливаться до тех пока суммарная задержка не станет равна длине буфера и в этот момент в динамиках будет щелчек.

    Если буферов больше, чем 2(и они относительно "мелкие"), поток при получении управления, обрабатывает(может обработать) несколько мессаджей(буферов), которые пришли от звуковой подсистемы, пока поток "спал". Притом, что драйвер продолжает вовремя переключать относительно мелкие буферы. А вот если буферов всего 2, тогда будут разрывы, так как один буфер, допустим, обрабатывается приложением, а у драйвера в момент заполнения второго буфера не оказывается "резерва" для дальнейшей работы.

    Можно провести такой ээксперимент.
    Со входа звуковушки записываем в файл чистый синус. Запись при помощи wavein функций.
    Т.е., ставим сразу в очередь 100 буферов по 50 мс, дожидаемся, пока все они заполнятся и сбрасываем в файл. В редакторе смотрим, есть ли разрывы/глюки в записанном синусе. Уменьшаем длительность буферов и повторяем. И так до тех пор, пока не появятся разрывы. Одновременно смотрим на загрузку процессора, для наглядности.
    Сообщение отредактировано: Prince -
      Действительной если нагрузка в системе очень неравномерна, то смысл есть, а для "чистой" работы программы (когда другие процессы не грузят систему) - она должна справляться с двумя буферами, если нет то надо оптимизировать код.
        Цитата
        Действительной если нагрузка в системе очень неравномерна,

        Тут дело не столько в неравномерности, сколько в нереалтаймовости винды. Пока поток "спит", он ничего не может поделать с мессагами, приходящими в это время. Зато когда просыпается, может успеть за отведённое время разгрести "кучу бумаг", накопившихся, пока он спал.

        Добавлено
        Цитата
        она должна справляться с двумя буферами

        При достаточном размере буфера да. Почему я и рекомендовал 100 мс. Но потоковая модель работы с буферами не подразумевает в обязательном порядке, что в очереди "зациклены" n буферов одинакового размера. После обработки буфера он может уничтожаться, а в очередь по мере поступления могут добавляться новые(с выделением памяти, prepare), например прилетевшие по сети, причём вы заранее, допустим, не знаете, какой у них размер.
        Сообщение отредактировано: Prince -
          Согласен случаи могут быть разными, отсюда и подходы разные.
            ...для статистики, в свей программе использую 20мс буферы (8кHz 16bit stereo) в количестве 50шт (1сек) - waveOut/In отрабатывают замечательно.
              Цитата junkers1989 @
              Доэкспериментировался - пришел к выводу что всегда достаточно двух буферов, если программа не успевает с двумя то делать их больше нет смысла - т.к. малые задержки на каждом буфере будут накапливаться до тех пока суммарная задержка не станет равна длине буфера и в этот момент в динамиках будет щелчек.

              Прошу прощения за ярый оффтоп, но у меня примерно такая-же ситуация. С той лишь разницей, что "щелчок" возникает при остановке воспроизведения аудио. Методом тыка удалось убрать эту проблему, но костыльным образом -- выводить программно звук в ноль, а потом уже останавливать. Мне стоит создать отдельную тему или эту ситуацию можно одним словом описать\решить?

              Добавлено
              Хотя наверное это уже некрофилизм темы, надеюсь простите :rolleyes:
                Цитата
                Прошу прощения за ярый оффтоп, но у меня примерно такая-же ситуация. С той лишь разницей, что "щелчок" возникает при остановке воспроизведения аудио. Методом тыка удалось убрать эту проблему, но костыльным образом -- выводить программно звук в ноль, а потом уже останавливать. Мне стоит создать отдельную тему или эту ситуацию можно одним словом описать\решить?

                Такая же? А какая была у ТС?
                Имхо, стоит создать новую тему.
                Чтобы ответить, нужны подробности, с частью кода и пояснениями.
                А "щёлчок" можно записать и приаттачить. Может, никакого щелчка и нет.
                  Хоть на словах, как происходит "остановка воспроизведения"?
                    Меня интересуют общие причины из-за чего такое может случаться. А дальше я сам додумаюсь как поправить. Именно по этому я решил не создавать новую тему. Одна из причин - неполный буфер, но не в моём случае.


                    Цитата 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 и из-за этого туда влетает пустой фрагмент, который и фигачит таким образом. Но это скорее теория, хз
                      Цитата
                      Меня интересуют общие причины из-за чего такое может случаться.

                      Сначала хотя бы понять, что такое "такое". Можете приаттачить щелчок(а лучше 2 щелчка, 3 щелчка... :) ), желательно вместе с "до щелчка" и "после щелчка".
                      Цитата
                      Но я не думаю что это вообще хоть как-то поможет, скорее наоборот.

                      Пожалуй. Ни разу не waveout.
                      Сообщение отредактировано: Prince -
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0517 ]   [ 16 queries used ]   [ Generated: 19.03.24, 03:37 GMT ]