GetCurrentPosition метод IDirectSoundBuffer имеет два аргумента:
HRESULT GetCurrentPosition( LPDWORD pdwCurrentPlayCursor, LPDWORD pdwCurrentWriteCursor );
Первый аргумент «pdwCurrentPlayCursor» получает курсор воспроизведения, а второй аргумент «pdwCurrentWriteCursor» получает курсор записи, который указывает позицию в звуковом буфере, после которой можно безопасно записывать данные — область, начинающаяся с курсора воспроизведения и заканчивающаяся в курсор записи (возможно, обернутый вокруг конца буфера) может содержать данные, которые были переданы звуковому оборудованию, но еще не воспроизводились.
Ближайшим эквивалентным методом, предоставляемым FMOD, является GetPosition метод FMOD :: Channel:
FMOD_RESULT F_API getPosition( unsigned int *position, FMOD_TIMEUNIT postype );
Этот метод имеет аргумент «position» для получения курсора воспроизведения, но не имеет аргумента для получения курсора записи.
Предоставляет ли FMOD какую-либо функцию с аргументом, который служит той же цели, что и аргумент pdwCurrentWriteCursor в IDirectSoundBuffer :: GetCurrentPosition? Или добавление фиксированного смещения (документация DirectSound предполагает, что интервал между курсором воспроизведения и курсором записи составляет около 15 миллисекунд) к курсору воспроизведения является единственным способом получения безопасного курсора записи при использовании FMOD?
DirectSound использует модель представления «кольцевой буфер», которая довольно старая. XAudio2, FMOD и другие современные звуковые API используют вместо этого «пакетную» отправку. В этой модели вы отправляете буферы аудио для воспроизведения, которые хранятся в очереди, а затем обрабатываются как каждый буфер перед завершением воспроизведения.
При передаче на основе пакетов «курсор воспроизведения» имеет значение, а «курсор записи» — нет.
Других решений пока нет …