.[ ČeskéHry.cz ].
načtení samplu do fmod přes TSream

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Delphi / Pascal
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Basnici2



Založen: 15. 08. 2009
Příspěvky: 6

PříspěvekZaslal: 15. srpen 2009, 12:17:57    Předmět: načtení samplu do fmod přes TSream Odpovědět s citátem

hello, v programování nejsem moc sběhlý, potřebuji tip, jak vyřešit následující věc.

Funkce fmod pro načtení samplu má tyto parametry:
kód:
FSOUND_Sample_Load(FSOUND_FREE; data:PAnsiChar; Mode:Cardinal; offset: integer; Length: Integer);


Pokud do parametru data dosadím pchar('soubor.wav'); a do ostatních parametrů nuly, funguje to, soubor se načte z disku.

Používám ale jednu komponentu, která mi umožňuje mít všechny soubory v jednom velkém balíku. Soubor z toho pak tahám jako GetFile(soubor:string):TStream;
U obrázků je například funkce LoadFromStream(getFile(soubor.bmp));

No a otázka je, jak tento výstup (TStream) aplikovat do výše uvedeného načtení zvuku. V parametru Mode bude FSOUND_LOADMEMORY, ale co dát do ostatních nevím, co jsem hledal to bude záludnost ohledně pointerů, s tím ale nemám zkušenosti, díky za rady!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 16. srpen 2009, 08:34:40    Předmět: Odpovědět s citátem

TStream je objekt reprezentující proud dat z nějakého zdroje (třeba ten balík). FMod akceputuje celý načtený soubor jako blok paměti. Takže ty potřebuješ pomocí toho streamu celý soubor nahrát do paměti a předat ho fmodu. Takže si naalokuješ blok paměti o velikosti toho souboru, pak budeš opakovaně číst z toho streamu třeba po 4 kB dokud to celé nepřečteš, pak ukazatel na ten blok paměti předáš fmodu a nakonec to uvolníš.
_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Basnici2



Založen: 15. 08. 2009
Příspěvky: 6

PříspěvekZaslal: 17. srpen 2009, 13:14:16    Předmět: Odpovědět s citátem

Zní to skvěle, bohužel v tom tápu, byl by velký zločin požádat tě zde o konkrétní kód? Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2150

PříspěvekZaslal: 17. srpen 2009, 13:59:15    Předmět: Odpovědět s citátem

Basnici2 napsal:
Zní to skvěle, bohužel v tom tápu, byl by velký zločin požádat tě zde o konkrétní kód? Smile


byl Smile - zkus jeste chvili tapat - pokud ti dame kod nic se nenaucis...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Basnici2



Založen: 15. 08. 2009
Příspěvky: 6

PříspěvekZaslal: 18. srpen 2009, 07:22:24    Předmět: Odpovědět s citátem

zkusil jsem tohle, ale nejde to, takže to bude asi špatně...

m:=TMemoryStream.Create;
m.LoadFromStream(GetFile('soubor.wav'));
FSOUND_Sample_Load(FSOUND_FREE,pchar(m),FSOUND_LOADMEMORY,0,m.Size);
m.free;

osobně se více přiučím z funkčního kódu než bastlením pokus-omyl Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2150

PříspěvekZaslal: 18. srpen 2009, 08:07:52    Předmět: Odpovědět s citátem

TMemoryStream je zase jenom stream. Pretypovani ti opravdu nepomuze. Je potreba pracovat primo s polem znaku, do ktereho nacitas ze streamu pres metodu read data.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Basnici2



Založen: 15. 08. 2009
Příspěvky: 6

PříspěvekZaslal: 18. srpen 2009, 10:14:21    Předmět: Odpovědět s citátem

Díky, už to funguje.
Jde to napsat ještě nějak elegantněji? Ten string si předem roztáhnout do požadované délky (to bych věděl), ale jak pak psát buffer přesně do té části stringu, kam potřebuji?


kód:

var m:TStream;
buffer:array[1..2048] of char;
toto:string;

...

  m:=TStream.Create;
  m:=GetFile('soubor.wav');
  m.Position:=0;
  toto:='';

  while m.Position<>m.Size do begin
   m.Read(Buffer,SizeOf(Buffer));
   toto:=toto+Buffer;
  end;

  FSOUND_Sample_Load(FSOUND_FREE,pansichar(toto),FSOUND_LOADMEMORY,0,m.Size);

  m.free;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 751
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 18. srpen 2009, 10:21:01    Předmět: Odpovědět s citátem

Basnici2: Jednoduseji by to mozna slo pres ten memory stream - vratme se k tomu tvemu predchozimu kodu s TMemoryStream. Pokud uz to do nej nactes, tak by se ti mohlo hodit m.Memory, ktere ti vrati pointer na data v tom streamu.

Jenom pak je potreba dat pozor na to, abys tu pamet pak spravne uvolnoval (nezapomnel neco uvolnit, neuvolnil neco driv, nez je zdravo).

Ale v Pascalu/Delfach uz jsem tak 8 let nedelal, takze to radsi vyzkousej Wink
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Basnici2



Založen: 15. 08. 2009
Příspěvky: 6

PříspěvekZaslal: 18. srpen 2009, 11:37:31    Předmět: Odpovědět s citátem

OndraSej>vypadá to dobře, ale nějak nejede (fmod hodí chybu)

m:=TMemoryStream.Create;
m.LoadFromStream(GetFile('soubor.wav'));
m.Position:=0;
FSOUND_Sample_Load(FSOUND_FREE,m.Memory,FSOUND_LOADMEMORY,0,m.Size);

m.free;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1484
Bydliště: u Prahy

PříspěvekZaslal: 18. srpen 2009, 15:23:06    Předmět: Odpovědět s citátem

Myslíš tu chybu?
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 22. srpen 2009, 08:31:24    Předmět: Odpovědět s citátem

Ladis: Jj, očividně myslí přesně tu chybu. Tak kdo mu poradí? Wink
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Basnici2



Založen: 15. 08. 2009
Příspěvky: 6

PříspěvekZaslal: 22. srpen 2009, 09:06:10    Předmět: Odpovědět s citátem

ne chybu, vrátí to buď true nebo false v závislosti na tom, zda to funguje nebo ne.. a totok nefunguje Wink
Funguje ale ten můj kód nadtím, tedy už to není třeba více řešit, šlo mi jen o případnou optimalizaci
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Delphi / Pascal Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna