FreeBasic
Главная
Вход
Регистрация
Пятница, 06.12.2024, 19:09Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Как в Windows заставить конвейеры работать в бинарном режиме
electrikДата: Суббота, 03.12.2022, 18:40 | Сообщение # 1
Полковник
Группа: Друзья
Сообщений: 182
Репутация: 3
Статус: 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
Репутация: 5
Статус: 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
Репутация: 3
Статус: Offline
Ладно, попробую. Я, честно говоря, своих конвейеров никогда не писал, надобности небыло, а только лишь использовал. мне интересно, не поломается ли дальше конвейер при вызове в нём через вертикальную черту | последующих утилит.
А поповоду приведённых мною функций, их нет в WinApi, но они есть в C.
 
zamabuvaraeuДата: Среда, 07.12.2022, 11:08 | Сообщение # 4
Подполковник
Группа: Друзья
Сообщений: 149
Репутация: 5
Статус: Offline
Так мы говорим о Windows или функциях библиотеки языка Си? Если про Си, то сколько бы я ни видел тем на форумах, то каждая про кодировку в консоли. Отсюда вывод: стандартная библиотека сломана и забагована, разработчики отказываются её чинить, и не очень понятно зачем использовать то, что не работает.

Напротив, функции Windows вроде ReadFile и WriteFile всегда работают. Это когда нужно вводить и выводить массив байт. А если у нас строки, то следует использовать ReadConsole и WriteConsole.
 
electrikДата: Среда, 07.12.2022, 17:55 | Сообщение # 5
Полковник
Группа: Друзья
Сообщений: 182
Репутация: 3
Статус: 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
Репутация: 5
Статус: Offline

Цитата
msys2
Никогда не использовал эту штуку.
Для сборки хватает mingw64.
Её же вкладывают в виндовый пакет с фрибесиком.
Releases · brechtsanders/winlibs_mingw (github.com)
 
electrikДата: Вторник, 31.01.2023, 15:41 | Сообщение # 7
Полковник
Группа: Друзья
Сообщений: 182
Репутация: 3
Статус: Offline
К сожалению в некоторых случаях без msys2 не обойтись, ибо при сборке юникс приложений под винду нужно учитывать зависимости от всяких autoconf, bash. К примеру, всё тот же sptk нужно собирать используя ./configure, а потом make.
Естественно, можно это забить в батник, но когда кпримеру, меня просят собрать програмку, не для себя, сидеть и всё это ручками переписывать, да ну его нафиг.
Как вариант, можно использовать CMake, он уже сам проверяет наличие зависимостей, ну а потом генерирует makefile. Я для SPTK так и сделал, но пока лезет ошибка. Я раньше не писал  CMake скрипты, скорее всего что-то неправильно написал. Будем курить их доку, которая, на первый взгляд, не очень хорошая. Возможно, я пока ещё не въехал, но как то там много написано, и в то же время в сжатом виде.

Добавлено (31.01.2023, 20:36)
---------------------------------------------
Всё оказалось проще. чтобы всё собралось нужно configure вызвать с ключём --target=mingw. Позже расскажу к чему приведёт проверка утилит.

 
  • Страница 1 из 1
  • 1
Поиск: