Files
jellytau/api/jellytau_lib/commands/player/fn.player_switch_audio_track.html
T

37 lines
7.2 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Switch audio track. Note: Frontend should handle saving series preferences after this command succeeds"><title>player_switch_audio_track in jellytau_lib::commands::player - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-17e0aaed.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="jellytau_lib" data-themes="" data-resource-suffix="" data-rustdoc-version="1.97.1 (8bab26f4f 2026-07-14)" data-channel="1.97.1" data-search-js="search-fd9372ac.js" data-stringdex-js="stringdex-2da4960a.js" data-settings-js="settings-170eb4bf.js" ><script src="../../../static.files/storage-41dd4d93.js"></script><script defer src="sidebar-items.js"></script><script defer src="../../../static.files/main-fcd733ba.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-f7c3ffd8.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc fn"><a class="skip-main-content" href="#main-content">Skip to main content</a><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">player_switch_audio_track</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../../jellytau_lib/index.html">jellytau_<wbr>lib</a><span class="version">0.11.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>commands::<wbr>player</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content" tabindex="-1"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../../index.html">jellytau_lib</a>::<wbr><a href="../index.html">commands</a>::<wbr><a href="index.html">player</a></div><h1>Function <span class="fn">player_<wbr>switch_<wbr>audio_<wbr>track</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../../src/jellytau_lib/commands/player/mod.rs.html#1636-1772">Source</a> </span></div><pre class="rust item-decl"><code>pub async fn player_switch_audio_track(
player: State&lt;'_, <a class="struct" href="struct.PlayerStateWrapper.html" title="struct jellytau_lib::commands::player::PlayerStateWrapper">PlayerStateWrapper</a>&gt;,
repository_manager: State&lt;'_, <a class="struct" href="../repository/struct.RepositoryManagerWrapper.html" title="struct jellytau_lib::commands::repository::RepositoryManagerWrapper">RepositoryManagerWrapper</a>&gt;,
repository_handle: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>,
stream_index: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.i32.html">i32</a>,
array_index: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.i32.html">i32</a>,
use_html5: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>,
current_position: <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>&gt;,
media_source_id: <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt;,
) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="enum" href="enum.AudioTrackSwitchResponse.html" title="enum jellytau_lib::commands::player::AudioTrackSwitchResponse">AudioTrackSwitchResponse</a>, <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt;</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Switch audio track.
Note: Frontend should handle saving series preferences after this command succeeds</p>
<p>What decides the route is <strong>whether the stream in front of the engine
carries the requested track at all</strong> — see
<a href="../../player/track_switch/fn.determine_audio_track_switch_strategy.html" title="fn jellytau_lib::player::track_switch::determine_audio_track_switch_strategy"><code>determine_audio_track_switch_strategy</code></a>:</p>
<ul>
<li>An HTML5 <code>&lt;video&gt;</code> element has no track-selection API, so the stream is
always re-opened at the chosen <code>AudioStreamIndex</code> and the frontend seeks
the reloaded element back to <code>position</code>.</li>
<li>A native backend playing a <strong>direct play</strong> holds the source file with
every track in it, so ExoPlayer selects in place by track-group index.</li>
<li>A native backend playing a <strong>transcode</strong> does not. Jellyfin builds a
transcode around one <code>AudioStreamIndex</code>, so the alternate tracks are not
in the stream; the switch has to re-open it, which this command does
itself and resumes at <code>current_position</code>.</li>
</ul>
<p>That last case is a bug fix, and it was the common case on Android: any
source whose default audio codec the device cannot decode is transcoded, so
ExoPlayer saw <code>Audio tracks: 1</code> while the menu listed every track in the
file. The old code called <code>setAudioTrack(n)</code> regardless, which indexes
ExoPlayers audio track <em>groups</em>, found nothing at <code>n</code>, warned <code>Invalid audio track index</code> and dropped the request — the default track just kept
playing, with nothing in the UI saying so.</p>
<p>libmpv implements neither selection nor reload here — it is the audio-only
backend and leaves <code>PlayerBackend::set_audio_track</code> at its
<code>not_implemented()</code> default, which is why IR-019 is met by these paths
rather than by MPV.</p>
<p>TRACES: UR-021, UR-005 | IR-019, DR-024, DR-258</p>
</div></details></section></div></main></body></html>