|
USB Audio, как проще сделать? |
|
|
|
 |
Ответов
(15 - 29)
|
Jun 28 2018, 09:38
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Atlantis- @ Jun 28 2018, 11:13)  Ну это вопрос того, что подключено к хабу. Просто нужно предупредить пользователя о возможной некорректной работе в случае подключения устройств с потоковой передачей данных. А вообще, вероятность такого сбоя крайне мала, в большинстве случаев по USB подключена мышь да клавиатура. Ну не знаю как у Вас, а у многих подключены ещё и USB-микрофоны и USB-камеры (для скайпа). А это - потоковые устройства. Кстати внутри ноутов камеры тоже запросто могут быть на USB cидеть, для унификации. А ещё есть ТВ-тюнеры. Да ещё куча другой потоковой периферии. Уже не говоря про спец.устройства. Цитата(Atlantis- @ Jun 28 2018, 11:13)  А вот создавая изохронную точку создается потенциальная угроза для других подключенных приборов. В чём угроза-то? Что пользователя предупредят что ему надо отключить лишние устройства, что бы подключить требуемое? По Вашему лучше молча глючить? А если сделаете на bulk, то юзеру придётся ваш девайс выключать каждый раз как он захочет флешку воткнуть или USB-HDD. А с изохронной точкой просто скорость чтения/записи этой флешки будет немного ниже. Цитата(Atlantis- @ Jun 28 2018, 11:13)  А как это поможет? Ну создам я два буфера по секунде каждый, заполню один, начну проигрывать, стану заполнять другой. Все равно со временем возникнет ситуация либо переполнения либо недостатка данных и что тогда делать? Естественно - заранее заложить требуемый избыток по пропускной полосе. Если скажем поток == 10000 Б/сек, то делается изохронная точка размером (1+10000/1000+1)==12байт, где первый байт указывает кол-во байт в кадре, а последний байт задаёт 10% запас на случай ухода частоты до +10%. Возможно, что первый байт длины и не нужен, если API в устройстве позволяет принимать неполные изохронные-кадры - кол-во байт определять по принятой длине.
|
|
|
|
|
Jun 28 2018, 10:46
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(jcxz @ Jun 28 2018, 11:00)  С соответствующим транспортом (изохронной точкой) вероятность "квакания" == 0. И буфера достаточно на пару мс. Я имел ввиду булковый транспорт. Цитата(jcxz @ Jun 28 2018, 13:20)  Чтоб не "квакало" когда передача данных с флешки будет конкурировать за полосу bulk-а с передачей данных девайса. Можно распределить флешку и звук на разные хосты, если уж так. Потому, что если на один посадите, то на моменты энумерации и пр все равно пару раз квакнет.
|
|
|
|
|
Jun 28 2018, 11:39
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(jcxz @ Jun 28 2018, 12:38)  Ну не знаю как у Вас, а у многих подключены ещё и USB-микрофоны и USB-камеры (для скайпа). А это - потоковые устройства. Кстати внутри ноутов камеры тоже запросто могут быть на USB cидеть, для унификации. А ещё есть ТВ-тюнеры. Да ещё куча другой потоковой периферии. Уже не говоря про спец.устройства. Проблема решается отключением всего вышеназванного. Мой поток данных равен 96 байт в 1 мс (48 кГц, 16 бит, 1 канал), это сравнительно мало. Цитата(jcxz @ Jun 28 2018, 12:38)  В чём угроза-то? Что пользователя предупредят что ему надо отключить лишние устройства, что бы подключить требуемое? По Вашему лучше молча глючить? smile3046.gif А если сделаете на bulk, то юзеру придётся ваш девайс выключать каждый раз как он захочет флешку воткнуть или USB-HDD. А с изохронной точкой просто скорость чтения/записи этой флешки будет немного ниже. В этом и угроза, что скорость работы другого устройства будет всегда ниже, а вдруг ее не хватит. В то время как потоковая передача - режим временный. В общем мой вопрос не в этом, а в том как правильно засинхронизироваться.
|
|
|
|
|
Jun 28 2018, 14:32
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Цитата Спасибо, а можете словами объяснить как это работает? Работа начинается, когда в выходной очереди (например, блоков DMA для выжачи на кодек/ЦАП) накопилось некоторое стартовое количество блоков. Их входного потока сэмплов формируются выходные блоки. Если их количество в выходной очереди растет, не чаще чем один раз в 5000 (зависит то возможной рассинхронизации) сэмплов выкидывается или при усыхающей очереди добавляется сэмпл. Алгоритм добавления в моем примере - среднее арифметическое между соседними.
Сообщение отредактировал Genadi Zawidowski - Jun 28 2018, 14:33
|
|
|
|
|
Jun 28 2018, 21:09
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Atlantis- @ Jun 28 2018, 14:39)  В этом и угроза, что скорость работы другого устройства будет всегда ниже, а вдруг ее не хватит. В то время как потоковая передача - режим временный. Вы совершенно не понимаете принципы организации передач в USB. Если скорость реалтайм-потока == 10000 б/сек, то размер изохронной точки нужен ==10 байт (+1 байт оверхида на несинхронность частот). Вот эти-то 10-11 байт и зарезервирует системный драйвер, на эту величину и уменьшится скорость работы других устройств. А если бы она не уменьшилась или уменьшилась на меньшую величину, то вы просто не успевали бы свой поток передать. Никаким транспортом и балком в том числе. Как не ухищряйтесь. И балком вы сможете успевать передавать. только если эти 11 байт будут оставаться от обмена других устройств. Только с балком это будет - как повезёт, а с изохронной точкой - гарантированно. Вот и вся разница. И скорость будет не "всегда ниже", а только когда активен профиль, в котором прописана данная точка. PS: Блин! Какое непроходимое дилетантство! Хоть бы почитали чего по теме, прежде чем чего-то делать....  (( Цитата(uriy @ Jun 28 2018, 15:43)  Тогда через Ethernet по вашему вообще звук передать невозможно? Там же и пакеты теряются и прийти могут не в том порядке что ушли и джиттер не постоянный. Ethernet-то тут каким боком???  Цитата(Genadi Zawidowski @ Jun 28 2018, 17:32)  Если их количество в выходной очереди растет, не чаще чем один раз в 5000 (зависит то возможной рассинхронизации) сэмплов выкидывается или при усыхающей очереди добавляется сэмпл. Я делал подстройку частот сложнее и плавнее: у меня при приближении к краям буфера ближе чем на какую-то величину (скажем 15% ёмкости буфера) вводился коэфф. ресэмплинга (нецелый), который линейно уменьшался/увеличивался при приближении к одной из границ буфера о 0% до некоторой величины (скажем 20%) по линейному закону. И на этот коэфф. у меня делался ресэмплинг потока сэмплов. Цитата(Rst7 @ Jun 28 2018, 20:42)  Bulk там именно для того, чтобы не потерять данные. Видимо такой же разработчик делал, как в первом посте. Попробуйте как-нить воткнуть что-нить в тот же хаб с большой изохронной точкой. Да ещё флешку рядом.  Цитата(Genadi Zawidowski @ Jun 28 2018, 22:29)  Дамп дескрипторов можно? Или хотя бы название. А то у меня есть процессор, в котором только два изохронных ендпоинта, а надо три потока передавать - bulk в нем без ограничений. Три потока одновременно? И нельзя все данные в один поток сложить? Можно попробовать interrupt-точку. Для неё нет таких гарантий от системы по полосе, но приоритет передач выше чем у bulk.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|