Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2015, 00:37   #1
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию Вывод нескольких буферов DirectSound в 1 потоке.

Привет всем! Объясню немного.. Например с одним буфером всё просто - делим его на 2 "половины" и поочередно в потоке заполняем каждую из них звуковыми данными:

Код:
procedure TPlayThread.Execute;
var
  dwEvent   : Cardinal;
  dwOffset  : Cardinal;
begin
  while not Terminated do
  begin
    dwEvent := WaitForMultipleObjects(2, @hEvents[0], false, INFINITE);
    dwEvent := dwEvent - WAIT_OBJECT_0;
    if dwEvent = 0 then
      dwOffset :=DSBPN[1].dwOffset
    else
      dwOffset := DSBPN[0].dwOffset;

    // Заполнение половин буфера звуковыми данными.
    ...
  end;
end;
А как быть если надо одновременно несколько буферов заполнять? Не пойму никак как подружиться с WaitForMultipleObjects, которая при остановке любого из буферов будет сразу тормозить поток до тех пор пока этот буфер снова не запустят... Подскажите куда хоть примерно копать и осуществима ли вообще идея вывода нескольких потоковых буферов в одном потоке?
JekaDefer вне форума Ответить с цитированием
Старый 14.05.2015, 16:45   #2
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

Тему можно закрывать разобрался сам)
JekaDefer вне форума Ответить с цитированием
Старый 14.05.2015, 18:38   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Дык покажи другим
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.05.2015, 07:43   #4
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

Лучше объясню... В общем пользуемся всё той же WaitForMultipleObjects но события, которые она будет отлавливать будут для всех буферов. Т.е. например нам надо вывести 3 буфера. Каждый буфер делим на 2 половины и поочередно заполняем. а событий создаем 6 штук. WaitForMultipleObjects отлавливает какое то из них, далее вычисляем для какого оно буфера и какой половины, и заполняем эту половину... Максимум одним потоком можно проиграть 32 буфера (для систем х64).
Я вот тут всё бьюсь нет ли у DirectSound какой либо функции которая бы отлавливала трески в начале проигрывания буфера и в конце (Если сигнал плавно не начинается с 0, или плавно не завершается). Придумал конечно каким нестандартным способом это можно сделать, но там небольшая задержка появляется. Но правда её видно только если циклом запускать сразу много буферов...
JekaDefer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод из нескольких таблиц shtep PHP 5 29.04.2014 09:00
Как из метода X в потоке А, вызвать метод Y и чтобы он работал в потоке B ? lawliet93 C# (си шарп) 0 09.03.2013 18:16
Вывод из нескольких баз Mr_freeman PHP 8 29.06.2012 13:00
вывод данных из нескольких таблиц Кристинка89 SQL, базы данных 3 05.03.2012 10:16
Вывод сообщения в отдельном потоке и т.д. Casper-SC Общие вопросы .NET 7 18.05.2010 03:32