diff --git a/dom/media/webrtc/MediaEngineWebRTC.h b/dom/media/webrtc/MediaEngineWebRTC.h index e5eaa433fff0..ccd0c7523bf7 100644 --- a/dom/media/webrtc/MediaEngineWebRTC.h +++ b/dom/media/webrtc/MediaEngineWebRTC.h @@ -153,6 +153,7 @@ public: virtual int GetRecordingDeviceName(int aIndex, char (&aStrNameUTF8)[128], char aStrGuidUTF8[128]) = 0; virtual int GetRecordingDeviceStatus(bool& aIsAvailable) = 0; + virtual int GetChannelCount(int aDeviceIndex, uint32_t& aChannels) = 0; virtual void StartRecording(SourceMediaStream *aStream, AudioDataListener *aListener) = 0; virtual void StopRecording(SourceMediaStream *aStream) = 0; virtual int SetRecordingDevice(int aIndex) = 0; @@ -264,6 +265,11 @@ public: return 0; } + int GetChannelCount(int aDeviceIndex, uint32_t& aChannels) + { + return GetDeviceMaxChannels(aDeviceIndex, aChannels); + } + static int GetDeviceMaxChannels(int aDeviceIndex, uint32_t& aChannels) { #ifdef MOZ_WIDGET_ANDROID @@ -379,6 +385,12 @@ public: return 0; } + int GetChannelCount(int aDeviceIndex, uint32_t& aChannels) + { + aChannels = 1; // default to mono + return 0; + } + void StartRecording(SourceMediaStream *aStream, AudioDataListener *aListener) {} void StopRecording(SourceMediaStream *aStream) {} diff --git a/dom/media/webrtc/MediaEngineWebRTCAudio.cpp b/dom/media/webrtc/MediaEngineWebRTCAudio.cpp index 324beb8458e6..bd48502e765d 100644 --- a/dom/media/webrtc/MediaEngineWebRTCAudio.cpp +++ b/dom/media/webrtc/MediaEngineWebRTCAudio.cpp @@ -616,11 +616,11 @@ MediaEngineWebRTCMicrophoneSource::InsertInGraph(const T* aBuffer, RefPtr buffer = SharedBuffer::Create(aFrames * aChannels * sizeof(T)); AutoTArray channels; - channels.SetLength(aChannels); if (aChannels == 1) { PodCopy(static_cast(buffer->Data()), aBuffer, aFrames); channels.AppendElement(static_cast(buffer->Data())); } else { + channels.SetLength(aChannels); AutoTArray write_channels; write_channels.SetLength(aChannels); T * samples = static_cast(buffer->Data()); @@ -637,6 +637,7 @@ MediaEngineWebRTCMicrophoneSource::InsertInGraph(const T* aBuffer, write_channels.Elements()); } + MOZ_ASSERT(aChannels == channels.Length()); segment->AppendFrames(buffer.forget(), channels, aFrames, mPrincipalHandles[i]); segment->GetStartTime(insertTime); @@ -789,12 +790,16 @@ MediaEngineWebRTCMicrophoneSource::AllocChannel() } #endif // MOZ_B2G - // Set "codec" to PCM, 32kHz on 1 channel + // Set "codec" to PCM, 32kHz on device's channels ScopedCustomReleasePtr ptrVoECodec(webrtc::VoECodec::GetInterface(mVoiceEngine)); if (ptrVoECodec) { webrtc::CodecInst codec; strcpy(codec.plname, ENCODING); codec.channels = CHANNELS; + uint32_t channels = 0; + if (mAudioInput->GetChannelCount(mCapIndex, channels) == 0) { + codec.channels = channels; + } MOZ_ASSERT(mSampleFrequency == 16000 || mSampleFrequency == 32000); codec.rate = SAMPLE_RATE(mSampleFrequency); codec.plfreq = mSampleFrequency; @@ -896,8 +901,8 @@ MediaEngineWebRTCMicrophoneSource::Process(int channel, if (mState != kStarted) return; - MOZ_ASSERT(!isStereo); - InsertInGraph(audio10ms, length, 1); + uint32_t channels = isStereo ? 2 : 1; + InsertInGraph(audio10ms, length, channels); return; }