Как в Windows заставить конвейеры работать в бинарном режиме
|
|
electrik | Дата: Суббота, 03.12.2022, 18:40 | Сообщение # 1 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| Собрал тут я себе набор утилит speech signal processing tools (SPTK). https://github.com/sp-nitech/SPTK По умолчанию для консольных инструментов при сборке у них стоит заглушка чтобы они не собирались в винде. Оно и понятно почему. Винда с stdin и stdout работают в текстовом режиме. Неужели нет способа заставить винду работать в конвейере правильно? Пробовал посмотреть несколько советов использовать setmode(STDIN_FILENO, O_BINARY); setmode(STDOUT_FILENO, O_BINARY); Но там же другие пишут, что это криво работает, и рекомендуют открывать устройство в бинарном режиме. Вопрос, придётся модифицировать весь SPTK, или возможно будет сделать костыль ввиде первого файла, который запустит потоки в бинарном режиме, а дальше уже будет всё норм? Может можно это сделать как-то на сессию? Уж очень хорошие утилиты, хрен с ним что виндовые конвейеры медленные. Хочу для себя написать небольшой GUI для задач связанных с ресинтезом и воспроизведением звука. Можно конечно заюзать в WSL pulse audio, прицепить звук к винде, и долбить там всё из консоли, но это всё уж очень долго, тем более, я хочу заниматься правкой F0 на лету, и затем воспроизводить полученный результат, а это будет вообще пипецки не удобно.
|
|
| |
zamabuvaraeu | Дата: Воскресенье, 04.12.2022, 22:13 | Сообщение # 2 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Не понял. Функции чтения и записи ReadFile и WriteFile как раз и работают в бинарном режиме. Получаем стандартный поток через GetStdHandle и потом читаем‐записываем оттуда массив байт. Добавлено (04.12.2022, 22:17) ---------------------------------------------
Цитата electrik ( ) setmode(STDIN_FILENO, O_BINARY); setmode(STDOUT_FILENO, O_BINARY); У Винапи нет таких функций.
|
|
| |
electrik | Дата: Вторник, 06.12.2022, 19:11 | Сообщение # 3 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| Ладно, попробую. Я, честно говоря, своих конвейеров никогда не писал, надобности небыло, а только лишь использовал. мне интересно, не поломается ли дальше конвейер при вызове в нём через вертикальную черту | последующих утилит. А поповоду приведённых мною функций, их нет в WinApi, но они есть в C.
|
|
| |
zamabuvaraeu | Дата: Среда, 07.12.2022, 11:08 | Сообщение # 4 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Так мы говорим о Windows или функциях библиотеки языка Си? Если про Си, то сколько бы я ни видел тем на форумах, то каждая про кодировку в консоли. Отсюда вывод: стандартная библиотека сломана и забагована, разработчики отказываются её чинить, и не очень понятно зачем использовать то, что не работает.
Напротив, функции Windows вроде ReadFile и WriteFile всегда работают. Это когда нужно вводить и выводить массив байт. А если у нас строки, то следует использовать ReadConsole и WriteConsole.
|
|
| |
electrik | Дата: Среда, 07.12.2022, 17:55 | Сообщение # 5 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| Да я уж понял, что C библиотека забагована. Просто хотелось это починить на уровне sptk. Получается, что и C++ тоже багованная, раз они отключили компиляцию бинарников в винде, а заморачиваться, им, видимо, пока не хочется. Добавлено (07.12.2022, 19:00) --------------------------------------------- Попробовал, ну ничего хорошего. С моей программы данные уходят нормальные, а дальше, всё так же ломается. Код моей программы starter.bas:
Код #include "windows.bi"
#define buf_size 65536
if __FB_ARGC__ then dim as HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE) dim as HANDLE hFile = CreateFile(__FB_ARGV__[1], GENERIC_READ or GENERIC_WRITE , FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL) if hFile then dim buf as any ptr = allocate(buf_size) dim bytesRead as DWORD = 0 do ReadFile (hFile, buf, buf_size, @bytesRead, NULL) if bytesRead = 0 then exit do WriteFile(stdout, buf, bytesRead, NULL, NULL) loop deallocate(buf) end if end if
вызываю так: starter klad3.raw | x2x +sf > klad3f.raw
В итоге от x2x попрежнему приходят сломанные данные. По длине всё нормально, но где-то в x2x байты преобразуются криво. Если ввод своей программы направляю в файл, всё норм. Короче не судьба. Посоветовали заюзать msys2, и запускать утилиты предварительно добавив переменную окружения: set MSYS=pipe_byte Видимо, придётся искать альтернативу на python и там мудрить. Немного приходится работать с Python, скажу так, всю науку пишут под него. Нейросети, математика, удобная работа с массивами. Притащить бы это всё в FB... Размечтался!Добавлено (26.01.2023, 23:15) --------------------------------------------- Вышел из положения. Скачал SPTK3.11. SPTK до четвёртый версии был написан на чистом C, а я не посмотрел и сразу бежать за последней версией. В третьей версии предусмотрены возможности для Windows, штатными функциями C:
Код int fwritex(void *ptr, const size_t size, const int nitems, FILE * fp) { #if defined(WIN32) _setmode(_fileno(fp), _O_BINARY); #endif return (fwrite(ptr, size, nitems, fp)); }
Функцию setmode, рекомендуют вызывать в винде всякий раз, как только ты начинаешь писать или считывать данные. Ну Вот они и запилили свои функции. В четвёрке пока нормально не сделали, вот и по этому приходят сломанные данные. Помимо прочего, у SPTK можно использовать API, который можно в дальнейшем подключить к FreeBasic, и использовать библиотеку напрямую без кучи исполняшек. Ну будет старенькая версия, но что нужно для исследования и синтеза звука, разложение на спектры, в библиотеке есть. Правда, у меня в msys2 спотыкается при сборке, но это другая история, разберёмся.
|
|
| |
zamabuvaraeu | Дата: Пятница, 27.01.2023, 18:53 | Сообщение # 6 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Никогда не использовал эту штуку. Для сборки хватает mingw64. Её же вкладывают в виндовый пакет с фрибесиком. Releases · brechtsanders/winlibs_mingw (github.com)
|
|
| |
electrik | Дата: Вторник, 31.01.2023, 15:41 | Сообщение # 7 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| К сожалению в некоторых случаях без msys2 не обойтись, ибо при сборке юникс приложений под винду нужно учитывать зависимости от всяких autoconf, bash. К примеру, всё тот же sptk нужно собирать используя ./configure, а потом make. Естественно, можно это забить в батник, но когда кпримеру, меня просят собрать програмку, не для себя, сидеть и всё это ручками переписывать, да ну его нафиг. Как вариант, можно использовать CMake, он уже сам проверяет наличие зависимостей, ну а потом генерирует makefile. Я для SPTK так и сделал, но пока лезет ошибка. Я раньше не писал CMake скрипты, скорее всего что-то неправильно написал. Будем курить их доку, которая, на первый взгляд, не очень хорошая. Возможно, я пока ещё не въехал, но как то там много написано, и в то же время в сжатом виде.Добавлено (31.01.2023, 20:36) --------------------------------------------- Всё оказалось проще. чтобы всё собралось нужно configure вызвать с ключём --target=mingw. Позже расскажу к чему приведёт проверка утилит.
|
|
| |
|