0.2.42 - DTS surround sound support

This commit is contained in:
ponzischeme89
2026-08-10 12:23:23 +12:00
parent 32c0054c44
commit f41db66ac6
29 changed files with 1363 additions and 128 deletions
+50
View File
@@ -481,6 +481,8 @@ func sessionPlaybackCapabilities(sess store.Session) emby.PlaybackCapabilities {
capabilities.HEVCHDR10Plus = true
case "video_hevc_dolby_vision":
capabilities.HEVCDolbyVision = true
case "audio_passthrough_v1":
capabilities.AudioProfileV1 = true
default:
parsePlaybackCapabilityValue(value, &capabilities)
}
@@ -508,6 +510,9 @@ func (s *Server) effectivePlaybackCapabilities(
}
func parsePlaybackCapabilityValue(value string, capabilities *emby.PlaybackCapabilities) {
if parseAudioCapability(value, capabilities) {
return
}
parseIntCapability(value, "video_h264_level_", &capabilities.H264Level)
parseIntCapability(value, "video_h264_high10_level_", &capabilities.H264High10Level)
parseIntCapability(value, "video_hevc_main_level_", &capabilities.HEVCMainLevel)
@@ -520,6 +525,51 @@ func parsePlaybackCapabilityValue(value string, capabilities *emby.PlaybackCapab
)
}
func parseAudioCapability(value string, capabilities *emby.PlaybackCapabilities) bool {
const prefix = "audio_"
if !strings.HasPrefix(value, prefix) {
return false
}
if strings.HasPrefix(value, "audio_max_channels_") {
parsed, err := strconv.Atoi(strings.TrimPrefix(value, "audio_max_channels_"))
if err == nil && parsed >= 2 && parsed <= 8 {
capabilities.AudioMaxChannels = parsed
}
return true
}
for _, suffix := range []string{"_passthrough", "_decode"} {
if !strings.HasSuffix(value, suffix) {
continue
}
codec := strings.TrimSuffix(strings.TrimPrefix(value, prefix), suffix)
if !validAudioCapabilityCodec(codec) {
return true
}
if suffix == "_passthrough" {
if capabilities.AudioPassthrough == nil {
capabilities.AudioPassthrough = map[string]bool{}
}
capabilities.AudioPassthrough[codec] = true
} else {
if capabilities.AudioDecode == nil {
capabilities.AudioDecode = map[string]bool{}
}
capabilities.AudioDecode[codec] = true
}
return true
}
return true
}
func validAudioCapabilityCodec(codec string) bool {
switch codec {
case "ac3", "eac3", "atmos", "dts", "dts_hd", "truehd":
return true
default:
return false
}
}
func parseIntCapability(value, prefix string, destination *int) {
if !strings.HasPrefix(value, prefix) {
return
@@ -0,0 +1,26 @@
package api
import (
"testing"
"github.com/ponzischeme89/memby/server/internal/store"
)
func TestSessionPlaybackCapabilitiesParsesAudioEvidence(t *testing.T) {
capabilities := sessionPlaybackCapabilities(store.Session{ClientCapabilities: []string{
"audio_passthrough_v1",
"audio_eac3_passthrough",
"audio_truehd_decode",
"audio_max_channels_8",
"audio_unknown_passthrough",
}})
if !capabilities.AudioProfileV1 || !capabilities.AudioPassthrough["eac3"] {
t.Fatalf("passthrough evidence = %#v", capabilities)
}
if !capabilities.AudioDecode["truehd"] || capabilities.AudioMaxChannels != 8 {
t.Fatalf("decode evidence = %#v", capabilities)
}
if capabilities.AudioPassthrough["unknown"] {
t.Fatalf("unknown audio codec was accepted: %#v", capabilities.AudioPassthrough)
}
}