![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Привет всем! Пишу програмку по звуку через компонент DelphiX. Работает норм. Но возникает один нюанс при сворачивании своего приложения звук заикается, когда окно свернулось звук играет дальше. Как решить мне эту проблему?
|
|
#2
|
||||
|
||||
|
Фоновую музыку лучше крутить через MediaPlayer, а DXSound предназначен для воспроизведения коротких wav-семплов, типа выстрела.
|
|
#3
|
||||
|
||||
|
Цитата:
|
|
#4
|
||||
|
||||
|
Цитата:
З.Ы. Можно ещё вроде в синхропотоке проиграть это дело, но наверное это тоже не решение, если их будет много. Последний раз редактировалось Alegun, 22.05.2013 в 02:55. |
|
#5
|
||||
|
||||
|
При работе с DirectX (DirectSound, DirectMusic), заикания нет ни при перетаскивании окна, ни при сворачивании. Что там наворотили в DelphiX и как идёт обращение к указанным интерфейсам неизвестно. Но этой гадостью (DelphiX) не пользовался и нет желание пользваться в дальнейшем.
|
|
#6
|
||||
|
||||
|
Я думаю проблема в том, что звук и графика в одном потоке реализованы. Сделайте вывод звука например через sndPlaySound()
|
|
#7
|
||||
|
||||
|
Шутишь? Это только для тестовых программ подойдёт, он же однопоточный, два звука одновременно проиграть нельзя.
|
|
#8
|
||||
|
||||
|
Ой ли? А флаг асинхронного воспроизведения ни о чем не говорит?
|
|
#9
|
||||
|
||||
|
Когда-то, было дело, для подобного юзал bass.dll. Почему бы сейчас не заюзать?
|
|
#10
|
||||
|
||||
|
Цитата:
|
|
#11
|
||||
|
||||
|
Ну а вам что надо? Надо ведь что-бы воспроизведение шло в отдельном потоке, не затормаживаясь при сворачивании. Так это и будет. Или я не догоняю что-то?
|
|
#12
|
||||
|
||||
|
имеется в виду что только 1 звук может проирываться, несколько она не умеет. одновременно.
|
|
#13
|
||||
|
||||
|
В диспетчере задач приложение для каждого звука создает отдельный поток. И вопроизводятся они одновременно. Только вот если поставить в главном потоке Sleep(n), то весь звук заикается. Может как-то можно перенести DXSound1 в отдельный поток только как его там создать я не знаю.
P.S. Проект скинул бы но че-то грузить не хочет пишет:"Кажется, произошла проблема с базой данных Форум по программированию - Delphi Sources.".Могу только код дать. Код:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DXSounds, ComCtrls;
type
TForm1 = class(TForm)
Button2: TButton;
DXSound1: TDXSound;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
Button1: TButton;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure TrackBar2Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
//r:trect;
Audio,Audio1,Audio2,Audio3: TAudioFileStream;
// pust:bool=true;
// x,y,z:integer;
//buf:array[0..244000]of word;
///image1,bmp:tbitmap;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
var x,y:integer;
l:cardinal;
begin
Audio.Play;
//Audio1.play;
audio2.Play;
audio3.Play;
sleep(10000);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Audio := TAudioFileStream.Create(DXSound1.DSound);
Audio.AutoUpdate := true;
Audio.BufferLength := 100;
Audio.FileName := 'wind_bkg_1.wav';
Audio.Looped := true;
audio.Frequency:=44000;
///////////////////////////////////////
{ Audio1 := TAudioFileStream.Create(DXSound1.DSound);
Audio1.AutoUpdate := true;
Audio1.BufferLength := 100;
Audio1.FileName := 'night_bkg_1.wav';
Audio1.Looped := true;
audio1.Frequency:=44000;}
///////////////////////////////////////
Audio2 := TAudioFileStream.Create(DXSound1.DSound);
Audio2.AutoUpdate := true;
Audio2.BufferLength := 100;
Audio2.FileName := 'rain_l.wav';
Audio2.Looped := true;
audio2.Frequency:=44000;
AUdio2.Pan:=-10000;
//audio2.Volume:=-1000;
///////////////////////////////////////
Audio3 := TAudioFileStream.Create(DXSound1.DSound);
Audio3.AutoUpdate := true;
Audio3.BufferLength := 100;
Audio3.FileName := 'rain_r.wav';
Audio3.Looped := true;
audio3.Frequency:=44000;
audio3.Pan:=10000;
//audio3.Volume:=-1000
///////////////////////////////////////
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
audio.Volume:=TrackBar1.Position;
end;
procedure TForm1.TrackBar2Change(Sender: TObject);
begin
audio3.Volume:=TrackBar2.Position;
audio2.Volume:=TrackBar2.Position;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Audio.Stop;
//Audio1.play;
audio2.Stop;
audio3.stop;
end; |
|
#14
|
||||
|
||||
|
Цитата:
|
|
#15
|
||||
|
||||
|
Перекачал экзешник для проверки, что он может воспроизводить 3 звука одновременно. Только создайте файлы в одной папке с экзешником с названием как указано в коде.(чтобы не было ошибок)
Последний раз редактировалось Klyaksa, 23.05.2013 в 03:48. |