-
Здравствуйте! Вопрос, наверное, очень простой, но я не разберусь... Как сделать в программе несколько потоков звука? Без использования нескольких компонентов МедиаПлеер, вообще без компонентов? Я без компонентов звук вывожу только функцией PlaySound() из mmsystem, но как только я пытаюсь проиграть другой файл, прежний обрывается, то есть звук там идет одним потоком. А как можно проигрывать скажем, пять фалов одновременно? Чтобы на каждом потоке отдельно управлять - загружать файл, проигрывать, останавливать, новый файл открывать и т.п.?
-
OpenAL, DirectSound, Bass - коючевые слова для поиска. :)
-
Дельфин почитай статью "Низкоуровневое программирование звука в Windows" в частности про набор интерфейсных функций звуковых устройств и погляди реализацию юнита mms. :)))
-
> Дельфин (17.09.07 22:17)
см. DirectSound, ASIO
-
Вай, какие страшные слова. Я тоже ругаццо умею: "MCI".
function MciPlayFile(Notify: HWND; const FileName: string): MCIDEVICEID;
var
mciOpenParams: MCI_OPEN_PARMS;
mciPlayParams: MCI_PLAY_PARMS;
r: MCIERROR;
begin
mciOpenParams.lpstrDeviceType := 'waveaudio';
mciOpenParams.lpstrElementName := PChar(FileName);
r := mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE or MCI_OPEN_ELEMENT, DWORD(@mciOpenParams));
if r <> 0 then raise Exception.Create('O pula MCI_OPEN');
Result := mciOpenParams.wDeviceID;
mciPlayParams.dwCallback := Notify;
r := mciSendCommand(Result, MCI_PLAY, MCI_NOTIFY, DWORD(@mciPlayParams));
if r <> 0 then raise Exception.Create('O pula MCI_PLAY');
end;
При пользовании главное не забыть: 1. Обработать MM_MCINOTIFY и закрыть девайс 2. Файлы открываются эксклюзивно Вот так можно пользоваться:
TForm1 = class(TForm)
...
private
procedure MMMciNotify(var Msg: TMessage); message MM_MCINOTIFY;
...
end;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
MciPlayFile(Handle, 'C:\WINNT\Media\Windows Logoff Sound.wav');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
MciPlayFile(Handle, 'C:\WINNT\Media\Windows Logon Sound.wav');
end;
procedure TForm1.MMMciNotify(var Msg: TMessage);
begin
mciSendCommand(Msg.LParam, MCI_CLOSE, 0, 0)
end;
Нажимайте попеременно кнопочки, наслаждайтесь параллельным звучанием файлов. Только не слишком резво, чтоб ошибку открытия не получить ;) Ну, с этим Вы справитесь. Программировать умеете, да и справка по MCI под рукой.
-
> Я тоже ругаццо умею: "MCI"
С чем тебя и поздравляю)
Но ASIO, равно впрочем как и ALSA, изначально "заточены" под такие рантаймовые задачи. В отличие от MCI.
-
> рантаймовые
Пардон, "риэлтаймовые" конечно же.
-
> Я тоже ругаццо умею: "MCI".
Это я вижу)
Только вот не вижу я, любезный, тех самых "аргументов" в пользу MCI vs DirectAccess, на коих ты с пеной у рта настаивал, скажем, в ветке про NP vs Sockets)
Не сподобишься ли привести их, а ? Особенно в явно неизвестных условиях окружения задачи автора ?
"Несподобнеость", извини уж, буду вынужден трактовать как очередной приступ паранойи) ...
p.s.
И не дожидайся, пока сюда заглянет Jeer (с) - с параноиками у него разговор жестче чем у меня)
-
> Не сподобишься ли привести их, а ?
Непременно, сразу как напомнишь мне, где я в этой ветке употребил что-нибудь вроде: "прямо таки напрашивается" "Даже не задумывайся" "выбор ... еще более очевиден"
> Особенно в явно неизвестных условиях окружения задачи автора
Что не помешало тебе охарактеризовать задачи как "риэлтаймовые".
Хотя я в вопросе явно вижу поиск альтернативы МедиаПлеер и PlaySound(). Это, видимо, такой род паранойи -- вчитываться в вопрос.
> "Несподобнеость", извини уж, буду вынужден трактовать как > очередной приступ паранойи) ...
Хоть я и не знаю, что такое "Несподобнеость", но так и быть: считай как тебе заблагорассудится.
-
> Хотя я в вопросе явно вижу поиск альтернативы МедиаПлеер > и PlaySound().
для проигрывания файлов.
-
Спасибо, буду разбираться
-
мда, опять как всегда, общие слова...
-
-
-
-
|