Столкнулся с необычной проблемой.
Ситуация: пи?у декодер mp3->raw с помощью вызова mpg123 через порты.
Decoder = open_port({spawn, "mpg123 -s -"}, [binary]),
Логика простая - мне нужно получать сырые данные в реальном времени (именно в реальном, не быстрее), поэтому я постепенно скармливаю в порт mp3-данные и так же постепенно читаю из него декодированные данные. На этапе открытия-декодирования всё ок. Проблемы начинаются при попытке закрытия порта.
Обычно логика должна работать так: входящий поток для mpg123 закрывается. mpg123 думает. что файл закончился и флу?ит наружу остаток данных (данные идут кадрами, поэтому внутри mpg123 есть неболь?ой буфер с предыдущим, нераскодированным до конца куском, т.е. с половиной кадра).
Соответственно, если вначале закрыть ему stdin, то в момент закрытия в stdout придёт остав?ийся кусок данных. Если закрыть stdout, а потом stdin, то mpg123 падает с примерно следущей о?ибкой:
[audio.c:596] error: Error in writing audio (Broken pipe?)!
[mpg123.c:583] error: Deep trouble! Cannot flush to my output anymore!
Что, впринципе, понятно.
Так вот. port_close, похоже, работает именно так - вначале закрывается stdout порта, а потом stdin. Соответственно, часть данных mpg123 непофлу?ила и они потерялись для меня.
Перерыл документацию, но способа закрыть отдельно потоки внутри порта не на?ел.
Что делать?
