Pull to refresh
26
0
Send message

С подключением на хабр ;)

AsioLinkPro очень мощный микшер
Да, я рассматривал его. Но в нем меня не устроило то, что внутри себя, по цепочке, он может подключить только один единственный дочерний ASIO-драйвер, а остальное необходимо подключать через WDM и/или Kernel Streaming. Напоминает студенческие времена ASIO4ALL или вообще Guitar FX Box'a (ни к ночи будет помянут, лол). Как по мне, не серьезно.
с этой задачей легко справляется jack audio connection kit
Я пробовал, у меня не получилось. Может подскажете, как сделать так, чтобы JACK можно было подключить как ASIO-драйвер в DAW, а внутри самого JACK'а подключить два других, аппаратных ASIO-драйвера с их входами и выходами?
Да в принципе и простая ALSA
Я собирал и 32-битный, и 64-битный Ardour, пробовал LMMS. Писал даже свой собственный ALSA VSTi-хост под линукс с лютой смесью из ALSA, Wine и VST. Но мне не удалось избавится от щелчков (при банальной задаче игры через midi-клавиатуру в реальном времени) на звуковухе, на которой под Windows никаких проблем нет. На форумах советовали поставить не дефолтное, а реалтаймовое ядро, но это не дело. Если расскажете, что на каком-либо оборудовании на стандартном ядре линукс можно играть реалтаймовое миди через VSTi-плагин(x86, x64, win32 — не нативный линуксовый), буду весьма признателен.
богомерзкого кубейса))
А что в нем такого богомерзкого, не подскажете? А то я что-то за 17 лет его использования как-то не замечал за ним ничего подобного. Версия, естественно, лицензионная.
А мне помогает после сохранения свернуть блокнот в трей, а потом развернуть его заново.
Я имел ввиду пример карты распределения всей памяти микроконтроллера в абсолютной адресации (ну или хотя бы файл карты памяти скомпилированного образа ОС например с тестами в виде пользовательского приложения, созданный самим компилятором). А про списки, правильно ли я понимаю, что при старте новой задачи память под новый экземпляр struct TN_Task выделяется приложением, а не ядром?
Статья неплохая, но хотелось бы увидеть карту распределения памяти. Мне после прочтения осталось не ясно, как именно выделяется память новым экземплярам структур, в который встраивается список при «Оба варианта неприемлемы. Поэтому используется вариант с встраиванием и, кстати, точно такой же подход используется в ядре Linux » без использования кучи в ядре.
Правильно ли я понимаю, что биткоин в России хотят использовать по следующим причинам:
— Свобода: я хочу использовать любое платежное средство, потому что я хочу ощущать свободу
— Удобство: у меня уже есть биткоин-кошелек, поэтому мне удобнее расплатиться им
— Конкурентное преимущество: мой интернет-магазин принимает биткоины, а другой нет, поэтому это можно использовать в рекламе как преимущество
— Расширение базы клиентов: мой интернет-магазин принимает биткоины, за счет чего расширяется охват покупательской аудитории за счет держателей этой криптовалюты

Или есть еще какие-то причины?
В свое время классы ООП изучал вот по этой (Дрейер М. — C# для школьников) книжке, как это ни парадоксально. Очень понятно и доходчиво.
При подключении внешнего геймпада я использую PSP именно в качестве стационарной консоли, о чем написал в начале (также об этом явно показывает гифка чуть выше):
Самая функциональная модификация имеет компонентный выход для подключения к ТВ. Но разъем подключения к ТВ располагается неудачно с точки зрения долгого использования PSP в качестве геймпада. К тому же, при длительном использовании возникает необходимость подключения второго провода — от зарядного устройства. И удобство использования такой химеры стремится к нулю.
А история такая — узнал я недавно, что у друга есть провод для подключения PSP к ТВ, причем он у него лежал без дела. Я попросил попользоваться и понял, что идея использовать PSP вкупе с телевизором очень хорошая, но при подключенных кабелях питания и AV пользоваться PSP как геймпадом неудобно. Ну а единственным геймпадом у меня оказался от Xbox.
Да, занятное наблюдение — переходник действительно мощнее. Но по совокупности количества серьезных играбельных игр PSP тут впереди, ибо на железе Raspberry Pi PSP нормально не эмулировать, а андроид с драйвером видеокарты Broadcom обещал, но так и не выпустил.

Насчет CortexM3 сейчас посмотрел — все оказалось очень просто. Берем любой МК на CortexM3 с поддержкой USB OTG в чипе, например STM32F105. Протокол с геймпадами Xbox смотреть здесь. Библиотеку и примеры для работы с USB Host на мк STM32 брать здесь (файл STM32_USB-Host-Device_Lib_V2.1.0 (WINUSB HID).rar).
Фотография




Беспроводной джойстик тоже можно подключить — драйвер универсальный.
«Да, звучит не очень. А логи на ошибки ты проверил?» «Ну, я бы так и поступил,» — сказал я, «если бы не сломал каждую компоненту системы, необходимую для ведения логов. У меня есть сетевая файловая система и я сломал сеть, файловую систему, и мои компьютеры подыхают от одного моего взгляда.
Кто-нибудь, расскажите автору оригинальной статьи про трейсинг по абсолютному адресу оперативной памяти с последующим чтением после аварийной перезагрузки. В операционке вот этих ребят это например отлично работает — сам проверял. А вообще странно все это.
Видимо ибо .exe-файл — это контейнер в формате Windows Portable Executable, и с выравниванием секций по-умолчанию получилось вот так. Предполагаю, что можно настроить компоновщик пристыковывать секции ближе друг к другу.
Понятно. Другими словами, озвученное оказалось не супер-преимуществом, а скорее недодуманностью/недоработкой.
Не совсем так. Во-первых, я нигде не писал об этом как о «супер-преимуществе», я лишь описал это в списке вещей, «которые мне показались интересными в процессе разработки программы». Даже вообще не называл это преимуществом, говоря «отличие в плане буферизации». Во-вторых, при качественном интернете, или в локальной сети, это действительно преимущество, а не недоработка. Ибо реально минимизирует задержку.

Но, в итоге да. Вы убедили меня в том, что моя программа очень нишевая — годится для локальных сетей и репетиций (не выступлений) в рамках одного провайдера.
Хм. Пост навел на мысли о том, что получается, что при разных размерах ASIO-драйверов у разных участников сессии получается разный user-experience.
всё равно по вышеописанным причинам (склейка, пропуск пакетов, потери пакетов) нужно будет делать нормальный jitter-буфер
Все правильно, можно улучшить эту часть в моей программе. Но, по-первых, у меня проблем с потерями пакетов не возникало. Во-вторых, в комментариях выше были указаны замечательные ссылки на программы Jamulus и Soundjack, о которых я не знал. Судя по описанию это как раз то, что нужно. В случае проблем с моей программой буду использовать их.

Например, если они вдвоём сидят за одним NAT'ом и получают один и тот же публичный IP-адрес.
В лучшем случае первый подключившийся из виртуальной сети к хосту во внешней сети будет передавать свои аудио данные, а сам слышать ничего не будет. Ибо с NAT'ом я не разбирался и ничего специально для этого не писал.
вначале приведённый код выдаст несколько сеансов тишины
весь дальнейший звук удалённого участника будет задерживаться
буферизация в вашей системе уже есть, просто вы об этом не догадывались
Да, как я уже говорил, у меня есть опыт работы с UDP, и это я знал. Но единственной мыслью было периодически очищать буфер сокета. Только запамятовал, можно ли получить статистику о количестве пришедших пакетов на сокет? Если можно, то может стоит очищать сокет, если скопилось больше одного пакета. Хм.

Что если два участника из трёх находятся в одной виртуальной подсети
А можно на примере, не совсем понятно что такое «виртуальная подсеть» в данном контексте?
То есть если пакет пришёл — он микшируется со следующим звуковым фреймом на playback, иначе — вместо канала пустота, верно
Верно. А разделение клиентов друг от друга осуществляется за счет разных портов приема. Причем тут тоже был интересный подводный камень. Чтобы в распределенной p2p-сети два разных участника не слали данные в один и тот же порт, каждый участник шлет данные в порт, индекс которого является позицией абсолютного четырёхбайтового значения своего ip-адреса в отсортированной по возрастанию таблице ip-адресов всех участников сессии.
как именно оно работает без буферизации, когда нового звука от удалённого участника ещё не поступало
Просто ASIO-драйвер callback'ом (44100 / buffSize) раз в секунду вызывает огроомную функцию, в которой написано в т.ч. следующее:

#define MAX_NET_USERS 8 // максимальное число удаленных участников музыкальной онлайн-сессии; в первом релизе сделать 8
for(int i = 0; i < MAX_NET_USERS; i++)
{
    // послать смикшированные сэмплы
    if(nSend[i] == 1)
    {
        NetSend((unsigned char*)(asioDriverInfo.bufferInfos[OutputCh].buffers[index]), (unsigned char*)(asioDriverInfo.bufferInfos[OutputCh+1].buffers[index]), buffSize, i);
    }
    // считать сетевые данные
    if(NetReceive((unsigned char*)(BigLeft), (unsigned char*)(BigRight), buffSize, i) == 0)
    {
        ClientCounter++;
    }
}

, где:

int NetReceive(unsigned char *Left, unsigned char *Right, int MaxSamples, int ClientIndex)
{
    //...
    if(NetReceive_real(ReceivedFrame, (2048 * 4 * 2) + 4 + 4, ClientIndex) == 0)
    {
        for(int NewBufPos = 0; NewBufPos < MaxSamples; NewBufPos++)
        {
            // смикшировать очередной сэмпл левого канала
            // смикшировать очередной сэмпл правого канала
            //...
        }
    }
    else
    { 
        //...
        return -1;
    }
return 0;
}

, где:

int NetReceive_real(unsigned char * data, int maxdatasize, int ClientIndex)
{
    struct sockaddr_in RecvAddr;
    int fromlen = sizeof(struct sockaddr_in);
    if(recvfrom(MySocket[ClientIndex], (LPSTR)data, maxdatasize, 0, (sockaddr*)&RecvAddr, &fromlen) >= 0)
    {
        PeerTableSetLastUpdateTime(RecvAddr.sin_addr.s_addr, MySystemTime);
        return 0; // если данные с сокета успешно считаны то возвращаем ноль
    }
    else
    {
        return -1; // иначе НАДО ВОЗВРАТИТЬ -1(!)
    }
}

.

Какие расстояния подразумевается под словом «интернет» здесь
Хм, один человек был в этом-же городе, где и я, и еще один был в соседнем городе за 50 км.
Сейчас спросил — друг, с которым тестировали, еще играл с городом, который находится за 800 км от него, говорит нормально. Сейчас он скинул мне записи и могу сказать, что проблем нет. Вот отрывок того файла.

В частности, я сомневаюсь что без этого буфера в Music Over The World Tool можно без проблем играть на темпе 120-140 между Москвой и Сан-Франциско.
Как я уже написал, чудес не бывает. Программа не может уменьшить пинг между двумя удаленными компьютерами. Так что если пинг будет миллисекунд 80, то проблемы будут. Но уж точно не по вине программы, суть то в этом.
1

Information

Rating
Does not participate
Registered
Activity