summaryrefslogtreecommitdiff
path: root/src/mixer
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2020-04-02 18:02:10 +0200
committerMax Kellermann <max@musicpd.org>2020-04-02 18:02:10 +0200
commit12b97bbe3896df558b3b8f52e8d9d495058aa996 (patch)
tree4430cf6fcd89a7c9d389f1f903c927b6d5297d1a /src/mixer
parent7d7bd51bc0a4748593e774decc91a1dbc939fd90 (diff)
parent5ccfcffcc124e406233359fe8fe65b704b98b8c8 (diff)
Merge tag 'v0.21.22'
release v0.21.22
Diffstat (limited to 'src/mixer')
-rw-r--r--src/mixer/MixerList.hxx1
-rw-r--r--src/mixer/plugins/AndroidMixerPlugin.cxx116
-rw-r--r--src/mixer/plugins/meson.build4
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,