diff options
author | Max Kellermann <max@musicpd.org> | 2020-04-02 18:02:10 +0200 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2020-04-02 18:02:10 +0200 |
commit | 12b97bbe3896df558b3b8f52e8d9d495058aa996 (patch) | |
tree | 4430cf6fcd89a7c9d389f1f903c927b6d5297d1a /src/mixer | |
parent | 7d7bd51bc0a4748593e774decc91a1dbc939fd90 (diff) | |
parent | 5ccfcffcc124e406233359fe8fe65b704b98b8c8 (diff) |
Merge tag 'v0.21.22'
release v0.21.22
Diffstat (limited to 'src/mixer')
-rw-r--r-- | src/mixer/MixerList.hxx | 1 | ||||
-rw-r--r-- | src/mixer/plugins/AndroidMixerPlugin.cxx | 116 | ||||
-rw-r--r-- | src/mixer/plugins/meson.build | 4 |
3 files changed, 121 insertions, 0 deletions
diff --git a/src/mixer/MixerList.hxx b/src/mixer/MixerList.hxx index d64d5d34b..7f68d84f5 100644 --- a/src/mixer/MixerList.hxx +++ b/src/mixer/MixerList.hxx @@ -29,6 +29,7 @@ struct MixerPlugin; extern const MixerPlugin null_mixer_plugin; extern const MixerPlugin software_mixer_plugin; +extern const MixerPlugin android_mixer_plugin; extern const MixerPlugin alsa_mixer_plugin; extern const MixerPlugin haiku_mixer_plugin; extern const MixerPlugin oss_mixer_plugin; diff --git a/src/mixer/plugins/AndroidMixerPlugin.cxx b/src/mixer/plugins/AndroidMixerPlugin.cxx new file mode 100644 index 000000000..b24b64fab --- /dev/null +++ b/src/mixer/plugins/AndroidMixerPlugin.cxx @@ -0,0 +1,116 @@ +/* + * Copyright 2003-2020 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "mixer/MixerInternal.hxx" +#include "filter/plugins/VolumeFilterPlugin.hxx" +#include "pcm/Volume.hxx" +#include "android/Context.hxx" +#include "android/AudioManager.hxx" + +#include "Main.hxx" + +#include <cassert> +#include <cmath> + +class AndroidMixer final : public Mixer { + AudioManager *audioManager; + int currentVolume; + int maxAndroidVolume; + int lastAndroidVolume; +public: + explicit AndroidMixer(MixerListener &_listener); + + ~AndroidMixer() override; + + /* virtual methods from class Mixer */ + void Open() override { + } + + void Close() noexcept override { + } + + int GetVolume() override; + + void SetVolume(unsigned volume) override; +}; + +static Mixer * +android_mixer_init([[maybe_unused]] EventLoop &event_loop, + [[maybe_unused]] AudioOutput &ao, + MixerListener &listener, + [[maybe_unused]] const ConfigBlock &block) +{ + return new AndroidMixer(listener); +} + +AndroidMixer::AndroidMixer(MixerListener &_listener) + :Mixer(android_mixer_plugin, _listener) +{ + JNIEnv *env = Java::GetEnv(); + audioManager = context->GetAudioManager(env); + + maxAndroidVolume = audioManager->GetMaxVolume(); + if (maxAndroidVolume != 0) + { + lastAndroidVolume = audioManager->GetVolume(env); + currentVolume = 100 * lastAndroidVolume / maxAndroidVolume; + } +} + +AndroidMixer::~AndroidMixer() +{ + delete audioManager; +} + +int +AndroidMixer::GetVolume() +{ + JNIEnv *env = Java::GetEnv(); + if (maxAndroidVolume == 0) + return -1; + + // The android volume index (or scale) is very likely inferior to the + // MPD one (100). The last volume set by MPD is saved into + // currentVolume, this volume is returned instead of the Android one + // when the Android mixer was not touched by an other application. This + // allows to fake a 0..100 scale from MPD. + + int volume = audioManager->GetVolume(env); + if (volume == lastAndroidVolume) + return currentVolume; + + return 100 * volume / maxAndroidVolume; +} + +void +AndroidMixer::SetVolume(unsigned newVolume) +{ + JNIEnv *env = Java::GetEnv(); + if (maxAndroidVolume == 0) + return; + currentVolume = newVolume; + lastAndroidVolume = currentVolume * maxAndroidVolume / 100; + audioManager->SetVolume(env, lastAndroidVolume); + +} + +const MixerPlugin android_mixer_plugin = { + android_mixer_init, + true, +}; diff --git a/src/mixer/plugins/meson.build b/src/mixer/plugins/meson.build index eda7c8e2a..ed9df39b3 100644 --- a/src/mixer/plugins/meson.build +++ b/src/mixer/plugins/meson.build @@ -34,6 +34,10 @@ if is_windows mixer_plugins_sources += 'WinmmMixerPlugin.cxx' endif +if is_android + mixer_plugins_sources += 'AndroidMixerPlugin.cxx' +endif + mixer_plugins = static_library( 'mixer_plugins', mixer_plugins_sources, |