Форум по 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
По умолчанию

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<font color="DarkGreen"><b>эта процедура задает звучание фоновой музыки</b></font>
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;
<font color="DarkGreen"><b>эта процедура создает звучание звука</b></font>
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;
<font color="DarkRed"> <b>далее идет код типа</b> </font>
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;
<font color="Blue">...и так далее</font>
 
<font color="DarkGreen"><b>здесь - события при загрузке формы</b></font>
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); <font color="DarkSlateBlue"><b>для фоновой музыки громкость устанавливается из тракбара</b></font>
BASS_ChannelSetAttributes(channel2,41400,100,-101); <font color="DarkSlateBlue"><b>для звука громкость на максимуме</b></font>
 end;
 
<font color="DarkGreen"><b>здесь выбор громкости для фоновой музыки</b></font>
procedure TForm1.trckbr1Change(Sender: TObject);
begin
form1.SetFocus;
 
BASS_ChannelSetAttributes(channel,41400,trckbr1.position,-101);
end;
 
 
<font color="DarkGreen"><b>здесь простая визуализация - децибелы правого и левого каналов(ЗЫ. пробовал эту тему вообще удалить - проблема осталась)</b></font>
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;
 
<font color="DarkGreen"><b>здесь тупо добавление файла в плейлист</b></font>
procedure TForm1.btn1Click(Sender: TObject);
var v,s: string;
begin
 if dlgOpen1.Execute then lst1.additem(dlgOpen1.FileName,nil);
end;
 
<font color="DarkGreen"><b>здесь событие по двойному щелчку по выбранному в плейлисте</b></font>
procedure TForm1.lst1DblClick(Sender: TObject);
begin
 PlayFile(lst1.Items.Strings[lst1.itemindex]);
      BASS_ChannelPlay(Channel,True);
BASS_ChannelSetAttributes(channel,41400,trckbr1.position,-101);
 
end;
 
<font color="DarkGreen"><b>этот таймер включает следующую песню в плейлисте, после того как закончилась предыдущая</b></font>
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 " там как раз смешиваются разные звуки практически в неограниченном количестве.

Код:
1
2
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, время: 02:16.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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