Воспроизведение стереозвука с помощью DirectSound

Тема в разделе "Библиотеки и интерфейсы", создана пользователем WishMaster, 12 ноя 2006.

  1. WishMaster

    WishMaster New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    54
    Адрес:
    Ukraine
    Воспроизведение одного звукового потока не представляет проблем. Как воспроизводить стереозвук? Можно создать для каждого канала свой буффер, установить вывод для каждого буффера на соответствующую колонку и начать одновременный вывод. При длительном проигрывании наблюдается разбалансировка звука, то есть в этом случае возникает проблема синхронизации каналов между собой. Я думаю, не я первый столкнулся с этой проблемой. Может кто-нибудь что-то подсказать?
    Другой вариант – микшировать оба канала в один звуковой поток программно и уже после этого посылать на проигрывание в буффер. Только вот никак не придумаю, как их смикшировать?
    Заранее благодарен за советы.
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    WishMaster
    Проще простого. Например:
    Код (Text):
    1. short int L_channel_16bit[n] = { l0, l1, l2, l3, l4, l5, ... }; // это левый канал
    2. short int R_channel_16bit[n] = { r0, r1, r2, r3, r4, r5, ... }; // это правый канал
    Теперь комбинируем их:
    Код (Text):
    1. short int stereo_channel_16bit[n*2] = { l0, r0, l1, r1, l2, r2, l3, r3, l4, r4, l5, r5, ... };
    Заметьте, что первым идёт сэмпл от левого канала, за ним - аналогичный сэмпл от правого, потом следующий сэмпл от левого и т.д. При создании буфера в DirectSound нужно указать, что данный буфер будет 2-канальным. Пример:
    Код (Text):
    1. WAVEFORMATEX pcm = {
    2.     WAVE_FORMAT_PCM, /* linear PCM */
    3.     2,               /* stereo!!!  */
    4.     48000,
    5.     48000 * 4,
    6.     4,16             /* 16-bit     */
    7.     };
    8. /* ... */
    9. /* Set format to PCM / 48 KHz / 16-bit / stereo. */
    10. if(IDirectSoundBuffer_SetFormat(lpDSBufferPrimary, &pcm) < 0)
    11.     return -1;
     
  3. WishMaster

    WishMaster New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    54
    Адрес:
    Ukraine
    Quantum, спасибо, я как то и подзабыл про то, что в WAVEFORMATEX выставляется стерео/моно. Но тогда, если можно, вопрос дальше - есть три звуковых потока, два из них мне надо вывести, скажем, на левый канал, а один на правый. Как тогда? Или в общем случае - можно ли вывести несколько звуковых потоков, используя только один буффер? Как их можно сложить программно?
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    WishMaster
    Если просто сложить амплитуды, сигнал запросто выйдет за предельное значение. Поэтому лучше посчитать среднее арифметическое, но и такой вариант не идеален.
     
  5. WishMaster

    WishMaster New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    54
    Адрес:
    Ukraine
    В том то и дело. У меня складывается впечатление, что параллельный вывод двух сигналов не происходит путем их сведения к какому то одному сигналу и выводу его, а они проигрываются как отдельные сигналы, просто их выборки разнесены во времени. А может и не так =\
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    WishMaster
    Миксеры так и делают, т.е. фактически складывают амплитуды сигналов. Поэтому, если это всё равно придётся делать K-Mixer'у, кодеку или звуковой карте, то может получиться эффективнее реализовать миксер программно в данном конкретном случае.