Как вывести разные wav в разные каналы одновременно?
От: Zuy Беларусь  
Дата: 19.04.03 20:17
Оценка:
Вот такая задача, надо разные wav файлы одновременно играть в разных физических звуковых каналах звукавухи. Каналов минимум 4, но было бы класно уметь это делать и во все 6. Я уже смотрел поиском по форумам, но ответа нет
Если звукавуга стерео, то вопросов нет, создаем вторичные буфера, в котором каждый звук при помощи SetPan ставим в свое место. Но мне надо то же самое, но на квадро звукавухах. Я пробую выставлять положение источников звука при помощи SetPosition в обьекте DS3DBuffer. Перед и зад разводятся отлично, но левый и правый каналы, попадают друг в друга. Как с этим бороться? Как производители звуковых карт делают в своих программах тестирования, когда в каждом канале отдельно четко играется звук?
Re: Как вывести разные wav в разные каналы одновременно?
От: PSP Беларусь  
Дата: 21.04.03 08:41
Оценка:
Здравствуйте, Zuy, Вы писали:

Zuy>Вот такая задача, надо разные wav файлы одновременно играть в разных физических звуковых каналах звукавухи. Каналов минимум 4, но было бы класно уметь это делать и во все 6. Я уже смотрел поиском по форумам, но ответа нет

Поищи в районе здесь -- обсуждалось уже на формуах.
Всегда Ваш, PSP.
Re: Как вывести разные wav в разные каналы одновременно?
От: luil Россия  
Дата: 06.05.03 15:15
Оценка:
Здравствуйте, Zuy,

Расскажи плз про то как ты в перед и зад выводишь каналы.
А то я вообще со звуком не работал а мне тоже надо кидать по каналам. Я пытался через mcisendstring все нето
Re: Как вывести разные wav в разные каналы одновременно?
От: Shurik2000  
Дата: 07.05.03 03:12
Оценка: 6 (1)
Здравствуйте, Zuy, Вы писали:

Zuy>Вот такая задача, надо разные wav файлы одновременно играть в разных физических звуковых каналах звукавухи. Каналов минимум 4, но было бы класно уметь это делать и во все 6. Я уже смотрел поиском по форумам, но ответа нет


http://www.microsoft.com/whdc/hwdev/tech/audio/multichaud.mspx
Re[2]: Как вывести разные wav в разные каналы одновременно?
От: Zuy Беларусь  
Дата: 07.05.03 19:41
Оценка:
Здравствуйте, Shurik2000, Вы писали:

S>Здравствуйте, Zuy, Вы писали:


Zuy>Вот такая задача, надо разные wav файлы одновременно играть в разных физических звуковых каналах звукавухи. Каналов минимум 4, но было бы класно уметь это делать и во все 6. Я уже смотрел поиском по форумам, но ответа нет


S>http://www.microsoft.com/whdc/hwdev/tech/audio/multichaud.mspx

Спасибо. Я до этого уже добрался и вопрос решился.
Re[2]: Как вывести разные wav в разные каналы одновременно?
От: Zuy Беларусь  
Дата: 07.05.03 19:54
Оценка:
Здравствуйте, 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;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.