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

[OpenAL] Как правильно сделать pan для моно звука?

#0
19:03, 26 окт. 2012

Проблема в том, что плавного перехода из одного канала в другой нет, а есть резкий переход. Отчетливо слышно как появляется звук в одной из колонок при прохождении нуля (устанавливаю значение просто - по синусу от времени).

Делаю вот так:

  alSource3f(source, AL_POSITION, pan, 0.0f, 0.0f);

Пробовал поигратся с

  
  alSourcef(source, AL_ROLLOFF_FACTOR, ...);
  alSourcef(source, AL_MAX_DISTANCE, ...);
  alSourcef(source, AL_REFERENCE_DISTANCE, ...);

Но нужного результата не могу добиться. Прошу вашей помощи.


#1
21:00, 26 окт. 2012

Оказалось, что на iOS это работает нормально. А в Windows вот такие проблемы.
Спасибо за наводку - посмотрю на эту тему.

Прошло более 9 месяцев
#2
10:48, 2 авг. 2013

Проблема и у меня. Нет никакой реакции на перемещение источника и слушателя. Данные устанавливаются, но нет результата.

    ALfloat v[3] = {value, 0, 0};
    alSourcefv(id, AL_POSITION, v);

    alGetSourcefv(id, AL_POSITION, v);
    assert(v[0]==value);

Ассерт не срабатывает, позиция источнику устанавливается. Но звук слышится в одном положении. Пробовал разные позиции от [-1,1] до [-1000,1000]. Безрезультатно.

#3
11:50, 2 авг. 2013

Загрузил моно звук и с ним уже все работает отлично. Со стерео звуками не работает. Так и должно быть?

#4
12:06, 2 авг. 2013

Volodar

Загрузил моно звук и с ним уже все работает отлично. Со стерео звуками не работает. Так и должно быть?

Стерео звуки (как и 4.0/5.1 при поддержке расширения в реализации OpenAL) проигрываются особым способом.
Поэтому да, так и должно быть.
#5
12:23, 2 авг. 2013

gkv311
> проигрываются особым способом.
В какую сторону хоть копать тогда?

#6
14:39, 2 авг. 2013

Volodar

В какую сторону хоть копать тогда?

А чего вы хотите от стерео-сэмпла? Громкость меняется легко, а если надо двигать в пространстве - то надо делить стерео на два моно источника и уже потом делать всё что захочется.
#7
16:08, 2 авг. 2013

Да, нашел в спецификации что, стерео форматы не поддерживают 3D. Печально.
Как делить? При загрузке файла проверять сколько имеет каналов, и если 2 и более, разделять их? Со вторым беда, не знаю как сделать.
Или готовить 2 файла? Бред написал, ага.

#8
16:09, 2 авг. 2013

gkv311
> А чего вы хотите от стерео-сэмпла?
Сделать панораму. И всего то.

#9
16:49, 2 авг. 2013

Volodar

Как делить? При загрузке файла проверять сколько имеет каналов, и если 2 и более, разделять их? Со вторым беда, не знаю как сделать.

Есть всего два варианта многоканального звука - планарный (каждый канал в своём буфере) и interleaved (сэмплы для каждого канала чередуются).
Свежий FFmpeg, к примеру, из многих форматов теперь извлекает звук в планарном виде.
Так же у него есть библиотека для ре-сэмплинга, где можно звук де-интерливить/интерливить, менять частоту дискретизации, битность.
Сам я её не пробовал (библиотеку для ресэмплинга - декодирую звук с помощью FFmpeg), ибо у меня есть свой велосипед, написанный задолго до её появления:
https://github.com/gkv311/sview/blob/master/StMoviePlayer/StVideo… PCMBuffer.cpp

Де-интерливить стерео в общем-то не сложно - создаёте два буфера размером вполовину стереобуфера, и дёргаете сэмпл за сэмплом по-очереди.
Размер сэмпла определяется битностью (16 бит / 24 бит / 32 бит).

#10
17:02, 2 авг. 2013

Т.е. нельзя так просто взять и сделать pan для стерео на OpenAL непосвященному в звуки человеку? Придется копать глубже, чем уровень "загрузить этот файл и так его воспроизвести"?

#11
18:25, 2 авг. 2013

Из стерео надо сначала моно сделать, но это не просто. Если усреднить звук в каналах - ничего хорошего не получится, поплывут частоты, что-то типа доплеровского эффекта выйдет, причем, совершенно не по делу. Один из каналов брать тоже нельзя. Надо переводить звук в частотную форму, и там в моно превращать.

#12
19:35, 12 авг. 2013

Товарищи чтобы не было проблем на разных платформах =) избегаем ошибки когда слушатель стоит в нуле и источник тоже - это и есть причина резких переходов. Если слушатель находится в позиции 0 0 0, и источник x 0 0 - то само собой при малейшем смещении по x переход будет резким. Ставте z источнику минимальный.

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

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