Я использую DirectSoundBuffer DirectSound для воспроизведения голосовых данных, которые я передаю в потоковом режиме по сети. Природа голоса/речи заключается в том, что они не обязательно постоянно передаются (они начинаются и останавливаются), а также могут поступать в пакетах разного размера (что затрудняет прогнозирование того, где должен остановиться буфер). Я держу переменную StoppingPoint
, которая отслеживает, где в моем буфере я выполнил запись (она также принимает во внимание циклическую природу этого буфера). Если достигнуто StoppingPoint
, я хотел бы остановить воспроизведение своего буфера. Кроме того, я StoppingPoint
также обозначал бы точку, с которой я также хотел бы начать писать.
My buffer
|==============================|--------------------------|
^ ^ ^
| | |
Voice Data Stopping point Old/Garbage
data
Кроме того, я не могу использовать уведомления, потому что для использования уведомления буфер должен быть остановлен. Но в моем случае очень вероятно, что во время воспроизведения буфера будет поступать больше данных, что отодвигает мое значение «StoppingPoint».
Сейчас у меня есть функция, которая вызывается каждый кадр. Эта функция, среди прочего, проверяет, где находится курсор воспроизведения. Если курсор воспроизведения проходит через позицию StoppingPoint
, он останавливает буфер и перемещает курсор воспроизведения обратно в позицию StoppingPoint
. Кажется, пока это работает нормально, но, как и следовало ожидать, курсор воспроизведения довольно часто выходит за пределы StoppingPoint
. Это означает, что немного старых/мусорных данных воспроизводится каждый раз, когда достигается конец потоковых данных.
Мне просто любопытно, есть ли способ остановить воспроизведение DirectSoundBuffer по определенному смещению? Что я хотел бы, так это записать данные в буфер, затем воспроизвести, а затем остановить их точно в месте, описанном моей переменной StoppingPoint
, не выходя за ее пределы.
Примечание. Я не добавлял никакого кода, потому что мне нужно более высокоуровневое решение. Моя реализация невероятно прямолинейна, типична и по большей части ДЕЙСТВИТЕЛЬНО работает. Мне просто нужно подтолкнуть в правильном направлении, чтобы убрать превышение моего StoppingPoint
. Возможно, есть функция, которую я могу использовать? Или какой-то другой алгоритм, который обычно используется для достижения этой цели?