75 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Visualizer (Android)
 | |
| 
 | |
| A tiny Jetpack Compose demo that visualizes the device audio output using the Android `Visualizer` API.
 | |
| 
 | |
| It attaches to audio session 0 (global output mix) and renders:
 | |
| - Waveform view (time-domain samples)
 | |
| - FFT magnitude bars (frequency-domain snapshot)
 | |
| - Simple metrics (sample count, RMS, peak, first bytes)
 | |
| 
 | |
| The UI is written with Jetpack Compose and organized into small composables.
 | |
| 
 | |
| ## Features
 | |
| - VisualizerController wrapper around `android.media.audiofx.Visualizer`
 | |
| - Global output (session 0) capture for convenience
 | |
| - Waveform and FFT visualizations
 | |
| - Permission handling (RECORD_AUDIO)
 | |
| - Basic controls to Start/Stop capture
 | |
| 
 | |
| ## Requirements
 | |
| - Android 7.0 (API 24) or later
 | |
| - Microphone permission (RECORD_AUDIO)
 | |
| - Audio playing on the device (e.g., music app) to see the visualization
 | |
| 
 | |
| ## How it works
 | |
| - `VisualizerController` sets up the `Visualizer` with the maximum supported capture size and a reasonable capture rate (half of the device max).
 | |
| - It registers `OnDataCaptureListener` to receive waveform and FFT byte arrays.
 | |
| - The app processes those bytes in Compose to draw a waveform path and magnitude bars for FFT bins.
 | |
| 
 | |
| Key parts of the UI:
 | |
| - `PermissionSection` asks for RECORD_AUDIO when missing.
 | |
| - `WaveformView` draws the latest waveform as a continuous path.
 | |
| - `FftBarsView` computes magnitude per bin and draws vertical bars.
 | |
| - `MetricsSection` shows simple stats and a short hex-ish dump of the first bytes.
 | |
| - `ControlButtons` exposes Start/Stop buttons.
 | |
| 
 | |
| ## Build & Run
 | |
| 1. Open the project in Android Studio (Giraffe or newer recommended) and let it sync.
 | |
| 2. Select a connected device or emulator running API 24+.
 | |
| 3. Run the app.
 | |
| 
 | |
| Or via command line:
 | |
| 
 | |
| ```bash
 | |
| ./gradlew :app:assembleDebug
 | |
| ```
 | |
| 
 | |
| Then install the generated APK on a device.
 | |
| 
 | |
| ## Permissions
 | |
| This app requests `android.permission.RECORD_AUDIO` at runtime.
 | |
| 
 | |
| Note: The `Visualizer` API reads audio data for visualization — it does not record or store audio.
 | |
| 
 | |
| ## Limitations & Notes
 | |
| - Some OEMs/devices restrict or alter access to the global output mix (session 0). On such devices the visualizer may return zeros or fail to initialize.
 | |
| - You need active audio playback from another app to see non-zero data.
 | |
| - Bluetooth/headphones/audio effects may influence sampling output.
 | |
| - The FFT values are raw magnitudes derived from interleaved real/imag bytes and are not calibrated to physical units.
 | |
| 
 | |
| ## KDocs
 | |
| Public classes and composables are documented with KDoc in the source:
 | |
| - `VisualizerController` (class, start/stop)
 | |
| - `MainActivity` and `VisualizerScreen`
 | |
| - Composables: `WaveformView`, `FftBarsView`, `PermissionSection`, `ControlButtons`, `MetricsSection`
 | |
| - `AudioSessionsTracker` (placeholder)
 | |
| 
 | |
| You can browse KDocs directly in code. There is no generated site output configured for this sample.
 | |
| 
 | |
| ## Project Info
 | |
| - Min SDK: 24
 | |
| - Target/Compile SDK: 36
 | |
| - Kotlin/JVM target: 11
 | |
| - UI: Jetpack Compose Material 3
 | |
| 
 | |
| This is a learning/demo project — feel free to adapt it to your needs. | 
