mirror of
https://github.com/librespot-org/librespot.git
synced 2024-12-18 17:11:53 +00:00
Correct notifications when loading the same track again.
This commit is contained in:
parent
499824a6ba
commit
ead794f4fd
1 changed files with 68 additions and 11 deletions
|
@ -716,6 +716,7 @@ impl Future for PlayerInternal {
|
||||||
play_request_id,
|
play_request_id,
|
||||||
loaded_track,
|
loaded_track,
|
||||||
start_playback,
|
start_playback,
|
||||||
|
false,
|
||||||
);
|
);
|
||||||
if let PlayerState::Loading { .. } = self.state {
|
if let PlayerState::Loading { .. } = self.state {
|
||||||
panic!("The state wasn't changed by start_playback()");
|
panic!("The state wasn't changed by start_playback()");
|
||||||
|
@ -1010,6 +1011,7 @@ impl PlayerInternal {
|
||||||
play_request_id: u64,
|
play_request_id: u64,
|
||||||
loaded_track: PlayerLoadedTrackData,
|
loaded_track: PlayerLoadedTrackData,
|
||||||
start_playback: bool,
|
start_playback: bool,
|
||||||
|
state_is_invalid_because_the_same_track_is_getting_repeated: bool,
|
||||||
) {
|
) {
|
||||||
let position_ms = Self::position_pcm_to_ms(loaded_track.stream_position_pcm);
|
let position_ms = Self::position_pcm_to_ms(loaded_track.stream_position_pcm);
|
||||||
|
|
||||||
|
@ -1035,7 +1037,16 @@ impl PlayerInternal {
|
||||||
position_ms,
|
position_ms,
|
||||||
}),
|
}),
|
||||||
PlayerState::Loading { .. } => (),
|
PlayerState::Loading { .. } => (),
|
||||||
PlayerState::Invalid { .. } => panic!("Player is in an invalid state."),
|
PlayerState::Invalid { .. } => {
|
||||||
|
if state_is_invalid_because_the_same_track_is_getting_repeated {
|
||||||
|
self.send_event(PlayerEvent::Changed {
|
||||||
|
old_track_id: track_id,
|
||||||
|
new_track_id: track_id,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
panic!("Player is in an invalid state.")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if start_playback {
|
if start_playback {
|
||||||
|
@ -1149,7 +1160,13 @@ impl PlayerInternal {
|
||||||
loaded_track.stream_position_pcm =
|
loaded_track.stream_position_pcm =
|
||||||
Self::position_ms_to_pcm(position_ms);
|
Self::position_ms_to_pcm(position_ms);
|
||||||
}
|
}
|
||||||
self.start_playback(track_id, play_request_id, loaded_track, play);
|
self.start_playback(
|
||||||
|
track_id,
|
||||||
|
play_request_id,
|
||||||
|
loaded_track,
|
||||||
|
play,
|
||||||
|
false,
|
||||||
|
);
|
||||||
load_command_processed = true;
|
load_command_processed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1158,7 +1175,6 @@ impl PlayerInternal {
|
||||||
// Check if we are already playing the track. If so, just do a seek and update our info.
|
// Check if we are already playing the track. If so, just do a seek and update our info.
|
||||||
if let PlayerState::Playing {
|
if let PlayerState::Playing {
|
||||||
track_id: current_track_id,
|
track_id: current_track_id,
|
||||||
play_request_id: ref mut current_play_request_id,
|
|
||||||
ref mut stream_position_pcm,
|
ref mut stream_position_pcm,
|
||||||
ref mut decoder,
|
ref mut decoder,
|
||||||
ref mut stream_loader_controller,
|
ref mut stream_loader_controller,
|
||||||
|
@ -1166,7 +1182,6 @@ impl PlayerInternal {
|
||||||
}
|
}
|
||||||
| PlayerState::Paused {
|
| PlayerState::Paused {
|
||||||
track_id: current_track_id,
|
track_id: current_track_id,
|
||||||
play_request_id: ref mut current_play_request_id,
|
|
||||||
ref mut stream_position_pcm,
|
ref mut stream_position_pcm,
|
||||||
ref mut decoder,
|
ref mut decoder,
|
||||||
ref mut stream_loader_controller,
|
ref mut stream_loader_controller,
|
||||||
|
@ -1180,13 +1195,49 @@ impl PlayerInternal {
|
||||||
stream_loader_controller.set_stream_mode();
|
stream_loader_controller.set_stream_mode();
|
||||||
*stream_position_pcm = Self::position_ms_to_pcm(position_ms);
|
*stream_position_pcm = Self::position_ms_to_pcm(position_ms);
|
||||||
}
|
}
|
||||||
*current_play_request_id = play_request_id;
|
|
||||||
if play {
|
let old_state = mem::replace(&mut self.state, PlayerState::Invalid);
|
||||||
self.handle_play();
|
|
||||||
} else {
|
if let PlayerState::Playing {
|
||||||
self.handle_pause();
|
stream_position_pcm,
|
||||||
|
decoder,
|
||||||
|
stream_loader_controller,
|
||||||
|
bytes_per_second,
|
||||||
|
duration_ms,
|
||||||
|
normalisation_factor,
|
||||||
|
..
|
||||||
|
}
|
||||||
|
| PlayerState::Paused {
|
||||||
|
stream_position_pcm,
|
||||||
|
decoder,
|
||||||
|
stream_loader_controller,
|
||||||
|
bytes_per_second,
|
||||||
|
duration_ms,
|
||||||
|
normalisation_factor,
|
||||||
|
..
|
||||||
|
} = old_state
|
||||||
|
{
|
||||||
|
let loaded_track = PlayerLoadedTrackData {
|
||||||
|
decoder,
|
||||||
|
normalisation_factor,
|
||||||
|
stream_loader_controller,
|
||||||
|
bytes_per_second,
|
||||||
|
duration_ms,
|
||||||
|
stream_position_pcm,
|
||||||
|
};
|
||||||
|
|
||||||
|
self.start_playback(
|
||||||
|
track_id,
|
||||||
|
play_request_id,
|
||||||
|
loaded_track,
|
||||||
|
play,
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
|
||||||
|
load_command_processed = true;
|
||||||
|
} else {
|
||||||
|
unreachable!();
|
||||||
}
|
}
|
||||||
load_command_processed = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1213,7 +1264,13 @@ impl PlayerInternal {
|
||||||
let _ = loaded_track.decoder.seek(position_ms as i64); // This may be blocking
|
let _ = loaded_track.decoder.seek(position_ms as i64); // This may be blocking
|
||||||
loaded_track.stream_loader_controller.set_stream_mode();
|
loaded_track.stream_loader_controller.set_stream_mode();
|
||||||
}
|
}
|
||||||
self.start_playback(track_id, play_request_id, loaded_track, play);
|
self.start_playback(
|
||||||
|
track_id,
|
||||||
|
play_request_id,
|
||||||
|
loaded_track,
|
||||||
|
play,
|
||||||
|
false,
|
||||||
|
);
|
||||||
load_command_processed = true;
|
load_command_processed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue