Bug 1397793 - Move away from VoEExternalMedia "external" API in AudioConduit.cpp. r?dminor draft
authorPaul Adenot <paul@paul.cx>
Tue, 31 Oct 2017 17:33:42 +0100
changeset 707559 f9ed6f1beeb3745dc17c4e6264808d1918e8906c
parent 707558 588d188f63237f1ce2cb0f2b290d54797d2d22e8
child 707560 65515c02928ed56d57ddd2facd586125df7f09ec
push id92158
push userpaul@paul.cx
push dateTue, 05 Dec 2017 14:38:23 +0000
reviewersdminor
bugs1397793
milestone59.0a1
Bug 1397793 - Move away from VoEExternalMedia "external" API in AudioConduit.cpp. r?dminor This forces us to do a copy. It's not the end of the world but could be avoided. The number of channels received is now explicit (via `AudioFrame::num_channels_`), instead of being guessed based on the number of samples (considering we're always dealing with 10ms of audio, and we know the rate). It's still coupled a bit with audio devices, but we cheat, and use a "fake audio device", which isn't going to touch actual OS APIs. MozReview-Commit-ID: 1Tfajkv1HQR
media/webrtc/signaling/src/media-conduit/AudioConduit.h
media/webrtc/signaling/src/mediapipeline/MediaPipeline.cpp
media/webrtc/signaling/src/mediapipeline/MediaPipeline.h
media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
--- a/media/webrtc/signaling/src/media-conduit/AudioConduit.h
+++ b/media/webrtc/signaling/src/media-conduit/AudioConduit.h
@@ -12,16 +12,17 @@
 #include "nsTArray.h"
 
 #include "MediaConduitInterface.h"
 #include "MediaEngineWrapper.h"
 #include "RtpSourceObserver.h"
 
 // Audio Engine Includes
 #include "webrtc/common_types.h"
+#include "webrtc/modules/audio_device/include/fake_audio_device.h"
 #include "webrtc/voice_engine/include/voe_base.h"
 #include "webrtc/voice_engine/include/voe_volume_control.h"
 #include "webrtc/voice_engine/include/voe_codec.h"
 #include "webrtc/voice_engine/include/voe_file.h"
 #include "webrtc/voice_engine/include/voe_network.h"
 #include "webrtc/voice_engine/include/voe_external_media.h"
 #include "webrtc/voice_engine/include/voe_audio_processing.h"
 #include "webrtc/voice_engine/include/voe_video_sync.h"
@@ -169,16 +170,17 @@ public:
   virtual bool SendRtcp(const uint8_t *data,
                         size_t len) override;
 
   virtual uint64_t CodecPluginID() override { return 0; }
   virtual void SetPCHandle(const std::string& aPCHandle) override {}
 
   explicit WebrtcAudioConduit():
                       mVoiceEngine(nullptr),
+                      mFakeAudioDevice(new webrtc::FakeAudioDeviceModule()),
                       mTransportMonitor("WebrtcAudioConduit"),
                       mTransmitterTransport(nullptr),
                       mReceiverTransport(nullptr),
                       mEngineTransmitting(false),
                       mEngineReceiving(false),
                       mChannel(-1),
                       mDtmfEnabled(false),
                       mCodecMutex("AudioConduit codec db"),
@@ -292,16 +294,17 @@ private:
                            const AudioCodecConfig* codecInfo) const;
   //Checks the codec to be applied
   MediaConduitErrorCode ValidateCodecConfig(const AudioCodecConfig* codecInfo, bool send);
 
   //Utility function to dump recv codec database
   void DumpCodecDB() const;
 
   webrtc::VoiceEngine* mVoiceEngine;
+  UniquePtr<webrtc::FakeAudioDeviceModule> mFakeAudioDevice;
   mozilla::ReentrantMonitor mTransportMonitor;
   RefPtr<TransportInterface> mTransmitterTransport;
   RefPtr<TransportInterface> mReceiverTransport;
   ScopedCustomReleasePtr<webrtc::VoENetwork>   mPtrVoENetwork;
   ScopedCustomReleasePtr<webrtc::VoEBase>      mPtrVoEBase;
   ScopedCustomReleasePtr<webrtc::VoECodec>     mPtrVoECodec;
   ScopedCustomReleasePtr<webrtc::VoEExternalMedia> mPtrVoEXmedia;
   ScopedCustomReleasePtr<webrtc::VoEAudioProcessing> mPtrVoEProcessing;
@@ -329,16 +332,18 @@ private:
   Mutex mCodecMutex; // protects mCurSendCodecConfig
   nsAutoPtr<AudioCodecConfig> mCurSendCodecConfig;
 
   // Current "capture" delay (really output plus input delay)
   int32_t mCaptureDelay;
 
   uint32_t mLastTimestamp;
 
+  webrtc::AudioFrame mAudioFrame; // for output pulls
+
   uint32_t mSamples;
   uint32_t mLastSyncLog;
 
   RtpSourceObserver mRtpSourceObserver;
 };
 
 } // end namespace
 
--- a/media/webrtc/signaling/src/mediapipeline/MediaPipeline.cpp
+++ b/media/webrtc/signaling/src/mediapipeline/MediaPipeline.cpp
@@ -2099,17 +2099,17 @@ public:
 
       segment.AppendFrames(samples.forget(), outputChannels, frames,
                            principal_handle_);
 
       // Handle track not actually added yet or removed/finished
       if (source_->AppendToTrack(track_id_, &segment)) {
         played_ticks_ += frames;
         if (MOZ_LOG_TEST(AudioLogModule(), LogLevel::Debug)) {
-          if (played_ticks_ > last_log_ + graph->GraphRate()) { // ~ 1 second
+          if (played_ticks_ > last_log_ + rate) { // ~ 1 second
             MOZ_LOG(AudioLogModule(), LogLevel::Debug,
                     ("%p: Inserting %zu samples into track %d, total = %" PRIu64,
                      (void*) this, frames, track_id_, played_ticks_));
             last_log_ = played_ticks_;
           }
         }
       } else {
         CSFLogError(LOGTAG, "AppendToTrack failed");
--- a/media/webrtc/signaling/src/mediapipeline/MediaPipeline.h
+++ b/media/webrtc/signaling/src/mediapipeline/MediaPipeline.h
@@ -22,17 +22,16 @@
 #include "AudioPacketizer.h"
 #include "StreamTracks.h"
 #include "signaling/src/peerconnection/PacketDumper.h"
 
 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
 
 // Should come from MediaEngine.h, but that's a pain to include here
 // because of the MOZILLA_EXTERNAL_LINKAGE stuff.
-#define WEBRTC_DEFAULT_SAMPLE_RATE 32000
 #define WEBRTC_MAX_SAMPLE_RATE 48000
 
 class nsIPrincipal;
 
 namespace mozilla {
 class MediaPipelineFilter;
 class PeerIdentity;
 class AudioProxyThread;
--- a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
+++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
@@ -2264,16 +2264,17 @@ PeerConnectionImpl::InsertAudioLevelForC
     if (transceiver->HasReceiveTrack(&aRecvTrack)) {
       transceiver->InsertAudioLevelForContributingSource(aSource,
                                                          aTimestamp,
                                                          aHasLevel,
                                                          aLevel);
       break;
     }
   }
+
   return NS_OK;
 }
 
 nsresult
 PeerConnectionImpl::AddRIDExtension(MediaStreamTrack& aRecvTrack,
                                     unsigned short aExtensionId)
 {
   return mMedia->AddRIDExtension(aRecvTrack, aExtensionId);