|
@@ -446,7 +446,7 @@ impl AudioFile {
|
|
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,
|
|
- }
|
|
|
|
|
|
+ };
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -514,7 +514,10 @@ impl AudioFileFetchDataReceiver {
|
|
request_length: usize,
|
|
request_length: usize,
|
|
request_sent_time: Instant,
|
|
request_sent_time: Instant,
|
|
) -> AudioFileFetchDataReceiver {
|
|
) -> AudioFileFetchDataReceiver {
|
|
- let measure_ping_time = shared.number_of_open_requests.load(atomic::Ordering::SeqCst) == 0;
|
|
|
|
|
|
+ let measure_ping_time = shared
|
|
|
|
+ .number_of_open_requests
|
|
|
|
+ .load(atomic::Ordering::SeqCst)
|
|
|
|
+ == 0;
|
|
|
|
|
|
shared
|
|
shared
|
|
.number_of_open_requests
|
|
.number_of_open_requests
|
|
@@ -562,7 +565,8 @@ impl Future for AudioFileFetchDataReceiver {
|
|
if let Some(request_sent_time) = self.request_sent_time {
|
|
if let Some(request_sent_time) = self.request_sent_time {
|
|
let duration = Instant::now() - request_sent_time;
|
|
let duration = Instant::now() - request_sent_time;
|
|
let duration_ms: u64;
|
|
let duration_ms: u64;
|
|
- if 0.001 * (duration.as_millis() as f64) > MAXIMUM_ASSUMED_PING_TIME_SECONDS
|
|
|
|
|
|
+ if 0.001 * (duration.as_millis() as f64)
|
|
|
|
+ > MAXIMUM_ASSUMED_PING_TIME_SECONDS
|
|
{
|
|
{
|
|
duration_ms = (MAXIMUM_ASSUMED_PING_TIME_SECONDS * 1000.0) as u64;
|
|
duration_ms = (MAXIMUM_ASSUMED_PING_TIME_SECONDS * 1000.0) as u64;
|
|
} else {
|
|
} else {
|
|
@@ -714,8 +718,13 @@ impl AudioFileFetch {
|
|
ranges_to_request.subtract_range_set(&download_status.requested);
|
|
ranges_to_request.subtract_range_set(&download_status.requested);
|
|
|
|
|
|
for range in ranges_to_request.iter() {
|
|
for range in ranges_to_request.iter() {
|
|
- let (_headers, data) =
|
|
|
|
- request_range(&self.session, self.shared.file_id, range.start, range.length).split();
|
|
|
|
|
|
+ let (_headers, data) = request_range(
|
|
|
|
+ &self.session,
|
|
|
|
+ self.shared.file_id,
|
|
|
|
+ range.start,
|
|
|
|
+ range.length,
|
|
|
|
+ )
|
|
|
|
+ .split();
|
|
|
|
|
|
download_status.requested.add_range(range);
|
|
download_status.requested.add_range(range);
|
|
|
|
|
|
@@ -749,7 +758,10 @@ impl AudioFileFetch {
|
|
// download data from after the current read position first
|
|
// download data from after the current read position first
|
|
let mut tail_end = RangeSet::new();
|
|
let mut tail_end = RangeSet::new();
|
|
let read_position = self.shared.read_position.load(atomic::Ordering::Relaxed);
|
|
let read_position = self.shared.read_position.load(atomic::Ordering::Relaxed);
|
|
- tail_end.add_range(&Range::new(read_position, self.shared.file_size - read_position));
|
|
|
|
|
|
+ tail_end.add_range(&Range::new(
|
|
|
|
+ read_position,
|
|
|
|
+ self.shared.file_size - read_position,
|
|
|
|
+ ));
|
|
let tail_end = tail_end.intersection(&missing_data);
|
|
let tail_end = tail_end.intersection(&missing_data);
|
|
|
|
|
|
if !tail_end.is_empty() {
|
|
if !tail_end.is_empty() {
|
|
@@ -794,8 +806,9 @@ impl AudioFileFetch {
|
|
let ping_time_ms: usize = match self.network_response_times_ms.len() {
|
|
let ping_time_ms: usize = match self.network_response_times_ms.len() {
|
|
1 => self.network_response_times_ms[0] as usize,
|
|
1 => self.network_response_times_ms[0] as usize,
|
|
2 => {
|
|
2 => {
|
|
- ((self.network_response_times_ms[0] + self.network_response_times_ms[1]) / 2)
|
|
|
|
- as usize
|
|
|
|
|
|
+ ((self.network_response_times_ms[0]
|
|
|
|
+ + self.network_response_times_ms[1])
|
|
|
|
+ / 2) as usize
|
|
}
|
|
}
|
|
3 => {
|
|
3 => {
|
|
let mut times = self.network_response_times_ms.clone();
|
|
let mut times = self.network_response_times_ms.clone();
|
|
@@ -863,10 +876,12 @@ impl AudioFileFetch {
|
|
self.download_range(request.start, request.length);
|
|
self.download_range(request.start, request.length);
|
|
}
|
|
}
|
|
Ok(Async::Ready(Some(StreamLoaderCommand::RandomAccessMode()))) => {
|
|
Ok(Async::Ready(Some(StreamLoaderCommand::RandomAccessMode()))) => {
|
|
- *(self.shared.download_strategy.lock().unwrap()) = DownloadStrategy::RandomAccess();
|
|
|
|
|
|
+ *(self.shared.download_strategy.lock().unwrap()) =
|
|
|
|
+ DownloadStrategy::RandomAccess();
|
|
}
|
|
}
|
|
Ok(Async::Ready(Some(StreamLoaderCommand::StreamMode()))) => {
|
|
Ok(Async::Ready(Some(StreamLoaderCommand::StreamMode()))) => {
|
|
- *(self.shared.download_strategy.lock().unwrap()) = DownloadStrategy::Streaming();
|
|
|
|
|
|
+ *(self.shared.download_strategy.lock().unwrap()) =
|
|
|
|
+ DownloadStrategy::Streaming();
|
|
}
|
|
}
|
|
Ok(Async::Ready(Some(StreamLoaderCommand::Close()))) => {
|
|
Ok(Async::Ready(Some(StreamLoaderCommand::Close()))) => {
|
|
return Ok(Async::Ready(()));
|
|
return Ok(Async::Ready(()));
|
|
@@ -908,15 +923,20 @@ impl Future for AudioFileFetch {
|
|
}
|
|
}
|
|
|
|
|
|
if let DownloadStrategy::Streaming() = self.get_download_strategy() {
|
|
if let DownloadStrategy::Streaming() = self.get_download_strategy() {
|
|
- let number_of_open_requests =
|
|
|
|
- self.shared.number_of_open_requests.load(atomic::Ordering::SeqCst);
|
|
|
|
|
|
+ let number_of_open_requests = self
|
|
|
|
+ .shared
|
|
|
|
+ .number_of_open_requests
|
|
|
|
+ .load(atomic::Ordering::SeqCst);
|
|
let max_requests_to_send =
|
|
let max_requests_to_send =
|
|
MAX_PREFETCH_REQUESTS - min(MAX_PREFETCH_REQUESTS, number_of_open_requests);
|
|
MAX_PREFETCH_REQUESTS - min(MAX_PREFETCH_REQUESTS, number_of_open_requests);
|
|
|
|
|
|
if max_requests_to_send > 0 {
|
|
if max_requests_to_send > 0 {
|
|
let bytes_pending: usize = {
|
|
let bytes_pending: usize = {
|
|
let download_status = self.shared.download_status.lock().unwrap();
|
|
let download_status = self.shared.download_status.lock().unwrap();
|
|
- download_status.requested.minus(&download_status.downloaded).len()
|
|
|
|
|
|
+ download_status
|
|
|
|
+ .requested
|
|
|
|
+ .minus(&download_status.downloaded)
|
|
|
|
+ .len()
|
|
};
|
|
};
|
|
|
|
|
|
let ping_time_seconds =
|
|
let ping_time_seconds =
|
|
@@ -924,9 +944,11 @@ impl Future for AudioFileFetch {
|
|
let download_rate = self.session.channel().get_download_rate_estimate();
|
|
let download_rate = self.session.channel().get_download_rate_estimate();
|
|
|
|
|
|
let desired_pending_bytes = max(
|
|
let desired_pending_bytes = max(
|
|
- (PREFETCH_THRESHOLD_FACTOR * ping_time_seconds * self.shared.stream_data_rate as f64)
|
|
|
|
|
|
+ (PREFETCH_THRESHOLD_FACTOR
|
|
|
|
+ * ping_time_seconds
|
|
|
|
+ * self.shared.stream_data_rate as f64) as usize,
|
|
|
|
+ (FAST_PREFETCH_THRESHOLD_FACTOR * ping_time_seconds * download_rate as f64)
|
|
as usize,
|
|
as usize,
|
|
- (FAST_PREFETCH_THRESHOLD_FACTOR * ping_time_seconds * download_rate as f64) as usize,
|
|
|
|
);
|
|
);
|
|
|
|
|
|
if bytes_pending < desired_pending_bytes {
|
|
if bytes_pending < desired_pending_bytes {
|
|
@@ -1003,7 +1025,9 @@ impl Read for AudioFileStreaming {
|
|
.unwrap()
|
|
.unwrap()
|
|
.0;
|
|
.0;
|
|
}
|
|
}
|
|
- let available_length = download_status.downloaded.contained_length_from_value(offset);
|
|
|
|
|
|
+ let available_length = download_status
|
|
|
|
+ .downloaded
|
|
|
|
+ .contained_length_from_value(offset);
|
|
assert!(available_length > 0);
|
|
assert!(available_length > 0);
|
|
drop(download_status);
|
|
drop(download_status);
|
|
|
|
|