|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Заикание звука в DirectSound
Привет всем! Пишу програмку по звуку через компонент DelphiX. Работает норм. Но возникает один нюанс при сворачивании своего приложения звук заикается, когда окно свернулось звук играет дальше. Как решить мне эту проблему?
|
#2
|
||||
|
||||
Фоновую музыку лучше крутить через MediaPlayer, а DXSound предназначен для воспроизведения коротких wav-семплов, типа выстрела.
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
||||
|
||||
Цитата:
|
#4
|
||||
|
||||
Цитата:
З.Ы. Можно ещё вроде в синхропотоке проиграть это дело, но наверное это тоже не решение, если их будет много. Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 22.05.2013 в 02:55. |
#5
|
||||
|
||||
При работе с DirectX (DirectSound, DirectMusic), заикания нет ни при перетаскивании окна, ни при сворачивании. Что там наворотили в DelphiX и как идёт обращение к указанным интерфейсам неизвестно. Но этой гадостью (DelphiX) не пользовался и нет желание пользваться в дальнейшем.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#6
|
||||
|
||||
Я думаю проблема в том, что звук и графика в одном потоке реализованы. Сделайте вывод звука например через sndPlaySound()
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#7
|
||||
|
||||
Шутишь? Это только для тестовых программ подойдёт, он же однопоточный, два звука одновременно проиграть нельзя.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#8
|
||||
|
||||
Ой ли? А флаг асинхронного воспроизведения ни о чем не говорит?
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#9
|
||||
|
||||
Когда-то, было дело, для подобного юзал bass.dll. Почему бы сейчас не заюзать?
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#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
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#15
|
||||
|
||||
Перекачал экзешник для проверки, что он может воспроизводить 3 звука одновременно. Только создайте файлы в одной папке с экзешником с названием как указано в коде.(чтобы не было ошибок)
Последний раз редактировалось Klyaksa, 23.05.2013 в 03:48. |