Quick Start Module Programming for PM Γιάννης Βλαχογιάννης Για να καταλάβουμε κάποια βασικά πράγματα για το PM , ας υποθέσουμε ότι θέλουμε αρχικά να βάλουμε μέσα στο API του ήχου μία καινούργια εντολή , την ising( ) ας πούμε . Αυτά που πρέπει να κάνουμε είναι τα εξής : 1.Ανοίγουμε το pml.c και κάτω από το // optional - OSD_SOUND_DEV , δηλώνουμε modinf->routines.osd.ising = dl_optional_getfuncptr(modinf, "pm_osd_ising"); 2.Ανοίγουμε το vram.c ( αφού θέλουμε όταν συναντήσουμε την ακολουθία \z να υπάρξει ένα beep -beep )χει και προσθέτουμε στο : void vr_print(const char *str) μέσα στο switch : case '\z': dev_beep(); dev_beep(); break; Φυσικά μπορούμε να καλέσουμε όποια συνάρτηση θέλουμε αντί για την dev_beep . Ίσως να υπάρχουν και κάποια άλλα πράγματα που πρέπει να γίνουν αλλά δεν τα θυμάμαι χεχε . Όπως και να είναι κοιτάζοντας ένα module και ακολουθόντας τα include αρχεία δεν είναι δύσκολο να φτιάξουμε ένα module . Για να φτιάξουμε ένα module τα βασικά μέρη στα οποία πρέπει να το δηλώσουμε είναι ( αν θυμάμαι καλά ... ) 1.Στο pm_app.c ---- Κοιτώντας το osd_module φτιάχνουμε κάτι παρόμοιο ( αν όχι copy - paste :) Δεν πρέπει να ξεχάσουμε και μία release ρουτίνα !!! 2.Κάνουμε ένα #include το module μας στο pm_mid.h ( πχ #include "pm_speech_module.h" ) 3.Στο pml.h προσθέτουμε #include "pm_speech_module.h" Φυσικά , το επόμενο βήμα είναι να εξετάσουμε λίγο το τι πρέπει να έχει το pm_speech_module.h μέσα . Κάποια άλλη φορά , θα εξηγήσω ακριβώς κάθε ένα header αρχείο που υπάρχει μέσα σε ένα Module αλλά ο σκοπός αυτού του tutorial είναι να μπορεί κάποιος να φτιάχνει γρήγορα ένα module χωρίς να πρέπει να μπλέκει με όλες τις λειτουργίες του Pm . Φυσικά , ίσως να έχω ξεχάσει να βάλω πολλά σε αυτό το tutorial αλλά σίγουρα είναι κάποια αρχή !!! Feedback is Welcomed !!! Και μετά από αυτό το διάλλειμα συνεχίζουμε !!! Να πως πρέπει να είναι ένα pm_speech_module.h /* * pm_speech_module.h: Purpose of module * * Module Programmer - Date */ #if !defined(_pm_speech_module_h) #define _pm_speech_module_h #include "pm_module.h" #if defined(__cplusplus) extern "C" { #endif typedef struct { // Maybe this struct should // be joined with the next struct ? int version; // version of this structure } pm_osd_sysinfo_t; // And pm_osd_sysinfo_t should // change to pm_sound_sysinfo_t // typedef struct { mid_t mid; // used for user // interface and I DONT // WANT 2 STRUCTURES OF // THE SAME THING void (*sysinfo)(mid_t mid, pm_osd_sysinfo_t *); void (*ising)(mid_t mid); // την ising την είχαμε // φτιάξει πιο πριν - look up // φυσικά μπορούμε να βάλουμε όλες τις καινούργιες //συναρτήσεις του module μας εδώ } pm_osd_routine_table_t; void pm_osd_ising(mid_t mid); #if defined(__cplusplus) } #endif #endif Φυσικά το λάθος εδώ είναι ότι αν και μιλάμε για ένα sound module , οι συναρτήσεις μας βρίσκονται μέσα σε pm_osd_.... , ενώ θα έπρεπε να είναι μέσα σε κάποιο pm_snd_module . Δεν είναι συντακτικό λάθος αλλά γενικά ας υπάρχει κάποιος γενικός διαχωρισμός σε vfs , osd και snd . Αυτά ... Αν και πρόχειρο και messed up tutorial , ίσως να είναι λίγο διαφωτιστικό ,χωρίς να μπλέκει σε λεπτομέρειες του Pm όπως στο κόλπο επικοινωνίας του Pm και modules μέσω shared memory h unix sockets ( αν η εφαρμογή δεν τρέχει στο ίδιο μηχάνημα ... ) κάτι που είναι εύκολο να το δει κανείς αν προσέξει ότι όλες οι κλήσεις είναι Pointers σε structures ... Αν υπάρχουν bug είναι γιατί το κείμενο αυτό γράφτηκε σε Windows ...