src/mediastreamer/audiostream.c

Thu, 05 Jan 2006 05:29:51 +0000

author
Mark Doliner <markdoliner@pidgin.im>
date
Thu, 05 Jan 2006 05:29:51 +0000
changeset 12733
0c1de18b51ed
parent 12029
e47434c9f4af
permissions
-rw-r--r--

[gaim-migrate @ 15077]
jabber.c:389: warning: ISO C90 forbids mixed declarations and code

12024
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
1 /*
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
2 The mediastreamer library aims at providing modular media processing and I/O
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
3 for linphone, but also for any telephony application.
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
4 Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
5
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
6 This library is free software; you can redistribute it and/or
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
7 modify it under the terms of the GNU Lesser General Public
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
8 License as published by the Free Software Foundation; either
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
9 version 2.1 of the License, or (at your option) any later version.
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
10
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
11 This library is distributed in the hope that it will be useful,
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
14 Lesser General Public License for more details.
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
15
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
16 You should have received a copy of the GNU Lesser General Public
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
17 License along with this library; if not, write to the Free Software
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
19 */
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
20
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
21 #include "mediastream.h"
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
22 #ifdef INET6
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
23 #include <sys/types.h>
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
24 #include <sys/socket.h>
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
25 #include <netdb.h>
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
26 #endif
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
27
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
28
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
29 #define MAX_RTP_SIZE 1500
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
30
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
31 /* this code is not part of the library itself, it is part of the mediastream program */
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
32 void audio_stream_free(AudioStream *stream)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
33 {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
34 RtpSession *s;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
35 RtpSession *destroyed=NULL;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
36 if (stream->rtprecv!=NULL) {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
37 s=ms_rtp_recv_get_session(MS_RTP_RECV(stream->rtprecv));
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
38 if (s!=NULL){
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
39 destroyed=s;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
40 rtp_session_destroy(s);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
41 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
42 ms_filter_destroy(stream->rtprecv);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
43 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
44 if (stream->rtpsend!=NULL) {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
45 s=ms_rtp_send_get_session(MS_RTP_SEND(stream->rtpsend));
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
46 if (s!=NULL){
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
47 if (s!=destroyed)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
48 rtp_session_destroy(s);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
49 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
50 ms_filter_destroy(stream->rtpsend);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
51 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
52 if (stream->soundread!=NULL) ms_filter_destroy(stream->soundread);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
53 if (stream->soundwrite!=NULL) ms_filter_destroy(stream->soundwrite);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
54 if (stream->encoder!=NULL) ms_filter_destroy(stream->encoder);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
55 if (stream->decoder!=NULL) ms_filter_destroy(stream->decoder);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
56 if (stream->timer!=NULL) ms_sync_destroy(stream->timer);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
57 g_free(stream);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
58 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
59
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
60 static int dtmf_tab[16]={'0','1','2','3','4','5','6','7','8','9','*','#','A','B','C','D'};
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
61
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
62 static void on_dtmf_received(RtpSession *s,gint dtmf,gpointer user_data)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
63 {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
64 AudioStream *stream=(AudioStream*)user_data;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
65 if (dtmf>15){
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
66 g_warning("Unsupported telephone-event type.");
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
67 return;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
68 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
69 g_message("Receiving dtmf %c.",dtmf_tab[dtmf]);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
70 if (stream!=NULL){
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
71 if (strcmp(stream->soundwrite->klass->name,"OssWrite")==0)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
72 ms_oss_write_play_dtmf(MS_OSS_WRITE(stream->soundwrite),dtmf_tab[dtmf]);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
73 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
74 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
75
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
76 static void on_timestamp_jump(RtpSession *s,guint32* ts, gpointer user_data)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
77 {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
78 g_warning("The remote sip-phone has send data with a future timestamp: %u,"
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
79 "resynchronising session.",*ts);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
80 rtp_session_reset(s);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
81 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
82
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
83 static const char *ip4local="0.0.0.0";
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
84 static const char *ip6local="::";
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
85
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
86 const char *get_local_addr_for(const char *remote)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
87 {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
88 const char *ret;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
89 #ifdef INET6
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
90 struct addrinfo hints, *res0;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
91 int err;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
92 memset(&hints, 0, sizeof(hints));
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
93 hints.ai_family = PF_UNSPEC;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
94 hints.ai_socktype = SOCK_DGRAM;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
95 err = getaddrinfo(remote,"8000", &hints, &res0);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
96 if (err!=0) {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
97 g_warning ("get_local_addr_for: %s", gai_strerror(err));
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
98 return ip4local;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
99 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
100 ret=(res0->ai_addr->sa_family==AF_INET6) ? ip6local : ip4local;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
101 freeaddrinfo(res0);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
102 #else
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
103 ret=ip4local;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
104 #endif
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
105 return ret;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
106 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
107
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
108 void create_duplex_rtpsession(RtpProfile *profile, int locport,char *remip,int remport,
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
109 int payload,int jitt_comp,
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
110 RtpSession **recvsend){
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
111 RtpSession *rtpr;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
112 rtpr=rtp_session_new(RTP_SESSION_SENDRECV);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
113 rtp_session_max_buf_size_set(rtpr,MAX_RTP_SIZE);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
114 rtp_session_set_profile(rtpr,profile);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
115 rtp_session_set_local_addr(rtpr,get_local_addr_for(remip),locport);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
116 if (remport>0) rtp_session_set_remote_addr(rtpr,remip,remport);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
117 rtp_session_set_scheduling_mode(rtpr,0);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
118 rtp_session_set_blocking_mode(rtpr,0);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
119 rtp_session_set_payload_type(rtpr,payload);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
120 rtp_session_set_jitter_compensation(rtpr,jitt_comp);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
121 rtp_session_enable_adaptive_jitter_compensation(rtpr,TRUE);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
122 /*rtp_session_signal_connect(rtpr,"timestamp_jump",(RtpCallback)on_timestamp_jump,NULL);*/
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
123 *recvsend=rtpr;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
124 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
125
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
126 void create_rtp_sessions(RtpProfile *profile, int locport,char *remip,int remport,
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
127 int payload,int jitt_comp,
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
128 RtpSession **recv, RtpSession **send){
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
129 RtpSession *rtps,*rtpr;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
130 /* creates two rtp filters to recv send streams (remote part)*/
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
131
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
132 rtps=rtp_session_new(RTP_SESSION_SENDONLY);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
133 rtp_session_max_buf_size_set(rtps,MAX_RTP_SIZE);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
134 rtp_session_set_profile(rtps,profile);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
135 #ifdef INET6
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
136 rtp_session_set_local_addr(rtps,"::",locport+2);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
137 #else
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
138 rtp_session_set_local_addr(rtps,"0.0.0.0",locport+2);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
139 #endif
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
140 rtp_session_set_remote_addr(rtps,remip,remport);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
141 rtp_session_set_scheduling_mode(rtps,0);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
142 rtp_session_set_blocking_mode(rtps,0);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
143 rtp_session_set_payload_type(rtps,payload);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
144 rtp_session_set_jitter_compensation(rtps,jitt_comp);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
145
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
146 rtpr=rtp_session_new(RTP_SESSION_RECVONLY);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
147 rtp_session_max_buf_size_set(rtpr,MAX_RTP_SIZE);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
148 rtp_session_set_profile(rtpr,profile);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
149 #ifdef INET6
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
150 rtp_session_set_local_addr(rtpr,"::",locport);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
151 #else
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
152 rtp_session_set_local_addr(rtpr,"0.0.0.0",locport);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
153 #endif
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
154 rtp_session_set_scheduling_mode(rtpr,0);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
155 rtp_session_set_blocking_mode(rtpr,0);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
156 rtp_session_set_payload_type(rtpr,payload);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
157 rtp_session_set_jitter_compensation(rtpr,jitt_comp);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
158 rtp_session_signal_connect(rtpr,"telephone-event",(RtpCallback)on_dtmf_received,NULL);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
159 rtp_session_signal_connect(rtpr,"timestamp_jump",(RtpCallback)on_timestamp_jump,NULL);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
160 *recv=rtpr;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
161 *send=rtps;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
162
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
163 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
164
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
165
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
166 AudioStream * audio_stream_start_full(RtpProfile *profile, int locport,char *remip,int remport,
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
167 int payload,int jitt_comp, gchar *infile, gchar *outfile, SndCard *playcard, SndCard *captcard)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
168 {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
169 AudioStream *stream=g_new0(AudioStream,1);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
170 RtpSession *rtps,*rtpr;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
171 PayloadType *pt;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
172
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
173 //create_rtp_sessions(profile,locport,remip,remport,payload,jitt_comp,&rtpr,&rtps);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
174
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
175 create_duplex_rtpsession(profile,locport,remip,remport,payload,jitt_comp,&rtpr);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
176 rtp_session_signal_connect(rtpr,"telephone-event",(RtpCallback)on_dtmf_received,(gpointer)stream);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
177 rtps=rtpr;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
178
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
179 stream->rtpsend=ms_rtp_send_new();
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
180 ms_rtp_send_set_session(MS_RTP_SEND(stream->rtpsend),rtps);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
181 stream->rtprecv=ms_rtp_recv_new();
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
182 ms_rtp_recv_set_session(MS_RTP_RECV(stream->rtprecv),rtpr);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
183
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
184
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
185 /* creates the local part */
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
186 if (infile==NULL) stream->soundread=snd_card_create_read_filter(captcard);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
187 else stream->soundread=ms_read_new(infile);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
188 if (outfile==NULL) stream->soundwrite=snd_card_create_write_filter(playcard);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
189 else stream->soundwrite=ms_write_new(outfile);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
190
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
191 /* creates the couple of encoder/decoder */
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
192 pt=rtp_profile_get_payload(profile,payload);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
193 if (pt==NULL){
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
194 g_error("audiostream.c: undefined payload type.");
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
195 return NULL;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
196 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
197 stream->encoder=ms_encoder_new_with_string_id(pt->mime_type);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
198 stream->decoder=ms_decoder_new_with_string_id(pt->mime_type);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
199 if ((stream->encoder==NULL) || (stream->decoder==NULL)){
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
200 /* big problem: we have not a registered codec for this payload...*/
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
201 audio_stream_free(stream);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
202 g_error("mediastream.c: No decoder available for payload %i.",payload);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
203 return NULL;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
204 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
205 /* give the sound filters some properties */
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
206 ms_filter_set_property(stream->soundread,MS_FILTER_PROPERTY_FREQ,&pt->clock_rate);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
207 ms_filter_set_property(stream->soundwrite,MS_FILTER_PROPERTY_FREQ,&pt->clock_rate);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
208
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
209 /* give the encoder/decoder some parameters*/
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
210 ms_filter_set_property(stream->encoder,MS_FILTER_PROPERTY_FREQ,&pt->clock_rate);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
211 ms_filter_set_property(stream->encoder,MS_FILTER_PROPERTY_BITRATE,&pt->normal_bitrate);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
212 ms_filter_set_property(stream->decoder,MS_FILTER_PROPERTY_FREQ,&pt->clock_rate);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
213 ms_filter_set_property(stream->decoder,MS_FILTER_PROPERTY_BITRATE,&pt->normal_bitrate);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
214
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
215 ms_filter_set_property(stream->encoder,MS_FILTER_PROPERTY_FMTP, (void*)pt->fmtp);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
216 ms_filter_set_property(stream->decoder,MS_FILTER_PROPERTY_FMTP,(void*)pt->fmtp);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
217 /* create the synchronisation source */
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
218 stream->timer=ms_timer_new();
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
219
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
220 /* and then connect all */
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
221 ms_filter_add_link(stream->soundread,stream->encoder);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
222 ms_filter_add_link(stream->encoder,stream->rtpsend);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
223 ms_filter_add_link(stream->rtprecv,stream->decoder);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
224 ms_filter_add_link(stream->decoder,stream->soundwrite);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
225
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
226 ms_sync_attach(stream->timer,stream->soundread);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
227 ms_sync_attach(stream->timer,stream->rtprecv);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
228
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
229 /* and start */
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
230 ms_start(stream->timer);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
231
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
232 return stream;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
233 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
234
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
235 static int defcard=0;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
236
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
237 void audio_stream_set_default_card(int cardindex){
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
238 defcard=cardindex;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
239 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
240
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
241 AudioStream * audio_stream_start_with_files(RtpProfile *prof,int locport,char *remip,
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
242 int remport,int profile,int jitt_comp,gchar *infile, gchar*outfile)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
243 {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
244 return audio_stream_start_full(prof,locport,remip,remport,profile,jitt_comp,infile,outfile,NULL,NULL);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
245 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
246
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
247 AudioStream * audio_stream_start(RtpProfile *prof,int locport,char *remip,int remport,int profile,int jitt_comp)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
248 {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
249 SndCard *sndcard;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
250 sndcard=snd_card_manager_get_card(snd_card_manager,defcard);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
251 return audio_stream_start_full(prof,locport,remip,remport,profile,jitt_comp,NULL,NULL,sndcard,sndcard);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
252 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
253
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
254 AudioStream *audio_stream_start_with_sndcards(RtpProfile *prof,int locport,char *remip,int remport,int profile,int jitt_comp,SndCard *playcard, SndCard *captcard)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
255 {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
256 g_return_val_if_fail(playcard!=NULL,NULL);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
257 g_return_val_if_fail(captcard!=NULL,NULL);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
258 return audio_stream_start_full(prof,locport,remip,remport,profile,jitt_comp,NULL,NULL,playcard,captcard);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
259 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
260
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
261 void audio_stream_set_rtcp_information(AudioStream *st, const char *cname){
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
262 if (st->send_session!=NULL){
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
263 rtp_session_set_source_description(st->send_session,cname,NULL,NULL,NULL,NULL,"linphone-" "2.0.0", // SME
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
264 "This is free software (GPL) !");
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
265 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
266 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
267
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
268 void audio_stream_stop(AudioStream * stream)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
269 {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
270
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
271 ms_stop(stream->timer);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
272 ortp_global_stats_display();
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
273 ms_sync_detach(stream->timer,stream->soundread);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
274 ms_sync_detach(stream->timer,stream->rtprecv);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
275
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
276 ms_filter_remove_links(stream->soundread,stream->encoder);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
277 ms_filter_remove_links(stream->encoder,stream->rtpsend);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
278 ms_filter_remove_links(stream->rtprecv,stream->decoder);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
279 ms_filter_remove_links(stream->decoder,stream->soundwrite);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
280
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
281 audio_stream_free(stream);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
282 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
283
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
284 RingStream * ring_start(gchar *file,gint interval,SndCard *sndcard)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
285 {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
286 return ring_start_with_cb(file,interval,sndcard,NULL,NULL);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
287 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
288
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
289 RingStream * ring_start_with_cb(gchar *file,gint interval,SndCard *sndcard, MSFilterNotifyFunc func,gpointer user_data)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
290 {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
291 RingStream *stream;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
292 int tmp;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
293 g_return_val_if_fail(sndcard!=NULL,NULL);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
294 stream=g_new0(RingStream,1);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
295 stream->source=ms_ring_player_new(file,interval);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
296 if (stream->source==NULL) {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
297 g_warning("Could not create ring player. Probably the ring file (%s) does not exist.",file);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
298 return NULL;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
299 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
300 if (func!=NULL) ms_filter_set_notify_func(MS_FILTER(stream->source),func,user_data);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
301 stream->sndwrite=snd_card_create_write_filter(sndcard);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
302 ms_filter_get_property(stream->source,MS_FILTER_PROPERTY_FREQ,&tmp);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
303 ms_filter_set_property(stream->sndwrite,MS_FILTER_PROPERTY_FREQ,&tmp);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
304 ms_filter_get_property(stream->source,MS_FILTER_PROPERTY_CHANNELS,&tmp);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
305 ms_filter_set_property(stream->sndwrite,MS_FILTER_PROPERTY_CHANNELS,&tmp);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
306 stream->timer=ms_timer_new();
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
307 ms_filter_add_link(stream->source,stream->sndwrite);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
308 ms_sync_attach(stream->timer,stream->source);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
309 ms_start(stream->timer);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
310 return stream;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
311 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
312
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
313 void ring_stop(RingStream *stream)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
314 {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
315 ms_stop(stream->timer);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
316 ms_sync_detach(stream->timer,stream->source);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
317 ms_sync_destroy(stream->timer);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
318 ms_filter_remove_links(stream->source,stream->sndwrite);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
319 ms_filter_destroy(stream->source);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
320 ms_filter_destroy(stream->sndwrite);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
321 g_free(stream);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
322 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
323
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
324 /* returns the latency in samples if the audio device with id dev_id is openable in full duplex mode, else 0 */
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
325 gint test_audio_dev(int dev_id)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
326 {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
327 gint err;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
328 SndCard *sndcard=snd_card_manager_get_card(snd_card_manager,dev_id);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
329 if (sndcard==NULL) return -1;
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
330 err=snd_card_probe(sndcard,16,0,8000);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
331 return err; /* return latency in number of sample */
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
332 }
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
333
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
334 gint audio_stream_send_dtmf(AudioStream *stream, gchar dtmf)
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
335 {
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
336 ms_rtp_send_dtmf(MS_RTP_SEND(stream->rtpsend), dtmf);
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
337 ms_oss_write_play_dtmf(MS_OSS_WRITE(stream->soundwrite),dtmf);
12029
e47434c9f4af [gaim-migrate @ 14322]
Gary Kramlich <grim@reaperworld.com>
parents: 12024
diff changeset
338
e47434c9f4af [gaim-migrate @ 14322]
Gary Kramlich <grim@reaperworld.com>
parents: 12024
diff changeset
339 /* not sure what this should be returning, nothing in mediastreamer calls
e47434c9f4af [gaim-migrate @ 14322]
Gary Kramlich <grim@reaperworld.com>
parents: 12024
diff changeset
340 * it directly, assuming 0 is okay here. -- Gary
e47434c9f4af [gaim-migrate @ 14322]
Gary Kramlich <grim@reaperworld.com>
parents: 12024
diff changeset
341 */
e47434c9f4af [gaim-migrate @ 14322]
Gary Kramlich <grim@reaperworld.com>
parents: 12024
diff changeset
342 return 0;
12024
5a87b77fcc3c [gaim-migrate @ 14317]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
343 }

mercurial