Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2011, 14:26   #1
werrey
Форумчанин
 
Регистрация: 01.02.2011
Сообщений: 105
По умолчанию Bass.dll -непрерывное воспроизведение звука

Здравствуйте уважаемые программисты.
Подскажите пожалуйста на нижеприведённом примере, как воспроизводить звук из файла, чтобы он постоянно играл, и чтобы если данный файл уже играет, то при его повторном вызове он не воспроизводился, пока не доиграет ?

Пример кода:

Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Forms, Bass,
  StdCtrls;

type
  TChannelType = (ctUnknown, ctStream, ctMusic);

type
  TfrmMain = class(TForm)
    btnStop: TButton;
    btnPlay: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure btnStopClick(Sender: TObject);
    procedure btnPlayClick(Sender: TObject);

  private
    Channel: DWORD;
    ChannelType: TChannelType;
    function BASS_PlaySoundFile(const FileName: string): Boolean;
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.DFM}

function TfrmMain.BASS_PlaySoundFile(const FileName: string): Boolean;
var
  ChannelInfo: BASS_CHANNELINFO;
begin
  Result:= False;
  Channel:= BASS_StreamCreateFile(False, PChar(FileName), 0, 0, 0);
  if (Channel <> 0) then
    ChannelType:= ctStream;

  if (Channel <> 0) then
  begin
    BASS_ChannelPlay(Channel, False);
  end;
  Result:= Channel <> 0;  
end;

procedure TfrmMain.FormCreate(Sender: TObject);
var
  BassInfo: BASS_INFO;
begin
  BASS_Init(1, 44100, BASS_DEVICE_3D, Handle, nil);
  BASS_Start;
  BASS_GetInfo(BassInfo);

end;


procedure TfrmMain.btnStopClick(Sender: TObject);
begin
    BASS_ChannelStop(Channel);
end;

procedure TfrmMain.btnPlayClick(Sender: TObject);
begin
BASS_PlaySoundFile('5.wav');
end;

end.

Последний раз редактировалось werrey; 12.06.2011 в 14:43.
werrey вне форума Ответить с цитированием
Старый 12.06.2011, 14:49   #2
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

http://programmersforum.ru/showpost....4&postcount=14
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 12.06.2011, 15:04   #3
werrey
Форумчанин
 
Регистрация: 01.02.2011
Сообщений: 105
По умолчанию

Цитата:
Сообщение от ZvEr_HaCkEr Посмотреть сообщение
Код:
Код:
Bass_Init(-1,44100,0,handle,nil);
Channel:=Bass_StreamCreateFile(false,Pchar(ExtractFilePath(ParamStr(0))+'music\main.mp3'), 0, 0, BASS_SAMPLE_LOOP  or {$IFDEF UNICODE} BASS_UNICODE {$ELSE} 0 {$ENDIF});
BASS_ChannelPlay(Channel, false);


А как это прикрутить к моему коду? Заменил в Create, ничего не изменилось... Хорошо бы примерчик работающий, так сложновато разобраться.
werrey вне форума Ответить с цитированием
Старый 12.06.2011, 16:24   #4
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

Странно, у меня все работает.
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 12.06.2011, 22:17   #5
werrey
Форумчанин
 
Регистрация: 01.02.2011
Сообщений: 105
По умолчанию

Да, файл проигрывается постоянно, но:
Я его произвожу по нажатию кнопки, и надо, чтобы если он еще играет, то не запускался, а так получается, если нажать 5 раз на button1, то файл воспроизводится 5 раз одновременно, и получается звуковая каша.

Подскажите пожалуйста, если знаете как это исправить.
werrey вне форума Ответить с цитированием
Старый 13.06.2011, 00:07   #6
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Код:
function TfrmMain.BASS_PlaySoundFile(const FileName: string): Boolean;
var
  ChannelInfo: BASS_CHANNELINFO;
begin
  Result:= False;

  if  channel > 0 then exit;
  bass_streamfree(channel);

  Channel:= BASS_StreamCreateFile(False, PChar(FileName), 0, 0, 0);
  if (Channel <> 0) then
    ChannelType:= ctStream;

  if (Channel  0) then
    BASS_ChannelPlay(Channel, False);
  Result:= Channel > 0;  
end;
ZuBy вне форума Ответить с цитированием
Старый 13.06.2011, 01:10   #7
werrey
Форумчанин
 
Регистрация: 01.02.2011
Сообщений: 105
По умолчанию

Цитата:
Сообщение от ZuBy Посмотреть сообщение
Код:
function TfrmMain.BASS_PlaySoundFile(const FileName: string): Boolean;
var
  ChannelInfo: BASS_CHANNELINFO;
begin
  Result:= False;

  if  channel > 0 then exit;
  bass_streamfree(channel);

  Channel:= BASS_StreamCreateFile(False, PChar(FileName), 0, 0, 0);
  if (Channel <> 0) then
    ChannelType:= ctStream;

  if (Channel  0) then
    BASS_ChannelPlay(Channel, False);
  Result:= Channel > 0;  
end;
Звук воспроизводится только один раз, при повторном нажатии на button1 больше не играет( И в 3 условии у Вас нету знака (if (Channel ? 0)), но я там по разному пробовал, не помогает

Последний раз редактировалось werrey; 13.06.2011 в 01:13.
werrey вне форума Ответить с цитированием
Старый 13.06.2011, 11:06   #8
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Код:
function TfrmMain.BASS_PlaySoundFile(const FileName: string): Boolean;
var
  ChannelInfo: BASS_CHANNELINFO;
begin
  Result:= False;

  if  channel > 0 then exit;
  bass_streamfree(channel);

  Channel:= BASS_StreamCreateFile(False, PChar(FileName), Bass_SAMPLE_Loop, 0, 0);
  if (Channel <> 0) then
    ChannelType:= ctStream;

  if (Channel >  0) then
    BASS_ChannelPlay(Channel, False);
  Result:= Channel > 0;  
end;
ZuBy вне форума Ответить с цитированием
Старый 13.06.2011, 12:26   #9
werrey
Форумчанин
 
Регистрация: 01.02.2011
Сообщений: 105
По умолчанию

Сделал по Вашему новому примеру, но звук при повторном нажатии не вызывается, играет только один раз( , а нужно, чтобы если опять нажать на Button, то опять воспроизводился, если уже проигрался до конца.

Код:

Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Forms, Bass,
  StdCtrls;

type
  TChannelType = (ctUnknown, ctStream, ctMusic);

type
  TfrmMain = class(TForm)
    btnStop: TButton;
    btnPlay: TButton;
    Label1: TLabel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnStopClick(Sender: TObject);
    procedure btnPlayClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    Channel: DWORD;
    ChannelType: TChannelType;
    function BASS_PlaySoundFile(const FileName: string): Boolean;
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.DFM}

function TfrmMain.BASS_PlaySoundFile(const FileName: string): Boolean;
var
  ChannelInfo: BASS_CHANNELINFO;
begin
  Result:= False;

  if  channel > 0 then exit;
  bass_streamfree(channel);

  Channel:= BASS_StreamCreateFile(False, PAnsiChar(AnsiString(FileName)), 0, 0, 0);
  if (Channel <> 0) then
    ChannelType:= ctStream;

  if (Channel >  0) then
    BASS_ChannelPlay(Channel, False);
  Result:= Channel > 0;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
var
  BassInfo: BASS_INFO;
begin
  BASS_Init(1, 44100, BASS_DEVICE_3D, Handle, nil);
  BASS_Start;
  BASS_GetInfo(BassInfo);

end;


procedure TfrmMain.btnStopClick(Sender: TObject);
begin
    BASS_ChannelStop(Channel);
end;

procedure TfrmMain.Button1Click(Sender: TObject);
begin
 BASS_PlaySoundFile('test.mp3');
end;

procedure TfrmMain.btnPlayClick(Sender: TObject);
begin
BASS_PlaySoundFile('test.mp3');

end;

end.

Где-то тут небольшая ошибка, посмотрите пожалуйста.
werrey вне форума Ответить с цитированием
Старый 13.06.2011, 15:23   #10
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

ну правильно условие
Код:
if Channel > 0 then exit;
не дает ему пройти, а всё почему?
потому что вы нигде (т.е. при завершении трека) не вызываете
Код:
bass_streamfree(channel);
channel := 0;
P.S. Channel:= BASS_StreamCreateFile(False, PChar(FileName), 0, 0, BASS_UNCIODE or BASS_SAMPLE_LOOP);

Последний раз редактировалось ZuBy; 13.06.2011 в 15:26.
ZuBy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36
BASS DLL ygy Мультимедиа в Delphi 4 29.09.2009 04:39
BASS.DLL VintProg Мультимедиа в Delphi 2 21.09.2009 16:36
bass.dll Elem Мультимедиа в Delphi 18 19.07.2009 11:04
Воспроизведение всех треков в директории, bass.dll Volkogriz Мультимедиа в Delphi 4 15.07.2009 13:16