Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Audacity

Глава 2 из книги "Архитектура приложений с открытым исходным кодом", том 1.

Оригинал: Audacity, глава из книги "The Architecture of Open Source Applications" том 1.
Автор: James Crook
Перевод: Н.Ромоданов

2.8. Эффекты режима реального времени

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

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

Относительно недавнее дополнение в Audacity, которое называется загрузкой по требованию (on demand loading), хотя оно и не связано с аудиоэффектами, обладает многими элементами, которые нам требуются для эффектов режима реального времени. При импорте аудиофайла в Audacity, теперь можно в фоновом режиме создавать блочные файлы с обобщающей информацией. Пока аудиозапись продолжает загружаться, Audacity будет отображать те места аудиозаписи, которые еще не обработаны, как закрашенные серо-голубыми диагональными полосками, и будет продолжать отвечать на множество пользовательских команд. Блоки не обязательно должны обрабатываться последовательно слева направо. Замысел в том, этот же самый код может пригодиться для эффектов режима реального времени.

Загрузка по требованию предлагает нам эволюционный подход к добавлению эффектов режима реального времени. Это шаг, который позволяет избежать некоторых сложностей при создании самих эффектов режима реального времени. Для эффектов режима реального времени также дополнительно потребуется взаимное наложение между блоками, поскольку в противном случае такие эффекты, как эхо, не будут правильно подключаться. Мы также должны позволить менять параметры во время проигрывания аудиозаписи. Благодаря тому, что сначала сделана загрузка по требованию, код стал использоваться на более раннем этапе, чем это могло бы быть. Благодаря фактическому использованию кода возникнет обратная связь и появятся уточнения.

2.9. Заключение

В предыдущих разделах данной главы рассказано, как хорошая структура способствует развитию программы или как отсутствие хорошей структуры этому мешает.

  • Интерфейсы API других разработчиков, такие как PortAudio и wxWidgets, принесли нам огромную пользу. Они предложили нам код, на базе которого была сделана работа, и позволили абстрагироваться от различий, имеющихся во многих платформах. Единственное, чем мы за это заплатили, это то, что у нас слишком мало возможностей выбирать абстракции. У нас не совсем красивый код, используемый для воспроизведения и записи, т.к. мы должны были обрабатывать потоки тремя различными способами. В коде также гораздо больший объем копирования данных, чем это могло бы быть в случае, если бы мы управляли абстракциями.
  • Интерфейс API, предложенный нам в wxWidgets, соблазнил нас написать несколько громоздкий код, которому следовать трудно. Наше решение состояло в добавление фасада перед wxWidgets, что предоставило нам абстракции, которые нам были нужны, и дало более чистый код.
  • В панели TrackPanel в Audacity нам потребовалось выйти за пределы возможностей, которые можно было бы легко получить в существующих виджетах. В результате мы создали нашу собственную специальную систему. Есть средства освобождения панели с виджетами, с механизмом изменения размеров и с логически различными объектами уровня приложения, использование которых выходит за рамки панели TrackPanel.
  • Структурные решения являются более широкими, чем решения, касающиеся того, как структурировать новые возможности. Столь же важным может оказаться решение о том, что не должно быть в программе. Оно может привести к чистому и безопасному коду. Приятно получить преимущества скриптовых языков, таких как Perl, и не выполнять работу по поддержанию нсвоей собственной копии языка. Структурные решения также принимаются с учетом планов будущего развития. Предполагается, что наши модульная система, находящаяся в зачаточном состоянии, позволит нам больше экспериментировать, т. к. эксперименты стали безопаснее. Предполагается, что загрузка по требованию будет эволюционным шагом на пути к обработке по требованию эффектов режима реального времени.

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

У меня нет никаких сомнений в том, что то, какое сообщество стоит за Audacity, отражено в сильных и слабых сторонах кода. Более закрытые группы могли бы написать более качественный код, чем тот, который есть у нас, и более последовательно, но при меньшем количестве участников было бы гораздо труднее реализовать весь спектр возможностей Audacity.

Примечания

  1. Единственным исключением из этого является язык Найквиста на базе Lisp (Lisp-based Nyquist language), который был встроен в Audacity с самого начала. Мы хотели бы сделать его отдельным модулем, поставляемым в комплекте с Audacity, но нам не хватило времени сделать эти изменения.

Вернуться к началу статьи.