Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Basnici2
Založen: 15. 08. 2009 Příspěvky: 6
|
Zaslal: 15. srpen 2009, 12:17:57 Předmět: načtení samplu do fmod přes TSream |
|
|
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 |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 16. srpen 2009, 08:34:40 Předmět: |
|
|
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 |
|
 |
Basnici2
Založen: 15. 08. 2009 Příspěvky: 6
|
Zaslal: 17. srpen 2009, 13:14:16 Předmět: |
|
|
Zní to skvěle, bohužel v tom tápu, byl by velký zločin požádat tě zde o konkrétní kód?  |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 17. srpen 2009, 13:59:15 Předmět: |
|
|
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?  |
byl - zkus jeste chvili tapat - pokud ti dame kod nic se nenaucis... |
|
Návrat nahoru |
|
 |
Basnici2
Založen: 15. 08. 2009 Příspěvky: 6
|
Zaslal: 18. srpen 2009, 07:22:24 Předmět: |
|
|
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  |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 18. srpen 2009, 08:07:52 Předmět: |
|
|
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 |
|
 |
Basnici2
Založen: 15. 08. 2009 Příspěvky: 6
|
Zaslal: 18. srpen 2009, 10:14:21 Předmět: |
|
|
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 |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 18. srpen 2009, 10:21:01 Předmět: |
|
|
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  _________________ http://trionteam.net |
|
Návrat nahoru |
|
 |
Basnici2
Založen: 15. 08. 2009 Příspěvky: 6
|
Zaslal: 18. srpen 2009, 11:37:31 Předmět: |
|
|
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 |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 18. srpen 2009, 15:23:06 Předmět: |
|
|
Myslíš tu chybu? _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
Mem

Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 22. srpen 2009, 08:31:24 Předmět: |
|
|
Ladis: Jj, očividně myslí přesně tu chybu. Tak kdo mu poradí?  _________________
 |
|
Návrat nahoru |
|
 |
Basnici2
Založen: 15. 08. 2009 Příspěvky: 6
|
Zaslal: 22. srpen 2009, 09:06:10 Předmět: |
|
|
ne chybu, vrátí to buď true nebo false v závislosti na tom, zda to funguje nebo ne.. a totok nefunguje
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 |
|
 |
|