Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.06.2011, 22:32
minik86 minik86 вне форума
Прохожий
 
Регистрация: 29.04.2011
Сообщения: 5
Репутация: 10
По умолчанию bass.dll медленно играет музыка

Вообщем суть проги: Написана для ребенка, он нажимает клавишу и появляется изображение животного и звук, который оно издает. Для фона прибавил туда музыки. В обоих случаях используется bass.dll то есть один канал для фоновой музыки, второй для воспроизведения звуков животного.
Проблема такова: фоновая музыка играет медленее чем следовало бы. То есть типа увеличили время звучания песни на 10 секунд. Последствия - тянется голос, теряется тональность: ну некрасиво вообщем. В проге присутствуют несколько таймеров, сначала грешил на них, удалил для теста - проблема осталась. фишка еще вот какая, включил я ноут, запустил прогу - играет все норм без задержек, но проходит некоторое время и начинается тягомотина с музыкой..
кто-нить сталкивался с такой проблемой? исходный код огромен, так, что не выкладываю. да и в организации bass все примитивно.
Ответить с цитированием
  #2  
Старый 07.06.2011, 23:32
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от minik86
... исходный код огромен, так, что не выкладываю...
А без этого, только телепатировать остаётся, но с этим проблемы. А если серьёзно, то с bass-ом никогда проблем не было, и примеров достаточно написал и автору bass-а отсылал. Ищи ошибку у себя в коде.
Ответить с цитированием
  #3  
Старый 09.06.2011, 09:54
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

Подобных глюков с bass.dll у меня никогда не было. Возможно, у тебя компьютер не справляется с обработкой двух звуковых потоков одновременно.
Ответить с цитированием
  #4  
Старый 09.06.2011, 23:03
minik86 minik86 вне форума
Прохожий
 
Регистрация: 29.04.2011
Сообщения: 5
Репутация: 10
По умолчанию

Код:
эта процедура задает звучание фоновой музыки
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  
Старый 09.06.2011, 23:24
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Заверни всё выложенное в тег CODE, иначе не читабельно.
Ответить с цитированием
  #6  
Старый 09.06.2011, 23:28
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Отдавать wav BASS-у... а смысл? Системы разве не хватает?
Посмотри пример "...\delphi\BassTest\BassTest.dpr " там как раз смешиваются разные звуки практически в неограниченном количестве.

Код:
FFileName:= PChar(Filename);
Channel:=BASS_StreamCreateFile(False,FFileName,0,0 ,0);
Это масло-масляное, лучше Channel:=BASS_StreamCreateFile(False, PChar(FFileName), 0, 0, 0). Обрати внимание на формат хранения стринга (строки) в памяти.

Последний раз редактировалось angvelem, 09.06.2011 в 23:42.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:27.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter