Reland 28629004: adding new AEC dump start interface for chrome. This is required because we are not allow to pass CRT objects across dll boundaries, that says, when we pass a file descriptor from chrome dll to libpeerconnection dll, the file descriptor will become invalid immediate, more information can be found here: http://msdn.microsoft.com/en-us/library/ms235460.aspx R=andresp@webrtc.org, andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, henrikg@webrtc.org Review URL: https://webrtc-codereview.appspot.com/30629004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@7418 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/base/BUILD.gn b/webrtc/base/BUILD.gn index 3be8a3a..be53e40 100644 --- a/webrtc/base/BUILD.gn +++ b/webrtc/base/BUILD.gn
@@ -111,6 +111,8 @@ "md5.cc", "md5.h", "md5digest.h", + "platform_file.cc", + "platform_file.h", "stringencode.cc", "stringencode.h", "stringutils.cc",
diff --git a/webrtc/base/base.gyp b/webrtc/base/base.gyp index 07f4c0b..569db74 100644 --- a/webrtc/base/base.gyp +++ b/webrtc/base/base.gyp
@@ -46,6 +46,8 @@ 'md5.cc', 'md5.h', 'md5digest.h', + 'platform_file.cc', + 'platform_file.h', 'stringencode.cc', 'stringencode.h', 'stringutils.cc',
diff --git a/webrtc/base/fileutils.cc b/webrtc/base/fileutils.cc index 06d76d2..24375c9 100644 --- a/webrtc/base/fileutils.cc +++ b/webrtc/base/fileutils.cc
@@ -10,13 +10,6 @@ #include <assert.h> -#if defined(WEBRTC_WIN) -// TODO(grunell): Remove io.h includes when Chromium has started -// to use AEC in each source. http://crbug.com/264611. -#include <io.h> -#include "webrtc/base/win32.h" -#endif - #include "webrtc/base/pathutils.h" #include "webrtc/base/fileutils.h" #include "webrtc/base/stringutils.h" @@ -279,28 +272,4 @@ return true; } -// Taken from Chromium's base/platform_file_*.cc. -// TODO(grunell): Remove when Chromium has started to use AEC in each source. -// http://crbug.com/264611. -FILE* FdopenPlatformFileForWriting(PlatformFile file) { -#if defined(WEBRTC_WIN) - if (file == kInvalidPlatformFileValue) - return NULL; - int fd = _open_osfhandle(reinterpret_cast<intptr_t>(file), 0); - if (fd < 0) - return NULL; - return _fdopen(fd, "w"); -#else - return fdopen(file, "w"); -#endif -} - -bool ClosePlatformFile(PlatformFile file) { -#if defined(WEBRTC_WIN) - return CloseHandle(file) != 0; -#else - return close(file); -#endif -} - } // namespace rtc
diff --git a/webrtc/base/fileutils.h b/webrtc/base/fileutils.h index 33ce457..9112952 100644 --- a/webrtc/base/fileutils.h +++ b/webrtc/base/fileutils.h
@@ -13,9 +13,7 @@ #include <string> -#if defined(WEBRTC_WIN) -#include "webrtc/base/win32.h" -#else +#if !defined(WEBRTC_WIN) #include <dirent.h> #include <stdio.h> #include <sys/stat.h> @@ -25,6 +23,7 @@ #include "webrtc/base/basictypes.h" #include "webrtc/base/common.h" +#include "webrtc/base/platform_file.h" #include "webrtc/base/scoped_ptr.h" namespace rtc { @@ -436,24 +435,6 @@ // process). bool CreateUniqueFile(Pathname& path, bool create_empty); -// Taken from Chromium's base/platform_file.h. -// Don't use ClosePlatformFile to close a file opened with FdopenPlatformFile. -// Use fclose instead. -// TODO(grunell): Remove when Chromium has started to use AEC in each source. -// http://crbug.com/264611. -#if defined(WEBRTC_WIN) -typedef HANDLE PlatformFile; -const PlatformFile kInvalidPlatformFileValue = INVALID_HANDLE_VALUE; -#elif defined(WEBRTC_POSIX) -typedef int PlatformFile; -const PlatformFile kInvalidPlatformFileValue = -1; -#else -#error Unsupported platform -#endif - -FILE* FdopenPlatformFileForWriting(PlatformFile file); -bool ClosePlatformFile(PlatformFile file); - } // namespace rtc #endif // WEBRTC_BASE_FILEUTILS_H_
diff --git a/webrtc/base/platform_file.cc b/webrtc/base/platform_file.cc new file mode 100644 index 0000000..d518b74 --- /dev/null +++ b/webrtc/base/platform_file.cc
@@ -0,0 +1,49 @@ +/* + * Copyright 2014 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "webrtc/base/platform_file.h" + +#if defined(WEBRTC_WIN) +#include <io.h> +#else +#include <unistd.h> +#endif + +namespace rtc { + +#if defined(WEBRTC_WIN) +const PlatformFile kInvalidPlatformFileValue = INVALID_HANDLE_VALUE; + +FILE* FdopenPlatformFileForWriting(PlatformFile file) { + if (file == kInvalidPlatformFileValue) + return NULL; + int fd = _open_osfhandle(reinterpret_cast<intptr_t>(file), 0); + if (fd < 0) + return NULL; + + return _fdopen(fd, "w"); +} + +bool ClosePlatformFile(PlatformFile file) { + return CloseHandle(file) != 0; +} +#else +const PlatformFile kInvalidPlatformFileValue = -1; + +FILE* FdopenPlatformFileForWriting(PlatformFile file) { + return fdopen(file, "w"); +} + +bool ClosePlatformFile(PlatformFile file) { + return close(file); +} +#endif + +} // namespace rtc
diff --git a/webrtc/base/platform_file.h b/webrtc/base/platform_file.h new file mode 100644 index 0000000..12e08e9 --- /dev/null +++ b/webrtc/base/platform_file.h
@@ -0,0 +1,44 @@ +/* + * Copyright 2014 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef WEBRTC_BASE_PLATFORM_FILE_H_ +#define WEBRTC_BASE_PLATFORM_FILE_H_ + +#include <stdio.h> + +#if defined(WEBRTC_WIN) +#include <windows.h> +#endif + +namespace rtc { + +#if defined(WEBRTC_WIN) +typedef HANDLE PlatformFile; +#elif defined(WEBRTC_POSIX) +typedef int PlatformFile; +#else +#error Unsupported platform +#endif + +extern const PlatformFile kInvalidPlatformFileValue; + +// Associates a standard FILE stream with an existing PlatformFile. +// Note that after this function has returned a valid FILE stream, +// the PlatformFile should no longer be used. +FILE* FdopenPlatformFileForWriting(PlatformFile file); + +// Closes a PlatformFile. +// Don't use ClosePlatformFile to close a file opened with FdopenPlatformFile. +// Use fclose instead. +bool ClosePlatformFile(PlatformFile file); + +} // namespace rtc + +#endif // WEBRTC_BASE_PLATFORM_FILE_H_
diff --git a/webrtc/modules/audio_processing/BUILD.gn b/webrtc/modules/audio_processing/BUILD.gn index d631adc..2ef2bdf 100644 --- a/webrtc/modules/audio_processing/BUILD.gn +++ b/webrtc/modules/audio_processing/BUILD.gn
@@ -157,6 +157,7 @@ } deps += [ + "../../base:rtc_base_approved", "../../common_audio", "../../system_wrappers", ]
diff --git a/webrtc/modules/audio_processing/audio_processing.gypi b/webrtc/modules/audio_processing/audio_processing.gypi index 9bbcfae..ce65f64 100644 --- a/webrtc/modules/audio_processing/audio_processing.gypi +++ b/webrtc/modules/audio_processing/audio_processing.gypi
@@ -9,6 +9,7 @@ { 'variables': { 'audio_processing_dependencies': [ + '<(webrtc_root)/base/base.gyp:rtc_base_approved', '<(webrtc_root)/common_audio/common_audio.gyp:common_audio', '<(webrtc_root)/system_wrappers/source/system_wrappers.gyp:system_wrappers', ],
diff --git a/webrtc/modules/audio_processing/audio_processing_impl.cc b/webrtc/modules/audio_processing/audio_processing_impl.cc index d91cbd2..d6e2906 100644 --- a/webrtc/modules/audio_processing/audio_processing_impl.cc +++ b/webrtc/modules/audio_processing/audio_processing_impl.cc
@@ -12,6 +12,7 @@ #include <assert.h> +#include "webrtc/base/platform_file.h" #include "webrtc/common_audio/include/audio_util.h" #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h" #include "webrtc/modules/audio_processing/audio_buffer.h" @@ -716,6 +717,12 @@ #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP } +int AudioProcessingImpl::StartDebugRecordingForPlatformFile( + rtc::PlatformFile handle) { + FILE* stream = rtc::FdopenPlatformFileForWriting(handle); + return StartDebugRecording(stream); +} + int AudioProcessingImpl::StopDebugRecording() { CriticalSectionScoped crit_scoped(crit_);
diff --git a/webrtc/modules/audio_processing/audio_processing_impl.h b/webrtc/modules/audio_processing/audio_processing_impl.h index 9753423..0817f47 100644 --- a/webrtc/modules/audio_processing/audio_processing_impl.h +++ b/webrtc/modules/audio_processing/audio_processing_impl.h
@@ -125,6 +125,8 @@ virtual int StartDebugRecording( const char filename[kMaxFilenameSize]) OVERRIDE; virtual int StartDebugRecording(FILE* handle) OVERRIDE; + virtual int StartDebugRecordingForPlatformFile( + rtc::PlatformFile handle) OVERRIDE; virtual int StopDebugRecording() OVERRIDE; virtual EchoCancellation* echo_cancellation() const OVERRIDE; virtual EchoControlMobile* echo_control_mobile() const OVERRIDE;
diff --git a/webrtc/modules/audio_processing/include/audio_processing.h b/webrtc/modules/audio_processing/include/audio_processing.h index 30f0d9c..10d2b8b 100644 --- a/webrtc/modules/audio_processing/include/audio_processing.h +++ b/webrtc/modules/audio_processing/include/audio_processing.h
@@ -14,6 +14,7 @@ #include <stddef.h> // size_t #include <stdio.h> // FILE +#include "webrtc/base/platform_file.h" #include "webrtc/common.h" #include "webrtc/typedefs.h" @@ -325,6 +326,13 @@ // of |handle| and closes it at StopDebugRecording(). virtual int StartDebugRecording(FILE* handle) = 0; + // Same as above but uses an existing PlatformFile handle. Takes ownership + // of |handle| and closes it at StopDebugRecording(). + // TODO(xians): Make this interface pure virtual. + virtual int StartDebugRecordingForPlatformFile(rtc::PlatformFile handle) { + return -1; + } + // Stops recording debugging information, and closes the file. Recording // cannot be resumed in the same file (without overwriting it). virtual int StopDebugRecording() = 0;