...a lejátszandó hangot nemes egyszerűséggel kiküldeni a soros portként kezelt eszközre. A Covoxnál is csak kiírtad a byte-ot az LPT-re, nem?
Nem.
Az AD/DA átalakítás alapja a Shannon mintavételi törvényen alapul. A lényeg az, hogy a mintákat időben pontosan kell adni vagy venni.
A DOS alatti Covoxra 7kHz sebességgel pakolták ki a bájtokat. Ez egy viszonylag egyszerű feladat, mert az oprendszer single user + single tasking. Ha írsz egy programot, akkor az fut, de nyilvánvalóan hardver időzítést is lehet használni. (timer interrupt) Ezzel a megoldással ugyan nem lehet a megfelelő időben kiadni a bájtokat, de a 8 bit felbontáshoz és a 3,5kHz sávszélességhez képest elfogadható az eredmény.
Abszolút pontos lenne az időzítés, ha egy timert-t összekötnénk egy DMA csatornával, és az pakolná ki a bufferelt adatokat. Persz ez sem igaz, mert az órajelnek is van ingadozása (jitter), de ilyen kis felbontásnál elhanyagolható a hiba. Ja, diszk műveletet sem szabad ilyenkor végezni, mert az is elfoglalja a buszt és pontatlanná teszi az időzítést.
A fentieket linux alatt nehezíti, hogy az multi user + multi tasking + protected oprendszer. Az IO privilégium megszerzésével nincs gond, ha végre tudod hajtani az outb() függvényt. Már csak az a kérdés, hogy mikor. Erre láthatsz komplett példát. A program egyáltalán nem garantálja az időben és adattartalomban pontos átvitelt. De jó játék! :-D
Eljutottunk az USB kezeléséhez. Az usb hardvert programozhatod közvetlenül is, de bájtokat csak bufferen keresztül tudsz küldeni. Miért? Mert az USB hardver a busz fizikai rétegének megfelelő protokollt valósítja meg, amibe nem tudsz beleavatkozni. Fölötte pedig a logikai protokollt kell driveren és descriptorokon keresztül eljátszani, hacsan nem kívánsz egy merőben új protokollt feltalálni. Bár ennek kicsi az esélye, mivel a hardver - véletlenül - pont az USB protokollokra van kihegyezve.
Ha egy oprendszerre rádugsz egy USB eszközt, akkor annak kell rendelkeznie egy control endpoint-tal. Amíg a driver ezzel nem dumálja meg az alap USB descriptorokat, addig nem is létezik számodra az eszköz. (Ezt már írták az első hozzászólásban.) Ha ezek után még adatot is akarsz küldeni, akkor még egy data endpoint-ra van szükséged. Egy-egy bájt szinkronizált küldéséhez, - ha a vevő nem bufferel, - a fentiekhez hasonló minőségben alkalmas lehet az "interrupt típusú" HID protokloll. A "Hi speed" (480 Mbps, USB-2.0) esetén pontosan 8kHz sebességgel tudod küldeni a blokkokat. Ehhez már csak egy vevő kell a másik oldalon, ami megfejti a protokollt, saját órajelre vagy a busz SOF-re szinkronizál és kirakja a bájtot.
A mikéntjét pontosan leírja pl. az USB 2.0 Specification. Elég, ha a fő 300+ oldalas dokumentumot átfutotd. ;)
A "soros port" (ebben az esetben) meg aszinkron eszköz, amivel nem célszerű szinkron adatot kiküldeni. Ha USB-soros átalakítóa gondoltál, az egy külön USB class, de akkor meg miért nem hangkártya?
Asszem tényleg erős túlzás az analógia, hiszen tapétázni sem tudsz. :-D
Ha ezen megsértődsz, meg is érdemled! Elvégre azt írtad Azzal én is tisztában vagyok, hogy nem értek túlságosan az elektronikához. Éppen ezért következmény, hogy nem kerülsz olyan helyzetbe, amikor egy drivert kellene írni vagy megérteni. Sőt, előveszem megint a régi tapasztalataimat. Nincs annál tiszteletreméltóbb, mint amikor valaki ki tudja mondani, ha nem ért valamihez. Vö. az egy bizonyos szoftveres népcsoprtosulattal, akik egy hardverfejlesztőnek is képesek bemagyarazni, hogy hülye a szakmájához. ;)
Bizonyára úgy gondolod, csak a szám jár. :) De sajnos éppen ez a munkám, egyedi USB műszereket fejlesztek. Van olyan is, ami véletlenül pont 8kB/s szinkron adatátvitelt tud. Csak teljesen másképp, mint ahogy elképzeled. Bár Windows-os szoftver van hozzá, de néha tesztelek linux alól is.
A megoldást az az egybeintegráltság jelentette volna...
Hááát, egy házilag gyártott Covox...
Akkor már lehetne egy kis doboz, egy kis hangszóró, egy kis D-osztályú erősítő USB táplálással és egy kis USB hangkártya. Drágább, macerásabb, kisvasút, de összeraható (tenyérnyi méretben). Lenne, ha nem lehetne egyben kapni.
Csak ezt a tudathasadást nem értettem, miért jobb egy Covox, mint egy kész hangkártya. Nem mindegy, hogy pár ellenállást forrasztasz be, vagy egy ugyanolyan méretű és árú, de alkalmas eszközt?
Csak mint írtam, azokra a hangkártyákra még kellett volna erősítés és hangszóró
A csak USB táplálású eszköz úgy 1,5W hangteljesítményt tud leadni. Ha ez kevés, akkor mégis külső táplálású kütyü kell. Biztosan lehet ilyet is találni, ami USB hangszóró külső táppal.