diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index f761e37..b9c831c 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -9,8 +9,8 @@ android { applicationId = "tv.orbit.classic" minSdk = 26 targetSdk = 36 - versionCode = 124 - versionName = "0.95.5-plain-sound" + versionCode = 125 + versionName = "0.95.6-sound-passthrough" } buildFeatures { compose = true } compileOptions { sourceCompatibility = JavaVersion.VERSION_17; targetCompatibility = JavaVersion.VERSION_17 } diff --git a/android/app/src/main/java/tv/orbit/classic/EmbyClient.kt b/android/app/src/main/java/tv/orbit/classic/EmbyClient.kt index 69ce80d..acbaf5d 100644 --- a/android/app/src/main/java/tv/orbit/classic/EmbyClient.kt +++ b/android/app/src/main/java/tv/orbit/classic/EmbyClient.kt @@ -66,7 +66,7 @@ internal class HttpsEmbyTransport(internal val deviceId: String = UUID.randomUUI connection.connectTimeout = 10_000 connection.readTimeout = request.readTimeoutMs ?: if (request.path == "/Sessions/Logout") 5_000 else 15_000 connection.setRequestProperty("Accept", "application/json") - connection.setRequestProperty("X-Emby-Authorization", "Emby Client=\"Orbit TV\", Device=\"Orbit TV\", DeviceId=\"$deviceId\", Version=\"0.95.5\"") + connection.setRequestProperty("X-Emby-Authorization", "Emby Client=\"Orbit TV\", Device=\"Orbit TV\", DeviceId=\"$deviceId\", Version=\"0.95.6\"") request.token?.let { connection.setRequestProperty("X-Emby-Token", it) } if (request.method == "POST") { val bytes = request.body.orEmpty().toByteArray(Charsets.UTF_8) diff --git a/android/app/src/main/java/tv/orbit/classic/SecureMediaDataSource.kt b/android/app/src/main/java/tv/orbit/classic/SecureMediaDataSource.kt index 66315a0..e17aecd 100644 --- a/android/app/src/main/java/tv/orbit/classic/SecureMediaDataSource.kt +++ b/android/app/src/main/java/tv/orbit/classic/SecureMediaDataSource.kt @@ -33,7 +33,7 @@ internal class SecureMediaDataSource(private val session: EmbySampleSession) : B next.instanceFollowRedirects = false next.connectTimeout = 10_000 next.readTimeout = 20_000 - next.setRequestProperty("User-Agent", "OrbitTV/0.95.5") + next.setRequestProperty("User-Agent", "OrbitTV/0.95.6") next.setRequestProperty("Accept-Encoding", "identity") session.mediaHeaders(address).forEach { (key, value) -> next.setRequestProperty(key, value) } if (dataSpec.position != 0L || dataSpec.length != C.LENGTH_UNSET.toLong()) { diff --git a/android/app/src/main/java/tv/orbit/classic/Settings.kt b/android/app/src/main/java/tv/orbit/classic/Settings.kt index a0a9d56..7030e35 100644 --- a/android/app/src/main/java/tv/orbit/classic/Settings.kt +++ b/android/app/src/main/java/tv/orbit/classic/Settings.kt @@ -59,10 +59,11 @@ internal class OrbitSettings(context: Context) { var driveInIntro: Boolean get() = saved.getBoolean("drive_in_intro", true) set(value) { saved.edit().putBoolean("drive_in_intro", value).apply() } - /** Off: Orbit decodes Dolby and DTS on the box and sends plain sound, which any TV plays. On: sends them undecoded, for an amplifier. */ + /** On (the default): Dolby and DTS go out undecoded, as before 0.95.4. Off: decoded on the box, which plays nothing for DTS on + * this Xiaomi box (its decoder runs but is silent, checked 3 November 2026), so off is only for a box whose decoders work. */ var surroundToAmplifier: Boolean - get() = saved.getBoolean("surround_to_amplifier", false) - set(value) { saved.edit().putBoolean("surround_to_amplifier", value).apply() } + get() = saved.getBoolean("surround_to_amplifier_v2", true) + set(value) { saved.edit().putBoolean("surround_to_amplifier_v2", value).apply() } /** Turns off moving presentation such as the Drive-In's curtains. More screens will follow it as they gain motion. */ var reduceMotion: Boolean get() = saved.getBoolean("reduce_motion", false) @@ -170,7 +171,7 @@ private fun ViewingDetail(totsOn: Boolean, windingDown: Boolean, onWindDown: (Bo SettingLine("Drive-In curtains", "Play the curtain intro, with its fanfare, as you go into a screening. Back skips it.") { OrbitButton(if (driveInIntro) "On" else "Off", Modifier.width(64.dp), selected = driveInIntro, onClick = { driveInIntro = !driveInIntro; settings.driveInIntro = driveInIntro }) } - SettingLine("Surround sound to an amplifier", "Send Dolby and DTS sound undecoded, for an amplifier or soundbar that decodes it. Leave off when the TV's own speakers play the sound. Takes effect from the next programme.") { + SettingLine("Surround sound undecoded", "Send Dolby and DTS sound as it is, for the TV or an amplifier to decode. Off decodes it on the box instead, which on some boxes leaves DTS silent. Takes effect from the next programme.") { OrbitButton(if (surroundToAmplifier) "On" else "Off", Modifier.width(64.dp), selected = surroundToAmplifier, onClick = { surroundToAmplifier = !surroundToAmplifier; settings.surroundToAmplifier = surroundToAmplifier }) } SettingLine("Reduce motion", "Leave out moving presentation, such as the Drive-In's curtains.") { diff --git a/docs/VERIFICATION-0.95.6.md b/docs/VERIFICATION-0.95.6.md new file mode 100644 index 0000000..c05e232 --- /dev/null +++ b/docs/VERIFICATION-0.95.6.md @@ -0,0 +1,5 @@ +# Orbit TV 0.95.6: surround sound undecoded again by default + +0.95.5 decoded DTS on the box and was silent on Paul's Xiaomi box (22:25, 3 November 2026): the Amlogic C2 DTS decoder runs and a PCM stream flows, but nothing is heard. 0.95.6 restores the pre-0.95.4 behaviour as the default: Dolby and DTS go out undecoded, which played fine on Terra at 22:21. The setting is renamed "Surround sound undecoded" (on by default, stored under a new key so the earlier off value doesn't carry over); off decodes on the box, for boxes whose decoders work. The earlier Terra dropouts, seen right after an install with several players opening, are unexplained; if they return, check the log while they happen. + +365 unit tests pass; lint has no errors.