![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Вообщем суть проги: Написана для ребенка, он нажимает клавишу и появляется изображение животного и звук, который оно издает. Для фона прибавил туда музыки. В обоих случаях используется bass.dll то есть один канал для фоновой музыки, второй для воспроизведения звуков животного.
Проблема такова: фоновая музыка играет медленее чем следовало бы. То есть типа увеличили время звучания песни на 10 секунд. Последствия - тянется голос, теряется тональность: ну некрасиво вообщем. В проге присутствуют несколько таймеров, сначала грешил на них, удалил для теста - проблема осталась. фишка еще вот какая, включил я ноут, запустил прогу - играет все норм без задержек, но проходит некоторое время и начинается тягомотина с музыкой.. кто-нить сталкивался с такой проблемой? исходный код огромен, так, что не выкладываю. да и в организации bass все примитивно. |
|
#2
|
||||
|
||||
|
Цитата:
|
|
#3
|
||||
|
||||
|
Подобных глюков с bass.dll у меня никогда не было. Возможно, у тебя компьютер не справляется с обработкой двух звуковых потоков одновременно.
|
|
#4
|
|||
|
|||
|
Код:
эта процедура задает звучание фоновой музыки
procedure PlayFile (const Filename: string) ;
var FFileName: PChar;
begin
if not FileExists(FileName) then Exit;
FFileName:= PChar(Filename);
if Channel <>0 then begin
BASS_ChannelStop(Channel);
BASS_StreamFree(Channel);
channel:=0;
end;
Channel:=BASS_StreamCreateFile(False,FFileName,0,0,0);
BASS_ChannelPlay(Channel,False);
ChannelEndSync, nil);
if Channel=0 then
MessageBox(0,'ошибка загрузки медиа',0,MB_OK or MB_ICONSTOP);
if not (BASS_ChannelPlay(Channel,False)) then
MessageBox(0,'ошибка воспроизведения медиа',0,MB_OK or MB_ICONSTOP);
end;
эта процедура создает звучание звука
procedure PlayFile1 (const Filename: string) ;
var FFileName: PChar;
begin
if not FileExists(FileName) then Exit;
FFileName:= PChar(Filename);
if Channel2 <>0 then begin
BASS_ChannelStop(Channel2);
BASS_StreamFree(Channel2);
channel2:=0;
end;
Channel2:=BASS_StreamCreateFile(False,FFileName,0,0,0);
BASS_ChannelPlay(Channel2,True);
if Channel2=0 then
MessageBox(0,'ошибка загрузки медиа',0,MB_OK or MB_ICONSTOP);
if not (BASS_ChannelPlay(Channel2,False)) then
MessageBox(0,'ошибка воспроизведения медиа',0,MB_OK or MB_ICONSTOP);
end;
далее идет код типа
case Key of
'q','Q': begin
img1.picture.LoadFromFile('images/1.jpg');
PlayFile1('sounds/1.wav');
lbl1.Caption:='ВОРОНА';
end;
'w','W': begin
img1.picture.LoadFromFile('images/2.jpg');
PlayFile1('sounds/2.wav');
lbl1.Caption:='ПЕТУХ';
end;
...и так далее
здесь - события при загрузке формы
procedure TForm1.FormCreate(Sender: TObject);
var i, b : 0..255;
begin
form1.AlphaBlendValue:=0;
Randomize;
lst1.ItemIndex:=0;
lst1.Items.LoadFromFile('lst.minik');
lst2.ItemIndex:=0;
lst2.Items.LoadFromFile('animalsimg.minik');
windows.SetFocus(1);
ActivateKeyboardLayout(LoadKeyboardLayout('00000409',0),0);
trckbr1.Position:=20;
BASS_SetVolume(100);
if not BASS_Init(-1,44100,0,Handle,nil) then Halt;
BASS_ChannelSetAttributes(channel,41400,trckbr1.Position,-101); для фоновой музыки громкость устанавливается из тракбара
BASS_ChannelSetAttributes(channel2,41400,100,-101); для звука громкость на максимуме
end;
здесь выбор громкости для фоновой музыки
procedure TForm1.trckbr1Change(Sender: TObject);
begin
form1.SetFocus;
BASS_ChannelSetAttributes(channel,41400,trckbr1.position,-101);
end;
здесь простая визуализация - децибелы правого и левого каналов(ЗЫ. пробовал эту тему вообще удалить - проблема осталась)
procedure TForm1.tmr1Timer(Sender: TObject);
var
L,R,L1,R1: Integer;
level: DWORD;
begin
if BASS_ChannelIsActive(Channel) <> BASS_active_playing then Exit;
level:= BASS_ChannelGetLevel(Channel);
L:=HiWord(level);
R:=HiWord(level);
pb1.Canvas.Brush.Color:=clRED;
pb1.Canvas.FillRect(pb1.Canvas.ClipRect);
pb2.Canvas.Brush.Color:=clred;
pb2.Canvas.FillRect(pb2.Canvas.ClipRect);
L1:=Round(L/(32768/pb1.Height));
R1:=Round(R/(32768/pb2.Height));
pb1.Canvas.Brush.Color:=clAqua;
pb2.Canvas.Brush.Color:=clLime;
pb1.Canvas.Rectangle(0,pb1.height-L1,pb1.Width,pb1.Height);
pb2.Canvas.Rectangle(0,pb2.height-R1,pb2.Width,pb2.Height);
end;
здесь тупо добавление файла в плейлист
procedure TForm1.btn1Click(Sender: TObject);
var v,s: string;
begin
if dlgOpen1.Execute then lst1.additem(dlgOpen1.FileName,nil);
end;
здесь событие по двойному щелчку по выбранному в плейлисте
procedure TForm1.lst1DblClick(Sender: TObject);
begin
PlayFile(lst1.Items.Strings[lst1.itemindex]);
BASS_ChannelPlay(Channel,True);
BASS_ChannelSetAttributes(channel,41400,trckbr1.position,-101);
end;
этот таймер включает следующую песню в плейлисте, после того как закончилась предыдущая
procedure TForm1.tmr3Timer(Sender: TObject);
var a:Integer;
begin
if BASS_ChannelIsActive(Channel)=BASS_ACTIVE_STOPPED then begin
lst1.ItemIndex:=lst1.ItemIndex+1;
a:=lst1.Items.Count-1;
BASS_ChannelSetAttributes(channel,41400,trckbr1.position,-101);
PlayFile(lst1.Items.Strings[lst1.itemindex]);
BASS_ChannelPlay(Channel,True);
end;
end;вот основная суть. Последний раз редактировалось Admin, 19.06.2011 в 14:59. |
|
#5
|
||||
|
||||
|
Заверни всё выложенное в тег CODE, иначе не читабельно.
|
|
#6
|
||||
|
||||
|
Отдавать wav BASS-у... а смысл? Системы разве не хватает?
Посмотри пример "...\delphi\BassTest\BassTest.dpr " там как раз смешиваются разные звуки практически в неограниченном количестве. Код:
FFileName:= PChar(Filename); Channel:=BASS_StreamCreateFile(False,FFileName,0,0 ,0); Последний раз редактировалось angvelem, 09.06.2011 в 23:42. |