15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_TEST_WEBRTC_AUDIO_DEVICE_TEST_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_TEST_WEBRTC_AUDIO_DEVICE_TEST_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/media/mock_media_observer.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/content_renderer_client.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ipc/ipc_listener.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/audio_hardware_config.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/channel_layout.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/webrtc/common_types.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace IPC { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Channel; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioManager; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContext; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace webrtc { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VoENetwork; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace win { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedCOMInitializer; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AudioMirroringManager; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentRendererClient; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MediaStreamManager; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderThreadImpl; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceContext; 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class TestAudioInputRendererHost; 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class TestAudioRendererHost; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestBrowserThread; 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class WebRtcAudioRenderer; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebRTCMockRenderProcess; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Scoped class for WebRTC interfaces. Fetches the wrapped interface 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the constructor via WebRTC's GetInterface mechanism and then releases 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the reference in the destructor. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedWebRTCPtr { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename Engine> 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ScopedWebRTCPtr(Engine* e) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ptr_(T::GetInterface(e)) {} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ScopedWebRTCPtr(T* p) : ptr_(p) {} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedWebRTCPtr() { reset(); } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T* operator->() const { return ptr_; } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T* get() const { return ptr_; } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Releases the current pointer. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void reset() { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ptr_) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr_->Release(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr_ = NULL; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool valid() const { return ptr_ != NULL; } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T* ptr_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Wrapper to automatically calling T::Delete in the destructor. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is useful for some WebRTC objects that have their own Create/Delete 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// methods and we can't use our our scoped_* classes. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebRTCAutoDelete { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebRTCAutoDelete() : ptr_(NULL) {} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit WebRTCAutoDelete(T* ptr) : ptr_(ptr) {} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~WebRTCAutoDelete() { reset(); } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void reset() { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ptr_) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T::Delete(ptr_); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr_ = NULL; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T* operator->() { return ptr_; } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T* get() const { return ptr_; } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool valid() const { return ptr_ != NULL; } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T* ptr_; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implemented and defined in the cc file. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ReplaceContentClientRenderer; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Temporarily disabled in LeakSanitizer builds due to memory leaks. 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// http://crbug.com/148865 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Disabling all tests for now since they are flaky. 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// http://crbug.com/167298 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define MAYBE_WebRTCAudioDeviceTest DISABLED_WebRTCAudioDeviceTest 121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class MAYBE_WebRTCAudioDeviceTest : public ::testing::Test, 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public IPC::Listener { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MAYBE_WebRTCAudioDeviceTest(); 126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual ~MAYBE_WebRTCAudioDeviceTest(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sends an IPC message to the IO thread channel. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Send(IPC::Message* message); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetAudioHardwareConfig(media::AudioHardwareConfig* hardware_config); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<WebRtcAudioRenderer> CreateDefaultWebRtcAudioRenderer( 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int render_view_id); 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitializeIOThread(const char* thread_name); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UninitializeIOThread(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateChannel(const char* name); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DestroyChannel(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnGetAudioHardwareConfig(media::AudioParameters* input_params, 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::AudioParameters* output_params); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IPC::Listener implementation. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Posts a final task to the IO message loop and waits for completion. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForIOThreadCompletion(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForAudioManagerCompletion(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForMessageLoopCompletion(base::MessageLoopProxy* loop); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string GetTestDataPath(const base::FilePath::StringType& file_name); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ReplaceContentClientRenderer> saved_content_renderer_; 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoopForUI message_loop_; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentRendererClient content_renderer_client_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl* render_thread_; // Owned by mock_process_. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebRTCMockRenderProcess> mock_process_; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MediaStreamManager> media_stream_manager_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<media::AudioManager> audio_manager_; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<AudioMirroringManager> mirroring_manager_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::URLRequestContext> test_request_context_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ResourceContext> resource_context_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<IPC::Channel> channel_; 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<TestAudioRendererHost> audio_render_host_; 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<TestAudioInputRendererHost> audio_input_renderer_host_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::AudioHardwareConfig* audio_hardware_config_; // Weak reference. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialized on the main test thread that we mark as the UI thread. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestBrowserThread> ui_thread_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialized on our IO thread to satisfy BrowserThread::IO checks. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestBrowserThread> io_thread_; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // COM initialization on the IO thread. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::win::ScopedCOMInitializer> initialize_com_; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are initialized when we set up our IO thread. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_input_devices_; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_output_devices_; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The previous state for whether sandbox support was enabled in 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewWebKitPlatformSupportImpl. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool sandbox_was_enabled_; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A very basic implementation of webrtc::Transport that acts as a transport 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but just forwards all calls to a local webrtc::VoENetwork implementation. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ownership of the VoENetwork object lies outside the class. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebRTCTransportImpl : public webrtc::Transport { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit WebRTCTransportImpl(webrtc::VoENetwork* network); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WebRTCTransportImpl(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int SendPacket(int channel, const void* data, int len) OVERRIDE; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int SendRTCPPacket(int channel, const void* data, int len) OVERRIDE; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webrtc::VoENetwork* network_; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_TEST_WEBRTC_AUDIO_DEVICE_TEST_H_ 211