Задержки
Задержки. Чтобы понять, с чем связаны эти сложности, заметим, что Linux — это операционная система, работающая с разделением времени, а не в режиме реального времени. За доступ к процессору постоянно конкурируют сразу несколько потоков выполнения; даже после возникновения некоторого события может пройти небольшой интервал времени до того, как система Linux передаст процессор в распоряжение потока, ожидающего этого события. Поэтому если поток запрашивает задержку в N миллисекунд (мс), операционная система гарантирует, что предоставленная задержка не будет меньше N мс, но не может гарантировать, что задержка будет точно равна N мс. Также следует учесть, что после того как поток запланирован на выполнение, вычислительные операции и операции ввода/вывода вносят дополнительную задержку до начала воспроизведения. ортопедические матрасы сравнить
В этом коде приходится учитывать много тонкостей, что неизбежно приводит к его усложнению. К числу наиболее трудоемких операций относится вычисление
Для большинства программ, связанных с обработкой данных, небольшая задержка не имеет значения. Однако при обработке в реальном времени аудиосигнала задержка при передаче данных на звуковое устройство приведет к возникновению паузы и к искажениям воспроизведения, заметным для слушателя. В целях предотвращения таких проблем в процедуре playaudio применяется эвристический метод: в ней предусмотрено, чтобы поток активизировался незадолго до того момента, когда потребуется воспроизведение. Это означает, что при вычислении задержки в процедуре playaudio используется значение, немного меньшее по сравнению с действительно необходимой точной задержкой. Это означает, что небольшие издержки, связанные с функционированием операционной системы или устройства, не помешают своевременно начать воспроизведение.
Обработка еще больше усложняется в связи с тем, как организовано функционирование программного обеспечения RTP. В частности, напомним, что пакеты RTP могут поступать с нарушением исходного порядка. Рассмотрим, что произойдет, если пакет поступит в то время, когда основной поток находится в неактивном состоянии. Например, предположим, что в момент времени, отстоящий от момента начала воспроизведения на 50 единиц времени (назовем его условно моментом времени 50), процедура playaudio просматривает очередь и находит, что первый пакет в этой очереди должен быть воспроизведен в момент времени 60. Основной поток должен установить выдержку времени в течение интервала, немного меньшего 10 единиц времени. Однако в любое время в течение этой задержки может поступить новый пакет, содержащий данные, которые должны быть воспроизведены в интервале между текущим моментом времени и моментом времени 60. Чтобы можно было учесть такие обстоятельства, программное обеспечение должно допускать отмену пауз. В приведенном примере кода для выхода из этой ситуации используется условная переменная. Основной поток переходит на установленное время в состояние ожидания события, связанного с изменением условной переменной stm.stmjrcond. Если установка таймера истекает, а это событие не происходит, операционная система активизирует поток. Если же поступает пакет, то процедура rtpnewdata вызывает функцию pthread_cond_signal для активизации потока. Данный код содержится в файле playaudio.с.