Repository files navigation

MICPY

A Windows desktop GUI for streaming Android microphone audio to a PC over USB or Wi-Fi.

MICPY stands for Mic (microphone) + Py (copy) — a homage to SCRCPY. It solves a simple problem: laptop microphones in 2026 are still not viable due to fan noise, poor placement, and mediocre quality. MICPY lets you use your Android phone's high-quality microphone as a wireless PC mic with minimal latency, all through a polished GUI.

Built with Tauri 2, React 19, and Rust, wrapping scrcpy's audio-forwarding capabilities in a native interface with full Volume Mixer integration.


Features

  • USB & Wireless — connect via USB or pair wirelessly (Android 11+). Remembers your last wireless device for auto-reconnect.
  • Portable scrcpy — on first launch, MICPY downloads and manages its own scrcpy copy. No PATH setup required.
  • Audio routing & volume control — route scrcpy's audio to any Windows playback device (all 3 WASAPI roles) with independent volume.
  • Output device selection — dropdown menu picks exactly where the phone mic audio goes: speakers, headphones, VB-Cable, Voicemeeter, etc.
  • ASIO Bridge ready — pair with ASIO Bridge Audio to expose the phone mic as a real Windows microphone input, usable in any software (Handy, OBS, Discord, etc.).
  • Live log console — real-time scrcpy output with color-coded levels and one-click copy.
  • Command preview — see the exact scrcpy command before pressing start.

Architecture

┌─────────────────────────────────────────────────────────────┐
│ Tauri 2 Desktop App │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ React 19 Frontend (WebView) │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────────┐ │ │
│ │ │ AudioConfig│ │ Header │ │ LogConsole │ │ │
│ │ │DeviceSelect│ │ (status, │ │ (live stream) │ │ │
│ │ │ │ │ connect) │ │ │ │ │
│ │ └────────────┘ └────────────┘ └────────────────┘ │ │
│ └──────────────────────┬────────────────────────────────┘ │
│ │ invoke() │
│ ┌──────────────────────┴────────────────────────────────┐ │
│ │ Tauri Rust Backend (lib.rs) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ Audio Management Stack │ │ │
│ │ │ ┌────────────────────────────────────────┐ │ │ │
│ │ │ │ device_routing.rs (device resolution) │ │ │ │
│ │ │ │ → IMMDeviceEnumerator COM │ │ │ │
│ │ │ │ → Win32 registry FFI │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ audio_routing.rs (per-app policy) │ │ │ │
│ │ │ │ → WinRT IAudioPolicyConfigFactory │ │ │ │
│ │ │ │ → version-aware vtable dispatch │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ volume_control.rs (session volume) │ │ │ │
│ │ │ │ → WASAPI IAudioSessionManager2 │ │ │ │
│ │ │ │ → ISimpleAudioVolume │ │ │ │
│ │ │ └────────────────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌──────────────────┐ │ │
│ │ │scrcpy_ │ │adb_manager.rs │ │ │
│ │ │manager.rs │ │(download, │ │ │
│ │ │(find, dl, │ │ extract, connect)│ │ │
│ │ │ launch) │ └──────────────────┘ │ │
│ │ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ scrcpy ─── ADB ─── Android Device │
└──────────────────────────────────────────────────────────────┘

Tech Stack

LayerTechnology
Desktop ShellTauri 2 (Rust + WebView)
FrontendReact 19, TypeScript, CSS
Audio Device EnumerationWindows MMDevice API via windows crate COM bindings
Per-App Audio RoutingWinRT COMIAudioPolicyConfigFactory with manual vtable dispatch
Process Volume ControlWASAPI COMIAudioSessionManager2ISimpleAudioVolume
Registry Syncadvapi32.dll FFIRegCreateKeyExW, RegSetValueExW, RegDeleteTreeW
Stream TransportADB (USB / Wireless)

The audio management stack is entirely native Rust — no PowerShell, no SoundVolumeView, no external tools. Everything from device enumeration to per-app routing to session volume is done through Windows COM and WinRT APIs directly.

Typical Use Case

  1. Connect your Android phone (USB or wireless ADB).
  2. Select the audio source (mic, voice-communication, etc.) and codec (raw, opus, aac, flac).
  3. Choose an output device from the Volume Mixer dropdown — or leave it on "Default" for the next step.
  4. Install ASIO Bridge Audio and route scrcpy's output to a virtual input.
  5. Open your speech-to-text software (Handy, OBS, Discord, etc.) and select that virtual microphone input.
  6. Enjoy your phone's high-quality microphone on PC — no fan noise, no laptop mic hiss.

Project Structure

micpy/
├── src/ # React frontend
│ ├── App.tsx # Main app component
│ ├── App.css
│ ├── main.tsx # Entry point
│ ├── index.css
│ ├── components/
│ │ ├── AudioConfig.tsx # Audio device selector
│ │ ├── DeviceSelector.tsx # ADB device picker (tabs)
│ │ ├── CommandPreview.tsx # Shows generated scrcpy command
│ │ ├── Header.tsx # Top bar (connect, status, download indicator)
│ │ └── LogConsole.tsx # Live scrcpy output viewer
│ └── hooks/
│ ├── useAutoScroll.ts # Auto-scroll-to-bottom logic
│ └── useClipboardWithFeedback.ts # Copy with visual feedback
│
├── src-tauri/ # Rust backend
│ └── src/
│ ├── lib.rs # Tauri commands, app entry point, AppState
│ ├── main.rs # Tauri entry point
│ ├── audio_routing.rs # WinRT per-app audio routing (IAudioPolicyConfigFactory)
│ ├── device_routing.rs # Device resolution + registry writes (COM + advapi32)
│ ├── volume_control.rs # Process volume control (WASAPI sessions)
│ ├── adb_manager.rs # Portable adb download + wireless connect
│ └── scrcpy_manager.rs # Portable scrcpy download + launch
│
├── CHANGELOG.md
├── package.json
├── tsconfig.json
└── vite.config.ts

Prerequisites

  • Windows 10 or 11 (x64)
  • An Android device with USB Debugging enabled (and/or Wireless Debugging on Android 11+)
  • A USB cable (for first-time USB pairing)

Usage

  1. Connect your phone via USB or pair wirelessly. Accept the RSA key fingerprint prompt.
  2. Select your device from the dropdown. Wireless devices are remembered for auto-reconnect.
  3. Configure audio — source (mic, output, voice-communication), codec (raw for lowest latency, opus for compression), buffer size.
  4. Choose an output device from the Volume Mixer dropdown — route the phone mic to speakers, headphones, or a virtual cable.
  5. Tweak volume with the independent scrcpy volume slider.
  6. Press "Launch scrcpy" and watch the live log console. The audio routing and volume are applied automatically.

All settings persist in localStorage until overridden.


Development

Prerequisites

Getting Started

cd micpy
bun install
bun run tauri dev

Build

bun run tauri build
# Installable MSI will be placed in src-tauri/target/release/bundle/msi/

Acknowledgments

  • scrcpy — the incredible screen mirroring tool whose audio-forwarding feature makes this whole project possible.
  • Windows CoreAudio / WASAPI / WinRT — for providing the native APIs that replaced PowerShell and SoundVolumeView.
  • ASIO Bridge Audio — for bridging the gap between playback output and microphone input.

About

Microphone Copy App based on Scrcpy

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

MICPY

A Windows desktop GUI for streaming Android microphone audio to a PC over USB or Wi-Fi.

MICPY stands for Mic (microphone) + Py (copy) — a homage to SCRCPY. It solves a simple problem: laptop microphones in 2026 are still not viable due to fan noise, poor placement, and mediocre quality. MICPY lets you use your Android phone's high-quality microphone as a wireless PC mic with minimal latency, all through a polished GUI.

Built with Tauri 2, React 19, and Rust, wrapping scrcpy's audio-forwarding capabilities in a native interface with full Volume Mixer integration.


Features

  • USB & Wireless — connect via USB or pair wirelessly (Android 11+). Remembers your last wireless device for auto-reconnect.
  • Portable scrcpy — on first launch, MICPY downloads and manages its own scrcpy copy. No PATH setup required.
  • Audio routing & volume control — route scrcpy's audio to any Windows playback device (all 3 WASAPI roles) with independent volume.
  • Output device selection — dropdown menu picks exactly where the phone mic audio goes: speakers, headphones, VB-Cable, Voicemeeter, etc.
  • ASIO Bridge ready — pair with ASIO Bridge Audio to expose the phone mic as a real Windows microphone input, usable in any software (Handy, OBS, Discord, etc.).
  • Live log console — real-time scrcpy output with color-coded levels and one-click copy.
  • Command preview — see the exact scrcpy command before pressing start.

Architecture

┌─────────────────────────────────────────────────────────────┐
│ Tauri 2 Desktop App │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ React 19 Frontend (WebView) │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────────┐ │ │
│ │ │ AudioConfig│ │ Header │ │ LogConsole │ │ │
│ │ │DeviceSelect│ │ (status, │ │ (live stream) │ │ │
│ │ │ │ │ connect) │ │ │ │ │
│ │ └────────────┘ └────────────┘ └────────────────┘ │ │
│ └──────────────────────┬────────────────────────────────┘ │
│ │ invoke() │
│ ┌──────────────────────┴────────────────────────────────┐ │
│ │ Tauri Rust Backend (lib.rs) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ Audio Management Stack │ │ │
│ │ │ ┌────────────────────────────────────────┐ │ │ │
│ │ │ │ device_routing.rs (device resolution) │ │ │ │
│ │ │ │ → IMMDeviceEnumerator COM │ │ │ │
│ │ │ │ → Win32 registry FFI │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ audio_routing.rs (per-app policy) │ │ │ │
│ │ │ │ → WinRT IAudioPolicyConfigFactory │ │ │ │
│ │ │ │ → version-aware vtable dispatch │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ volume_control.rs (session volume) │ │ │ │
│ │ │ │ → WASAPI IAudioSessionManager2 │ │ │ │
│ │ │ │ → ISimpleAudioVolume │ │ │ │
│ │ │ └────────────────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌──────────────────┐ │ │
│ │ │scrcpy_ │ │adb_manager.rs │ │ │
│ │ │manager.rs │ │(download, │ │ │
│ │ │(find, dl, │ │ extract, connect)│ │ │
│ │ │ launch) │ └──────────────────┘ │ │
│ │ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ scrcpy ─── ADB ─── Android Device │
└──────────────────────────────────────────────────────────────┘

Tech Stack

LayerTechnology
Desktop ShellTauri 2 (Rust + WebView)
FrontendReact 19, TypeScript, CSS
Audio Device EnumerationWindows MMDevice API via windows crate COM bindings
Per-App Audio RoutingWinRT COMIAudioPolicyConfigFactory with manual vtable dispatch
Process Volume ControlWASAPI COMIAudioSessionManager2ISimpleAudioVolume
Registry Syncadvapi32.dll FFIRegCreateKeyExW, RegSetValueExW, RegDeleteTreeW
Stream TransportADB (USB / Wireless)

The audio management stack is entirely native Rust — no PowerShell, no SoundVolumeView, no external tools. Everything from device enumeration to per-app routing to session volume is done through Windows COM and WinRT APIs directly.

Typical Use Case

  1. Connect your Android phone (USB or wireless ADB).
  2. Select the audio source (mic, voice-communication, etc.) and codec (raw, opus, aac, flac).
  3. Choose an output device from the Volume Mixer dropdown — or leave it on "Default" for the next step.
  4. Install ASIO Bridge Audio and route scrcpy's output to a virtual input.
  5. Open your speech-to-text software (Handy, OBS, Discord, etc.) and select that virtual microphone input.
  6. Enjoy your phone's high-quality microphone on PC — no fan noise, no laptop mic hiss.

Project Structure

micpy/
├── src/ # React frontend
│ ├── App.tsx # Main app component
│ ├── App.css
│ ├── main.tsx # Entry point
│ ├── index.css
│ ├── components/
│ │ ├── AudioConfig.tsx # Audio device selector
│ │ ├── DeviceSelector.tsx # ADB device picker (tabs)
│ │ ├── CommandPreview.tsx # Shows generated scrcpy command
│ │ ├── Header.tsx # Top bar (connect, status, download indicator)
│ │ └── LogConsole.tsx # Live scrcpy output viewer
│ └── hooks/
│ ├── useAutoScroll.ts # Auto-scroll-to-bottom logic
│ └── useClipboardWithFeedback.ts # Copy with visual feedback
│
├── src-tauri/ # Rust backend
│ └── src/
│ ├── lib.rs # Tauri commands, app entry point, AppState
│ ├── main.rs # Tauri entry point
│ ├── audio_routing.rs # WinRT per-app audio routing (IAudioPolicyConfigFactory)
│ ├── device_routing.rs # Device resolution + registry writes (COM + advapi32)
│ ├── volume_control.rs # Process volume control (WASAPI sessions)
│ ├── adb_manager.rs # Portable adb download + wireless connect
│ └── scrcpy_manager.rs # Portable scrcpy download + launch
│
├── CHANGELOG.md
├── package.json
├── tsconfig.json
└── vite.config.ts

Prerequisites

  • Windows 10 or 11 (x64)
  • An Android device with USB Debugging enabled (and/or Wireless Debugging on Android 11+)
  • A USB cable (for first-time USB pairing)

Usage

  1. Connect your phone via USB or pair wirelessly. Accept the RSA key fingerprint prompt.
  2. Select your device from the dropdown. Wireless devices are remembered for auto-reconnect.
  3. Configure audio — source (mic, output, voice-communication), codec (raw for lowest latency, opus for compression), buffer size.
  4. Choose an output device from the Volume Mixer dropdown — route the phone mic to speakers, headphones, or a virtual cable.
  5. Tweak volume with the independent scrcpy volume slider.
  6. Press "Launch scrcpy" and watch the live log console. The audio routing and volume are applied automatically.

All settings persist in localStorage until overridden.


Development

Prerequisites

Getting Started

cd micpy
bun install
bun run tauri dev

Build

bun run tauri build
# Installable MSI will be placed in src-tauri/target/release/bundle/msi/

Acknowledgments

  • scrcpy — the incredible screen mirroring tool whose audio-forwarding feature makes this whole project possible.
  • Windows CoreAudio / WASAPI / WinRT — for providing the native APIs that replaced PowerShell and SoundVolumeView.
  • ASIO Bridge Audio — for bridging the gap between playback output and microphone input.

About

Microphone Copy App based on Scrcpy

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MICPY

A Windows desktop GUI for streaming Android microphone audio to a PC over USB or Wi-Fi.

MICPY stands for Mic (microphone) + Py (copy) — a homage to SCRCPY. It solves a simple problem: laptop microphones in 2026 are still not viable due to fan noise, poor placement, and mediocre quality. MICPY lets you use your Android phone's high-quality microphone as a wireless PC mic with minimal latency, all through a polished GUI.

Built with Tauri 2, React 19, and Rust, wrapping scrcpy's audio-forwarding capabilities in a native interface with full Volume Mixer integration.


Features

  • USB & Wireless — connect via USB or pair wirelessly (Android 11+). Remembers your last wireless device for auto-reconnect.
  • Portable scrcpy — on first launch, MICPY downloads and manages its own scrcpy copy. No PATH setup required.
  • Audio routing & volume control — route scrcpy's audio to any Windows playback device (all 3 WASAPI roles) with independent volume.
  • Output device selection — dropdown menu picks exactly where the phone mic audio goes: speakers, headphones, VB-Cable, Voicemeeter, etc.
  • ASIO Bridge ready — pair with ASIO Bridge Audio to expose the phone mic as a real Windows microphone input, usable in any software (Handy, OBS, Discord, etc.).
  • Live log console — real-time scrcpy output with color-coded levels and one-click copy.
  • Command preview — see the exact scrcpy command before pressing start.

Architecture

┌─────────────────────────────────────────────────────────────┐
│ Tauri 2 Desktop App │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ React 19 Frontend (WebView) │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────────┐ │ │
│ │ │ AudioConfig│ │ Header │ │ LogConsole │ │ │
│ │ │DeviceSelect│ │ (status, │ │ (live stream) │ │ │
│ │ │ │ │ connect) │ │ │ │ │
│ │ └────────────┘ └────────────┘ └────────────────┘ │ │
│ └──────────────────────┬────────────────────────────────┘ │
│ │ invoke() │
│ ┌──────────────────────┴────────────────────────────────┐ │
│ │ Tauri Rust Backend (lib.rs) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ Audio Management Stack │ │ │
│ │ │ ┌────────────────────────────────────────┐ │ │ │
│ │ │ │ device_routing.rs (device resolution) │ │ │ │
│ │ │ │ → IMMDeviceEnumerator COM │ │ │ │
│ │ │ │ → Win32 registry FFI │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ audio_routing.rs (per-app policy) │ │ │ │
│ │ │ │ → WinRT IAudioPolicyConfigFactory │ │ │ │
│ │ │ │ → version-aware vtable dispatch │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ volume_control.rs (session volume) │ │ │ │
│ │ │ │ → WASAPI IAudioSessionManager2 │ │ │ │
│ │ │ │ → ISimpleAudioVolume │ │ │ │
│ │ │ └────────────────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌──────────────────┐ │ │
│ │ │scrcpy_ │ │adb_manager.rs │ │ │
│ │ │manager.rs │ │(download, │ │ │
│ │ │(find, dl, │ │ extract, connect)│ │ │
│ │ │ launch) │ └──────────────────┘ │ │
│ │ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ scrcpy ─── ADB ─── Android Device │
└──────────────────────────────────────────────────────────────┘

Tech Stack

LayerTechnology
Desktop ShellTauri 2 (Rust + WebView)
FrontendReact 19, TypeScript, CSS
Audio Device EnumerationWindows MMDevice API via windows crate COM bindings
Per-App Audio RoutingWinRT COMIAudioPolicyConfigFactory with manual vtable dispatch
Process Volume ControlWASAPI COMIAudioSessionManager2ISimpleAudioVolume
Registry Syncadvapi32.dll FFIRegCreateKeyExW, RegSetValueExW, RegDeleteTreeW
Stream TransportADB (USB / Wireless)

The audio management stack is entirely native Rust — no PowerShell, no SoundVolumeView, no external tools. Everything from device enumeration to per-app routing to session volume is done through Windows COM and WinRT APIs directly.

Typical Use Case

  1. Connect your Android phone (USB or wireless ADB).
  2. Select the audio source (mic, voice-communication, etc.) and codec (raw, opus, aac, flac).
  3. Choose an output device from the Volume Mixer dropdown — or leave it on "Default" for the next step.
  4. Install ASIO Bridge Audio and route scrcpy's output to a virtual input.
  5. Open your speech-to-text software (Handy, OBS, Discord, etc.) and select that virtual microphone input.
  6. Enjoy your phone's high-quality microphone on PC — no fan noise, no laptop mic hiss.

Project Structure

micpy/
├── src/ # React frontend
│ ├── App.tsx # Main app component
│ ├── App.css
│ ├── main.tsx # Entry point
│ ├── index.css
│ ├── components/
│ │ ├── AudioConfig.tsx # Audio device selector
│ │ ├── DeviceSelector.tsx # ADB device picker (tabs)
│ │ ├── CommandPreview.tsx # Shows generated scrcpy command
│ │ ├── Header.tsx # Top bar (connect, status, download indicator)
│ │ └── LogConsole.tsx # Live scrcpy output viewer
│ └── hooks/
│ ├── useAutoScroll.ts # Auto-scroll-to-bottom logic
│ └── useClipboardWithFeedback.ts # Copy with visual feedback
│
├── src-tauri/ # Rust backend
│ └── src/
│ ├── lib.rs # Tauri commands, app entry point, AppState
│ ├── main.rs # Tauri entry point
│ ├── audio_routing.rs # WinRT per-app audio routing (IAudioPolicyConfigFactory)
│ ├── device_routing.rs # Device resolution + registry writes (COM + advapi32)
│ ├── volume_control.rs # Process volume control (WASAPI sessions)
│ ├── adb_manager.rs # Portable adb download + wireless connect
│ └── scrcpy_manager.rs # Portable scrcpy download + launch
│
├── CHANGELOG.md
├── package.json
├── tsconfig.json
└── vite.config.ts

Prerequisites

  • Windows 10 or 11 (x64)
  • An Android device with USB Debugging enabled (and/or Wireless Debugging on Android 11+)
  • A USB cable (for first-time USB pairing)

Usage

  1. Connect your phone via USB or pair wirelessly. Accept the RSA key fingerprint prompt.
  2. Select your device from the dropdown. Wireless devices are remembered for auto-reconnect.
  3. Configure audio — source (mic, output, voice-communication), codec (raw for lowest latency, opus for compression), buffer size.
  4. Choose an output device from the Volume Mixer dropdown — route the phone mic to speakers, headphones, or a virtual cable.
  5. Tweak volume with the independent scrcpy volume slider.
  6. Press "Launch scrcpy" and watch the live log console. The audio routing and volume are applied automatically.

All settings persist in localStorage until overridden.


Development

Prerequisites

Getting Started

cd micpy
bun install
bun run tauri dev

Build

bun run tauri build
# Installable MSI will be placed in src-tauri/target/release/bundle/msi/

Acknowledgments

  • scrcpy — the incredible screen mirroring tool whose audio-forwarding feature makes this whole project possible.
  • Windows CoreAudio / WASAPI / WinRT — for providing the native APIs that replaced PowerShell and SoundVolumeView.
  • ASIO Bridge Audio — for bridging the gap between playback output and microphone input.

About

Microphone Copy App based on Scrcpy

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MICPY

A Windows desktop GUI for streaming Android microphone audio to a PC over USB or Wi-Fi.

MICPY stands for Mic (microphone) + Py (copy) — a homage to SCRCPY. It solves a simple problem: laptop microphones in 2026 are still not viable due to fan noise, poor placement, and mediocre quality. MICPY lets you use your Android phone's high-quality microphone as a wireless PC mic with minimal latency, all through a polished GUI.

Built with Tauri 2, React 19, and Rust, wrapping scrcpy's audio-forwarding capabilities in a native interface with full Volume Mixer integration.


Features

  • USB & Wireless — connect via USB or pair wirelessly (Android 11+). Remembers your last wireless device for auto-reconnect.
  • Portable scrcpy — on first launch, MICPY downloads and manages its own scrcpy copy. No PATH setup required.
  • Audio routing & volume control — route scrcpy's audio to any Windows playback device (all 3 WASAPI roles) with independent volume.
  • Output device selection — dropdown menu picks exactly where the phone mic audio goes: speakers, headphones, VB-Cable, Voicemeeter, etc.
  • ASIO Bridge ready — pair with ASIO Bridge Audio to expose the phone mic as a real Windows microphone input, usable in any software (Handy, OBS, Discord, etc.).
  • Live log console — real-time scrcpy output with color-coded levels and one-click copy.
  • Command preview — see the exact scrcpy command before pressing start.

Architecture

┌─────────────────────────────────────────────────────────────┐
│ Tauri 2 Desktop App │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ React 19 Frontend (WebView) │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────────┐ │ │
│ │ │ AudioConfig│ │ Header │ │ LogConsole │ │ │
│ │ │DeviceSelect│ │ (status, │ │ (live stream) │ │ │
│ │ │ │ │ connect) │ │ │ │ │
│ │ └────────────┘ └────────────┘ └────────────────┘ │ │
│ └──────────────────────┬────────────────────────────────┘ │
│ │ invoke() │
│ ┌──────────────────────┴────────────────────────────────┐ │
│ │ Tauri Rust Backend (lib.rs) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ Audio Management Stack │ │ │
│ │ │ ┌────────────────────────────────────────┐ │ │ │
│ │ │ │ device_routing.rs (device resolution) │ │ │ │
│ │ │ │ → IMMDeviceEnumerator COM │ │ │ │
│ │ │ │ → Win32 registry FFI │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ audio_routing.rs (per-app policy) │ │ │ │
│ │ │ │ → WinRT IAudioPolicyConfigFactory │ │ │ │
│ │ │ │ → version-aware vtable dispatch │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ volume_control.rs (session volume) │ │ │ │
│ │ │ │ → WASAPI IAudioSessionManager2 │ │ │ │
│ │ │ │ → ISimpleAudioVolume │ │ │ │
│ │ │ └────────────────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌──────────────────┐ │ │
│ │ │scrcpy_ │ │adb_manager.rs │ │ │
│ │ │manager.rs │ │(download, │ │ │
│ │ │(find, dl, │ │ extract, connect)│ │ │
│ │ │ launch) │ └──────────────────┘ │ │
│ │ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ scrcpy ─── ADB ─── Android Device │
└──────────────────────────────────────────────────────────────┘

Tech Stack

LayerTechnology
Desktop ShellTauri 2 (Rust + WebView)
FrontendReact 19, TypeScript, CSS
Audio Device EnumerationWindows MMDevice API via windows crate COM bindings
Per-App Audio RoutingWinRT COMIAudioPolicyConfigFactory with manual vtable dispatch
Process Volume ControlWASAPI COMIAudioSessionManager2ISimpleAudioVolume
Registry Syncadvapi32.dll FFIRegCreateKeyExW, RegSetValueExW, RegDeleteTreeW
Stream TransportADB (USB / Wireless)

The audio management stack is entirely native Rust — no PowerShell, no SoundVolumeView, no external tools. Everything from device enumeration to per-app routing to session volume is done through Windows COM and WinRT APIs directly.

Typical Use Case

  1. Connect your Android phone (USB or wireless ADB).
  2. Select the audio source (mic, voice-communication, etc.) and codec (raw, opus, aac, flac).
  3. Choose an output device from the Volume Mixer dropdown — or leave it on "Default" for the next step.
  4. Install ASIO Bridge Audio and route scrcpy's output to a virtual input.
  5. Open your speech-to-text software (Handy, OBS, Discord, etc.) and select that virtual microphone input.
  6. Enjoy your phone's high-quality microphone on PC — no fan noise, no laptop mic hiss.

Project Structure

micpy/
├── src/ # React frontend
│ ├── App.tsx # Main app component
│ ├── App.css
│ ├── main.tsx # Entry point
│ ├── index.css
│ ├── components/
│ │ ├── AudioConfig.tsx # Audio device selector
│ │ ├── DeviceSelector.tsx # ADB device picker (tabs)
│ │ ├── CommandPreview.tsx # Shows generated scrcpy command
│ │ ├── Header.tsx # Top bar (connect, status, download indicator)
│ │ └── LogConsole.tsx # Live scrcpy output viewer
│ └── hooks/
│ ├── useAutoScroll.ts # Auto-scroll-to-bottom logic
│ └── useClipboardWithFeedback.ts # Copy with visual feedback
│
├── src-tauri/ # Rust backend
│ └── src/
│ ├── lib.rs # Tauri commands, app entry point, AppState
│ ├── main.rs # Tauri entry point
│ ├── audio_routing.rs # WinRT per-app audio routing (IAudioPolicyConfigFactory)
│ ├── device_routing.rs # Device resolution + registry writes (COM + advapi32)
│ ├── volume_control.rs # Process volume control (WASAPI sessions)
│ ├── adb_manager.rs # Portable adb download + wireless connect
│ └── scrcpy_manager.rs # Portable scrcpy download + launch
│
├── CHANGELOG.md
├── package.json
├── tsconfig.json
└── vite.config.ts

Prerequisites

  • Windows 10 or 11 (x64)
  • An Android device with USB Debugging enabled (and/or Wireless Debugging on Android 11+)
  • A USB cable (for first-time USB pairing)

Usage

  1. Connect your phone via USB or pair wirelessly. Accept the RSA key fingerprint prompt.
  2. Select your device from the dropdown. Wireless devices are remembered for auto-reconnect.
  3. Configure audio — source (mic, output, voice-communication), codec (raw for lowest latency, opus for compression), buffer size.
  4. Choose an output device from the Volume Mixer dropdown — route the phone mic to speakers, headphones, or a virtual cable.
  5. Tweak volume with the independent scrcpy volume slider.
  6. Press "Launch scrcpy" and watch the live log console. The audio routing and volume are applied automatically.

All settings persist in localStorage until overridden.


Development

Prerequisites

Getting Started

cd micpy
bun install
bun run tauri dev

Build

bun run tauri build
# Installable MSI will be placed in src-tauri/target/release/bundle/msi/

Acknowledgments

  • scrcpy — the incredible screen mirroring tool whose audio-forwarding feature makes this whole project possible.
  • Windows CoreAudio / WASAPI / WinRT — for providing the native APIs that replaced PowerShell and SoundVolumeView.
  • ASIO Bridge Audio — for bridging the gap between playback output and microphone input.

About

Microphone Copy App based on Scrcpy

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

MICPY

A Windows desktop GUI for streaming Android microphone audio to a PC over USB or Wi-Fi.

MICPY stands for Mic (microphone) + Py (copy) — a homage to SCRCPY. It solves a simple problem: laptop microphones in 2026 are still not viable due to fan noise, poor placement, and mediocre quality. MICPY lets you use your Android phone's high-quality microphone as a wireless PC mic with minimal latency, all through a polished GUI.

Built with Tauri 2, React 19, and Rust, wrapping scrcpy's audio-forwarding capabilities in a native interface with full Volume Mixer integration.


Features

  • USB & Wireless — connect via USB or pair wirelessly (Android 11+). Remembers your last wireless device for auto-reconnect.
  • Portable scrcpy — on first launch, MICPY downloads and manages its own scrcpy copy. No PATH setup required.
  • Audio routing & volume control — route scrcpy's audio to any Windows playback device (all 3 WASAPI roles) with independent volume.
  • Output device selection — dropdown menu picks exactly where the phone mic audio goes: speakers, headphones, VB-Cable, Voicemeeter, etc.
  • ASIO Bridge ready — pair with ASIO Bridge Audio to expose the phone mic as a real Windows microphone input, usable in any software (Handy, OBS, Discord, etc.).
  • Live log console — real-time scrcpy output with color-coded levels and one-click copy.
  • Command preview — see the exact scrcpy command before pressing start.

Architecture

┌─────────────────────────────────────────────────────────────┐
│ Tauri 2 Desktop App │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ React 19 Frontend (WebView) │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────────┐ │ │
│ │ │ AudioConfig│ │ Header │ │ LogConsole │ │ │
│ │ │DeviceSelect│ │ (status, │ │ (live stream) │ │ │
│ │ │ │ │ connect) │ │ │ │ │
│ │ └────────────┘ └────────────┘ └────────────────┘ │ │
│ └──────────────────────┬────────────────────────────────┘ │
│ │ invoke() │
│ ┌──────────────────────┴────────────────────────────────┐ │
│ │ Tauri Rust Backend (lib.rs) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ Audio Management Stack │ │ │
│ │ │ ┌────────────────────────────────────────┐ │ │ │
│ │ │ │ device_routing.rs (device resolution) │ │ │ │
│ │ │ │ → IMMDeviceEnumerator COM │ │ │ │
│ │ │ │ → Win32 registry FFI │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ audio_routing.rs (per-app policy) │ │ │ │
│ │ │ │ → WinRT IAudioPolicyConfigFactory │ │ │ │
│ │ │ │ → version-aware vtable dispatch │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ volume_control.rs (session volume) │ │ │ │
│ │ │ │ → WASAPI IAudioSessionManager2 │ │ │ │
│ │ │ │ → ISimpleAudioVolume │ │ │ │
│ │ │ └────────────────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌──────────────────┐ │ │
│ │ │scrcpy_ │ │adb_manager.rs │ │ │
│ │ │manager.rs │ │(download, │ │ │
│ │ │(find, dl, │ │ extract, connect)│ │ │
│ │ │ launch) │ └──────────────────┘ │ │
│ │ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ scrcpy ─── ADB ─── Android Device │
└──────────────────────────────────────────────────────────────┘

Tech Stack

LayerTechnology
Desktop ShellTauri 2 (Rust + WebView)
FrontendReact 19, TypeScript, CSS
Audio Device EnumerationWindows MMDevice API via windows crate COM bindings
Per-App Audio RoutingWinRT COMIAudioPolicyConfigFactory with manual vtable dispatch
Process Volume ControlWASAPI COMIAudioSessionManager2ISimpleAudioVolume
Registry Syncadvapi32.dll FFIRegCreateKeyExW, RegSetValueExW, RegDeleteTreeW
Stream TransportADB (USB / Wireless)

The audio management stack is entirely native Rust — no PowerShell, no SoundVolumeView, no external tools. Everything from device enumeration to per-app routing to session volume is done through Windows COM and WinRT APIs directly.

Typical Use Case

  1. Connect your Android phone (USB or wireless ADB).
  2. Select the audio source (mic, voice-communication, etc.) and codec (raw, opus, aac, flac).
  3. Choose an output device from the Volume Mixer dropdown — or leave it on "Default" for the next step.
  4. Install ASIO Bridge Audio and route scrcpy's output to a virtual input.
  5. Open your speech-to-text software (Handy, OBS, Discord, etc.) and select that virtual microphone input.
  6. Enjoy your phone's high-quality microphone on PC — no fan noise, no laptop mic hiss.

Project Structure

micpy/
├── src/ # React frontend
│ ├── App.tsx # Main app component
│ ├── App.css
│ ├── main.tsx # Entry point
│ ├── index.css
│ ├── components/
│ │ ├── AudioConfig.tsx # Audio device selector
│ │ ├── DeviceSelector.tsx # ADB device picker (tabs)
│ │ ├── CommandPreview.tsx # Shows generated scrcpy command
│ │ ├── Header.tsx # Top bar (connect, status, download indicator)
│ │ └── LogConsole.tsx # Live scrcpy output viewer
│ └── hooks/
│ ├── useAutoScroll.ts # Auto-scroll-to-bottom logic
│ └── useClipboardWithFeedback.ts # Copy with visual feedback
│
├── src-tauri/ # Rust backend
│ └── src/
│ ├── lib.rs # Tauri commands, app entry point, AppState
│ ├── main.rs # Tauri entry point
│ ├── audio_routing.rs # WinRT per-app audio routing (IAudioPolicyConfigFactory)
│ ├── device_routing.rs # Device resolution + registry writes (COM + advapi32)
│ ├── volume_control.rs # Process volume control (WASAPI sessions)
│ ├── adb_manager.rs # Portable adb download + wireless connect
│ └── scrcpy_manager.rs # Portable scrcpy download + launch
│
├── CHANGELOG.md
├── package.json
├── tsconfig.json
└── vite.config.ts

Prerequisites

  • Windows 10 or 11 (x64)
  • An Android device with USB Debugging enabled (and/or Wireless Debugging on Android 11+)
  • A USB cable (for first-time USB pairing)

Usage

  1. Connect your phone via USB or pair wirelessly. Accept the RSA key fingerprint prompt.
  2. Select your device from the dropdown. Wireless devices are remembered for auto-reconnect.
  3. Configure audio — source (mic, output, voice-communication), codec (raw for lowest latency, opus for compression), buffer size.
  4. Choose an output device from the Volume Mixer dropdown — route the phone mic to speakers, headphones, or a virtual cable.
  5. Tweak volume with the independent scrcpy volume slider.
  6. Press "Launch scrcpy" and watch the live log console. The audio routing and volume are applied automatically.

All settings persist in localStorage until overridden.


Development

Prerequisites

Getting Started

cd micpy
bun install
bun run tauri dev

Build

bun run tauri build
# Installable MSI will be placed in src-tauri/target/release/bundle/msi/

Acknowledgments

  • scrcpy — the incredible screen mirroring tool whose audio-forwarding feature makes this whole project possible.
  • Windows CoreAudio / WASAPI / WinRT — for providing the native APIs that replaced PowerShell and SoundVolumeView.
  • ASIO Bridge Audio — for bridging the gap between playback output and microphone input.

About

Microphone Copy App based on Scrcpy

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MICPY

A Windows desktop GUI for streaming Android microphone audio to a PC over USB or Wi-Fi.

MICPY stands for Mic (microphone) + Py (copy) — a homage to SCRCPY. It solves a simple problem: laptop microphones in 2026 are still not viable due to fan noise, poor placement, and mediocre quality. MICPY lets you use your Android phone's high-quality microphone as a wireless PC mic with minimal latency, all through a polished GUI.

Built with Tauri 2, React 19, and Rust, wrapping scrcpy's audio-forwarding capabilities in a native interface with full Volume Mixer integration.


Features

  • USB & Wireless — connect via USB or pair wirelessly (Android 11+). Remembers your last wireless device for auto-reconnect.
  • Portable scrcpy — on first launch, MICPY downloads and manages its own scrcpy copy. No PATH setup required.
  • Audio routing & volume control — route scrcpy's audio to any Windows playback device (all 3 WASAPI roles) with independent volume.
  • Output device selection — dropdown menu picks exactly where the phone mic audio goes: speakers, headphones, VB-Cable, Voicemeeter, etc.
  • ASIO Bridge ready — pair with ASIO Bridge Audio to expose the phone mic as a real Windows microphone input, usable in any software (Handy, OBS, Discord, etc.).
  • Live log console — real-time scrcpy output with color-coded levels and one-click copy.
  • Command preview — see the exact scrcpy command before pressing start.

Architecture

┌─────────────────────────────────────────────────────────────┐
│ Tauri 2 Desktop App │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ React 19 Frontend (WebView) │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────────┐ │ │
│ │ │ AudioConfig│ │ Header │ │ LogConsole │ │ │
│ │ │DeviceSelect│ │ (status, │ │ (live stream) │ │ │
│ │ │ │ │ connect) │ │ │ │ │
│ │ └────────────┘ └────────────┘ └────────────────┘ │ │
│ └──────────────────────┬────────────────────────────────┘ │
│ │ invoke() │
│ ┌──────────────────────┴────────────────────────────────┐ │
│ │ Tauri Rust Backend (lib.rs) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ Audio Management Stack │ │ │
│ │ │ ┌────────────────────────────────────────┐ │ │ │
│ │ │ │ device_routing.rs (device resolution) │ │ │ │
│ │ │ │ → IMMDeviceEnumerator COM │ │ │ │
│ │ │ │ → Win32 registry FFI │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ audio_routing.rs (per-app policy) │ │ │ │
│ │ │ │ → WinRT IAudioPolicyConfigFactory │ │ │ │
│ │ │ │ → version-aware vtable dispatch │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ volume_control.rs (session volume) │ │ │ │
│ │ │ │ → WASAPI IAudioSessionManager2 │ │ │ │
│ │ │ │ → ISimpleAudioVolume │ │ │ │
│ │ │ └────────────────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌──────────────────┐ │ │
│ │ │scrcpy_ │ │adb_manager.rs │ │ │
│ │ │manager.rs │ │(download, │ │ │
│ │ │(find, dl, │ │ extract, connect)│ │ │
│ │ │ launch) │ └──────────────────┘ │ │
│ │ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ scrcpy ─── ADB ─── Android Device │
└──────────────────────────────────────────────────────────────┘

Tech Stack

LayerTechnology
Desktop ShellTauri 2 (Rust + WebView)
FrontendReact 19, TypeScript, CSS
Audio Device EnumerationWindows MMDevice API via windows crate COM bindings
Per-App Audio RoutingWinRT COMIAudioPolicyConfigFactory with manual vtable dispatch
Process Volume ControlWASAPI COMIAudioSessionManager2ISimpleAudioVolume
Registry Syncadvapi32.dll FFIRegCreateKeyExW, RegSetValueExW, RegDeleteTreeW
Stream TransportADB (USB / Wireless)

The audio management stack is entirely native Rust — no PowerShell, no SoundVolumeView, no external tools. Everything from device enumeration to per-app routing to session volume is done through Windows COM and WinRT APIs directly.

Typical Use Case

  1. Connect your Android phone (USB or wireless ADB).
  2. Select the audio source (mic, voice-communication, etc.) and codec (raw, opus, aac, flac).
  3. Choose an output device from the Volume Mixer dropdown — or leave it on "Default" for the next step.
  4. Install ASIO Bridge Audio and route scrcpy's output to a virtual input.
  5. Open your speech-to-text software (Handy, OBS, Discord, etc.) and select that virtual microphone input.
  6. Enjoy your phone's high-quality microphone on PC — no fan noise, no laptop mic hiss.

Project Structure

micpy/
├── src/ # React frontend
│ ├── App.tsx # Main app component
│ ├── App.css
│ ├── main.tsx # Entry point
│ ├── index.css
│ ├── components/
│ │ ├── AudioConfig.tsx # Audio device selector
│ │ ├── DeviceSelector.tsx # ADB device picker (tabs)
│ │ ├── CommandPreview.tsx # Shows generated scrcpy command
│ │ ├── Header.tsx # Top bar (connect, status, download indicator)
│ │ └── LogConsole.tsx # Live scrcpy output viewer
│ └── hooks/
│ ├── useAutoScroll.ts # Auto-scroll-to-bottom logic
│ └── useClipboardWithFeedback.ts # Copy with visual feedback
│
├── src-tauri/ # Rust backend
│ └── src/
│ ├── lib.rs # Tauri commands, app entry point, AppState
│ ├── main.rs # Tauri entry point
│ ├── audio_routing.rs # WinRT per-app audio routing (IAudioPolicyConfigFactory)
│ ├── device_routing.rs # Device resolution + registry writes (COM + advapi32)
│ ├── volume_control.rs # Process volume control (WASAPI sessions)
│ ├── adb_manager.rs # Portable adb download + wireless connect
│ └── scrcpy_manager.rs # Portable scrcpy download + launch
│
├── CHANGELOG.md
├── package.json
├── tsconfig.json
└── vite.config.ts

Prerequisites

  • Windows 10 or 11 (x64)
  • An Android device with USB Debugging enabled (and/or Wireless Debugging on Android 11+)
  • A USB cable (for first-time USB pairing)

Usage

  1. Connect your phone via USB or pair wirelessly. Accept the RSA key fingerprint prompt.
  2. Select your device from the dropdown. Wireless devices are remembered for auto-reconnect.
  3. Configure audio — source (mic, output, voice-communication), codec (raw for lowest latency, opus for compression), buffer size.
  4. Choose an output device from the Volume Mixer dropdown — route the phone mic to speakers, headphones, or a virtual cable.
  5. Tweak volume with the independent scrcpy volume slider.
  6. Press "Launch scrcpy" and watch the live log console. The audio routing and volume are applied automatically.

All settings persist in localStorage until overridden.


Development

Prerequisites

Getting Started

cd micpy
bun install
bun run tauri dev

Build

bun run tauri build
# Installable MSI will be placed in src-tauri/target/release/bundle/msi/

Acknowledgments

  • scrcpy — the incredible screen mirroring tool whose audio-forwarding feature makes this whole project possible.
  • Windows CoreAudio / WASAPI / WinRT — for providing the native APIs that replaced PowerShell and SoundVolumeView.
  • ASIO Bridge Audio — for bridging the gap between playback output and microphone input.

About

Microphone Copy App based on Scrcpy

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MICPY

A Windows desktop GUI for streaming Android microphone audio to a PC over USB or Wi-Fi.

MICPY stands for Mic (microphone) + Py (copy) — a homage to SCRCPY. It solves a simple problem: laptop microphones in 2026 are still not viable due to fan noise, poor placement, and mediocre quality. MICPY lets you use your Android phone's high-quality microphone as a wireless PC mic with minimal latency, all through a polished GUI.

Built with Tauri 2, React 19, and Rust, wrapping scrcpy's audio-forwarding capabilities in a native interface with full Volume Mixer integration.


Features

  • USB & Wireless — connect via USB or pair wirelessly (Android 11+). Remembers your last wireless device for auto-reconnect.
  • Portable scrcpy — on first launch, MICPY downloads and manages its own scrcpy copy. No PATH setup required.
  • Audio routing & volume control — route scrcpy's audio to any Windows playback device (all 3 WASAPI roles) with independent volume.
  • Output device selection — dropdown menu picks exactly where the phone mic audio goes: speakers, headphones, VB-Cable, Voicemeeter, etc.
  • ASIO Bridge ready — pair with ASIO Bridge Audio to expose the phone mic as a real Windows microphone input, usable in any software (Handy, OBS, Discord, etc.).
  • Live log console — real-time scrcpy output with color-coded levels and one-click copy.
  • Command preview — see the exact scrcpy command before pressing start.

Architecture

┌─────────────────────────────────────────────────────────────┐
│ Tauri 2 Desktop App │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ React 19 Frontend (WebView) │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────────┐ │ │
│ │ │ AudioConfig│ │ Header │ │ LogConsole │ │ │
│ │ │DeviceSelect│ │ (status, │ │ (live stream) │ │ │
│ │ │ │ │ connect) │ │ │ │ │
│ │ └────────────┘ └────────────┘ └────────────────┘ │ │
│ └──────────────────────┬────────────────────────────────┘ │
│ │ invoke() │
│ ┌──────────────────────┴────────────────────────────────┐ │
│ │ Tauri Rust Backend (lib.rs) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ Audio Management Stack │ │ │
│ │ │ ┌────────────────────────────────────────┐ │ │ │
│ │ │ │ device_routing.rs (device resolution) │ │ │ │
│ │ │ │ → IMMDeviceEnumerator COM │ │ │ │
│ │ │ │ → Win32 registry FFI │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ audio_routing.rs (per-app policy) │ │ │ │
│ │ │ │ → WinRT IAudioPolicyConfigFactory │ │ │ │
│ │ │ │ → version-aware vtable dispatch │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ volume_control.rs (session volume) │ │ │ │
│ │ │ │ → WASAPI IAudioSessionManager2 │ │ │ │
│ │ │ │ → ISimpleAudioVolume │ │ │ │
│ │ │ └────────────────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌──────────────────┐ │ │
│ │ │scrcpy_ │ │adb_manager.rs │ │ │
│ │ │manager.rs │ │(download, │ │ │
│ │ │(find, dl, │ │ extract, connect)│ │ │
│ │ │ launch) │ └──────────────────┘ │ │
│ │ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ scrcpy ─── ADB ─── Android Device │
└──────────────────────────────────────────────────────────────┘

Tech Stack

LayerTechnology
Desktop ShellTauri 2 (Rust + WebView)
FrontendReact 19, TypeScript, CSS
Audio Device EnumerationWindows MMDevice API via windows crate COM bindings
Per-App Audio RoutingWinRT COMIAudioPolicyConfigFactory with manual vtable dispatch
Process Volume ControlWASAPI COMIAudioSessionManager2ISimpleAudioVolume
Registry Syncadvapi32.dll FFIRegCreateKeyExW, RegSetValueExW, RegDeleteTreeW
Stream TransportADB (USB / Wireless)

The audio management stack is entirely native Rust — no PowerShell, no SoundVolumeView, no external tools. Everything from device enumeration to per-app routing to session volume is done through Windows COM and WinRT APIs directly.

Typical Use Case

  1. Connect your Android phone (USB or wireless ADB).
  2. Select the audio source (mic, voice-communication, etc.) and codec (raw, opus, aac, flac).
  3. Choose an output device from the Volume Mixer dropdown — or leave it on "Default" for the next step.
  4. Install ASIO Bridge Audio and route scrcpy's output to a virtual input.
  5. Open your speech-to-text software (Handy, OBS, Discord, etc.) and select that virtual microphone input.
  6. Enjoy your phone's high-quality microphone on PC — no fan noise, no laptop mic hiss.

Project Structure

micpy/
├── src/ # React frontend
│ ├── App.tsx # Main app component
│ ├── App.css
│ ├── main.tsx # Entry point
│ ├── index.css
│ ├── components/
│ │ ├── AudioConfig.tsx # Audio device selector
│ │ ├── DeviceSelector.tsx # ADB device picker (tabs)
│ │ ├── CommandPreview.tsx # Shows generated scrcpy command
│ │ ├── Header.tsx # Top bar (connect, status, download indicator)
│ │ └── LogConsole.tsx # Live scrcpy output viewer
│ └── hooks/
│ ├── useAutoScroll.ts # Auto-scroll-to-bottom logic
│ └── useClipboardWithFeedback.ts # Copy with visual feedback
│
├── src-tauri/ # Rust backend
│ └── src/
│ ├── lib.rs # Tauri commands, app entry point, AppState
│ ├── main.rs # Tauri entry point
│ ├── audio_routing.rs # WinRT per-app audio routing (IAudioPolicyConfigFactory)
│ ├── device_routing.rs # Device resolution + registry writes (COM + advapi32)
│ ├── volume_control.rs # Process volume control (WASAPI sessions)
│ ├── adb_manager.rs # Portable adb download + wireless connect
│ └── scrcpy_manager.rs # Portable scrcpy download + launch
│
├── CHANGELOG.md
├── package.json
├── tsconfig.json
└── vite.config.ts

Prerequisites

  • Windows 10 or 11 (x64)
  • An Android device with USB Debugging enabled (and/or Wireless Debugging on Android 11+)
  • A USB cable (for first-time USB pairing)

Usage

  1. Connect your phone via USB or pair wirelessly. Accept the RSA key fingerprint prompt.
  2. Select your device from the dropdown. Wireless devices are remembered for auto-reconnect.
  3. Configure audio — source (mic, output, voice-communication), codec (raw for lowest latency, opus for compression), buffer size.
  4. Choose an output device from the Volume Mixer dropdown — route the phone mic to speakers, headphones, or a virtual cable.
  5. Tweak volume with the independent scrcpy volume slider.
  6. Press "Launch scrcpy" and watch the live log console. The audio routing and volume are applied automatically.

All settings persist in localStorage until overridden.


Development

Prerequisites

Getting Started

cd micpy
bun install
bun run tauri dev

Build

bun run tauri build
# Installable MSI will be placed in src-tauri/target/release/bundle/msi/

Acknowledgments

  • scrcpy — the incredible screen mirroring tool whose audio-forwarding feature makes this whole project possible.
  • Windows CoreAudio / WASAPI / WinRT — for providing the native APIs that replaced PowerShell and SoundVolumeView.
  • ASIO Bridge Audio — for bridging the gap between playback output and microphone input.

About

Microphone Copy App based on Scrcpy

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

MICPY

A Windows desktop GUI for streaming Android microphone audio to a PC over USB or Wi-Fi.

MICPY stands for Mic (microphone) + Py (copy) — a homage to SCRCPY. It solves a simple problem: laptop microphones in 2026 are still not viable due to fan noise, poor placement, and mediocre quality. MICPY lets you use your Android phone's high-quality microphone as a wireless PC mic with minimal latency, all through a polished GUI.

Built with Tauri 2, React 19, and Rust, wrapping scrcpy's audio-forwarding capabilities in a native interface with full Volume Mixer integration.


Features

  • USB & Wireless — connect via USB or pair wirelessly (Android 11+). Remembers your last wireless device for auto-reconnect.
  • Portable scrcpy — on first launch, MICPY downloads and manages its own scrcpy copy. No PATH setup required.
  • Audio routing & volume control — route scrcpy's audio to any Windows playback device (all 3 WASAPI roles) with independent volume.
  • Output device selection — dropdown menu picks exactly where the phone mic audio goes: speakers, headphones, VB-Cable, Voicemeeter, etc.
  • ASIO Bridge ready — pair with ASIO Bridge Audio to expose the phone mic as a real Windows microphone input, usable in any software (Handy, OBS, Discord, etc.).
  • Live log console — real-time scrcpy output with color-coded levels and one-click copy.
  • Command preview — see the exact scrcpy command before pressing start.

Architecture

┌─────────────────────────────────────────────────────────────┐
│ Tauri 2 Desktop App │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ React 19 Frontend (WebView) │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────────┐ │ │
│ │ │ AudioConfig│ │ Header │ │ LogConsole │ │ │
│ │ │DeviceSelect│ │ (status, │ │ (live stream) │ │ │
│ │ │ │ │ connect) │ │ │ │ │
│ │ └────────────┘ └────────────┘ └────────────────┘ │ │
│ └──────────────────────┬────────────────────────────────┘ │
│ │ invoke() │
│ ┌──────────────────────┴────────────────────────────────┐ │
│ │ Tauri Rust Backend (lib.rs) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ Audio Management Stack │ │ │
│ │ │ ┌────────────────────────────────────────┐ │ │ │
│ │ │ │ device_routing.rs (device resolution) │ │ │ │
│ │ │ │ → IMMDeviceEnumerator COM │ │ │ │
│ │ │ │ → Win32 registry FFI │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ audio_routing.rs (per-app policy) │ │ │ │
│ │ │ │ → WinRT IAudioPolicyConfigFactory │ │ │ │
│ │ │ │ → version-aware vtable dispatch │ │ │ │
│ │ │ └───────────────┬────────────────────────┘ │ │ │
│ │ │ ┌───────────────┴────────────────────────┐ │ │ │
│ │ │ │ volume_control.rs (session volume) │ │ │ │
│ │ │ │ → WASAPI IAudioSessionManager2 │ │ │ │
│ │ │ │ → ISimpleAudioVolume │ │ │ │
│ │ │ └────────────────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌──────────────────┐ │ │
│ │ │scrcpy_ │ │adb_manager.rs │ │ │
│ │ │manager.rs │ │(download, │ │ │
│ │ │(find, dl, │ │ extract, connect)│ │ │
│ │ │ launch) │ └──────────────────┘ │ │
│ │ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ scrcpy ─── ADB ─── Android Device │
└──────────────────────────────────────────────────────────────┘

Tech Stack

LayerTechnology
Desktop ShellTauri 2 (Rust + WebView)
FrontendReact 19, TypeScript, CSS
Audio Device EnumerationWindows MMDevice API via windows crate COM bindings
Per-App Audio RoutingWinRT COMIAudioPolicyConfigFactory with manual vtable dispatch
Process Volume ControlWASAPI COMIAudioSessionManager2ISimpleAudioVolume
Registry Syncadvapi32.dll FFIRegCreateKeyExW, RegSetValueExW, RegDeleteTreeW
Stream TransportADB (USB / Wireless)

The audio management stack is entirely native Rust — no PowerShell, no SoundVolumeView, no external tools. Everything from device enumeration to per-app routing to session volume is done through Windows COM and WinRT APIs directly.

Typical Use Case

  1. Connect your Android phone (USB or wireless ADB).
  2. Select the audio source (mic, voice-communication, etc.) and codec (raw, opus, aac, flac).
  3. Choose an output device from the Volume Mixer dropdown — or leave it on "Default" for the next step.
  4. Install ASIO Bridge Audio and route scrcpy's output to a virtual input.
  5. Open your speech-to-text software (Handy, OBS, Discord, etc.) and select that virtual microphone input.
  6. Enjoy your phone's high-quality microphone on PC — no fan noise, no laptop mic hiss.

Project Structure

micpy/
├── src/ # React frontend
│ ├── App.tsx # Main app component
│ ├── App.css
│ ├── main.tsx # Entry point
│ ├── index.css
│ ├── components/
│ │ ├── AudioConfig.tsx # Audio device selector
│ │ ├── DeviceSelector.tsx # ADB device picker (tabs)
│ │ ├── CommandPreview.tsx # Shows generated scrcpy command
│ │ ├── Header.tsx # Top bar (connect, status, download indicator)
│ │ └── LogConsole.tsx # Live scrcpy output viewer
│ └── hooks/
│ ├── useAutoScroll.ts # Auto-scroll-to-bottom logic
│ └── useClipboardWithFeedback.ts # Copy with visual feedback
│
├── src-tauri/ # Rust backend
│ └── src/
│ ├── lib.rs # Tauri commands, app entry point, AppState
│ ├── main.rs # Tauri entry point
│ ├── audio_routing.rs # WinRT per-app audio routing (IAudioPolicyConfigFactory)
│ ├── device_routing.rs # Device resolution + registry writes (COM + advapi32)
│ ├── volume_control.rs # Process volume control (WASAPI sessions)
│ ├── adb_manager.rs # Portable adb download + wireless connect
│ └── scrcpy_manager.rs # Portable scrcpy download + launch
│
├── CHANGELOG.md
├── package.json
├── tsconfig.json
└── vite.config.ts

Prerequisites

  • Windows 10 or 11 (x64)
  • An Android device with USB Debugging enabled (and/or Wireless Debugging on Android 11+)
  • A USB cable (for first-time USB pairing)

Usage

  1. Connect your phone via USB or pair wirelessly. Accept the RSA key fingerprint prompt.
  2. Select your device from the dropdown. Wireless devices are remembered for auto-reconnect.
  3. Configure audio — source (mic, output, voice-communication), codec (raw for lowest latency, opus for compression), buffer size.
  4. Choose an output device from the Volume Mixer dropdown — route the phone mic to speakers, headphones, or a virtual cable.
  5. Tweak volume with the independent scrcpy volume slider.
  6. Press "Launch scrcpy" and watch the live log console. The audio routing and volume are applied automatically.

All settings persist in localStorage until overridden.


Development

Prerequisites

Getting Started

cd micpy
bun install
bun run tauri dev

Build

bun run tauri build
# Installable MSI will be placed in src-tauri/target/release/bundle/msi/

Acknowledgments

  • scrcpy — the incredible screen mirroring tool whose audio-forwarding feature makes this whole project possible.
  • Windows CoreAudio / WASAPI / WinRT — for providing the native APIs that replaced PowerShell and SoundVolumeView.
  • ASIO Bridge Audio — for bridging the gap between playback output and microphone input.

About

Microphone Copy App based on Scrcpy

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages