Hoi RGJ,
Ik wilde een classfile m.b.t. circulaire buffer in phone.c gebruiken, dit lukt mij niet direct want je moet het dan als phone.cpp compileren. Hierna kreeg ik een hoop foutmeldingen m.b.t. de volgorde van procedures en procedureaanroep met een verkeerd aantal parameters.
De (in het hoofdprogramma) gedefineerde openssl procedures werkten ook niet meer in Curl.c, dus alle source van Curl.c in hoofdprogramma gehaald. Het hoofdprogramma is nu 44 duizend regels.
Ik heb mijn oude “portaudio poort” er ook aangekoppeld. Ben momenteel zoekende hoe ik het aan moet koppelen in phone.cpp. Daarnaast zie ik dat er weer een nieuwe versie van Portaudio is. Ook is de (officiële) Wengo source niet goed want het gebruikt te veel CPU in vergelijking met Skype. Het wordt begrensd op 50% CPU. Ik denk dat dit komt door een lus (in ontvangen van packets), die aldoor maar ronddraait zonder voldoende “Sleep”.
Ik wilde een circulaire buffer er tussen zetten. Ik portaudio zit ook een buffer structuur. Ook is RTP protocol van buffers aan elkaar gelinkt. Zie ook Appendix A. b_rptr is eerste byte van de buffer en b_wptr de laatste byte.
Ik heb nog niet getest, maar ik denk dat de thread, die zorgt dat de UDP-packets ontvangen worden, de buffers op volgorde zet afhankelijk van de timestamp. Ik weet namelijk dat UDP-packets wel in een andere volgorde binnenkomen als ze verzonden zijn.
De rtp_header structuur is 76 bytes lang. Ik moet nog uitzoeken of alle 76 bytes over de lijn gaan. Lijkt mij een beetje veel. Ik ben zelf een beetje aan het nadenken om een 16 bits kanaal mee te laten zenden in een RTP packet. Stel je hebt 4 geluidskaarten (telefoons) aanstaan op een peer dan geeft de laagste 2 bits van het “kanaal” de geluidkaart bufferqueue aan waarin de packets gestopt moeten worden. Je kan met 1 if commando ook nog even testen of packet van de goede peer komt. Je voorkomt dan dat je lineair door een lijst gaat zoeken.
Stel dat je een netwerk hebt met 4 telefoons elk op een andere pc’s, dan kan hoofdcomputer via een tabel met 4 elementen het UDP geluidspacket direct naar de juiste locale pc doorrouteren. Een andere oplossing zou kunnen zijn dat je 4 verschillende poorten (portnummers) gaat gebruiken.
Ben dus voorstander om 1 controle (SIP) poort open te zetten naast 1 audio en optioneel 1 video poort. Sommige mensen zeggen je moet een tunnel naar andere peer opzetten, echter je verplaatst het probleem dan naar deze peer. Natuurlijk moet je wel een tunnel gaan opzetten als je achter een firewall blijkt te zitten. Indien je wel vanuit internet te benaderen bent dan zal er voordeel moeten zijn om toch een poort open te zetten.
De vriendelijke groet Jan Marco
Appendix A:
typedef struct msgb
{
struct msgb *b_prev;
struct msgb *b_next;
struct msgb *b_cont;
struct datab *b_datap;
char *b_rptr;
char *b_wptr;
struct timeval bts;
} mblk_t;
Appendix B:
typedef struct rtp_header
{
#ifdef WORDS_BIGENDIAN
guint16 version:2;
guint16 padbit:1;
guint16 extbit:1;
guint16 cc:4;
guint16 markbit:1;
guint16 paytype:7;
#else
guint16 cc:4;
guint16 extbit:1;
guint16 padbit:1;
guint16 version:2;
guint16 paytype:7;
guint16 markbit:1;
#endif
guint16 seq_number;
guint32 timestamp;
guint32 ssrc;
guint32 csrc[16];
} rtp_header_t;