Войти
ПрограммированиеФорумЗвук

CreateSoundBuffer - как узнать поддерживаемые форматы?

Страницы: 1 2 Следующая »
#0
15:17, 22 апр. 2011

Пытаюсь воспроизводить звук из mp2 файла. Декодер предлагает 32 бита, 48 kHz, на что CreateSoundBuffer не соглашается возвращая E_INVALIDARG. На 16 бит соглашается, но слышатся какие-то щелчки. Наверное из-за того, что 48kHz, а максимум для PCM, как пишут в SDK - 44.1. Перевод 48->44.1 имхо делать не правильно, тем более, что звуковуха сама поддерживает 48 kHz без проблем.

Вопрос: как заставить DirectSound выводить звук 32 бита 48 kHz? Ну или в крайнем случае 16 бит 48 kHz (хотя имхо плохой вариант).

P.S. Потом ещё понадобится вывод 4.0, 5.1 и т.д. как кодируют звук. Судя по всему без каких-то дополнительных ухищрений тоже воспроизводиться не будет?


#1
16:47, 22 апр. 2011

Under the Windows driver model (WDM), DirectSound hardware buffers can play any uncompressed or compressed sound format that can be described in a WAVEFORMATEX or WAVEFORMATEXTENSIBLE structure, provided the format is supported by the hardware. Software buffers and non-WDM hardware buffers support only 8-bit and 16-bit uncompressed formats.
то есть я полагаю вам надо создавать буфер с флагом DSBCAPS_LOCHARDWARE

On WDM drivers, DirectSound buffers support WAV formats that have more than two output channels, for speaker configurations such as 5.1. They also support formats with sample resolutions of greater than 16 bits.

Such formats can be described by a WAVEFORMATEXTENSIBLE structure. This structure is an extension of WAVEFORMATEX that configures the extra bytes specified by the WAVEFORMATEX.cbSize. A WAVEFORMATEXTENSIBLE structure can be cast as WAVEFORMATEX wherever the latter is expected, as for example in the DSBUFFERDESC structure. DirectSound recognizes multichannel and high-resolution formats by the WAVE_FORMAT_EXTENSIBLE tag in WAVEFORMATEX.wFormatTag.

You do not have to use the WAVEFORMATEXTENSIBLE type definition in your application in order to play multichannel or high-resolution files. You need only parse the file header correctly into a WAVEFORMATEX structure that contains the extra bytes specified by cbSize..

If the system is configured for fewer physical speakers than the number of channels specified in a multichannel WAV file, the audio data is mixed appropriately and output to the existing speakers...


Вы знаете, по поводу щелчков, однажды и я столкнулся с этим. Проблема была в том, что порция звука записывалась в буфер до курсора воспроизведения.

#2
20:08, 22 апр. 2011

К сожалению, DSBCAPS_LOCHARDWARE не помогает для 32 битного звука.
Пишу после курсора. По крайней мере если верить GetCurrentPosition.

#3
20:49, 22 апр. 2011

XAudio/XACT щупал?

#4
21:06, 22 апр. 2011

>XAudio/XACT щупал?
Зачем мне лишние глюки? Мне надо просто как можно более стандартными средствами вывести декодированный звук.

#5
22:43, 22 апр. 2011

32-разрядный звук нужен исключительно для промежуточной обработки. Для воспроизведения он не нужен абсолютно: динамический диапазон, для 16 разрядов составляет 98 дБ, что нереализуемо даже для высококлассной бытовой звуковоспроизводящей аппаратуры, а для компьютерной звукотехники - и подавно.

Что же касается конкретно SoundBlaster'а, то его собственный уровень шума находится где-то на уровне 12-14 разрядов. А вот 48 КГц он держит аппаратно.

#6
23:42, 22 апр. 2011

Я понимаю, что 32 разрядный звук - это уже баловство. Но ведь на какой-то машине может и ещё что-то не поддерживаться, поэтому мне и интересно выяснить все возможные нюансы, что бы соглашаться на тип, который ТОЧНО проиграется НА ДАННОЙ машине. Но сколько ни читал SDK - не нашёл возможности узнать что поддерживается, а что нет ДО создания буфера. Что бы была 100% гарантия успешности самого создания и последующего его воспроизведения.

#7
0:44, 23 апр. 2011

Akad
В SDK пишут что DirectSound сейчас лучше не.

#8
1:27, 23 апр. 2011

>В SDK пишут что DirectSound сейчас лучше не.

А что вместо него, что бы и под 2000/XP работало,  и на максимальном % машин?

#9
14:06, 23 апр. 2011

Akad
> Я понимаю, что 32 разрядный звук - это уже баловство. Но ведь на какой-то
> машине может и ещё что-то не поддерживаться, поэтому мне и интересно выяснить
> все возможные нюансы, что бы соглашаться на тип, который ТОЧНО проиграется НА
> ДАННОЙ машине. Но сколько ни читал SDK - не нашёл возможности узнать что
> поддерживается, а что нет ДО создания буфера. Что бы была 100% гарантия
> успешности самого создания и последующего его воспроизведения.

Я тебе даю гарантию, что если даже на некоторой машине аппаратура (или софт - как знать) и допускают проигрывание 32-разрядного звука, на выходе звуковой крты результат все равно ничем не будет отличаться от 15-разрядного.
Поэтому советую забыть о 32-разрядном звуке и везде выводить 16-разрядный. Есть уверенность, что он поддерживается на любом компьютере, оснащенном звуковой картой (или набортным звуком).

Кстати, непонятно, чем не устраивает способ "узнавания" - попытаться создать буфер.

#10
14:55, 23 апр. 2011

Akad
> А что вместо него, что бы и под 2000/XP работало,  и на максимальном % машин?
XSound или вообще XACT. Последний - готовый звуковой движок с редактором. Вообще железо звук о 32 битах держит неохотно. Моя Audigy2 имеет предел в 24 бита. Оно может и хорошо для редактирования, но для игры лучше перегнать в 16 бит которые есть везде.

#11
18:19, 23 апр. 2011

zlos
> Вообще железо звук о 32 битах держит неохотно. Моя Audigy2 имеет предел в 24
> бита.

Можно сказать определеннее: совсем не "держит". Вероятнее всего, что перед тем, как послать на "железо", драйвера преобразуют 32 в 16. Хотя в принципе не исключена и ситуация, при которой на "железо" честно посылается 32 разряда, но железо 30-32 из них попросту игнорирует самым простым способом "соответствующие контакты висят в воздухе".
По поводу 24 бит Аудиджи - это разрядность исключительно DSP, т.к. ADC и DAC с такой разрядностью в принципе не работают.
Практический максимум, которого сегодня удается добиться, это 21-22 разряда, причем "железо" с такой разрядностью (скажем, МОНО ADC) стоит в несколько раз дороже самого навороченного компа вместе с софтом. Цены измеряются в десятках Кбаксов на один канал. Используется, естественно, ТОЛЬКО в измерительной технике. Такого нет даже в студийной звуковой аппаратуре.

> Оно может и хорошо для редактирования, но для игры лучше перегнать в 16
> бит которые есть везде.

Это единственный разумный вариант.

#12
19:22, 23 апр. 2011

>Кстати, непонятно, чем не устраивает способ "узнавания" - попытаться создать буфер.
Кодек запрашивает до 10-15 раз соглашусь ли я на всякие медиатипы. Мне 10 раз создавать/разрушать буфер? Это как-то криво.
> Поэтому советую забыть о 32-разрядном звуке и везде выводить 16-разрядный.
Опять-же: мне-то всё равно. Главное, что бы кодек согласился отдать 16 или 8 бит. Обычно отдают, но про всегда - не уверен.
andriano
> XSound или вообще XACT. Последний - готовый звуковой движок с редактором.
Мне надо просто вывести звук, а не заставлять пользователей кучу всяких левых прибамбасов устанавливать, что бы они потом глючили у него. :)

#13
21:26, 23 апр. 2011

Akad
> Опять-же: мне-то всё равно. Главное, что бы кодек согласился отдать 16 или 8
> бит. Обычно отдают, но про всегда - не уверен.
Т.е. это всё гипотетическая ситуация, звука о 32 битах нигде не используется, не считая каких нибудь специальных задач про звук. Делаете в Content Pipeline (у вас ведь есть?) штуку котрая матерится матом если звук не 16 бит или конвертирует его. Или чтобы игра материалась если ей подсунули что то такое. И проблема решена.
Любят же некоторые придумывать проблемы из пальца.
> кучу всяких левых прибамбасов устанавливать
Всего лишь DirectX. Оно должно идти прямо в redist.

#14
23:44, 23 апр. 2011

Akad
> Опять-же: мне-то всё равно. Главное, что бы кодек согласился отдать 16 или 8
> бит. Обычно отдают, но про всегда - не уверен.

Не понимаю, в чем проблема.
Можно узнать, в каком формате отдает данные кодек?
Если можно, преобразуем то, что выдает кодек, из его, кодека, формата в формат 16 бит 48 КГц и отдаем звуковой железке.

Страницы: 1 2 Следующая »
ПрограммированиеФорумЗвук

Тема в архиве.