diff --git a/README.md b/README.md
index 4f9ad629..bf3aa320 100644
--- a/README.md
+++ b/README.md
@@ -142,6 +142,7 @@ A partial list of parameters are below. See the config file for a complete list.
| `vsync`
`gl_vsync` | Set vsync for OpenGL or Vulkan |
| `media_player` | Show media player metadata |
| `media_player_name` | Set main media player DBus service name without the `org.mpris.MediaPlayer2` part, like `spotify`, `vlc`, `audacious` or `cantata`. Defaults to `spotify`. |
+| `media_player_order` | Media player metadata field order. Defaults to `title,artist,album`. |
| `font_scale_media_player` | Change size of media player text relative to font_size |
| `io_read`
`io_write` | Show non-cached IO read/write, in MiB/s |
| `pci_dev` | Select GPU device in multi-gpu setups |
diff --git a/bin/MangoHud.conf b/bin/MangoHud.conf
index b371c84a..05600c17 100644
--- a/bin/MangoHud.conf
+++ b/bin/MangoHud.conf
@@ -97,6 +97,7 @@ background_alpha=0.5
### Show media player metadata
# media_player
# media_player_name = spotify
+# media_player_order = title,artist,album
### Specify gpu with pci bus id for amdgpu and NVML stats.
### Set to 'domain:bus:slot.function'
diff --git a/src/overlay.cpp b/src/overlay.cpp
index ae1a20bf..766e4dd8 100644
--- a/src/overlay.cpp
+++ b/src/overlay.cpp
@@ -957,10 +957,11 @@ float get_ticker_limited_pos(float pos, float tw, float& left_limit, float& righ
}
#ifdef HAVE_DBUS
-void render_mpris_metadata(swapchain_stats& data, const ImVec4& color, metadata& meta, uint64_t frame_timing, bool is_main)
+static void render_mpris_metadata(struct overlay_params& params, metadata& meta, uint64_t frame_timing, bool is_main)
{
scoped_lock lk(meta.mutex);
if (meta.valid) {
+ auto color = ImGui::ColorConvertU32ToFloat4(params.media_player_color);
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(8,0));
ImGui::Dummy(ImVec2(0.0f, 20.0f));
//ImGui::PushFont(data.font1);
@@ -989,18 +990,34 @@ void render_mpris_metadata(swapchain_stats& data, const ImVec4& color, metadata&
meta.ticker.pos -= .5f * (frame_timing / 16666.7f) * meta.ticker.dir;
- new_pos = get_ticker_limited_pos(meta.ticker.pos, meta.ticker.tw0, left_limit, right_limit);
- ImGui::SetCursorPosX(new_pos);
- ImGui::TextColored(color, "%s", meta.title.c_str());
-
- new_pos = get_ticker_limited_pos(meta.ticker.pos, meta.ticker.tw1, left_limit, right_limit);
- ImGui::SetCursorPosX(new_pos);
- ImGui::TextColored(color, "%s", meta.artists.c_str());
- //ImGui::NewLine();
- if (!meta.album.empty()) {
- new_pos = get_ticker_limited_pos(meta.ticker.pos, meta.ticker.tw2, left_limit, right_limit);
- ImGui::SetCursorPosX(new_pos);
- ImGui::TextColored(color, "%s", meta.album.c_str());
+ for (auto order : params.media_player_order) {
+ switch (order) {
+ case MP_ORDER_TITLE:
+ {
+ new_pos = get_ticker_limited_pos(meta.ticker.pos, meta.ticker.tw0, left_limit, right_limit);
+ ImGui::SetCursorPosX(new_pos);
+ ImGui::TextColored(color, "%s", meta.title.c_str());
+ }
+ break;
+ case MP_ORDER_ARTIST:
+ {
+ new_pos = get_ticker_limited_pos(meta.ticker.pos, meta.ticker.tw1, left_limit, right_limit);
+ ImGui::SetCursorPosX(new_pos);
+ ImGui::TextColored(color, "%s", meta.artists.c_str());
+ }
+ break;
+ case MP_ORDER_ALBUM:
+ {
+ //ImGui::NewLine();
+ if (!meta.album.empty()) {
+ new_pos = get_ticker_limited_pos(meta.ticker.pos, meta.ticker.tw2, left_limit, right_limit);
+ ImGui::SetCursorPosX(new_pos);
+ ImGui::TextColored(color, "%s", meta.album.c_str());
+ }
+ }
+ break;
+ default: break;
+ }
}
if (is_main && main_metadata.valid && !main_metadata.playing) {
@@ -1355,9 +1372,8 @@ void render_imgui(swapchain_stats& data, struct overlay_params& params, ImVec2&
ImFont scaled_font;
scale_default_font(scaled_font, params.font_scale_media_player);
ImGui::PushFont(&scaled_font);
- auto media_color = ImGui::ColorConvertU32ToFloat4(params.media_player_color);
- render_mpris_metadata(data, media_color, main_metadata, frame_timing, true);
- render_mpris_metadata(data, media_color, generic_mpris, frame_timing, false);
+ render_mpris_metadata(params, main_metadata, frame_timing, true);
+ render_mpris_metadata(params, generic_mpris, frame_timing, false);
ImGui::PopFont();
#endif
diff --git a/src/overlay_params.cpp b/src/overlay_params.cpp
index ef223ba4..09887a52 100644
--- a/src/overlay_params.cpp
+++ b/src/overlay_params.cpp
@@ -8,6 +8,8 @@
#include
#include
#include
+#include
+#include
#include "overlay_params.h"
#include "overlay.h"
@@ -182,6 +184,25 @@ parse_path(const char *str)
return str;
}
+static std::vector
+parse_media_player_order(const char *str)
+{
+ std::vector order;
+ std::stringstream ss(str);
+ std::string token;
+ while (std::getline(ss, token, ',')) {
+ trim(token);
+ std::transform(token.begin(), token.end(), token.begin(), ::tolower);
+ if (token == "title")
+ order.push_back(MP_ORDER_TITLE);
+ else if (token == "artist")
+ order.push_back(MP_ORDER_ARTIST);
+ else if (token == "album")
+ order.push_back(MP_ORDER_ALBUM);
+ }
+ return order;
+}
+
#define parse_width(s) parse_unsigned(s)
#define parse_height(s) parse_unsigned(s)
#define parse_vsync(s) parse_unsigned(s)
@@ -367,6 +388,7 @@ parse_overlay_config(struct overlay_params *params,
params->media_player_name = "spotify";
params->font_scale_media_player = 0.55f;
params->log_interval = 100;
+ params->media_player_order = { MP_ORDER_TITLE, MP_ORDER_ARTIST, MP_ORDER_ALBUM };
#ifdef HAVE_X11
params->toggle_hud = { XK_Shift_R, XK_F12 };
diff --git a/src/overlay_params.h b/src/overlay_params.h
index 29984c69..61b0598e 100644
--- a/src/overlay_params.h
+++ b/src/overlay_params.h
@@ -84,6 +84,7 @@ typedef unsigned long KeySym;
OVERLAY_PARAM_CUSTOM(pci_dev) \
OVERLAY_PARAM_CUSTOM(media_player_name) \
OVERLAY_PARAM_CUSTOM(media_player_color) \
+ OVERLAY_PARAM_CUSTOM(media_player_order) \
OVERLAY_PARAM_CUSTOM(cpu_text) \
OVERLAY_PARAM_CUSTOM(gpu_text) \
OVERLAY_PARAM_CUSTOM(log_interval) \
@@ -102,6 +103,12 @@ enum overlay_plots {
OVERLAY_PLOTS_MAX,
};
+enum media_player_order {
+ MP_ORDER_TITLE,
+ MP_ORDER_ARTIST,
+ MP_ORDER_ALBUM,
+};
+
enum overlay_param_enabled {
#define OVERLAY_PARAM_BOOL(name) OVERLAY_PARAM_ENABLED_##name,
#define OVERLAY_PARAM_CUSTOM(name)
@@ -141,6 +148,7 @@ struct overlay_params {
std::string media_player_name;
std::string cpu_text, gpu_text;
unsigned log_interval;
+ std::vector media_player_order;
std::string config_file_path;
std::unordered_map options;