|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
bass.dll медленно играет музыка
Вообщем суть проги: Написана для ребенка, он нажимает клавишу и появляется изображение животного и звук, который оно издает. Для фона прибавил туда музыки. В обоих случаях используется 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. |