Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.11;
Скачать: CL | DM;

Вниз

Звук из ресурса   Найти похожие ветки 

 
!_SM_!   (2006-07-08 23:37) [0]

Из справки Делфи Windows SDK:

You can use the PlaySound function to play a sound that is stored as a resource. Although this is also possible using the sndPlaySound function, sndPlaySound requires you to find, load, lock, unlock, and free the resource; PlaySound achieves all of this with a single line of code.

Вопрос 1) Почему не проигрывается звук из ресурса? -

PlaySound("SoundName", HInstance, SND_RESOURCE or SND_ASYNC);

PlaySound achieves all of this with a single line of code. :(((????

а так играет

procedure PlaySound5(const S: PChar);
var hRes: THandle;
   pRes: Pointer;
begin
 hRes := LoadResource( HInstance, FindResource( HInstance, S, RT_RCDATA));
 try pRes := LockResource(hRes);
  if pRes=nil then Exit;
  PlaySound(pRes, 0, SND_MEMORY or SND_ASYNC);
 finally FreeResource(hRes); end;
end;

PlaySound5("SoundName");


Спасибо.


 
KilkennyCat ©   (2006-07-09 00:42) [1]

http://borland.xportal.ru/forum/viewtopic.php?t=1163


 
!_SM_!   (2006-07-09 01:48) [2]

Вот установил bass ... изучаю...
можно ли используя bass проиграть wav файл из ресурса
если можно пример?


 
KilkennyCat ©   (2006-07-09 01:53) [3]

Думаю, что да. Но я c bass не работал.


 
!_SM_!   (2006-07-09 05:16) [4]

Кто нибудь знает как, используя bass, можно проиграть wav файл из ресурса? Спасибо.


 
!_SM_!   (2006-07-09 05:19) [5]


> KilkennyCat ©   (09.07.06 00:42) [1]

Кстати, Спасибо за ссылку, я там разобрался почему у меня не пел
PlaySound из ресурса.... я его (ресурс) не правильно собрал
надо для PlaySound"a SOUND указывать, а не RCDATA... Вот.


 
!_SM_!   (2006-07-09 16:07) [6]


> !_SM_!   (09.07.06 05:16) [4]

Ответьте пожалуйста..... кто - нибудь, на вопрос.
Спасибо.


 
!_SM_!   (2006-07-10 16:35) [7]

Похоже никто не знает...


 
antonn ©   (2006-07-10 16:51) [8]

!_SM_!   (10.07.06 16:35) [7]
загрузить в TMemorystream и проиграть оттуда
var chan:HSTREAM; _M:TMemorystream;
begin
chan:=BASS_StreamCreateFile(True, _M.Memory, 0, _M.Size, 0);
BASS_ChannelPlay(chan,true);


 
!_SM_!   (2006-07-11 02:34) [9]


> antonn ©   (10.07.06 16:51) [8]

Будь добр, подскажи пожалуйста как из ресурса загрузить
в TMemorystream
Я вот вообще так пытался, нифига не получается:

procedure TForm1.SpeedButton7Click(Sender: TObject);
var HGlobRes: THandle; HRes: TResourceHandle; pDataRes: Pointer;
Snd: HSAMPLE;
begin
 HRes:=FindResource(HInstance, PChar("SND"), PChar("SOUND"));
 HGlobRes:=LoadResource(HInstance, HRes);
 try pDataRes:=LockResource(HGlobRes); if pDataRes=nil then Exit;

  Snd:=BASS_SampleLoad(True, pDataRes, 0, 0, 1, BASS_SAMPLE_OVER_POS);
  BASS_ChannelPlay(Snd, True);

 finally FreeResource(HGlobRes); end;
end;


 
!_SM_!   (2006-07-11 02:38) [10]

Ну это без TMemorystream, пытался сделать как PlaySound играет из ресурса...
TStream раньше не пользовал


 
antonn ©   (2006-07-11 05:31) [11]

TMemorystream - рулит (почти как канвас)

var Res : TResourceStream; _MM:TmemoryStream;
begin
Res := TResourceStream.Create(hInstance, Pchar("music"), Pchar("RESS")); //название и секция ресурса
_MM:=TmemoryStream.Create;
try
_mm.CopyFrom(RES,res.Size); //только селекторы нужно для подстраховки вернуть на начало

finally
_MM.Free; //замечу, что тут память будет убита, а значит нужно создать глобальную переменную
res.Free;
end;


 
!_SM_!   (2006-07-11 16:28) [12]

Спасибо, будем пробовать...


 
!_SM_!   (2006-07-12 00:47) [13]


> antonn ©   (11.07.06 05:31) [11]

Не поет :(((

var Res : TResourceStream; ResMM:TmemoryStream; Snd: HSAMPLE;

procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
 Res:=TResourceStream.Create(hInstance, Pchar("SND"), Pchar("SOUND"));
 try if Res=nil then Exit;
ShowMessage(IntToStr(Res.Position)); {TEST}  // показывает 0
  ResMM:=TmemoryStream.Create;
  ResMM.CopyFrom(Res, Res.Size);
ShowMessage(IntToStr(ResMM.Position)); {TEST}  //показывает 11868 - Size
  ResMM.Position:=0;
ShowMessage(IntToStr(ResMM.Position)); {TEST} //показывает 0
  Snd:=BASS_SampleLoad(True, ResMM, 0, 0, 1, BASS_SAMPLE_OVER_POS);
ShowMessage(IntToStr(Snd)); {TEST} // показывает 0
  BASS_ChannelPlay(Snd, True);
 finally end;
end;


 
!_SM_!   (2006-07-12 01:18) [14]

Пробовал и так:
 
Snd1:=BASS_StreamCreateFile(True, ResMM, 0, 0, BASS_SAMPLE_OVER_POS);
BASS_ChannelPlay( BASS_SampleGetChannel( Snd1, False), True);


тоже ноль... тишина
а вот PlaySound поет и Res.memory и ResMM.Memory
PlaySound(Res.Memory, 0, SND_MEMORY or SND_ASYNC);
PlaySound(ResMM.Memory, 0, SND_MEMORY or SND_ASYNC);

но он не катит.... так как 2 раза одновременно не может:(((
Блин, как заставить BASS играть ресурс??????????????????


 
antonn ©   (2006-07-12 05:00) [15]

!_SM_!   (12.07.06 0:47) [13]
так и не будет петь...

!_SM_!   (12.07.06 1:18) [14]
во первых, так тоже не будет. Потому что это не тот код, что я приводил...
Во вторых, а инициализация где?
BASS_Init(1, 44100, 0, Handle, nil);
 BASS_Stop;
 Bass_Start;


 
!_SM_!   (2006-07-12 18:44) [16]

Вот код примера (ниже) как я делаю он рабочий, компилиться нормально.
В ресурсе есть два wav файла. Ресурсы с именами:
RCDT тип RT_RCDATA и
SND тип SOUND
они загружаються нормально - PlaySound их играет.
На форме 7 кнопок TButton; В папке с exe есть файл 3.wav;
Вот сам код:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, BASS, StdCtrls, MMSystem;

type
 TForm1 = class(TForm)
   ButtonPlayFile: TButton;
   ButtonPlayRes: TButton;
   ButtonPlayRes1: TButton;
   ButtonPlayResMM: TButton;
   ButtonPlaySound: TButton;
   Button1: TButton;
   Button2: TButton;
   procedure FormCreate(Sender: TObject);
   procedure ButtonPlayFileClick(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure ButtonPlayResClick(Sender: TObject);
   procedure ButtonPlayRes1Click(Sender: TObject);
   procedure ButtonPlayResMMClick(Sender: TObject);
   procedure ButtonPlaySoundClick(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 ChF, ChR, ChR1, ChR2: HCHANNEL;
 SndF, SndR, SndR1, SndR2: HSAMPLE;
 ResS, ResRC: TResourceStream;
 ResMM: TmemoryStream;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 if not BASS_Init(-1, 44100, 0, Handle, nil) then Halt;
 SndF :=BASS_SampleLoad(FALSE, PChar("3.wav"), 0, 0, 3, BASS_SAMPLE_OVER_POS);
 ChF  :=BASS_SampleGetChannel(SndF, False);
 ResS :=TResourceStream.Create(hInstance, Pchar("SND"), Pchar("SOUND"));
 ResRC:=TResourceStream.Create(hInstance, Pchar("RCDT"), RT_RCDATA);
 ResMM:=TmemoryStream.Create;
 ResMM.CopyFrom(ResS, ResS.Size);
 if ResS<>nil then begin
  SndR:=BASS_StreamCreateFile(True, ResS, 0, 0, BASS_SAMPLE_OVER_POS);
  ChR:=BASS_SampleGetChannel(SndR, False);
 end else Exit;
 if ResRC<>nil then begin
  SndR1:=BASS_StreamCreateFile(True, ResRC, 0, 0, BASS_SAMPLE_OVER_POS);
  ChR1:=BASS_SampleGetChannel(SndR1, True);
 end else Exit;
 if ResMM<>nil then begin
  //SndR2:=BASS_SampleLoad(True {False}, ResMM, 0, 0, 0, BASS_SAMPLE_OVER_POS); //и так пробовал,

тишина
  //ChR2:=BASS_SampleGetChannel(SndR2, True);
  SndR2:=BASS_StreamCreateFile(True, ResMM, 0, 0, BASS_SAMPLE_OVER_POS);
  ChR2:=BASS_SampleGetChannel(SndR2, True);
 end else Exit;
 BASS_Start;  //Без этого файл играет всеравно
 ShowMessage("OK"); {TEST}  //Показывается, значит всё создается ..не суть
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 BASS_SampleFree(SndF);
 BASS_SampleFree(SndR);
 BASS_SampleFree(SndR1);
 BASS_SampleFree(SndR2);
 ResS.Free;
 ResRC.Free;
 ResMM.Free;
 BASS_Free;
end;

procedure TForm1.ButtonPlayFileClick(Sender: TObject);

begin
 BASS_ChannelPlay(chF, True);  //ПОЕТ
end;

procedure TForm1.ButtonPlayResClick(Sender: TObject);
begin
 BASS_ChannelPlay(chR, True);   //НЕ поет
end;

procedure TForm1.ButtonPlayRes1Click(Sender: TObject);
begin
 BASS_ChannelPlay(chR1, True);  //НЕ поет
end;

procedure TForm1.ButtonPlayResMMClick(Sender: TObject);
begin
 BASS_ChannelPlay(chR2, True);  //НЕ поет
end;

procedure TForm1.ButtonPlaySoundClick(Sender: TObject);
begin
 PlaySound(ResS.Memory, hInstance, SND_MEMORY or SND_ASYNC); //ПОЕТ
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 PlaySound(ResRC.Memory, hInstance, SND_MEMORY or SND_ASYNC); //ПОЕТ
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 PlaySound(ResMM.Memory, hInstance, SND_MEMORY or SND_ASYNC); //ПОЕТ
end;

end.


ПОМОГИТЕ ПОЖАЛУЙСТА, ЧТО НЕ ТАК У МЕНЯ?
или может BASS не умеет играть ресурсы?
для чего нужен тогда первый пораметр BASS_StreamCreateFile(mem: LongBool...
или BASS_SampleLoad(mem: LongBool...?

> antonn ©   (11.07.06 05:31) [11]
>antonn ©   (12.07.06 05:00) [15]
>!_SM_!   (12.07.06 0:47) [13]
>так и не будет петь...
>!_SM_!   (12.07.06 1:18) [14]
во первых, так тоже не будет. Потому что это не тот код, что я приводил...

????????????????????????????


 
!_SM_!   (2006-07-12 19:50) [17]

И вот, пользую вот такую Bass
BASS 2.3 - Copyright (c) 1999-2006 Ian Luck.
так, на всякий случай.....


 
antonn_web   (2006-07-12 20:49) [18]

не знаю, что там насчет ресурсов, я давал код проигрывания из памяти, вот его и используй. И параметры правильные подставь, по буквам из [8] прочитай


 
!_SM_!   (2006-07-12 23:32) [19]

Сделал так:

 if ResRC<>nil then begin
  SndR1:=BASS_StreamCreateFile(True, ResRC.Memory, 0, ResRC.Size, 0);
  //ChR1:=BASS_SampleGetChannel(SndR1, True);
 end else Exit;

BASS_ChannelPlay(SndR2, True);


ПОЕТ.... Спасибо... не доглядел.



Страницы: 1 вся ветка

Текущий архив: 2007.03.11;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.031 c
2-1171873747
ssss
2007-02-19 11:29
2007.03.11
Компонент TreeView


2-1171982875
VovkaN
2007-02-20 17:47
2007.03.11
Как указать temp-файлам .db при работе BDE другую папку?


2-1171658763
Norfolk
2007-02-16 23:46
2007.03.11
Использование системных переменных в имени файла


2-1171896060
Ezorcist
2007-02-19 17:41
2007.03.11
Удалить первые N байт из MemoryStream?


8-1150456899
!_SM_!
2006-06-16 15:21
2007.03.11
Проиграть звук