|  | #!/usr/bin/env python | 
|  | # Copyright (c) 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. | 
|  | """Checks if a virtual webcam is running and starts it if not. | 
|  |  | 
|  | Returns a non-zero return code if the webcam could not be started. | 
|  |  | 
|  | Prerequisites: | 
|  | * The Python interpreter must have the psutil package installed. | 
|  | * Windows: a scheduled task named 'ManyCam' must exist and be configured to | 
|  | launch ManyCam preconfigured to auto-play the test clip. | 
|  | * Mac: ManyCam must be installed in the default location and be preconfigured | 
|  | to auto-play the test clip. | 
|  | * Linux: Not implemented | 
|  |  | 
|  | NOTICE: When running this script as a buildbot step, make sure to set | 
|  | usePTY=False for the build step when adding it, or the subprocess will die as | 
|  | soon the step has executed. | 
|  |  | 
|  | If any command line arguments are passed to the script, it is executed as a | 
|  | command in a subprocess. | 
|  | """ | 
|  |  | 
|  | # psutil is not installed on non-Linux machines by default. | 
|  | import psutil  # pylint: disable=F0401 | 
|  | import subprocess | 
|  | import sys | 
|  |  | 
|  | WEBCAM_WIN = ('schtasks', '/run', '/tn', 'ManyCam') | 
|  | WEBCAM_MAC = ('open', '/Applications/ManyCam/ManyCam.app') | 
|  |  | 
|  |  | 
|  | def IsWebCamRunning(): | 
|  | if sys.platform == 'win32': | 
|  | process_name = 'ManyCam.exe' | 
|  | elif sys.platform.startswith('darwin'): | 
|  | process_name = 'ManyCam' | 
|  | elif sys.platform.startswith('linux'): | 
|  | # TODO(bugs.webrtc.org/9636): Currently a no-op on Linux: sw webcams no | 
|  | # longer in use. | 
|  | print 'Virtual webcam: no-op on Linux' | 
|  | return True | 
|  | else: | 
|  | raise Exception('Unsupported platform: %s' % sys.platform) | 
|  | for p in psutil.process_iter(): | 
|  | try: | 
|  | if process_name == p.name: | 
|  | print 'Found a running virtual webcam (%s with PID %s)' % ( | 
|  | p.name, p.pid) | 
|  | return True | 
|  | except psutil.AccessDenied: | 
|  | pass  # This is normal if we query sys processes, etc. | 
|  | return False | 
|  |  | 
|  |  | 
|  | def StartWebCam(): | 
|  | try: | 
|  | if sys.platform == 'win32': | 
|  | subprocess.check_call(WEBCAM_WIN) | 
|  | print 'Successfully launched virtual webcam.' | 
|  | elif sys.platform.startswith('darwin'): | 
|  | subprocess.check_call(WEBCAM_MAC) | 
|  | print 'Successfully launched virtual webcam.' | 
|  | elif sys.platform.startswith('linux'): | 
|  | # TODO(bugs.webrtc.org/9636): Currently a no-op on Linux: sw webcams no | 
|  | # longer in use. | 
|  | print 'Not implemented on Linux' | 
|  |  | 
|  | except Exception as e: | 
|  | print 'Failed to launch virtual webcam: %s' % e | 
|  | return False | 
|  |  | 
|  | return True | 
|  |  | 
|  |  | 
|  | def _ForcePythonInterpreter(cmd): | 
|  | """Returns the fixed command line to call the right python executable.""" | 
|  | out = cmd[:] | 
|  | if out[0] == 'python': | 
|  | out[0] = sys.executable | 
|  | elif out[0].endswith('.py'): | 
|  | out.insert(0, sys.executable) | 
|  | return out | 
|  |  | 
|  |  | 
|  | def Main(argv): | 
|  | if not IsWebCamRunning(): | 
|  | if not StartWebCam(): | 
|  | return 1 | 
|  |  | 
|  | if argv: | 
|  | return subprocess.call(_ForcePythonInterpreter(argv)) | 
|  | else: | 
|  | return 0 | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(Main(sys.argv[1:])) |