![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#31
|
||||
|
||||
|
я в библиотеку bass только начал изучать, с английским не сильно, в справке ни фига не понимаю, вот поэтому прошу помощи)
|
|
#32
|
||||
|
||||
|
я это понимаю, что можно через процедуру, но как именно с потоками работать?
|
|
#33
|
||||
|
||||
|
А зачем тут потоки? По клику в ListBox-е получаешь имя и грузишь также, как если нажал кнопку.
Код:
St := ListBox1.Items[ListBox1.ItemIndex];
if LoadStream(St) then
PlayStream; |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (28.01.2012)
| ||
|
#34
|
||||
|
||||
|
вы меня не поняли, я хочу чтобы при завершении(принудительном или нет) песни сразу воспроизводился второй поток, первый заглушать, а второй увеличивать, когда первый станет равен нулю то освобождаем, а второй проигрываем. Например вы дали пример, где поток завершается, уменьшается звук, задержка, потом грузиться другая песня и только потом увеличивается, а мне надо чтобы потоки стыковались, при этом первый затухает, а второй возрастает.
Последний раз редактировалось sariman, 28.01.2012 в 01:05. |
|
#35
|
||||
|
||||
|
Ну раз ты скачивал библиотеку, то и примеры имеются. Больше всех для этого подходит BASSTEST. Там как раз идёт проигрывние нескольких потоков сразу, но придётся дорабатывать под свои нужды.
|
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (28.01.2012)
| ||
|
#36
|
||||
|
||||
|
ясно, спасибо
|
|
#37
|
||||
|
||||
|
а как реализовать плавный переход громкости?
|
|
#38
|
||||
|
||||
|
Там ведь используется несколько потоков и, соответственно, несколько Channel-ов. Используй как и раньше BASS_ChannelSlideAttribute, только 2 одновременно, каждый для своего канала. Один гасит звук первого канала, второй повышает второго.
|
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (28.01.2012)
| ||
|
#39
|
||||
|
||||
|
спасибо, а подскажите как пользоваться функцией плавного понижения или повышение громкости?
|
|
#40
|
||||
|
||||
|
Странно, в твоём первом варианте эта функция используется.
Код:
// гасим за одну секунду BASS_ChannelSlideAttribute(channel, BASS_ATTRIB_VOL, 0, 1000); // повышаем за одну секунду BASS_ChannelSlideAttribute(channel, BASS_ATTRIB_VOL, 1, 1000); |
| Этот пользователь сказал Спасибо 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 остаток до конца. Последний раз редактировалось 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; |