{"id":26088960,"url":"https://github.com/yume-chan/volumemanager","last_synced_at":"2025-07-13T01:13:02.638Z","repository":{"id":281366522,"uuid":"945061262","full_name":"yume-chan/VolumeManager","owner":"yume-chan","description":"Control each app's volume independently.","archived":false,"fork":false,"pushed_at":"2025-04-27T16:18:04.000Z","size":370,"stargazers_count":141,"open_issues_count":5,"forks_count":2,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-07-05T09:41:15.800Z","etag":null,"topics":["adb","android","shizuku","volume-control"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yume-chan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-03-08T15:13:10.000Z","updated_at":"2025-07-02T18:52:26.000Z","dependencies_parsed_at":"2025-03-08T16:23:17.805Z","dependency_job_id":"4b230620-77ff-4f74-bef3-1586d29f695c","html_url":"https://github.com/yume-chan/VolumeManager","commit_stats":null,"previous_names":["yume-chan/volumemanager"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/yume-chan/VolumeManager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yume-chan%2FVolumeManager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yume-chan%2FVolumeManager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yume-chan%2FVolumeManager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yume-chan%2FVolumeManager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yume-chan","download_url":"https://codeload.github.com/yume-chan/VolumeManager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yume-chan%2FVolumeManager/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265077549,"owners_count":23707706,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["adb","android","shizuku","volume-control"],"created_at":"2025-03-09T08:44:37.991Z","updated_at":"2025-07-13T01:13:02.614Z","avatar_url":"https://github.com/yume-chan.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Volume Manager\n\n**Work in progress**\n\nControl each app's volume independently. [Shizuku](https://shizuku.rikka.app/) is used to access privileged APIs.\n\nRequires Android 13.\n\n![Screenshot](screenshot.png)\n\n## Download\n\nLatest development version can be downloaded from [action artifacts](https://github.com/yume-chan/VolumeManager/actions).\n\nSome hand-picked versions can also be downloaded from [releases](https://github.com/yume-chan/VolumeManager/releases).\n\n## Usage\n\n1. Install and enable [Shizuku](https://shizuku.rikka.app/)\n2. Launch Volume Manager and request Shizuku permission\n3. It should automatically enable its accessibility service\n4. You can change volume either from\n   1. The main interface\n   2. Press any volume button and a popup should appear, completely replace the default volume popup\n   3. Enable accessibility button and click the button\n\n## Compare to [SoundMaster from ShizuTools](https://github.com/legendsayantan/ShizuTools/wiki/SoundMaster)\n\nThis app uses hidden API to directly change each audio stream's volume.\n\nSoundMaster uses MediaProjection API to record audio from each app and apply post-effects.\n\n| Feature                        | Volume Manager  | SoundMaster     |\n| ------------------------------ | --------------- | --------------- |\n| Minimal Android version        | 13              | 10              |\n| Control volume of each app     | ✅              | ✅              |\n| Set output device for each app | ❌ \u003csup\u003e1\u003c/sup\u003e | ✅              |\n| Change left-right balance      | ❌ \u003csup\u003e2\u003c/sup\u003e | ✅              |\n| Equalizer (EQ)                 | ❌              | ✅              |\n| Control protected apps         | ✅              | ❌ \u003csup\u003e3\u003c/sup\u003e |\n| Zero latency added             | ✅              | ❌              |\n\n\u003csup\u003e1\u003c/sup\u003e: There are APIs to do that, but not implemented in this app\n\n\u003csup\u003e2\u003c/sup\u003e: There are other APIs to do that, but not implemented in this app\n\n\u003csup\u003e3\u003c/sup\u003e: Can be worked around by patching the app\n\n## How does it work\n\n1. Use [`AudioManager#getActivePlaybackConfigurations()`](\u003chttps://developer.android.com/reference/android/media/AudioManager#getActivePlaybackConfigurations()\u003e) to get list of [`AudioPlaybackConfiguration`](https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/media/java/android/media/AudioPlaybackConfiguration.java;drc=e282cc572ef848b1cb8d622c2c4939aac37c3b27).\n\n   Each `AudioPlaybackConfiguration` represents a audio player, like [`AudioTrack`](https://developer.android.com/reference/android/media/AudioTrack) and [`MediaPlayer`](https://developer.android.com/media/platform/mediaplayer)\n\n2. Use [`ActivityManager#getRunningAppProcesses()`](\u003chttps://developer.android.com/reference/android/app/ActivityManager#getRunningAppProcesses()\u003e) and [`PackageManager#getApplicationInfo()`](\u003chttps://developer.android.com/reference/android/content/pm/PackageManager#getApplicationInfo(java.lang.String,%20android.content.pm.PackageManager.ApplicationInfoFlags)\u003e) to map and group `AudioPlaybackConfiguration#getClientPid()` to apps\n3. Use `AudioPlaybackConfiguration#getPlayerProxy()` and [`IPlayer.setVolume()`](https://cs.android.com/android/platform/superproject/main/+/main:frameworks/av/media/libaudioclient/aidl/android/media/IPlayer.aidl;l=29;drc=75e48fea431b1de2bf1715eb5c22ba4c794200bd) to update the internal volume multiplier\n4. Use [`AudioManager#registerAudioPlaybackCallback()`](\u003chttps://developer.android.com/reference/android/media/AudioManager?hl=en#registerAudioPlaybackCallback(android.media.AudioManager.AudioPlaybackCallback,%20android.os.Handler)\u003e) to listen for new `AudioPlaybackConfiguration`s and apply current volume to them.\n\n## Note\n\nThis app uses the same API as MIUI's \"Adjust media sound in multiple apps\". Because this API can only setting volume, not reading, the volume set by one app will not be reflected in the other one.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyume-chan%2Fvolumemanager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyume-chan%2Fvolumemanager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyume-chan%2Fvolumemanager/lists"}