Directx влияет на звук
Мож ты девайс выбрал не тот.
Septic
Это как? я выбра тот что по умолчанию.
Привет, прошу огромное прощение что оставляю вопрос тут, но он по теме!
Пишу аудио плэйер на DirectShow(а точнее звуковой движок) и на данный момент возникло несколько проблем:
как получить от DS аудиобуфер?
m_pMediaSeekeng->SetPositions(&Value, AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning); компилится правильно но при работе вылетает ошибка.
и как правильно работать с этим m_pBasicAudio->put_Volume(lValue), в сдк что-то про -10 000 до -100 дБ, но у меня она работает как-то странно.
Если кто знает напишите пожалуйста. Очень нужно!
Мда, похоже грамотных людей все меньше и меньше сюда заходит.
> Мда, похоже грамотных людей все меньше и меньше сюда заходит.
Это точно. :(
Если хочешь получить вменяемый ответ, постарайся толково сформулировать проблему:
- Что хочешь получить?
- Что делаешь для этого?
- Что получается на самом деле?
- Чем то, что получается, отличается от того, что хочешь?
Итак, может комуто пригодиться:
Единственный метод который я нашел чтоб менять звук во всех буферах это Получить первичный буффер и меняять звук в нем. К сожалению при этом меняеться звук во всех приложениях. Пробовал делать обертки на остальные буфера, понял что это бред. В итоге отказался менять значения всем буферам.
Знаю точно что такое можно реализовать на DirectShow но у меня нет времени переписывать двиг да и скорее это не понадобиться.
4measurement
Лучшее что могу посоветовать по твоей проблемме лазить по мсдн. Там практически есть все в примерах.
>получить от DS аудиобуфер
DS - это sound | show?
>m_pBasicAudio->put_Volume(lValue), в сдк что-то про -10 000 до -100 дБ
В СДК все правильно сказанно дело в том что человеческое ухо слышит не равномерно. Поэтому звук менряют в логарифмической шкале. В данном случае это затухание от максимума.
под SD я имею ввиду DirectShow, вроде как говорят что ISampleGrabber поможет с получением буфера, вот пробую)
4measurement
Вообще ничего сложного нет, только надо постояно смотреть код ошибок, который возвращают ф-ии.
А вообще идея такая нужно ловко соиеденить иголки(входы/выходы) у фильтров. Должно чтото типа этого получиться: Источник -> декодер -> регулятор -> ISampleGrabber -> воспроизведение. В принципе самое сложно е правильно все соиеденить. тут тебе тока МСДН поможет.
Вот тебе примерчик, только сдесь мне надо было грабить не звук а видео :)
Давно присматриваюсь к карточке Creative Audigy SE - она недорогая и всяко лучше Realtek ALC 892. Но вот написано, что не поддерживает аппаратного ускорения звука в играх. Мне всегда было фиолетово, что значит это самое АУ, но вот стало интересно, а гугль не дал ответа. Может скажите, что за хрень и что даёт/отнимает?
это работа со звуком средствами звукового процессора на звуковой карте. Теоретически дает лучшее качество звука и больший fps, практически под Windows Vista и 7 не дает ничего. Вместо Audigy SE лучше присмотрись к Asus DG - звук намного лучше.
Аппаратное ускорение звука - это поддержка функций программного API (к примеру DirectX, но необязательно этих API много) силами самой аудиокарты (т е в ней эти функции реализованы ещё на заводе при штамповке чипа карты).
Вместо Audigy SE лучше присмотрись к Asus DG - звук намного лучше.
у Xonar Essence звук ещё лучше
Creative Audigy SE
это уже старое решение. Лучше поискать что-ниб лучшее. Хотя можно купить - аппаратно через ASIO в Foobar'e можно оцифровки в 96 000 Hz слушать. Если кто продаёт за 10$ - можно купить.
Аппаратное ускорение звука - это поддержка функций программного API (к примеру DirectX, но необязательно этих API много) силами самой аудиокарты (т е в ней эти функции реализованы ещё на заводе при штамповке чипа карты).
и в чем разница с моими словами?
у Xonar Essence звук ещё лучше
ты разницу в цене между DG и Essence ощущаешь?
ты разницу в цене между DG и Essence ощущаешь?
Essence лучше - ни у одной карты на рынке нет такого выхода на наушники как у неё по качеству.. DG устарела уже.
Joy McNally [Верните Games Convention]
у нее могут быть какого угодно качества выходы на наушники, но она стоит в 5-6 раз дороже.
Хадримацхез
Я смотрю тут экспертов понабежало
Один из "понабежавших" - ты, как я погляжу.
А что вы скажите об этой
ты сюда "понты колотить" зашел или по делу спросить?
.А что вы скажите об этой /
Карта начального уровня с которой лучше начать ознакомление со звуком. Ессно есть и гораздо лучше сейчас
Хадримацхез
Такую уже не найти в магазинах, а те Х-фаер, что на PCI-Ex говорят имеют кучу проблем с драйверами и работают как повезет. В общем нормальные карты Креатив закончились на тех, что подключались к PCI разъему. Просто сам хотел заменить свой Audigy4 на что нибудь посовременнее и обалдел от цены на новинки, а потом от отзывов на эти новинки.
PsychodelicNoise
Creative Audigy SE не бери. Сам как то взял эту карту, хотел денег сэкономить (ибо встроенная начала сильно шипеть, какой у меня был Реалтек, уже не помню, ибо было более 5 лет назад), так она по качеству уступит твоему Realtek (ходил до магазина дольше, чем эта карта стояла на моем компе) стоит брать только если встроенная сгорела. Когда я ее брал, то играл в Q4, так она у меня посралась с игрой, чего то она там не поддержала. (в общем то это и стало причиной возврата)
Совершенно наивное приложение, использующее переадресацию прокси/dll, чтобы попытаться запустить Elden Ring на оборудовании DX12 с уровнем функций 11_0 (например, графические процессоры Nvidia Kepler)
Честно говоря, я просто очень разозлился из-за того, что Elden Ring вылетает со знаменитым WSOD (белым экраном смерти) на моем графическом процессоре (NVIDIA Tesla K40 с использованием закадрового рендеринга),
Я никогда не думал, что у меня действительно что-то получится :-)
Некоторая отладка показала, что в моем случае белый экран смерти вызван неправильной инициализацией DX12 (и не удосужился проверить код возврата. )
Чтобы быть более конкретным: кажется, что игра вызывает D3D12CreateDevice с минимальным требуемым уровнем функций D3D_FEATURE_LEVEL_12, который больше, чем максимальный. поддерживаемый уровень функций на графических процессорах NVIDIA Kepler (11_0)
После этого все быстро идет вниз (главным образом потому, что игра, похоже, не выполняет правильную обработку ошибок).
Таким образом, этот проект пытается сделать следующее, чтобы, возможно, заставить elden ring работать на вашем старом неподдерживаемом графическом процессоре D3D_FEATURE_LEVEL_11_0:
предоставить «поддельную» d3d12.dll, которая будет загружена вместо настоящей d3d12.dll с помощью elden ring (при размещении в папке с исполняемым файлом игры elden ring)
dll просто перенаправляет все функции, кроме одной, в исходную dll d3d12 (которая должна быть помещена в ту же папку и переименована в d3d12_original.dll)
«поддельная» d3d12.dll обеспечивает другую реализацию D3D12CreateDevice (вызов функции, который не работает),
который просто вызывает исходную функцию D3D12CreateDevice с теми же параметрами, но для D3D_FEATURE_LEVEL установлено значение 11_0 вместо 12_0.
-> Обычно это приводит к успешной инициализации D3D12 и, к моему полному удивлению, попаданию в игру на моем графическом процессоре Nvidia Kepler.
-> Весь проект, скорее всего, не является хорошим примером того, как сделать что-то подобное,
так что используйте с осторожностью! Я просто подумал, что это может быть полезно для других людей, застрявших на графических процессорах серии Nvidia GTX 6xx или 7xx, никаких гарантий или чего-то еще!
В архиве уже есть оба нужных для запуска файла, которые нужно просто скопировать в корневой каталог игры, но на всякий случай, установка от автора:
Как это попробовать?
Возьмите настоящие d3d12.dll и d3d12core.dll из папки windows/system32, поместите обе dll в папку с игрой elden ring (где eldenring.
exe) И ПЕРЕИМЕНОВАТЬ настоящую d3d12.dll в d3d12_original.dll (ту, что находится в папке с игрой, а НЕ dll в windows/system32)
Поместите новую "поддельную" d3d12.dll в папку с игрой elden ring (там, где находится eldenring.exe)
Попробуйте запустить elden ring, теперь вы должны пройти мимо белого экрана :-)
Работает на Radeon HD 7850. Храни тебя господь, автор сея чуда
Ого…эта видюшка потянула?? Что с фпс?? И какой проц у тебя??
А чо-бы нет, неплохая карта же, хоть и старая, у меня 280х вкупе с 2500к 4.9 45-60 рожает, правда в 900p
на минималочках в 1600х900 примерно 40 кадров. Проц райзен 2600
Ребята вот моя история: Я очень хотела поиграть в элден и с момента выхода, и всё накрылось "задницей Смоуга" в тот момент когда у меня вышел белый экран( Но я не удивилась у меня ""не сильная система"" я даже удалила игру, но теперь я решила попробовать вот этот способ и сначала я расстроилась ведь опять был белый экран, я хотела уже удалить игру но я ставила и ставила файлики пыталась совместимость и тд. но нечего не получалось и я полезла обратно на эту страницу и увидила комент о том что надо поставить файл с реддита потому что не тянул уже проц и поставив я увидела опять белый экран. и он стал чёрным! Я чуть не подавилась чаем, но он почернел! и. ЗАПУСТИЛСЯ! О ЧУДО! Я пошла проходить обучение и тут были невидимые враги. но я опять вернулась сюда и увидела про фикс с нексуса и о чудо оно работает! Я могу поиграть в игру! УРА! А вот что по поводу оптимизации я оптимист 12-14 фпс. но я подумала я имба у меня замедленное действие меня теперь боссы не подловят, но это до пещеры ближайшей ведь там у меня 30 фпс. И да кого то напугает 10 фпс, но в своё время когда комп был ещё хуже я прошла с 10 фпс зельду ботву на эмуляторе!
Мой пк: AMD Athlon II X4 635, 6гб ОЗУ и венец моего чуда эхх GTX 650 ti. (Соболезную если у кого пк хуже моего) P.S. Я поставила всё на высокое ибо фпс не меняется от настроек вообще никак. но это у меня так.
Я хочу попросить если у автора статьи получится скачай все файлы и объедини в один файл ведь все вместе они игру и запустили! У тех у кого запустилось! С победой! Модеры нагнули продажных!
Или можно собрать все в одном комментарии.
Фикс для старых моделей процессоров:
Скопируйте и вставьте файл oo2core_6_win64.dll туда, где находится ваш файл eldenring.exe.
Фикс невидимых врагов:
Но если fps совсем мало то очень советую заместо фикса невидимых врагов -
И да, настройки влияют, освещение, тени, трава, отражения, все это на средние/низкие.
Здравствуйте! Интересно мнение посетителей форума относительно использования режима Pure Direct в современных AV-ресиверах бюджетного сегмента (Yamaha, Denon, Sony, Onkyo и др.) и их использования в качестве стереоусилителей при наличии качественного аналогового источника.
Очень часто в разных статьях и форумах встречается мнение, что в качестве усилителя AV-ресиверы звучат существенно хуже чистых стереоусилителей. При этом нередко говорят, что подключение по аналоговому входу существенно уступает цифровому подключению. Но почему так получается, если связка внутреннего ЦАПа ресивера и усилителя ресивера должна быть хуже, чем пара из внешнего ЦАПа и собственно усилителя ресивера, так как обычно в ресиверах ЦАПы довольно средние? Конечно, ресивер должен использоваться в режиме Pure Direct, когда аналоговый сигнал идёт в обход цепи АЦП-DSP-ЦАП внутри ресивера. Или в тестах ресиверов на качество воспроизведения стерео DSP вообще не отключают? Тогда довольно сложно по тесту судить о качестве прямого стереоусиления. Вопрос возник, так как в большинстве тестов AV-ресиверов на качество воспроизведения именно музыки авторы не указывают в каком режиме работал ресивер (аналоговый или цифровой вход, DSP или Direct режим), что существенно влияет на его применимость в тех или иных условиях: кому-то в первую очередь нужен просто хороший аналоговый усилитель, а другому качественное звучание цифровых источников.
Спасибо за ваши мысли по этому поводу.
Ответы
лучшая система-где кинотеатр и стерео разделены.Как ресивер не подключай,стереоусилитель будет играть лучше.
Согласен. Но здесь возникают сложности управления всей системой и трудности подключения одной пары АС к двум аппаратам. Часто удобнее иметь один аппарат для коммутации всех сигналов и усиления, который является центром системы. Хотя, это всё индивидуально.
Никакой особой сложности в подключении стерео усилителя и ресивера к одной фронтальной паре я не вижу. В продаже есть акустические коммутаторы, которые позволяют совершить такую коммутацию между парой АС, ресивером и интегральным стерео усилителем.
Но, можно сделать еще более интересную по качеству звучанию систему.
Использовать совместно с АВ ресивером, который имеет линейные выходы с аудио процессора-отдельный интегральный стерео усилитель с наличием входа на усилитель мощности.
В этом случае, Вы убиваете сразу двух зайцев, у Вас в стерео, на музыке работает полный стерео тракт интегрального усилителя,т.е. обеспечивается высокое качество звука от линейных источников звука, CD, винилового проигрывателя или стримплеера. А в кино, этот интегральный усилитель превращается в усилитель мощности для работы с фронтальной акустикой, т.е. в такой системе улучшается еще и кинозвук, благодаря внешнему мощнику фронтальных АС.
Первый способ добавляет в тракт кучу разъемов и переключателей. Второй открывает калитку для наводок со всего подъезда.
Никакой "кучи" разъёмов не прибавится. Второй путь, тоже проверен многократно и наводок я не замечал, т к в данной коммутации входные цепи усилителей не подвержены наводкам в силу их не высокой чувствительности порядка 0,7-1V и не высокому входному сопротивлению усилителей мощности в интегральном аппарате, это около 10КОм. А вот раздельное использование стерео тракта для прослушивания музыки на интегральном усилителе и добавление усилителя мощности в кино просмотре, реально улучшают качество звука, как в стерео, так и в многоканальном варианте прослушивания.
Ведь в данном стерео усилитель работает от своего Блока питания, а в режиме кино ресивер выполняет функцию процессора со своим блоком питания. Правда, начальный AV ресивер в качестве процессора весьма посредственная вещь и для таких вещей есть смысл использовать соответствующий по классу интегрального стерео усилителя AV ресивер.
Как не прибавится. Объсните как? Переключатели конекторы (и каждый даёт спектр гармоник) в систему вводятся, но не прибавляются.)))
Про наводки. Их никто не замечает, а потом начинаются чудеса с фразировкой вилок в розетке. Вооружитесь детектором остаточного напряжения и заметите. Если избавитесь от них, то результат тоже будет на лицо.
Становится меньше,т.к. в стерео у Вас работает только двухканальный интегральный усилитель! Для прослушивания музыки Вам не надо включать AV ресивер.
В кинотеатре, AV ресивер работает как процессор для фронтов и сам озвучивает центр, тылы и дает LFE сигнал на саб.
В режиме работы усилителя мощности наводки на входные цепи оконечных усилителей интегральника- минимальны. И если у Вас межблочные кабели не 10 метровой длины от выходов фронтов AV ресивера до входов мощника интегрального усилителя, а кабель имеет хороший экран, то все работает абсолютно нормально.
Плюс ко всему, как Вы сами понимаете, в режиме кино фронты нагружены на отдельный усилитель, со своим блоком питания, который не связан с Б/П ресивера, так, что перекрестных помех, по цепям питания становится даже меньше!
Вы меня немного удивляете, если для Вас эти вещи не понятны и Вам приходится все "разжевывать", как начинающему. Вы же сами конструируете и делаете АС.
В наличии собственно есть Acoustic Research S40, подключённые к Yamaha RX-V450, которая в режиме Direct усиливает аналоговый сигнал с проф. звуковой карты ESI MAYA44. И всё устраивает, и покупки, честно говоря, не планируются. Но появился скорее теоретический интерес, что можно сделать с усилением в этой системе. Некоторое время в этой связке присутствовал усилитель мощности Audiolab 8200P, подключённый к АС просто параллельно с ресивером. Знаю, что так делать нельзя, но всё работало. Только пару раз, когда случайно включались оба аппарата, ресивер уходил в защиту. Звук с Audiolab получался более как бы размашистый и тёплый, но баса было уже слишком много, у Yamaha он более сухой. Всё это ещё было непросто в плане управления: выбирать, что именно нужно включить, когда хочется то кино посмотреть , то музыку послушать. Вариант с ресивером в качестве предусилителя в паре с усилителем мощности это бы решил, но сейчас этого нет, и даже если соберусь что-то покупать, вряд ли выделю более 50 т.р. на всё усиление, поэтому и интересны ресиверы бюджетного сегмента. Но и то неясно будет ли в этом случае особая разница именно в аналоговом стерео, пусть и многоканальное кино должно стать существенно лучше.
я для себя этой задачу решил так: усилитель и ресивер подсоединены так же как у вас. Из сетевого разветвителя типа пилот сделан переключатель на пару розеток, который всегда обесточивает один из аппаратов. Меньшее из зол я считаю.
Не возникает ли только при параллельном подключении усилителя и ресивера к АС (при условии, что включён всегда только один) каких-нибудь проблем со звуком? Хотя, насколько я знаю по сервисным руководствам, выходы у выключенного усилителя/ресивера отключаются с помощью реле.
именно реле обеспечивают развязку такой системы, крайне желательно, чтобы системы никак больше не контачили
раньше вроде бы пользовались для таких целей входами для фронтальных каналов многоканального аудиовхода ресивера (если такой был), там действительно было напрямую на усилители мощности.
кто-нибудь может этот вопрос прояснить с аналоговым подключением к АВ-ресиверу. или цифровое подключение предпочтительнее?, если так, зачем тогда СД-плеер, БД-плеер по hdmi не сильно хуже будет)))
Нет, такой возможности нет в любом AV ресивере, даже топ класса, т.к. любой аналоговый сигнал со входа проходит через АЦП, ведь регулятор громкости в любом ресивере имеет "цифровую" природу. И все режимы "директ" отключают лишь работу видео процессора в ресивере и только частично решают вопрос снижения поканального проникновения перекрестных помех в усилителях кинотеатральных ресиверов.
Как правило аналоговый сигнал на авресивере оцифровывается. Директ - исключение процессора. Иногда бывают ресиверы, где есть режим с чисто аналоговыми цепочками. Как правило его как-нибудь обозначают и в названии и в мануале: пур директ, директин, трудирект.
ну вроде как у денонов и ямах Pure Direct ничего аналогового не означает, у сони непонятно, но есть сомнения.
я думаю, что к АВ-ресу подключать СД-плеер по аналогу пустая затея, но это имхо, скажем так)))
Они делали когда-то аналоговый директ. Кембридж делал тоже. В буклетах такие штуки указывают. А ацпэшки в ресах как правило слабенькие. Цеплять к ним хороший цдплеер по аналогу конечно смысла ну совсем нет.
Мой опыт исследования этого вопроса показал, что директ в ресиверах существует, но не всегда понятно, как он реализован. Более-менее верное понимание здесь дают только сервисные руководства, где есть структурные и принципиальные схемы ресиверов. Для моего ресивера Yamaha RX-V450 директ точно есть, так как аналоговый многоканальный вход включается в усилительный тракт уже после выходной аналоговой линии из DSP-секции. Так как на современных ресиверах многоканальных входов уже не делают, то здесь ситуация менее ясная. Получилось найти "сервис мануалы" на Yamaha RX-V675, Sony STR-DN860 (1060) и Denon AVR-x2000. Yamaha и Sony построены на схожей архитектуре: все аналоговые аудио-сигналы идут на селектор на аналоговой микросборке, который осуществляет главную регулировку громкости (master volume) (кстати, регулировка аналоговая, то есть никакие АЦП/ЦАП здесь ни причём), селектор может посылать выбранный аналоговый сигнал на цифровую секцию и принимать из неё сигнал с ЦАПа, но самое интересное, что этот же селектор может посылать выбранный аналоговый сигнал напрамую на дальнейшее усиление (делаю этот вывод, так как тот же селектор используется и в полностью аналоговом усилителе A-S500, возможно, и в других). Таким образом, аналоговый директ в схемотехнике Yamaha и Sony возможен, а используется ли он, зависит от логики управляющего микропроцессора, скорее всего да. Кроме того, в описании Sony STR-DN1060 сказано, что директ режим направляет сигнал в обход DSP. Так как на схеме у Sony цифровой сигнал с АЦП идёт на ЦАП только через DSP, то из этого следует, что аналоговый сигнал в директе вообще не заходит в цифровую секцию. То есть директ у Sony есть, причём даже в младшей модели STR-DN860. У Yamaha он тоже скорее всего есть, так как на это всё указывает и прослушивание в том числе (в звуке легко угадывается характер внешнего источника). Но у Yamaha есть разделение по моделям: в младшей RX-V379 директа нет в принципе, в 479 и 579 есть просто Direct, а в 679 и 779 уже Pure Direct. Чем отличаются последние два режима точно не ясно, где-то встречал информацию, то в Pure Direct просто ещё отключается дисплей передней панели. С Denon ситуация неясная, у них структурные схемы выполнены каким-то странным образом, я не смог прочитать, а разбираться в принципиальных долго. И у Denon тоже есть разделение по моделям: директ начинается только с модели AVR-x2200.
Alex, прошу, поясните, почему маршрут аналогового сигнала через АЦП неизбежен. Мои исследования (в посте ниже) показали, что аналоговый директ есть как минимум у Sony и, скорее всего, у всех остальных, где он заявлен. Регулирование громкости выполняется в аналоговом виде, это хорошо видно на схемах (регулятор в любом случае находится после ЦАПа и никаких аналого-цифровых преобразователей в его схеме не предусмотрено).
Вот и схема для Yamaha RX-V675
Итак, у вас есть прекрасная игра. Она имеет всё, что необходимо: восхитительную графику, сверхсветовую скорость реакции на действия игрока, короче, нормально работает. Отсутствует только одна вещь: ЗВУК. Качество звука может придать игре жизнь или же погубить её. Итак, вы хотите заполучить достаточную систему звука. При помощи чего это сделать? Ответ прост: DirectX Audio!
Этот урок поможет вам научиться пользоваться DirectX Audio. Вы научитесь загружать и проигрывать WAV и MIDI файлы. В этом уроке нет разъяснений по поводу 3D звука. Урок не требует каких-либо знаний по звуку или программированию звука.
Не забудьте прилинковать dsound.lib и dxguid.lib, а так же включить заголовочный файл dmusici.h.
Инициализация DirectX Audio.
Перед тем как мы сможем проиграть звук, необходимо проинициализировать DirectX Audio. Это делается в три этапа:
1. Инициализировать COM.
2. Создать и инициализировать объект исполнения.
3. Создать загрузчик.
1. Инициализация COM.
В отличие от других компонент DirectX, Direct Audio - чистый COM. Это означает, что вам необходимо создать COM объект самостоятельно функцией CoCreateInstance(). Инициализация современной COM системы, однако, очень проста.
Этот простой вызов функции позволяет вам теперь использовать COM, чтобы создать объект DirectX Audio.
2. Создание и инициализация объекта исполнения.
Сначала, давайте поговорим об объекте исполнения (performance object). Объект исполнения управляет всеми данными, идущими от звуковых сегментов - до синтезаторов, воспроизводящие звуки. По существу, это основной интерфейс DirectX Audio. Для того чтобы создать объект исполнения, вам необходимо создать объект интерфейса IDirectMusicPerformance8. Объект создаётся вызовом CoCreateInstance().
Этот код объявляет объект IDirectMusicPerformance8 и создаёт его. Теперь нам его нужно проинициализировать. Для своей инициализации объект интерфейса IDirectMusicPerformance8 использует свой же метод InitAudio(). Давайте взглянем на эту функцию:
Теперь покажем рабочий пример этой функции:
3. Создание загрузчика.
Объект загрузчика загружает всё содержимое аудио, такого как MIDI или WAV, в сегменты, хранящие данные. Загрузчик представлен интерфейсом IDirectMusicLoader8. Создание объекта требует простой вызов, как вы могли догадаться, это CoCreateInstance():
Воспроизведение аудио.
Итак, мы подготовили DirectX Audio, теперь нам нужно что-нибудь воспроизвести. На очереди - создание сегмента. Посмотрим, что нам нужно сделать:
1. Создать сегмент.
2. Загрузить сегмент.
3. Загрузить трек.
4. Проиграть сегмент.
1. Создание сегмента.
Вы можете удивиться, узнав, что такое сегмент. Сегмент - это объект, включающий в себя звуковые данные, загруженные из звукового файла. Любой звук, воспроизводящийся DirectX Audio, находится в сегменте. Следуя общему принципу, сегментный объект представляется интерфейсом IDirectMusicSegment8 и инициализируется вызовом в стиле COM.
2. Загрузка сегмента.
Теперь в сегмент нужно загрузить звуковое содержание. Здесь мы используем загрузчик. Сначала, необходимо выставить директорию поиска для загрузчика. Это можно выполнить функцией IDirectMusicLoader8::SetSearchDirectory().
Если вы хотите директорию поиска выставить, как директорию, в которой запущена ваша программа, то необходимо сделать, как показано ниже:
Здесь функция GetCurrentDirectory() - получает директорию, в которой была запущена программа. MultiByteToWideChar() - обычный массив символов конвертируется в массив типа WCHAR. Если вы используете dxutil.h, то вы может воспользоваться функцией DXUtil_ConvertGenericStringToWide(), хотя на самом деле эта функция просто использует MultiByteToWideChar(), только выглядит лучше. Наконец, мы вызываем метод SetSearchDirectory() с предопределённым GUID, который открывает доступ ко всем звуковым типам для чтения. Теперь устанавливаем путь поиска, откуда мы хотим загрузить файл. Это выполняется одним вызовом функции:
Ниже показано, как вы можете загрузить файл test.wav.
3. Загрузка трека.
Чтобы проиграть звук, вы должны загрузить его в "синтезатор". Это выполняет функцией IDirectMusicSegment8::Download()
HRESULT IDirectMusicSegment8::Download(Iunknown *pAudioPath);
Всё что осталось - загрузить трек в объект исполнения, как показано ниже:
4. Воспроизведение сегмента.
Наконец, настоящая вещь. Воспроизведение звука, как большинство операций в DirectX Audio, требует только одну функцию. Вы можете использовать PlaySegment() или PlaySegmentEx(). Мы рассмотрим вызов PlaySegmentEx(), поскольку он предлагает больше функциональности.
Не смотря на то, что эта функция имеет запутанный вид, она очень проста в использовании. Только пара параметров актуальна для нас.
pSource - звуковые данные, которые будут воспроизводиться. В нашем случае вы будите проигрывать g_segment.
i64StartTime - это точное время, когда звук начнёт воспроизводиться. Обычно, вы просто выставляете этот параметр в ноль, чтобы указать, что звук начнёт воспроизводиться немедленно.
Заметьте, что это функция интерфейса IDirectMusicPerformance8. Это функция не интерфейса IDirectMusicSegment, потому что сегментный интерфейс только управляет звуковыми данными и информацией воспроизведения. IDirectMusicPerformance8 управляет всеми манипуляциями с сегментом, включая воспроизведение и остановку воспроизведения. Теперь, давайте, наконец, проиграем какую-нибудь музыку.
g_performance->PlaySegmentEx(g_segment, NULL, NULL, 0, 0, NULL, NULL, NULL);
Другие функции.
Теперь вы можете загружать и воспроизводить мелодии при помощи DirectX Audio. Вам необходим дополнительный контроль над вашей музыкой. Только одна есть вещь, важная как запуск воспроизведения звука, это остановка воспроизведения. Для этого просто достаточно воспользоваться одной из функций:
Вы можете использовать любую из этих функций для остановки. В обоих случаях два последних параметра имеют одинаковую функциональность.
i64StopTime - говорит, когда сделать остановку. Если вы хотите остановить звук немедленно, выставьте этот параметр в 0.
dwFlags - когда остановка должна произойти в сегменте, тоже можно выставить в 0.
Метод StopEx() имеет дополнительную функциональность, потому что он может остановить сегмент или аудио путь (audiopath). Для остановки одного звука, будем использовать следующее:
g_performance->StopEx(g_segment, 0, 0);
Для того, чтобы выключить все треки, не нужно их выключать по отдельности, достаточно вызвать функцию Stop():
g_performance->Stop(NULL, NULL, 0, 0);
Когда вы выставляете в функции сегмент в ноль, то останавливаются все звуки, которые в этот момент воспроизводятся. Я попытался это проделать с функцией StopEx(), но при этом программа некорректно «свалилась».
Ещё один момент. Что, если мы захотим узнать, проигрываются сейчас звуки или нет? Используйте для этого функцию IsPlaying().
Эта функция возвращает S_OK, если сегмент воспроизводится.
Ещё одна функция, о которой я бы хотел рассказать, перед тем как мы кончим - SetRepeats().
Эта функция устанавливает число повторений для звука. Если вы воспроизводите музыку на фоне и, например, хотите повторять её постоянно, выставьте значение параметра этой функции равным DMUS_SEG_REPEAT_INFINITE. Мелодия будет проигрываться с повторениями до тех пор, пока вы явно не вызовите останавливающую функцию.
Завершение работы.
Мы хорошо провели время, теперь необходимо корректно завершить работу программы. Первое, что нужно сделать - остановить воспроизведение всех звуков. Это делается функцией Stop(), указанной ниже. Затем, мы вызываем метод IDirectMusicPerformance8::CloseDown(), который не имеет никаких параметров. После мы освобождаем все объекты, применяя к ним вызовы Release(). Наконец, мы используем CoUninitialize() для отключения COM.
Если вы нашли урок полезным, нашли ошибки или просто есть вопросы - пишите письма автору: . (Понятное дело, на англицком).
Оригинальный урок находится тут.
Урок переведён и выложен с разрешения GameDev.net и автора статьи Mason "Masonium" Smith
Читайте также: