mirror of
https://github.com/librespot-org/librespot.git
synced 2025-10-05 02:39:53 +02:00
Adapt code for the new bitrate selection via alternatives.
This commit is contained in:
parent
9b069effb2
commit
c50fc9885a
2 changed files with 29 additions and 13 deletions
|
@ -57,6 +57,7 @@ pub struct StreamLoaderController {
|
||||||
channel_tx: Option<mpsc::UnboundedSender<StreamLoaderCommand>>,
|
channel_tx: Option<mpsc::UnboundedSender<StreamLoaderCommand>>,
|
||||||
stream_shared: Option<Arc<AudioFileShared>>,
|
stream_shared: Option<Arc<AudioFileShared>>,
|
||||||
file_size: usize,
|
file_size: usize,
|
||||||
|
bytes_per_second: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -65,6 +66,8 @@ impl StreamLoaderController {
|
||||||
return self.file_size;
|
return self.file_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn data_rate(&self) -> usize { return self.bytes_per_second; }
|
||||||
|
|
||||||
pub fn range_available(&self, range: Range) -> bool {
|
pub fn range_available(&self, range: Range) -> bool {
|
||||||
if let Some(ref shared) = self.stream_shared {
|
if let Some(ref shared) = self.stream_shared {
|
||||||
let download_status = shared.download_status.lock().unwrap();
|
let download_status = shared.download_status.lock().unwrap();
|
||||||
|
@ -168,6 +171,7 @@ impl StreamLoaderController {
|
||||||
|
|
||||||
pub fn set_stream_data_rate(&mut self, bytes_per_second: usize) {
|
pub fn set_stream_data_rate(&mut self, bytes_per_second: usize) {
|
||||||
// when optimising for streaming, assume a streaming rate of this many bytes per second.
|
// when optimising for streaming, assume a streaming rate of this many bytes per second.
|
||||||
|
self.bytes_per_second = bytes_per_second;
|
||||||
self.send_stream_loader_command(StreamLoaderCommand::StreamDataRate(bytes_per_second));
|
self.send_stream_loader_command(StreamLoaderCommand::StreamDataRate(bytes_per_second));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,20 +339,24 @@ impl AudioFile {
|
||||||
AudioFileOpen::Streaming(open)
|
AudioFileOpen::Streaming(open)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_stream_loader_controller(&self) -> StreamLoaderController {
|
pub fn get_stream_loader_controller(&self, bytes_per_second: usize) -> StreamLoaderController {
|
||||||
match self {
|
match self {
|
||||||
AudioFile::Streaming(stream) => {
|
AudioFile::Streaming(stream) => {
|
||||||
return StreamLoaderController {
|
let mut result = StreamLoaderController {
|
||||||
channel_tx: Some(stream.stream_loader_command_tx.clone()),
|
channel_tx: Some(stream.stream_loader_command_tx.clone()),
|
||||||
stream_shared: Some(stream.shared.clone()),
|
stream_shared: Some(stream.shared.clone()),
|
||||||
file_size: stream.shared.file_size,
|
file_size: stream.shared.file_size,
|
||||||
}
|
bytes_per_second: bytes_per_second,
|
||||||
|
};
|
||||||
|
result.set_stream_data_rate(bytes_per_second);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
AudioFile::Cached(ref file) => {
|
AudioFile::Cached(ref file) => {
|
||||||
return StreamLoaderController {
|
return StreamLoaderController {
|
||||||
channel_tx: None,
|
channel_tx: None,
|
||||||
stream_shared: None,
|
stream_shared: None,
|
||||||
file_size: file.metadata().unwrap().len() as usize,
|
file_size: file.metadata().unwrap().len() as usize,
|
||||||
|
bytes_per_second: bytes_per_second,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -490,12 +490,12 @@ impl PlayerInternal {
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we're playing, ensure, that we have enough data leaded to avoid a buffer underrun.
|
// If we're playing, ensure, that we have enough data leaded to avoid a buffer underrun.
|
||||||
let stream_data_rate = self.stream_data_rate();
|
|
||||||
if let Some(stream_loader_controller) = self.state.stream_loader_controller() {
|
if let Some(stream_loader_controller) = self.state.stream_loader_controller() {
|
||||||
stream_loader_controller.set_stream_mode();
|
stream_loader_controller.set_stream_mode();
|
||||||
}
|
}
|
||||||
if let PlayerState::Playing{..} = self.state {
|
if let PlayerState::Playing{..} = self.state {
|
||||||
if let Some(stream_loader_controller) = self.state.stream_loader_controller() {
|
if let Some(stream_loader_controller) = self.state.stream_loader_controller() {
|
||||||
|
let stream_data_rate = stream_loader_controller.data_rate();
|
||||||
let wait_for_data_length = (2 * stream_loader_controller.ping_time_ms() * stream_data_rate) / 1000;
|
let wait_for_data_length = (2 * stream_loader_controller.ping_time_ms() * stream_data_rate) / 1000;
|
||||||
stream_loader_controller.fetch_next_blocking(wait_for_data_length);
|
stream_loader_controller.fetch_next_blocking(wait_for_data_length);
|
||||||
}
|
}
|
||||||
|
@ -561,11 +561,22 @@ impl PlayerInternal {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn stream_data_rate(&self) -> usize {
|
fn stream_data_rate(&self, format: FileFormat) -> usize {
|
||||||
match self.config.bitrate {
|
match format {
|
||||||
Bitrate::Bitrate96 => 12 * 1024,
|
FileFormat::OGG_VORBIS_96 => 12 * 1024,
|
||||||
Bitrate::Bitrate160 => 20 * 1024,
|
FileFormat::OGG_VORBIS_160 => 20 * 1024,
|
||||||
Bitrate::Bitrate320 => 40 * 1024,
|
FileFormat::OGG_VORBIS_320=> 40 * 1024,
|
||||||
|
FileFormat::MP3_256 => 32 * 1024,
|
||||||
|
FileFormat::MP3_320 => 40 * 1024,
|
||||||
|
FileFormat::MP3_160 => 20 * 1024,
|
||||||
|
FileFormat::MP3_96 => 12 * 1024,
|
||||||
|
FileFormat::MP3_160_ENC => 20 * 1024,
|
||||||
|
FileFormat::MP4_128_DUAL => 16 * 1024,
|
||||||
|
FileFormat::OTHER3 => 40 * 1024, // better some high guess than nothing
|
||||||
|
FileFormat::AAC_160 => 20 * 1024,
|
||||||
|
FileFormat::AAC_320 => 40 * 1024,
|
||||||
|
FileFormat::MP4_128 => 16 * 1024,
|
||||||
|
FileFormat::OTHER5 => 40 * 1024, // better some high guess than nothing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -618,10 +629,7 @@ impl PlayerInternal {
|
||||||
|
|
||||||
let encrypted_file = encrypted_file.wait().unwrap();
|
let encrypted_file = encrypted_file.wait().unwrap();
|
||||||
|
|
||||||
let mut stream_loader_controller = encrypted_file.get_stream_loader_controller();
|
let mut stream_loader_controller = encrypted_file.get_stream_loader_controller(self.stream_data_rate(*format));
|
||||||
|
|
||||||
// tell the stream loader how to optimise its strategy.
|
|
||||||
stream_loader_controller.set_stream_data_rate(self.stream_data_rate());
|
|
||||||
|
|
||||||
if position == 0 {
|
if position == 0 {
|
||||||
// No need to seek -> we stream from the beginning
|
// No need to seek -> we stream from the beginning
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue