Воспроизведение одного звукового потока не представляет проблем. Как воспроизводить стереозвук? Можно создать для каждого канала свой буффер, установить вывод для каждого буффера на соответствующую колонку и начать одновременный вывод. При длительном проигрывании наблюдается разбалансировка звука, то есть в этом случае возникает проблема синхронизации каналов между собой. Я думаю, не я первый столкнулся с этой проблемой. Может кто-нибудь что-то подсказать? Другой вариант – микшировать оба канала в один звуковой поток программно и уже после этого посылать на проигрывание в буффер. Только вот никак не придумаю, как их смикшировать? Заранее благодарен за советы.
WishMaster Проще простого. Например: Код (Text): short int L_channel_16bit[n] = { l0, l1, l2, l3, l4, l5, ... }; // это левый канал short int R_channel_16bit[n] = { r0, r1, r2, r3, r4, r5, ... }; // это правый канал Теперь комбинируем их: Код (Text): short int stereo_channel_16bit[n*2] = { l0, r0, l1, r1, l2, r2, l3, r3, l4, r4, l5, r5, ... }; Заметьте, что первым идёт сэмпл от левого канала, за ним - аналогичный сэмпл от правого, потом следующий сэмпл от левого и т.д. При создании буфера в DirectSound нужно указать, что данный буфер будет 2-канальным. Пример: Код (Text): WAVEFORMATEX pcm = { WAVE_FORMAT_PCM, /* linear PCM */ 2, /* stereo!!! */ 48000, 48000 * 4, 4,16 /* 16-bit */ }; /* ... */ /* Set format to PCM / 48 KHz / 16-bit / stereo. */ if(IDirectSoundBuffer_SetFormat(lpDSBufferPrimary, &pcm) < 0) return -1;
Quantum, спасибо, я как то и подзабыл про то, что в WAVEFORMATEX выставляется стерео/моно. Но тогда, если можно, вопрос дальше - есть три звуковых потока, два из них мне надо вывести, скажем, на левый канал, а один на правый. Как тогда? Или в общем случае - можно ли вывести несколько звуковых потоков, используя только один буффер? Как их можно сложить программно?
WishMaster Если просто сложить амплитуды, сигнал запросто выйдет за предельное значение. Поэтому лучше посчитать среднее арифметическое, но и такой вариант не идеален.
В том то и дело. У меня складывается впечатление, что параллельный вывод двух сигналов не происходит путем их сведения к какому то одному сигналу и выводу его, а они проигрываются как отдельные сигналы, просто их выборки разнесены во времени. А может и не так =\
WishMaster Миксеры так и делают, т.е. фактически складывают амплитуды сигналов. Поэтому, если это всё равно придётся делать K-Mixer'у, кодеку или звуковой карте, то может получиться эффективнее реализовать миксер программно в данном конкретном случае.