From 181af686c2911648ff30b79c703704acf5f9ee59 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jaime=20Garc=C3=ADa?=
<55400857+jaime-grj@users.noreply.github.com>
Date: Wed, 6 Aug 2025 01:49:30 +0200
Subject: [PATCH] feat: show sampling rate and bit depth if available
---
.../tempo/database/AppDatabase.java | 4 +-
.../tempo/model/Chronology.kt | 2 +
.../com/cappielloantonio/tempo/model/Queue.kt | 2 +
.../tempo/subsonic/models/Child.kt | 6 +++
.../tempo/ui/dialog/TrackInfoDialog.java | 2 +
.../ui/fragment/PlayerControllerFragment.java | 15 +++++-
.../tempo/util/MappingUtil.java | 2 +
.../tempo/util/MusicUtil.java | 7 +++
app/src/main/res/layout/dialog_track_info.xml | 52 +++++++++++++++++++
app/src/main/res/values-es-rES/strings.xml | 2 +
app/src/main/res/values/strings.xml | 2 +
11 files changed, 93 insertions(+), 3 deletions(-)
diff --git a/app/src/main/java/com/cappielloantonio/tempo/database/AppDatabase.java b/app/src/main/java/com/cappielloantonio/tempo/database/AppDatabase.java
index ed37106b..b19e934f 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/database/AppDatabase.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/database/AppDatabase.java
@@ -28,9 +28,9 @@ import com.cappielloantonio.tempo.subsonic.models.Playlist;
@UnstableApi
@Database(
- version = 10,
+ version = 11,
entities = {Queue.class, Server.class, RecentSearch.class, Download.class, Chronology.class, Favorite.class, SessionMediaItem.class, Playlist.class},
- autoMigrations = {@AutoMigration(from = 9, to = 10)}
+ autoMigrations = {@AutoMigration(from = 10, to = 11)}
)
@TypeConverters({DateConverters.class})
public abstract class AppDatabase extends RoomDatabase {
diff --git a/app/src/main/java/com/cappielloantonio/tempo/model/Chronology.kt b/app/src/main/java/com/cappielloantonio/tempo/model/Chronology.kt
index c84781a3..18a77bfa 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/model/Chronology.kt
+++ b/app/src/main/java/com/cappielloantonio/tempo/model/Chronology.kt
@@ -37,6 +37,8 @@ class Chronology(@PrimaryKey override val id: String) : Child(id) {
transcodedSuffix = mediaItem.mediaMetadata.extras!!.getString("transcodedSuffix")
duration = mediaItem.mediaMetadata.extras!!.getInt("duration")
bitrate = mediaItem.mediaMetadata.extras!!.getInt("bitrate")
+ samplingRate = mediaItem.mediaMetadata.extras!!.getInt("samplingRate")
+ bitDepth = mediaItem.mediaMetadata.extras!!.getInt("bitDepth")
path = mediaItem.mediaMetadata.extras!!.getString("path")
isVideo = mediaItem.mediaMetadata.extras!!.getBoolean("isVideo")
userRating = mediaItem.mediaMetadata.extras!!.getInt("userRating")
diff --git a/app/src/main/java/com/cappielloantonio/tempo/model/Queue.kt b/app/src/main/java/com/cappielloantonio/tempo/model/Queue.kt
index a5f66ada..ca2300c2 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/model/Queue.kt
+++ b/app/src/main/java/com/cappielloantonio/tempo/model/Queue.kt
@@ -41,6 +41,8 @@ class Queue(override val id: String) : Child(id) {
transcodedSuffix = child.transcodedSuffix
duration = child.duration
bitrate = child.bitrate
+ samplingRate = child.samplingRate
+ bitDepth = child.bitDepth
path = child.path
isVideo = child.isVideo
userRating = child.userRating
diff --git a/app/src/main/java/com/cappielloantonio/tempo/subsonic/models/Child.kt b/app/src/main/java/com/cappielloantonio/tempo/subsonic/models/Child.kt
index 6299dfe2..15057cf7 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/subsonic/models/Child.kt
+++ b/app/src/main/java/com/cappielloantonio/tempo/subsonic/models/Child.kt
@@ -50,6 +50,12 @@ open class Child(
@ColumnInfo("bitrate")
@SerializedName("bitRate")
var bitrate: Int? = null,
+ @ColumnInfo("sampling_rate")
+ @SerializedName("samplingRate")
+ var samplingRate: Int? = null,
+ @ColumnInfo("bit_depth")
+ @SerializedName("bitDepth")
+ var bitDepth: Int? = null,
@ColumnInfo
var path: String? = null,
@ColumnInfo(name = "is_video")
diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/TrackInfoDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/TrackInfoDialog.java
index ca9b6d20..84afcb6a 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/TrackInfoDialog.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/TrackInfoDialog.java
@@ -72,6 +72,8 @@ public class TrackInfoDialog extends DialogFragment {
bind.transcodedSuffixValueSector.setText(mediaMetadata.extras.getString("transcodedSuffix", getString(R.string.label_placeholder)));
bind.durationValueSector.setText(MusicUtil.getReadableDurationString(mediaMetadata.extras.getInt("duration", 0), false));
bind.bitrateValueSector.setText(mediaMetadata.extras.getInt("bitrate", 0) + " kbps");
+ bind.samplingRateValueSector.setText(mediaMetadata.extras.getInt("samplingRate", 0) != 0 ? mediaMetadata.extras.getInt("samplingRate", 0) + " Hz" : getString(R.string.label_placeholder));
+ bind.bitDepthValueSector.setText(mediaMetadata.extras.getInt("bitDepth", 0) != 0 ? mediaMetadata.extras.getInt("bitDepth", 0) + " bits" : getString(R.string.label_placeholder));
bind.pathValueSector.setText(mediaMetadata.extras.getString("path", getString(R.string.label_placeholder)));
bind.discNumberValueSector.setText(String.valueOf(mediaMetadata.extras.getInt("discNumber", 0)));
}
diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java
index d1daae9b..37cd9f10 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java
@@ -2,6 +2,7 @@ package com.cappielloantonio.tempo.ui.fragment;
import android.content.ComponentName;
import android.os.Bundle;
+import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -40,6 +41,9 @@ import com.google.android.material.elevation.SurfaceColors;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Objects;
@UnstableApi
@@ -190,14 +194,23 @@ public class PlayerControllerFragment extends Fragment {
if (mediaMetadata.extras != null) {
String extension = mediaMetadata.extras.getString("suffix", "Unknown format");
String bitrate = mediaMetadata.extras.getInt("bitrate", 0) != 0 ? mediaMetadata.extras.getInt("bitrate", 0) + "kbps" : "Original";
+ String samplingRate = mediaMetadata.extras.getInt("samplingRate", 0) != 0 ? new DecimalFormat("0.#").format(mediaMetadata.extras.getInt("samplingRate", 0) / 1000.0) + "kHz" : "";
+ String bitDepth = mediaMetadata.extras.getInt("bitDepth", 0) != 0 ? mediaMetadata.extras.getInt("bitDepth", 0) + "b" : "";
playerMediaExtension.setText(extension);
if (bitrate.equals("Original")) {
playerMediaBitrate.setVisibility(View.GONE);
} else {
+ List mediaQualityItems = new ArrayList<>();
+
+ if (!bitrate.trim().isEmpty()) mediaQualityItems.add(bitrate);
+ if (!bitDepth.trim().isEmpty()) mediaQualityItems.add(bitDepth);
+ if (!samplingRate.trim().isEmpty()) mediaQualityItems.add(samplingRate);
+
+ String mediaQuality = TextUtils.join(" • ", mediaQualityItems);
playerMediaBitrate.setVisibility(View.VISIBLE);
- playerMediaBitrate.setText(bitrate);
+ playerMediaBitrate.setText(mediaQuality);
}
}
diff --git a/app/src/main/java/com/cappielloantonio/tempo/util/MappingUtil.java b/app/src/main/java/com/cappielloantonio/tempo/util/MappingUtil.java
index be531eda..1b88774d 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/util/MappingUtil.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/util/MappingUtil.java
@@ -54,6 +54,8 @@ public class MappingUtil {
bundle.putString("transcodedSuffix", media.getTranscodedSuffix());
bundle.putInt("duration", media.getDuration() != null ? media.getDuration() : 0);
bundle.putInt("bitrate", media.getBitrate() != null ? media.getBitrate() : 0);
+ bundle.putInt("samplingRate", media.getSamplingRate() != null ? media.getSamplingRate() : 0);
+ bundle.putInt("bitDepth", media.getBitDepth() != null ? media.getBitDepth() : 0);
bundle.putString("path", media.getPath());
bundle.putBoolean("isVideo", media.isVideo());
bundle.putInt("userRating", media.getUserRating() != null ? media.getUserRating() : 0);
diff --git a/app/src/main/java/com/cappielloantonio/tempo/util/MusicUtil.java b/app/src/main/java/com/cappielloantonio/tempo/util/MusicUtil.java
index fddb4cce..696b5b9d 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/util/MusicUtil.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/util/MusicUtil.java
@@ -15,6 +15,7 @@ import com.cappielloantonio.tempo.repository.DownloadRepository;
import com.cappielloantonio.tempo.subsonic.models.Child;
import java.text.CharacterIterator;
+import java.text.DecimalFormat;
import java.text.StringCharacterIterator;
import java.util.ArrayList;
import java.util.List;
@@ -163,6 +164,12 @@ public class MusicUtil {
" " +
child.getBitrate() +
"kbps" +
+ " • " +
+ (child.getBitDepth() != null && child.getBitDepth() != 0
+ ? child.getBitDepth() + "/" + (child.getSamplingRate() != null ? child.getSamplingRate() / 1000 : "")
+ : (child.getSamplingRate() != null
+ ? new DecimalFormat("0.#").format(child.getSamplingRate() / 1000.0) + "kHz"
+ : "")) +
" " +
child.getSuffix();
}
diff --git a/app/src/main/res/layout/dialog_track_info.xml b/app/src/main/res/layout/dialog_track_info.xml
index ee6eb8b8..ae72877f 100644
--- a/app/src/main/res/layout/dialog_track_info.xml
+++ b/app/src/main/res/layout/dialog_track_info.xml
@@ -391,6 +391,58 @@
android:text="@string/label_placeholder" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Interno
Álbum
Artista
+ Profundidad de bits
Tasa de bits
+ Tasa de muestreo
Tipo de contenido
Aceptar
Tipo de contenido en la transcodificación
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 8ecb78af..a05234fb 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -395,6 +395,7 @@
https://buymeacoffee.com/a.cappiello
Album
Artist
+ Bit depth
Bitrate
Content Type
OK
@@ -403,6 +404,7 @@
Duration
Genre
Path
+ Sampling rate
Size
Suffix
The file has been downloaded using the Subsonic APIs. The codec and bitrate of the file remain unchanged from the source file.