2 stuff van. A playtree maga, meg az iterator. A playtree testesiti meg az adatot, az iteratort meg az mplayer hasznalja arra hogy egyik bejegyzesrol a masikra lepjen Eloszor, a play_tree struct : struct play_tree { play_tree_t* parent; play_tree_t* child; play_tree_t* next; play_tree_t* prev; play_tree_param_t* params; int loop; char** files; int entry_type; }; A play_tree_t* tartalmazza a linkeket a 4 iranyba, a params tartalmazza az adott bejegyzes osszes parameteret, a loop 1ertelmu (loop < 0 vegtelen loopot jelent), a files tartalmazza az adott bejegyzes osszes file-jat, es az entry_type kurvaegyertelmuen az adott bejegyzes tipusat adja meg (node, file, dvd, vcd, tv) Egy bejegyzes egynel tobb filet is tartalmazhat, mie'? Mert egy bejegyzes lehet network stream is, es altalaban egynel tobb szerver van. De mind ugyanazt kuldi, sz'al ez egy olyan bejegyzes aminek tobb forrasa van. Es mit basszak ezzel a szarral? Eloszor csinalj egy entryt a play_tree_new func segitsegevel. Ez letrehozza a structot, es default ertekekkel tolti fel. Eztan ez lehet node vagy leaf is. Node lesz rogton, ha a play_tree_set_child vagy a play_tree_set_parent segitsegevel odalinkeled egy masikhoz. Vagy leaf lesz, ha a play_tree_add_file-t nyomod ra. Ha egy bejegyzes legalabb 1 filet tartalmaz, nem lehet node (egy assert lesz raised) es ha egy bejegyzesnek van egy childje amihez nem adhatsz filet (?) (itt is assert lesz) Aztan hogy letrehozz egy listat a bejegyzesekrol, hasznald a play_tree_ _append_entry-t, a play_tree_prepend_entry-t vagy a play_tree_insert_entryt. Ezek kozul barmelyikben hasznalhatod a lista barmelyik bejegyzeset elso argumentumkent, nem csak az elsot. Ugyanez ervenyes arra amikor egy node childjet allitod, a child argumentum barmelyik, listaban levo bejegyzes lehet. A bejegyzes treebol valo kiszedesehez hasznald a play_tree_removet. Ha a masodik arg (free_it) true, akkor felszabaditja, ha a bejegyzest freezni kell, es a harmadik arg is true, akkor a childjeit is. Amikor a tree kesz, hasznalhatod a play_tree_cleanupot hogy eltavolitsd az osszes nemhasznalt bejegyzest. Playlist betoltesehez hasznald a parse_playtree-t ami egy stream_t-t fogad argumentumkent, vagy a parse_playlist_file-t ami filenevet. Mind2 funkcio NULL-t ad vissza hiba eseten, vagy ha egy uj (torolt) fa eseten, amit hozzaadhatsz valahova a treedbe. (?)_ Hogy lehet DVD-t VCD-t TV-t? igy dvd://x where x is the title number. vcd://x where x is the track number tv://x where x is the channel Kesz a playtreem, mit basszak a play_tree_iter-rel? Ez egy iterator arra a celra hogy a treet atfesuljed jol. Ezt a play_tree_iter_new-vel hozod letre, ami argumentumkent egy play_tree_t es egy m_config_t-t eszik, amik aztan arra lesznek hasznalva hogy az egyes bejegyzesek parametereit allitgassad. Miutan az iter pontot jol semmibe krealtad, init az elso lepest. A listaban egy masik bejegyzesre torteno atlepeshez hasznald a play_tree_iter_step-et. A masodik argumentum a lepes iranya, pozitiv ertekek elore, negativok hatra, es 0 nem mozdul. A harmadik meg azt mondja meg hogy erdekel-e a node vagy se. Ha igen, az iterator megall a nodeknel, maskulonben a kovetkezo ervenyes bejegyzeshez megy. This function return different values : PLAY_TREE_ITER_ERROR : egyertelmu PLAY_TREE_ITER_ENTRY : entryn vagyunk PLAY_TREE_ITER_NODE : nodeon vagyunk PLAY_TREE_ITER_END : targyalason vagyok ;) (( Megj : kene rakni ide egy PLAY_TREE_ITER_BEGININGet a kezdethez. Nemtom mit kene visszadni ilyen esetben. PLAY_TREE_ITER_ERROR ? )) Van meg a play_tree_iter_up_step ami egy loop megtoresere vagy az adott lista skipelesere jo. Ugyanazok az argok mint a play_tree_iter_stepnel. A kulonbseg az hogy ez visszamehet a jelenlegi lista parentjehez, es az argumentumok szerint lephet. Eztan amikor az iter visszadta a PLAY_TREE_ITER_ENTRYt, hasznalhatod a play_tree_iter_get_file-t hogy megkapd a filet. Ha egynel tobbszor hivod meg, visszaadja az adott bejegyzeshez tartozo kovetkezo filet, vagy loopolja a listat ha nincs tobb file. Megnezheted hogy hany file all rendelkezesre az iter->num_files-sel (?) es hogy melyik adta vissza, azt meg az iter->file-al (?). Ha a bejegyzes DVD,VCD vagy tv, a visszaadott string nem file, hanem "DVD title x", "VCD track x" or "TV channel x". Hogy ezeket megkulonboztessuk egy normalis filetol, lehet csekkolni az iter->tree->entry_type-ot. Tartalmazhat : PLAY_TREE_ENTRY_DVD, PLAY_TREE_ENTRY_VCD, PLAY_TREE_ENTRY_TV or PLAY_TREE_ENTRY_FILE. Ha csekkelni akarsz meg az iterrel, mint pl hogy a kovetkezo bejegyzes helyes-e, egy klont kell letrehoznod a play_tree_iter_new_copy-val. Ez az iter nem fogja befolyasolni a configot, szal azt qrsz vele amit akarsz. Es amikor annyit basztal az iterrel amennyit akartal, szabaditsd meg szenvedeseitol a play_tree_iter_free-vel. Miutan megvolt config parsing, az iterator az mplayer.c-ben jon letre. Meg, a stream megnyitasa utan, ha a stream egy playlist, behelyettesiti a bejegyzest amelyik a playlistet tarolta azzal mi a parsing eredmenye. Az event handlingben megnezi hogy egy lepes megoldhato-e, stb. Es vegul a vegen a kovetkezo bejegyzesre m1.