Как бы вы сыграли один звук? Когда я хочу точного управления, я использую функции waveOut
, как в этот ответ . Мой ответ там также позволяет воспроизводить звук с помощью потока (то есть, помимо прочего, асинхронно). Я думаю , что вы можете воспроизводить два звука одновременно, просто запустив два таких потока одновременно, если вы замените только глобальные var
с глобальными threadvar
с.
Обновление
Самый простой способ воспроизвести один звук - это использовать PlaySound
. Это можно использовать асинхронно, но поскольку вы задаете этот вопрос, я предполагаю, что это не позволяет вам использовать эту функцию дважды подряд, чтобы начать одновременное воспроизведение двух файлов. Но: если вы создаете поток, который воспроизводит только звук ( синхронно , так что поток не умирает до окончания воспроизведения), тогда вы можете , вероятно, использовать два таких потока для Воспроизведение двух аудио файлов одновременно. (У меня сейчас нет доступа к компилятору Delphi, поэтому я боюсь, что не могу проверить свои гипотезы.)
Обновление 2
Моя гипотеза состояла в том, что вы могли бы использовать два вызова PlaySound
, если бы только функция была вызвана из двух разных потоков , но, видимо, этого недостаточно. Кажется, вам действительно нужны два разных процесса, что плохо (констатировать очевидное). Я пытался
procedure TForm1.FormCreate(Sender: TObject);
begin
with TSoundPlayerThread.Create(true) do
begin
SetFileName('C:\Users\Andreas Rejbrand\Downloads\Anna.wav');
FreeOnTerminate := true;
Resume;
end;
with TSoundPlayerThread.Create(true) do
begin
SetFileName('C:\Users\Andreas Rejbrand\Downloads\Mike.wav');
FreeOnTerminate := true;
Resume;
end;
end;
с
unit SoundPlayerThread;
interface
uses
Classes, MMSystem, Windows;
type
TSoundPlayerThread = class(TThread)
private
{ Private declarations }
FAudioFileName: string;
protected
procedure Execute; override;
public
procedure SetFileName(const FileName: string);
end;
implementation
procedure TSoundPlayerThread.Execute;
begin
PlaySound(PChar(FAudioFileName), 0, SND_SYNC);
end;
procedure TSoundPlayerThread.SetFileName(const FileName: string);
begin
FAudioFileName := FileName;
end;
end.
и воспроизводился только последний волновой файл.
Обновление 3
На самом деле я написал небольшую библиотеку файлов WAV. Используя это, я могу загрузить два файла WAV, объединить их и отправить результат в аудиодрайвер. Тем не менее, это слишком много кода, чтобы размещать здесь. Если у меня останется время, я могу написать более легкую PlaySimultaneously
процедуру и опубликовать ее.
В противном случае: DirectX?