2a46c6143bf13d28399463d1cade24ef7d33e093
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 theVisualizer
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
- Open the project in Android Studio (Giraffe or newer recommended) and let it sync.
- Select a connected device or emulator running API 24+.
- Run the app.
Or via command line:
./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
andVisualizerScreen
- 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.
Description
Languages
Kotlin
100%