mkckr0 / audio-share

Audio Share can share Windows/Linux computer's audio to Android phone over network, so your phone becomes the speaker of computer. (You needn't buy a new speaker😄.)
Apache License 2.0
1.07k stars 48 forks source link
android asio audio audio-capture audio-playback audio-strea cpp kotlin linux pipewire windows

Audio Share

metadata/en-US/images/icon.png

GitHub release (latest SemVer) F-Droid GitHub license GitHub Release Date GitHub last commit GitHub contributors GitHub commit activity GitHub Repo stars GitHub forks GitHub watchers GitHub language count GitHub top language GitHub repo size GitHub all releases Download Audio Share GitHub issues GitHub closed issues GitHub pull requests GitHub closed pull requests Release GitHub number of milestones GitHub milestone details FOSSA Status

Download Audio Share

Audio Share can share Windows/Linux computer's audio to Android phone over network, so your phone becomes the speaker of computer. (You needn't buy a new speaker😄.)

Screenshots

docs/img/win_01.png 

docs/img/win_02.png

metadata/en-US/images/phoneScreenshots/1.png 

metadata/en-US/images/phoneScreenshots/2.png

Requirements

Usage for Windows GUI

[!CAUTION] This app doesn't support auto reconnecting feature at present. Once the app is killed or disconnected by Android power saver, the audio playing will be stop. Adding app to the whitelist of power saver is recommended. To do this, you can press "Request Ignore Battery Optimizations" on app's Settings.

Usage for Windows/Linux CMD

Configure Firewall Rules on Linux

Add rules

address=192.168.3.2 # change it.
port=65530 # change it.
sudo firewall-cmd --add-rich-rule="rule family=ipv4 destination address=$address port port=$port protocol=tcp accept"
sudo firewall-cmd --add-rich-rule="rule family=ipv4 destination address=$address port port=$port protocol=udp accept"
sudo firewall-cmd --runtime-to-permanent

Check rules

sudo firewall-cmd --list-rich-rules

Output:

rule family="ipv4" destination address="192.168.3.2" port port="65530" protocol="tcp" accept
rule family="ipv4" destination address="192.168.3.2" port port="65530" protocol="udp" accept

Remove rules

address=192.168.3.2 # change it.
port=65530 # change it.
sudo firewall-cmd --remove-rich-rule="rule family=ipv4 destination address=$address port port=$port protocol=tcp accept"
sudo firewall-cmd --remove-rich-rule="rule family=ipv4 destination address=$address port port=$port protocol=udp accept"
sudo firewall-cmd --runtime-to-permanent

About Audio Format

There are two kinds of audio format:

The transfer audio format is uncompressed PCM data and keep same with capture audio format.

You can open server.log to see the transfer audio format.

[2024-10-26 14:52:48.967] [info] AudioFormat:
encoding: ENCODING_PCM_16BIT
channels: 2
sample_rate: 44100

As shown above, the encoding is 16 bit integer PCM, the channel count is 2, and sample rate is 44.1kHz.

On Android, AudioTrack API only support the PCM audio formats listed below:

ENCODING_PCM_FLOAT
ENCODING_PCM_8BIT
ENCODING_PCM_16BIT
ENCODING_PCM_24BIT_PACKED
ENCODING_PCM_32BIT

https://developer.android.com/reference/android/media/AudioFormat#encoding

Audio Share support these 5 kinds of PCM format, but whether specific format is available depends on the audio endpoint.

On Windows, the default capture audio format depends on the audio endpoint's default format. You may change it by setting Sound Panel(mmsys.cpl). In Sound Panel's Playback tab, right click one available endpoint, and open Properties Panel, and select Advanced tab, and change Default Format and click Apply. This can be also done in Realtek Audio Console, if you use a Realtek audio card. The capture audio format must has the same channels and sample rate with the audio endpoint. So if you want to change them, you can only open Sound Panel and set default format. To be compatible with Linux, the as-cmd can still set the --channels or --sample-rate on Windows. However, it will fallback to the proper audio format, because it doesn't support the expected in most cases.

https://learn.microsoft.com/en-us/windows/win32/coreaudio/device-formats

On Linux, the default capture audio format could have been given by PipeWire completely. However, the default audio encoding may be planar, such as SPA_AUDIO_FORMAT_F32P. Android's AudioTrack can't play it. So the default audio encoding is forced to SPA_AUDIO_FORMAT_F32_LE(32 bit float PCM with little endian). The default channels and sample rate are untouched and given by PipeWire.

Note that decrease the encoding bitwise or sample rate can decrease network bandwidth, but can also increase the blank noise, also known as audio loss.

About Volume

The final volume that you hear is affected by the following volume:

They are all independent. If you max the volume of your PC and audio player, and still feel it's not enough, but don't want to change the Android system volume, you can increase "Loudness Enhancer" on app's Settings. It won't affect the system volume. The "Audio Volume" on app can decrease the volume you hear without changing system volume.

Too much loudness will hurt your ear!!! "Loudness Enhancer" has a limit of 3000mB. It's enough for most cases. If you still need more loudness, just directly change Android system volume.

Extra Setups for "No Audio Endpoint"

For Windows

Method 1: Make audio endpoint available when speaker doesn't plug in

Realtek sound card can make audio endpoint available when speaker doesn't plug in. Just open Realtek Audio Console, select "Device advanced settings" tab, and switch on "Disable front panel front popup dialog" option. Then the audio endpoint will show up. Other sound card may have similar options. If you can't find, then turn to Method 2.

Method 2: Install a third-party virtual audio device driver

At present, I haven't find a way to create virtual audio endpoint. The only way to achieve it is to write a virtual audio device driver. But it need a EV Code Signing Certificate to sign it. Otherwise, user can't install it. I don't want to pay for it. And there are many existed third-party virtual audio device drivers. You can find one or post one that you know at Virtual Audio Device Driver on Windows. Generally, a driver has an INF file. Right click it and click "Install" to install it.

For Linux

Thanks to PipeWire, it's very easy for Linux to create a virtual audio endpoint, even without a root privilege. Just copy the below config to ~/.config/pipewire/pipewire.conf.d/audio-share-sink.conf

context.objects = [
    {   factory = adapter
        args = {
           factory.name     = support.null-audio-sink
           node.name        = "Audio Share Sink"
           media.class      = Audio/Sink
           object.linger    = true
           audio.position   = [ FL FR ]
           priority.session = 1009
           priority.driver  = 1009
           monitor.channel-volumes = true
           monitor.passthrough = true
        }
    }
]

Then run systemctl --user restart pipewire to restart the PipeWire service.
Finally, you can see the added endpoint "Audio Share Sink".

[abc@localhost ~]$ as-cmd -l
[2024-03-17 22:46:14.563] [info] pipewire header_version: 0.3.48, library_version: 0.3.67
endpoint_list:
        * id: 30   name: Audio Share Sink
total: 1

Compile from source

Star History

Star History Chart

License

This project is licensed under the Apache-2.0 license .

   Copyright 2022-2024 mkckr0 <https://github.com/mkckr0>

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

FOSSA Status

Used Third-party Libraries

Sponsors