[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Jak na ten zatracenej audio.device.......
> Nazdar!,
> Nemate, nahodou nekdo nejaky zdrojak, ktery prehrava hudbu, ALE systemove
> pomoci audio.device!!!!!
> Me se povedlo zahrat jakoukoli melodii, ale pouze v jednom kanalu!!!
> Ja jsem se vzdycky zamotal v tom nastavovani audio.device:^(
> No proste to neni zadna sranda, jo a myslim ze 4 kanaly se mi povedlo
> alokovat, ale hrat jen v jednom!
> Nemohl byste mi nekdo vysvetlit, jak prehrat vice samplu najednou,
> (myslim ve vice kanalech)
>
>Predem dik MarK
Jo, mas stesti ! asi pred 14 dny jsem mel stejny problem. Vyresil jsem to
nasledovne:
- Postupne jsem si vytvoril 4 IO requesty pro audio.device (napr
CreateIORequest() Execu, nebo proste "Request1 ds.b aio_SIZEOF" v
pripade assembleru)
- pak 4 MessagePorty (Napr. CreateMsgPort(), ty jsem potom soupnul do
MN_REPLYPORT
- pak jsem pro kazdy IO request zavolal jednou OpenDevice() s tim, ze to
pole ,ktere indikuje, ktery kanaly alokuju jsem postupne vyplnoval
hodnotou 1,2,4,8. Tim jsem dosahnul toho, ze mam alokovany vsechny 4
kanaly, a ke kazdemu mam jeden IO-Request a jeden MsgPort - ten se
hodi k tomu, ze mi posle zpravu, kdyz kanal dohraje to, co jsem mu
zadal (to byl nejvetsi problem, protoze kazdy ReplyPort muze prijmout
vzdy jen jeden Message-takze 4 kanaly obslouzit nelze)
No a potom uz staci zavolat funkci WRITE pro kazdy kanal zvlast - kazdy
kanal ma svuj IO-Request, takze to jde v pohode. Zde jsem se setkal s
neskutecnou prasarnou v EXECU - funkce DoIO() a SendIO() si jako prvni
vyplni io_Flags hodnotou IOF_QUICK, nebo nulou ! Zadny OR/AND, normalne
to sproste premaze muj puvodni flag! Tim padem mi nechodilo u funkce
WRITE to rozsireni, ktere najednou vyplni i hlasitost a periodu, protoze
se mi smazal flag ADIOF_PERVOL, a musel jsem volat postupne funkce
PERVOL a WRITE. Je to desna svinarna, a prisel jsem na to az potom, co
jsem si odkrokoval tenhle kus EXECu v Debuggeru. Melo by se to vyresit
funkci BeginIO() z amiga.lib, ale me se nechtelo linkovat 100Kb
knihovnu kvuli jedny funkci, tak jsem si napsal vlastni BeginIO() :-)
Mam to cely reseny v assembleru, takze pokud budou nejaky problemy, tak ti
to poslu. Jinak, jestli ses dival do autodocs, tak tam pisou, ktera funkce
je pro jeden, a ktera pro vice kanalu - funkce WRITE je pouze pro JEDEN !
Ten si nastavis v polozce IO_UNIT - 1,2,4,8 A pro jistotu jeste pred
pouzitim WRITE proved RESET konkretniho kanalu - bez nej mi to trochu blblo,
kdyz se ty zvuky hodne rychle stridaly.
cau,FiDo of INSANITY
>P.S. Je prave Silvestr 22:08 vypinam pocitac a zacinam pripravovat delobuchy:^)
Hmmm, doufam, ze jsi jeste celej a tenhle mail ti bude neco platnej :-)