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();