Sophie

Sophie

distrib > Fedora > 18 > x86_64 > by-pkgid > 8e2e4769e0b5d2d650eba022d03068c0 > files > 7

psimedia-1.0.3-11.fc18.src.rpm

diff --git a/gstprovider/modes.cpp b/gstprovider/modes.cpp
index dcba8ad..b99422c 100644
--- a/gstprovider/modes.cpp
+++ b/gstprovider/modes.cpp
@@ -67,7 +67,7 @@ QList<PAudioParams> modes_supportedAudio()
 		p.sampleSize = 16;
 		p.channels = 1;
 		list += p;
-	}
+	}*/
 	{
 		PAudioParams p;
 		p.codec = "speex";
@@ -75,7 +75,7 @@ QList<PAudioParams> modes_supportedAudio()
 		p.sampleSize = 16;
 		p.channels = 1;
 		list += p;
-	}*/
+	}
 	{
 		PAudioParams p;
 		p.codec = "speex";
diff --git a/gstprovider/rtpworker.cpp b/gstprovider/rtpworker.cpp
index 35ae41d..3841e1b 100644
--- a/gstprovider/rtpworker.cpp
+++ b/gstprovider/rtpworker.cpp
@@ -970,6 +970,11 @@ bool RtpWorker::setupSendRecv()
 
 bool RtpWorker::startSend()
 {
+  return startSend(16000);
+}
+
+bool RtpWorker::startSend(int rate)
+{
 	// file source
 	if(!infile.isEmpty() || !indata.isEmpty())
 	{
@@ -1056,7 +1061,7 @@ bool RtpWorker::startSend()
 
 	if(audiosrc)
 	{
-		if(!addAudioChain())
+		if(!addAudioChain(rate))
 		{
 			delete pd_audiosrc;
 			pd_audiosrc = 0;
@@ -1193,15 +1198,22 @@ bool RtpWorker::startRecv()
 
 	// TODO: support more than speex
 	int speex_at = -1;
+	int samplerate = -1;
 	for(int n = 0; n < remoteAudioPayloadInfo.count(); ++n)
 	{
 		const PPayloadInfo &ri = remoteAudioPayloadInfo[n];
-		if(ri.name.toUpper() == "SPEEX" && ri.clockrate == 16000)
+		if(ri.name.toUpper() == "SPEEX")
 		{
-			speex_at = n;
-			break;
+			if (ri.clockrate > samplerate) {
+			  speex_at = n;
+			  samplerate = ri.clockrate;
+			}
 		}
 	}
+	if (samplerate != 16000) {
+	  cleanup();
+	  startSend(samplerate);
+	}
 
 	// TODO: support more than theora
 	int theora_at = -1;
@@ -1461,9 +1473,13 @@ fail1:
 
 bool RtpWorker::addAudioChain()
 {
+  return addAudioChain(16000);
+}
+
+bool RtpWorker::addAudioChain(int rate)
+{
 	// TODO: support other codecs.  for now, we only support speex 16khz
 	QString codec = "speex";
-	int rate = 16000;
 	int size = 16;
 	int channels = 1;
 	//QString codec = localAudioParams[0].codec;
@@ -1479,7 +1495,7 @@ bool RtpWorker::addAudioChain()
 	for(int n = 0; n < remoteAudioPayloadInfo.count(); ++n)
 	{
 		const PPayloadInfo &ri = remoteAudioPayloadInfo[n];
-		if(ri.name.toUpper() == "SPEEX" && ri.clockrate == 16000)
+		if(ri.name.toUpper() == "SPEEX" && ri.clockrate == rate)
 		{
 			pt = ri.id;
 			break;
@@ -1684,7 +1700,20 @@ bool RtpWorker::getCaps()
 
 		gst_caps_unref(caps);
 
-		localAudioPayloadInfo = QList<PPayloadInfo>() << pi;
+		PPayloadInfo speexnb;
+		speexnb.id = 97;
+		speexnb.name = "SPEEX";
+		speexnb.clockrate = 8000;
+		speexnb.channels = 1;
+		speexnb.ptime = pi.ptime;
+		speexnb.maxptime = pi.maxptime;
+		
+		QList<PPayloadInfo> ppil;
+		ppil << pi;
+		ppil << speexnb;
+		
+		
+		localAudioPayloadInfo = ppil;
 		canTransmitAudio = true;
 	}
 
diff --git a/gstprovider/rtpworker.h b/gstprovider/rtpworker.h
index 0e9302a..fef6008 100644
--- a/gstprovider/rtpworker.h
+++ b/gstprovider/rtpworker.h
@@ -177,8 +177,10 @@ private:
 
 	bool setupSendRecv();
 	bool startSend();
+	bool startSend(int rate);
 	bool startRecv();
 	bool addAudioChain();
+	bool addAudioChain(int rate);
 	bool addVideoChain();
 	bool getCaps();
 	bool updateTheoraConfig();