|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Проблема с затуханием звука BASS
Все воспроизводится, затухание происходит, вот только музыка играет только 3 секунды, FadeTime - это время через которое звук должен возрастать до 100.
Помогите плз) Вот код: Код:
procedure PlayStreamSync(handle: HSYNC; Stream, data: DWORD; user: Pointer); stdcall; begin BASS_ChannelRemoveSync(Stream,Handle); BASS_StreamFree(Channel); Channel:=Buffer; Buffer:=0; end; procedure TForm1.FreeStream(var Stream: HStream); begin BASS_ChannelStop(Stream); BASS_StreamFree(Stream); end; procedure TForm1.PlayStream; begin if Buffer=0 then Exit; if Channel=0 then begin Channel:=Buffer; Play; end else if BASS_ChannelIsActive(Channel)=Bass_Active_Stopped then begin FreeStream(Channel); Channel:=Buffer; Play; end else begin BASS_ChannelSlideAttribute(Channel,BASS_ATTRIB_VOL,0,FadeTimer); BASS_ChannelSetAttribute(Buffer,BASS_ATTRIB_VOL,0); BASS_ChannelPlay(Buffer,False); end; PlaySync:=BASS_ChannelSetSync(Buffer,BASS_SYNC_SLIDE,0,@PlayStreamSync,nil); BASS_ChannelSlideAttribute(Buffer,BASS_ATTRIB_VOL,Volume / 100,FadeTimer) end; procedure TForm1.FormCreate(Sender: TObject); begin if bass_init(-1, 44100,0, handle,nil)=false then showmessage('Îøèáêà'); Channel:=0; Buffer:=0; FadeTimer:=3000; Volume:=100; end; procedure TForm1.Play; begin if Channel=0 then Exit; BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_VOL,0); BASS_ChannelPlay(Channel,False); BASS_ChannelSlideAttribute(Channel,BASS_ATTRIB_VOL,Volume / 100,FadeTimer) end; procedure TForm1.FormDestroy(Sender: TObject); begin bass_free(); end; procedure TForm1.btn1Click(Sender: TObject); begin if Open.Execute=false then exit; LoadStream(Open.FileName); end; procedure TForm1.sButton1Click(Sender: TObject); begin LoadStream('D:\MuZa\Aksent\Aksent - Hood Boy.mp3'); PlayStream; end; procedure TForm1.btn3Click(Sender: TObject); begin bass_channelplay(Channel, false); end; procedure TForm1.LoadStream(FileName: string); begin if Buffer<>0 then Buffer:=0; Buffer:=Bass_StreamCreateFile(False,PChar(FileName),0,0,0); end; procedure TForm1.sButton3Click(Sender: TObject); begin LoadStream('D:\MuZa\Adidas\Adidas - New Hit.mp3'); PlayStream; end; |
#2
|
||||
|
||||
ну помогите плиииз!!!)
|
#3
|
||||
|
||||
Помогаем:
Код:
BASS_ChannelSetAttribute(Buffer, BASS_ATTRIB_VOL, 0); Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#4
|
||||
|
||||
нет, это не то, звук все равно прорывается всего лишь 3 сек.
Я думаю что проблема в этом: Код:
procedure TForm1.PlayStream; begin if Buffer=0 then Exit; if Channel=0 then begin Channel:=Buffer; Play; end else if BASS_ChannelIsActive(Channel)=Bass_Active_Stopped then begin FreeStream(Channel); Channel:=Buffer; Play; end else begin BASS_ChannelSlideAttribute(Channel,BASS_ATTRIB_VOL,0,FadeTimer); BASS_ChannelSetAttribute(Buffer,BASS_ATTRIB_VOL,0); BASS_ChannelPlay(Buffer,False); end; PlaySync:=BASS_ChannelSetSync(Buffer,BASS_SYNC_SLIDE,0,@PlayStreamSync,nil); BASS_ChannelSlideAttribute(Buffer,BASS_ATTRIB_VOL,Volume / 100,FadeTimer) end; |
#5
|
||||
|
||||
Что значит не то? Именно то. Ты в двух местах гасишь звук. Выкладывай весь проект.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#6
|
||||
|
||||
вот весь мой проект
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, bass, StdCtrls, sButton, sSkinManager, sDialogs, ExtCtrls, sPanel, sScrollBar, sLabel, Buttons, sSpeedButton, sGauge, ComCtrls, acProgressBar, MPlayer, sListBox, sTrackBar; type TForm1 = class(TForm) SkinManager: TsSkinManager; btn1: TsButton; btn2: TsButton; sButton2: TsButton; spnl1: TsPanel; Open: TsOpenDialog; sScrollBar1: TsScrollBar; sLabel1: TsLabel; sLabel2: TsLabel; tmr1: TTimer; tmr2: TTimer; sButton1: TsButton; sLabel3: TsLabel; sGauge1: TsGauge; Progress: TsProgressBar; ListBox: TsListBox; sTrackBar1: TsTrackBar; sLabel4: TsLabel; sTrackBar2: TsTrackBar; sButton3: TsButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btn1Click(Sender: TObject); procedure sButton1Click(Sender: TObject); procedure btn3Click(Sender: TObject); procedure sButton3Click(Sender: TObject); procedure sButton2Click(Sender: TObject); private { Private declarations } public procedure Play; procedure PlayStream; procedure FreeStream(var Stream: HStream); procedure LoadStream(FileName: string); end; var Form1: TForm1; track: boolean; Channel, Buffer: HSTREAM; Volume, FadeTimer: Integer; PlaySync: HSYNC; implementation {$R *.dfm} procedure PlayStreamSync(handle: HSYNC; Stream, data: DWORD; user: Pointer); stdcall; begin BASS_ChannelRemoveSync(Stream,Handle); BASS_StreamFree(Channel); Channel:=Buffer; Buffer:=0; end; procedure TForm1.FreeStream(var Stream: HStream); begin BASS_ChannelStop(Stream); BASS_StreamFree(Stream); end; procedure TForm1.PlayStream; begin if Buffer=0 then Exit; if Channel=0 then begin Channel:=Buffer; Play; end else if BASS_ChannelIsActive(Channel)=Bass_Active_Stopped then begin FreeStream(Channel); Channel:=Buffer; Play; end else begin BASS_ChannelSlideAttribute(Channel,BASS_ATTRIB_VOL,0,FadeTimer); BASS_ChannelSetAttribute(Buffer,BASS_ATTRIB_VOL,0); BASS_ChannelPlay(Buffer,False); end; PlaySync:=BASS_ChannelSetSync(Buffer,BASS_SYNC_SLIDE,0,@PlayStreamSync,nil); BASS_ChannelSlideAttribute(Buffer,BASS_ATTRIB_VOL,Volume / 100,FadeTimer) end; procedure TForm1.FormCreate(Sender: TObject); begin if bass_init(-1, 44100,0, handle,nil)=false then showmessage('Îøèáêà'); Channel:=0; Buffer:=0; FadeTimer:=3000; Volume:=100; end; procedure TForm1.Play; begin if Channel=0 then Exit; BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_VOL,0); BASS_ChannelPlay(Channel,False); BASS_ChannelSlideAttribute(Channel,BASS_ATTRIB_VOL,Volume / 100,FadeTimer) end; procedure TForm1.FormDestroy(Sender: TObject); begin bass_free(); end; procedure TForm1.btn1Click(Sender: TObject); begin if Open.Execute=false then exit else ListBox.Items.Add(Open.FileName); LoadStream(Open.FileName); end; procedure TForm1.sButton1Click(Sender: TObject); begin LoadStream('D:\MuZa\Aksent\Aksent - Hood Boy.mp3'); PlayStream; end; procedure TForm1.btn3Click(Sender: TObject); begin bass_channelplay(Channel, false); end; procedure TForm1.LoadStream(FileName: string); begin if Buffer<>0 then Buffer:=0; Buffer:=Bass_StreamCreateFile(False,PChar(FileName),0,0,0); end; procedure TForm1.sButton3Click(Sender: TObject); begin LoadStream('D:\MuZa\Adidas\Adidas - New Hit.mp3'); PlayStream; end; end. |
#7
|
||||
|
||||
Предлагаешь мне самому все контролы на форму кидать?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#8
|
||||
|
||||
не понимаю о чем вы
|
#9
|
||||
|
||||
В архиве проект давай, мне лень всё создавать с нуля, проще посмотреть, что у тебя там намудрено.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (27.01.2012)
|
#11
|
||||
|
||||
Не стоило в архив вкладывать библиотеку и mp3, тогда и "вес" бы значительно уменшился. Сейчас посмотрю.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (27.01.2012)
|
#12
|
||||
|
||||
учту, спасибо)
|
#13
|
||||
|
||||
Порезал всё, что только мог - играет:
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, bass, StdCtrls; type TForm1 = class(TForm) btn1: TButton; btn2: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btn1Click(Sender: TObject); procedure btn2Click(Sender: TObject); private { Private declarations } public procedure FreeStream; procedure PlayStream; procedure Play; function LoadStream(FileName : String) : Boolean; end; var Form1 : TForm1; Channel : HSTREAM; Volume, FadeTimer : Integer; PlaySync : HSYNC; Dir : String; implementation {$R *.dfm} procedure PlayStreamSync(Handle: HSYNC; Stream, Data: DWORD; User: Pointer); stdcall; begin end; procedure TForm1.FreeStream; begin BASS_ChannelStop(Channel); // если канал воспроизводится, тормозим его BASS_StreamFree(Channel); // высвобождаем память Channel := 0; end; procedure TForm1.PlayStream; begin if BASS_ChannelIsActive(Channel) = BASS_Active_Stopped then Play else begin BASS_ChannelSlideAttribute(Channel, BASS_ATTRIB_VOL, 0, FadeTimer); BASS_ChannelSetAttribute(Channel, BASS_ATTRIB_VOL, 0); BASS_ChannelPlay(Channel, False); end; PlaySync := BASS_ChannelSetSync(Channel, BASS_SYNC_SLIDE, 0, @PlayStreamSync, NIL); BASS_ChannelSlideAttribute(Channel, BASS_ATTRIB_VOL, Volume / 100, FadeTimer); end; procedure TForm1.FormCreate(Sender: TObject); begin if BASS_Init(-1, 44100, 0, Handle, NIL) = False then ShowMessage('Ошибка'); GetDir(0, Dir); Channel := 0; // приравниваем к 0, на случай если Windows заполнить переменные числами. FadeTimer := 3000; Volume := 100; end; procedure TForm1.Play; //функция воспроизведения канала давно загруженного в память begin if Channel = 0 then Exit; BASS_ChannelSetAttribute(Channel, BASS_ATTRIB_VOL, 0); BASS_ChannelPlay(Channel, False); BASS_ChannelSlideAttribute(Channel, BASS_ATTRIB_VOL, Volume / 100, FadeTimer); end; procedure TForm1.FormDestroy(Sender: TObject); begin BASS_Free; end; function TForm1.LoadStream(FileName : String) : Boolean; begin if Channel <> 0 then FreeStream; Channel := BASS_StreamCreateFile(False, PChar(FileName), 0, 0, 0); Result := Channel <> 0; end; procedure TForm1.btn1Click(Sender: TObject); begin if LoadStream(Dir + '\First.mp3') then PlayStream; end; procedure TForm1.btn2Click(Sender: TObject); begin if LoadStream(Dir + '\Second.mp3') then PlayStream; end; end. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 27.01.2012 в 01:41. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (27.01.2012)
|
#14
|
||||
|
||||
спасибо большое), только первый канал завершается сразу, а второй возрастает, не подскажите, как сделать, чтобы когда менялась песня, первый канал затухал, а второй возрастал?
|
#15
|
||||
|
||||
Вот для этого и пригодится процедура PlayStreamSync, раньше от неё толку не было. В ней вести проверку на остаток до завершения и при достижении нужного значения использовать BASS_ChannelSlideAttribute.
Советую посетить авторский сайт, там на форуме можно много чего найти, но нужно знать английский. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (27.01.2012)
|