Вверх ↑
Ответов: 4622
Рейтинг: 746
#1: 2015-02-25 19:12:25 ЛС | профиль | цитата
Просветите меня. Как работает воспроизведение в той схеме?
1) Получаем очередную порцию данных из UDP и записываем её в SoundBuffer (кстати, что, в SoundBuffer нельзя добавить прием данных из строки, чтобы не делать StrToStream?)
2) С помощью BASS_StreamCreate назначаем callback, который будет читать данные из SoundBuffer
3) Запускаем воспроизведение с помощью BASS_ChannelPlay. Что в этом случае происходит? Библиотека BASS запускает параллельный поток, который с нужной частотой обращается к выше упомянутой callback из BASS_StreamCreate, которая и возвращает очередную порцию данных из SoundBuffer?

Если да, то спрашивается: каким это образом можно одновременно записывать данные в поток (MemoryStream) в SoundBuffer (при этом, судя по коду, перемещать часть данных с конца в начало по превышению размера) и в это же время параллельным потоком читать из этого же MemoryStream?
Как минимум, в коде SoundBuffer должна стоять критическая секция в THISoundBuffer._work_doAdd, а в BASS_StreamCreate та же критическая секция в function MakeSine. А более правильно - сделать свой TMemoryStream, уже содержащий критическую секцию на чтение/запись, выполняющий внутри весь тот круговорот данных, и использовать его в SoundBuffer.
карма: 26

0