rtpsignaltable.c 2.46 KB
Newer Older
aymeric's avatar
aymeric committed
1
/*
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 * The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) implementation with additional features.
 * Copyright (C) 2017 Belledonne Communications SARL
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
aymeric's avatar
aymeric committed
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33



#include <ortp/rtpsession.h>
#include "utils.h"


void rtp_signal_table_init(RtpSignalTable *table,RtpSession *session, const char *signal_name)
{
	memset(table,0,sizeof(RtpSignalTable));
	table->session=session;
	table->signal_name=signal_name;
	session->signal_tables=o_list_append(session->signal_tables,(void*)table);
}

34
int rtp_signal_table_add(RtpSignalTable *table,RtpCallback cb, void *user_data)
aymeric's avatar
aymeric committed
35 36
{
	int i;
37

aymeric's avatar
aymeric committed
38 39 40 41 42 43 44 45 46 47 48
	for (i=0;i<RTP_CALLBACK_TABLE_MAX_ENTRIES;i++){
		if (table->callback[i]==NULL){
			table->callback[i]=cb;
			table->user_data[i]=user_data;
			table->count++;
			return 0;
		}
	}
	return -1;
}

49

50
void rtp_signal_table_emit(RtpSignalTable *table)
aymeric's avatar
aymeric committed
51 52
{
	int i,c;
53

aymeric's avatar
aymeric committed
54 55 56
	for (i=0,c=0;c<table->count;i++){
		if (table->callback[i]!=NULL){
			c++;	/*I like it*/
57
			table->callback[i](table->session,table->user_data[i],0,0);
aymeric's avatar
aymeric committed
58 59 60 61
		}
	}
}

62
void rtp_signal_table_emit2(RtpSignalTable *table, void *arg)
aymeric's avatar
aymeric committed
63
{
64 65 66 67 68
	int i,c;

	for (i=0,c=0;c<table->count;i++){
		if (table->callback[i]!=NULL){
			c++;	/*I like it*/
69
			table->callback[i](table->session,arg,table->user_data[i],0);
70 71
		}
	}
aymeric's avatar
aymeric committed
72 73
}

74
void rtp_signal_table_emit3(RtpSignalTable *table, void *arg1, void *arg2)
aymeric's avatar
aymeric committed
75
{
76 77 78 79 80
	int i,c;

	for (i=0,c=0;c<table->count;i++){
		if (table->callback[i]!=NULL){
			c++;	/*I like it*/
81
			table->callback[i](table->session,arg1,arg2,table->user_data[i]);
82 83
		}
	}
aymeric's avatar
aymeric committed
84 85 86 87 88
}

int rtp_signal_table_remove_by_callback(RtpSignalTable *table,RtpCallback cb)
{
	int i;
89

aymeric's avatar
aymeric committed
90 91 92 93 94 95 96 97 98 99
	for (i=0;i<RTP_CALLBACK_TABLE_MAX_ENTRIES;i++){
		if (table->callback[i]==cb){
			table->callback[i]=NULL;
			table->user_data[i]=0;
			table->count--;
			return 0;
		}
	}
	return -1;
}