Вот такая задача, надо разные wav файлы одновременно играть в разных физических звуковых каналах звукавухи. Каналов минимум 4, но было бы класно уметь это делать и во все 6. Я уже смотрел поиском по форумам, но ответа нет
Если звукавуга стерео, то вопросов нет, создаем вторичные буфера, в котором каждый звук при помощи SetPan ставим в свое место. Но мне надо то же самое, но на квадро звукавухах. Я пробую выставлять положение источников звука при помощи SetPosition в обьекте DS3DBuffer. Перед и зад разводятся отлично, но левый и правый каналы, попадают друг в друга. Как с этим бороться? Как производители звуковых карт делают в своих программах тестирования, когда в каждом канале отдельно четко играется звук?
Re: Как вывести разные wav в разные каналы одновременно?
Здравствуйте, Zuy, Вы писали:
Zuy>Вот такая задача, надо разные wav файлы одновременно играть в разных физических звуковых каналах звукавухи. Каналов минимум 4, но было бы класно уметь это делать и во все 6. Я уже смотрел поиском по форумам, но ответа нет
Поищи в районе здесь -- обсуждалось уже на формуах.
Всегда Ваш, PSP.
Re: Как вывести разные wav в разные каналы одновременно?
Расскажи плз про то как ты в перед и зад выводишь каналы.
А то я вообще со звуком не работал а мне тоже надо кидать по каналам. Я пытался через mcisendstring все нето
Re: Как вывести разные wav в разные каналы одновременно?
Здравствуйте, Zuy, Вы писали:
Zuy>Вот такая задача, надо разные wav файлы одновременно играть в разных физических звуковых каналах звукавухи. Каналов минимум 4, но было бы класно уметь это делать и во все 6. Я уже смотрел поиском по форумам, но ответа нет
Здравствуйте, Shurik2000, Вы писали:
S>Здравствуйте, Zuy, Вы писали:
Zuy>Вот такая задача, надо разные wav файлы одновременно играть в разных физических звуковых каналах звукавухи. Каналов минимум 4, но было бы класно уметь это делать и во все 6. Я уже смотрел поиском по форумам, но ответа нет
S>http://www.microsoft.com/whdc/hwdev/tech/audio/multichaud.mspx
Спасибо. Я до этого уже добрался и вопрос решился.
Re[2]: Как вывести разные wav в разные каналы одновременно?
Здравствуйте, luil, Вы писали:
L>Здравствуйте, Zuy,
L>Расскажи плз про то как ты в перед и зад выводишь каналы. L>А то я вообще со звуком не работал а мне тоже надо кидать по каналам. Я пытался через mcisendstring все нето
Вот как раз вчера я решил все вопросы по-этому поводу и могу кое-что рассказать.
Значит в винде появился новый формат wav файла, это WAVEFORMATEXTENSIBLE о нем можешь почитать по ссылке,
которую в этом же треде дал Shurik2000. Этот формат замечательно проигрывается через DirectSoundBuffer.
У меня в задаче были куча обычных моно wav файлов. которые мне надо было проигрывать в разных каналах.
Я написал процедурку, которая брала на входе обычный wav файл и номер канала в каком играть. Далее я в
памяти из этой вавки делал образ вавки формата WAVEFORMATEXTENSIBLE а в нем неиспользуемые каналы заполнял нулями.
И потом этот образ подсовывал на проигрывание в DSBUFFER. Все зарулило. Проц не грузится, Разделение по каналам полное,
ничего в соседние не перескакивает.
Подробности о проигрывании wav файлов смотри в DX8SDK там есть пример в DirectSound->Play Sound он понятно
показывает как через этот интерфейс проигрывать файлы.
Re[3]: Как вывести разные wav в разные каналы одновременно?
От:
Аноним
Дата:
12.05.03 16:02
Оценка:
Сенкс! Вот только трабл в том что я по англицки не бельмеса
все пытаюсь на рускоязычных найти. Буду со словарем сидеть. но сразу вижу это что надо.
Кстати можешь кинуть в виде примерчика процедурку, если конечно это не комерческая тайна.
Даже если и нет все равно спасибо за помощь.
Настоение поднялось прям. А то достало лазить по ссылочкам искать информацию
Re[4]: Как вывести разные wav в разные каналы одновременно?
От:
Аноним
Дата:
05.12.06 09:11
Оценка:
Та же задача. после прочтения статьи msdn и написания соответствующего кода — все равно смешиваються аудио каналы.
Использую для вывода DirectSound.
Делал дамп в файл проигрываемого буфера — все как надо, первые два байта — не ноль, остальные 14 — нули, потом снова 2 байта не ноль, и т.д.
Что не так? что я еще не учел?
var dsBufferDescr: TDSBufferDesc;
BufCaps: TDSBCaps;
wfx: TWaveFormatEx;
Wfxtensible: TWaveFormatExtensible;
Buf: PWordArray; //буфер DirectSoundBuffer'a
dum: Pointer; //temp
dum2: Longword; //temp
res: integer; //temp begin
dum:=nil;
wfx.wFormatTag := WAVE_FORMAT_EXTENSIBLE;
wfx.nChannels := 8 ;
wfx.nSamplesPerSec := 16000 ;
wfx.nAvgBytesPerSec := 256000;
wfx.nBlockAlign := 16 ;
wfx.wBitsPerSample := 16 ;
wfx.cbSize := SizeOf(Wfxtensible);
Wfxtensible.Format := wfx ;
Wfxtensible.wValidBitsPerSample:= 16;
Wfxtensible.dwChannelMask := KSAUDIO_SPEAKER_7POINT1; //SPEAKER_FRONT_LEFT or SPEAKER_FRONT_RIGHT or SPEAKER_FRONT_CENTER or SPEAKER_LOW_FREQUENCY or SPEAKER_BACK_LEFT or SPEAKER_BACK_RIGHT or SPEAKER_FRONT_LEFT_OF_CENTER or SPEAKER_FRONT_RIGHT_OF_CENTER
Wfxtensible.SubFormat := KSDATAFORMAT_SUBTYPE_PCM;
dsBufferDescr.dwSize := SizeOf(dsBufferDescr);
dsBufferDescr.dwFlags := 0;
dsBufferDescr.dwBufferBytes := 1024*100;
dsBufferDescr.dwReserved := 0;
dsBufferDescr.lpwfxFormat := @Wfxtensible;
dsBufferDescr.guid3DAlgorithm := DS3DALG_DEFAULT;
DirectSoundCreate(nil, DirectSound, nil);
DirectSound.SetCooperativeLevel(Handle, DSSCL_PRIORITY);
DirectSound.CreateSoundBuffer(dsBufferDescr, SoundBuffer, nil);
SoundBuffer.Lock(0, dsBufferDescr.dwBufferBytes, Pointer(Buf), dsBufferDescr.dwBufferBytes, dum, dum2, 0);
for dum2:=0 to (dsBufferDescr.dwBufferBytes div 2{байта на сэмпл})-1 do
if dum2 mod 8 = 0
then Buf^[dum2]:=Random(32768)
else Buf^[dum2]:=0;
SoundBuffer.Unlock(buf, dsBufferDescr.dwBufferBytes, dum, 0)
SoundBuffer.Play(0, 0, DSBPLAY_LOOPING);
end;