|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#31
|
||||
|
||||
я в библиотеку bass только начал изучать, с английским не сильно, в справке ни фига не понимаю, вот поэтому прошу помощи)
|
#32
|
||||
|
||||
я это понимаю, что можно через процедуру, но как именно с потоками работать?
|
#33
|
||||
|
||||
А зачем тут потоки? По клику в ListBox-е получаешь имя и грузишь также, как если нажал кнопку.
Код:
St := ListBox1.Items[ListBox1.ItemIndex]; if LoadStream(St) then PlayStream; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (28.01.2012)
|
#34
|
||||
|
||||
вы меня не поняли, я хочу чтобы при завершении(принудительном или нет) песни сразу воспроизводился второй поток, первый заглушать, а второй увеличивать, когда первый станет равен нулю то освобождаем, а второй проигрываем. Например вы дали пример, где поток завершается, уменьшается звук, задержка, потом грузиться другая песня и только потом увеличивается, а мне надо чтобы потоки стыковались, при этом первый затухает, а второй возрастает.
Последний раз редактировалось sariman, 28.01.2012 в 01:05. |
#35
|
||||
|
||||
Ну раз ты скачивал библиотеку, то и примеры имеются. Больше всех для этого подходит BASSTEST. Там как раз идёт проигрывние нескольких потоков сразу, но придётся дорабатывать под свои нужды.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (28.01.2012)
|
#36
|
||||
|
||||
ясно, спасибо
|
#37
|
||||
|
||||
а как реализовать плавный переход громкости?
|
#38
|
||||
|
||||
Там ведь используется несколько потоков и, соответственно, несколько Channel-ов. Используй как и раньше BASS_ChannelSlideAttribute, только 2 одновременно, каждый для своего канала. Один гасит звук первого канала, второй повышает второго.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (28.01.2012)
|
#39
|
||||
|
||||
спасибо, а подскажите как пользоваться функцией плавного понижения или повышение громкости?
|
#40
|
||||
|
||||
Странно, в твоём первом варианте эта функция используется.
Код:
// гасим за одну секунду BASS_ChannelSlideAttribute(channel, BASS_ATTRIB_VOL, 0, 1000); // повышаем за одну секунду BASS_ChannelSlideAttribute(channel, BASS_ATTRIB_VOL, 1, 1000); Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (28.01.2012)
|
#41
|
||||
|
||||
да, но я же писал что музыка играет всего лишь три секунды, эти секунды зависят сколько времени будет возрастать громкость, только не знаю где запорол
|
#42
|
||||
|
||||
да, и еще, как узнать сколько осталось до конца трека? т.е если осталось 2 секунды то заглушаем и начинает играть второй поток
|
#43
|
||||
|
||||
Узнать текущую позицию BASS_ChannelGetPosition.
Код:
var Time : DWORD; begin ... Time := Trunc(BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel, BASS_POS_BYTE) - BASS_ChannelGetPosition(Channel, BASS_POS_BYTE))); ... end; в Time остаток до конца. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 28.01.2012 в 01:50. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (28.01.2012)
|
#44
|
||||
|
||||
огромное спасибо, завтра попробую))
|
#45
|
||||
|
||||
спасибо, разобрался, нашел ошибку в своем коде кому нужно, вот:
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, bass, StdCtrls, ComCtrls, sDialogs, sListBox; type TForm1 = class(TForm) btn1: TButton; btn2: TButton; ListBox: TsListBox; sOpenDialog1: TsOpenDialog; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btn1Click(Sender: TObject); procedure ListBoxDblClick(Sender: TObject); private { Private declarations } public procedure PlayStream; procedure Play; procedure FreeStream(var Stream: HStream); function LoadStream(FileName : String) : Boolean; end; var Form1 : TForm1; Channel, Channel2 : HSTREAM; Volume, FadeTimer : Integer; PlaySync : HSYNC; Dir : String; Timer : DWORD; implementation {$R *.dfm} procedure PlayStreamSync(handle: HSYNC; Stream, data: DWORD; user: Pointer); stdcall; begin BASS_ChannelRemoveSync(Stream,Handle); Channel:=Channel2; Channel2:=0; end; procedure TForm1.FormCreate(Sender: TObject); begin if BASS_Init(-1, 44100, 0, Handle, NIL) = False then ShowMessage('Îøèáêà'); GetDir(0, Dir); Channel:=0; FadeTimer:=3000; Volume:=100; end; procedure TForm1.FormDestroy(Sender: TObject); begin BASS_Free; end; procedure TForm1.FreeStream(var Stream: HStream); begin BASS_ChannelStop(Stream); BASS_StreamFree(Stream); end; procedure TForm1.PlayStream; begin if Channel2=0 then Exit; if Channel=0 then begin Channel:=Channel2; Play; end else if BASS_ChannelIsActive(Channel)=Bass_Active_Stopped then begin FreeStream(Channel); Channel:=Channel2; Play; end else begin BASS_ChannelSlideAttribute(Channel,BASS_ATTRIB_VOL,0,FadeTimer); BASS_ChannelSetAttribute(Channel2,BASS_ATTRIB_VOL,0); BASS_ChannelPlay(Channel2,False); end; PlaySync:=BASS_ChannelSetSync(Channel2,BASS_SYNC_SLIDE,0,@PlayStreamSync,nil); BASS_ChannelSlideAttribute(Channel2,BASS_ATTRIB_VOL,Volume / 100,FadeTimer) end; procedure TForm1.Play; //ôóíêöèÿ âîñïðîèçâåäåíèÿ êàíàëà äàâíî çàãðóæåííîãî â ïàìÿòü begin BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_VOL,0); BASS_ChannelPlay(Channel,False); BASS_ChannelSlideAttribute(Channel,BASS_ATTRIB_VOL,Volume / 100,FadeTimer); end; function TForm1.LoadStream(FileName : String) : Boolean; var Time : DWORD; begin if Channel2<>0 then Channel2:=0; Channel2:=Bass_StreamCreateFile(False,PChar(FileName),0,0,0); end; procedure TForm1.btn1Click(Sender: TObject); begin if sOpenDialog1.Execute then ListBox.Items.Append(sOpenDialog1.FileName); end; procedure TForm1.ListBoxDblClick(Sender: TObject); var ST:string; begin St := ListBox.Items[ListBox.ItemIndex]; if LoadStream(St) then PlayStream; end; end. Код:
procedure PlayStreamSync(handle: HSYNC; Stream, data: DWORD; user: Pointer); stdcall; begin BASS_ChannelRemoveSync(Stream,Handle); Channel:=Channel2; Channel2:=0; // все из-за этой строчки, я ее просто убрал, и все нормально работает BASS_StreamFree(Channel); end; |