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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.01.2012, 17:06
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию Проблема с затуханием звука 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  
Старый 26.01.2012, 20:23
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

ну помогите плиииз!!!)
Ответить с цитированием
  #3  
Старый 26.01.2012, 22:00
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Помогаем:
Код:
  BASS_ChannelSetAttribute(Buffer, BASS_ATTRIB_VOL, 0);
последний параметр устанавливает громкость звучания в диапазоне 0..1. Вы поставили 0, музыка играет молча.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #4  
Старый 26.01.2012, 23:47
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

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

Что значит не то? Именно то. Ты в двух местах гасишь звук. Выкладывай весь проект.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 27.01.2012, 00:01
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

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

Предлагаешь мне самому все контролы на форму кидать?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #8  
Старый 27.01.2012, 00:08
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

не понимаю о чем вы
Ответить с цитированием
  #9  
Старый 27.01.2012, 00:11
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

В архиве проект давай, мне лень всё создавать с нуля, проще посмотреть, что у тебя там намудрено.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
sariman (27.01.2012)
  #10  
Старый 27.01.2012, 00:42
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

вот, много весит, поэтому выложил на файлообменник
Ответить с цитированием
  #11  
Старый 27.01.2012, 01:02
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Не стоило в архив вкладывать библиотеку и mp3, тогда и "вес" бы значительно уменшился. Сейчас посмотрю.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
sariman (27.01.2012)
  #12  
Старый 27.01.2012, 01:05
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

учту, спасибо)
Ответить с цитированием
  #13  
Старый 27.01.2012, 01:31
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Порезал всё, что только мог - играет:
Код:
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  
Старый 27.01.2012, 14:22
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

спасибо большое), только первый канал завершается сразу, а второй возрастает, не подскажите, как сделать, чтобы когда менялась песня, первый канал затухал, а второй возрастал?
Ответить с цитированием
  #15  
Старый 27.01.2012, 16:00
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вот для этого и пригодится процедура PlayStreamSync, раньше от неё толку не было. В ней вести проверку на остаток до завершения и при достижении нужного значения использовать BASS_ChannelSlideAttribute.
Советую посетить авторский сайт, там на форуме можно много чего найти, но нужно знать английский.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
sariman (27.01.2012)
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter