IDirectSoundBuffe Lock, зачем пропускать 2 части?

В методе блокировки IDirectSoundBuffer8 мы должны передать 2 части и их соответствующие размеры. Что это? Первая часть — это начало, а вторая — конец замка? Они имеют отношение к первичному и вторичному буферам? Стерео звук? Я совершенно потерян.

Кто-нибудь может помочь?


person Luiz Heringer    schedule 24.04.2016    source источник
comment
Буфер может быть круговым. Таким образом, буфер концептуально может обернуться. Когда это происходит, буфер не является непрерывным и должен быть представлен двумя непересекающимися областями памяти.   -  person David Heffernan    schedule 24.04.2016
comment
Теперь смысл. Когда этот размер для блокировки больше размера буфера, он сохраняется в другой части. Спасибо, Дэвид.   -  person Luiz Heringer    schedule 24.04.2016
comment
Обратите внимание, что я вообще ничего не знаю об аудио, и просто почерпнул это из нескольких веб-поисков. Вам следует копнуть глубже самому. Наверняка есть еще много тонкостей. Но веб-поиск поможет вам пройти долгий путь.   -  person David Heffernan    schedule 24.04.2016
comment
Я знаю это. Проблема в том, что я как бы только сейчас изучаю winapi, и иногда даже не знаю, как что-то искать. И мой английский тоже не помогает. На этот вопрос я потратил не менее 15 минут и боялся, что никто не поймет. Так что спросить здесь что-то настолько сложное, как DirectSound, для меня проще, чем пытаться заставить Google понять, что я пытаюсь сказать. Но я буду стараться больше. Еще раз спасибо за ответ, и совет. Хорошего дня, Дэвид.   -  person Luiz Heringer    schedule 24.04.2016


Ответы (1)


Лучший ответ здесь: не используйте DirectSound, если вы не используете Windows XP.

Если вы воспроизводите только один звук за раз и вам не нужно микширование в реальном времени, вы можете использовать что-то тривиальное, например PlaySound. Я предполагаю, что вам действительно нужно микширование в реальном времени и возможность воспроизведения нескольких перекрывающихся звуков.

Для Windows 8, Windows 8.1 или Windows 10 вы можете использовать XAudio 2.8 или 2.9, встроенный в операционную систему. В противном случае вы можете использовать XAudio 2.7, который является частью старого DirectX SDK. .

Некоторые образовательные ресурсы см. в разделе Изучение XAudio2.

См. набор инструментов DirectX для аудио для простой оболочки C++ для XAudio2.

RE: буферы DirectSound

На ваш первоначальный вопрос: еще в старые времена Windows 95 «первичный буфер» был фактическим звуковым буфером, передаваемым на оборудование. «Вторичные буферы» — это место, где вы создали свои индивидуальные «голоса» для воспроизведения более одного звука одновременно. Затем система смешивает все вторичные буферы с первичным буфером для воспроизведения.

Однако после перехода на NT «основного буфера» больше не существует. Есть нечто, называемое «первичным» буфером, но в основном оно предназначено для BackCompat. Все буферы смешиваются DirectSound в один буфер, а затем передаются в систему для воспроизведения. В Windows Vista или более поздних версиях он передается в Windows Core API (WASAPI), который микширует все звуки из системы и всех запущенных приложений, прежде чем они попадут на звуковое оборудование.

Вы можете использовать WASAPI напрямую, но этот API довольно ограничен, поскольку он не выполняет никакого микширования на уровне приложения или преобразований исходной скорости. Как правило, вы используете WASAPI напрямую только в том случае, если вы являетесь звуковым движком, который уже выполнил все необходимые преобразования и микширование и просто хочет воспроизвести окончательный микс.

В любом случае, причина наличия двух наборов указателей при работе с Lock заключается в том, что это «кольцевой буфер», также известный как «круговой буфер». В прежние времена Windows 95 части основного буфера фактически воспроизводились аппаратным обеспечением в то самое время, когда вы могли записывать в буфер раньше, чем в данный момент происходило воспроизведение. У вас была эта сложная настройка с двумя указателями, чтобы избежать перезаписи данных, которые все еще воспроизводились, иначе вы получили бы ужасные «хлопки» или «глюки» при воспроизведении звука. Так как этого больше не происходит в современных версиях Windows, все это просто для BackCompat w.r.t. в основной буфер. Тем не менее, микшер DirectSound по-прежнему использует тот факт, что вторичные буферы являются «кольцевыми буферами», поэтому тот же механизм используется для защиты чтения микшера в реальном времени, когда вы записываете «вперед», а также, если вам случается обновить воспроизводимый файл. буфер. Если вторичный буфер не воспроизводится, вы можете просто передать nullptr для второго указателя и размера.

С этой старой моделью «кольцевого буфера» было сложно работать, и она была более важна, когда системная память была весьма ограничена. Практически все современные звуковые API основаны на «пакетах», где каждый воспроизводимый голос имеет очередь ожидающих буферов, и вы добавляете дополнительные данные, отправляя новый буфер в очередь для обработки. Вы можете получать уведомления о завершении буфера, чтобы знать, что аудио в этом «пакете» было обработано.

Кроме того, в DirectSound вам приходилось копировать аудиоданные в память, предоставленную Lock, но современные API на основе «пакетов» избегают дополнительной копии, считывая исходные данные непосредственно из памяти вашего приложения. Это усложняет необходимость обеспечения доступности исходной памяти до тех пор, пока все воспроизведение не остановится (т. е. вы не можете free память, когда она все еще считывается микшером реального времени, иначе ваше приложение выйдет из строя), но взамен вы избегаете лишнего копирования.

person Chuck Walbourn    schedule 24.04.2016
comment
Спасибо за информацию, но я думаю, что вы неправильно поняли вопрос. В любом случае спасибо, информация была очень верной и полезной. - person Luiz Heringer; 24.04.2016
comment
Извините, не закончил составление ответа... Теперь я закончил. - person Chuck Walbourn; 24.04.2016
comment
Спасибо, Чак. Это то, что я называю офигенным ответом. хе-хе Большое спасибо, чувак. Кстати, извините за задержку, я был очень занят в последнее время. - person Luiz Heringer; 28.04.2016